Mercurial > urweb
changeset 227:524e10c91478
GROUP BY and HAVING
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Thu, 21 Aug 2008 14:09:08 -0400 (2008-08-21) |
parents | b0041cc7e5f7 |
children | 19e5791923d0 |
files | src/lacweb.grm src/lacweb.lex tests/group_by.lac |
diffstat | 3 files changed, 15 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lacweb.grm Thu Aug 21 13:59:49 2008 -0400 +++ b/src/lacweb.grm Thu Aug 21 14:09:08 2008 -0400 @@ -152,7 +152,7 @@ | NOTAGS of string | BEGIN_TAG of string | END_TAG of string - | SELECT | FROM | AS | CWHERE | GROUP | BY + | SELECT | FROM | AS | CWHERE | GROUP | BY | HAVING | TRUE | FALSE | CAND | OR | NOT | NE | LT | LE | GT | GE @@ -231,6 +231,7 @@ | groupi of group_item | groupis of group_item list | gopt of group_item list option + | hopt of exp %verbose (* print summary of errors *) @@ -645,7 +646,7 @@ query : query1 (query1) -query1 : SELECT select FROM tables wopt gopt +query1 : SELECT select FROM tables wopt gopt hopt (let val loc = s (SELECTleft, tablesright) @@ -690,10 +691,6 @@ (CRecord tabs, loc)), loc) end - val hopt = (sql_inject (EVar (["Basis"], "True"), - EVar (["Basis"], "sql_bool"), - loc)) - val e = (EVar (["Basis"], "sql_query"), loc) val re = (ERecord [((CName "From", loc), (ERecord tables, loc)), @@ -788,3 +785,8 @@ gopt : (NONE) | GROUP BY groupis (SOME groupis) + +hopt : (sql_inject (EVar (["Basis"], "True"), + EVar (["Basis"], "sql_bool"), + ErrorMsg.dummySpan)) + | HAVING sqlexp (sqlexp)
--- a/src/lacweb.lex Thu Aug 21 13:59:49 2008 -0400 +++ b/src/lacweb.lex Thu Aug 21 14:09:08 2008 -0400 @@ -297,6 +297,7 @@ <INITIAL> "WHERE" => (Tokens.CWHERE (pos yypos, pos yypos + size yytext)); <INITIAL> "GROUP" => (Tokens.GROUP (pos yypos, pos yypos + size yytext)); <INITIAL> "BY" => (Tokens.BY (pos yypos, pos yypos + size yytext)); +<INITIAL> "HAVING" => (Tokens.HAVING (pos yypos, pos yypos + size yytext)); <INITIAL> "TRUE" => (Tokens.TRUE (pos yypos, pos yypos + size yytext)); <INITIAL> "FALSE" => (Tokens.FALSE (pos yypos, pos yypos + size yytext));
--- a/tests/group_by.lac Thu Aug 21 13:59:49 2008 -0400 +++ b/tests/group_by.lac Thu Aug 21 14:09:08 2008 -0400 @@ -3,3 +3,9 @@ val q1 = (SELECT * FROM t1 GROUP BY t1.B) val q2 = (SELECT * FROM t1, t2 GROUP BY t1.B, t2.D, t1.A) + +val q3 = (SELECT * FROM t1 WHERE t1.A = 0 GROUP BY t1.B) +val q4 = (SELECT * FROM t1 WHERE t1.A = 0 GROUP BY t1.C HAVING t1.C < 0.2) + +val q5 = (SELECT t1.A, t2.D FROM t1, t2 GROUP BY t2.D, t1.A) +val q6 = (SELECT t1.A, t2.D FROM t1, t2 WHERE t1.C = 0.0 GROUP BY t2.D, t1.A HAVING t1.A = 0 AND t2.D = 17)