diff src/lacweb.grm @ 236:f5732dc1316c

More aggregate functions
author Adam Chlipala <adamc@hcoop.net>
date Thu, 28 Aug 2008 12:56:08 -0400
parents 0608a0cfd32a
children fc6f04889bf2
line wrap: on
line diff
--- a/src/lacweb.grm	Thu Aug 28 11:59:46 2008 -0400
+++ b/src/lacweb.grm	Thu Aug 28 12:56:08 2008 -0400
@@ -110,7 +110,6 @@
     let
         val e = (EVar (["Basis"], "sql_comparison"), loc)
         val e = (EApp (e, (EVar (["Basis"], "sql_" ^ oper), loc)), loc)
-        val e = (EApp (e, (EWild, loc)), loc)
         val e = (EApp (e, sqlexp1), loc)
     in
         (EApp (e, sqlexp2), loc)
@@ -169,7 +168,7 @@
  | UNION | INTERSECT | EXCEPT
  | LIMIT | OFFSET | ALL
  | TRUE | FALSE | CAND | OR | NOT
- | COUNT
+ | COUNT | AVG | SUM | MIN | MAX
  | NE | LT | LE | GT | GE
 
 %nonterm
@@ -253,6 +252,7 @@
  | lopt of exp
  | ofopt of exp
  | sqlint of exp
+ | sqlagg of string
 
 
 %verbose                                (* print summary of errors *)
@@ -831,6 +831,16 @@
                                              (EApp ((EVar (["Basis"], "sql_count"), loc),
                                                     (ERecord [], loc)), loc)
                                          end)
+       | sqlagg LPAREN sqlexp RPAREN    (let
+                                             val loc = s (sqlaggleft, RPARENright)
+
+                                             val e = (EApp ((EVar (["Basis"], "sql_" ^ sqlagg), loc),
+                                                            (EWild, loc)), loc)
+                                             val e = (EApp ((EVar (["Basis"], "sql_aggregate"), loc),
+                                                            e), loc)
+                                         in
+                                             (EApp (e, sqlexp), loc)
+                                         end)
 
 wopt   :                                (sql_inject (EVar (["Basis"], "True"),
                                                      EVar (["Basis"], "sql_bool"),
@@ -892,3 +902,8 @@
 
 sqlint : INT                             (EPrim (Prim.Int INT), s (INTleft, INTright))
        | LBRACE eexp RBRACE              (eexp)
+
+sqlagg : AVG                             ("avg")
+       | SUM                             ("sum")
+       | MIN                             ("min")
+       | MAX                             ("max")