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)