comparison 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
comparison
equal deleted inserted replaced
235:0608a0cfd32a 236:f5732dc1316c
108 108
109 fun sql_compare (oper, sqlexp1, sqlexp2, loc) = 109 fun sql_compare (oper, sqlexp1, sqlexp2, loc) =
110 let 110 let
111 val e = (EVar (["Basis"], "sql_comparison"), loc) 111 val e = (EVar (["Basis"], "sql_comparison"), loc)
112 val e = (EApp (e, (EVar (["Basis"], "sql_" ^ oper), loc)), loc) 112 val e = (EApp (e, (EVar (["Basis"], "sql_" ^ oper), loc)), loc)
113 val e = (EApp (e, (EWild, loc)), loc)
114 val e = (EApp (e, sqlexp1), loc) 113 val e = (EApp (e, sqlexp1), loc)
115 in 114 in
116 (EApp (e, sqlexp2), loc) 115 (EApp (e, sqlexp2), loc)
117 end 116 end
118 117
167 166
168 | SELECT | FROM | AS | CWHERE | GROUP | ORDER | BY | HAVING 167 | SELECT | FROM | AS | CWHERE | GROUP | ORDER | BY | HAVING
169 | UNION | INTERSECT | EXCEPT 168 | UNION | INTERSECT | EXCEPT
170 | LIMIT | OFFSET | ALL 169 | LIMIT | OFFSET | ALL
171 | TRUE | FALSE | CAND | OR | NOT 170 | TRUE | FALSE | CAND | OR | NOT
172 | COUNT 171 | COUNT | AVG | SUM | MIN | MAX
173 | NE | LT | LE | GT | GE 172 | NE | LT | LE | GT | GE
174 173
175 %nonterm 174 %nonterm
176 file of decl list 175 file of decl list
177 | decls of decl list 176 | decls of decl list
251 | obopt of exp 250 | obopt of exp
252 | obexps of exp 251 | obexps of exp
253 | lopt of exp 252 | lopt of exp
254 | ofopt of exp 253 | ofopt of exp
255 | sqlint of exp 254 | sqlint of exp
255 | sqlagg of string
256 256
257 257
258 %verbose (* print summary of errors *) 258 %verbose (* print summary of errors *)
259 %pos int (* positions *) 259 %pos int (* positions *)
260 %start file 260 %start file
829 val loc = s (COUNTleft, RPARENright) 829 val loc = s (COUNTleft, RPARENright)
830 in 830 in
831 (EApp ((EVar (["Basis"], "sql_count"), loc), 831 (EApp ((EVar (["Basis"], "sql_count"), loc),
832 (ERecord [], loc)), loc) 832 (ERecord [], loc)), loc)
833 end) 833 end)
834 | sqlagg LPAREN sqlexp RPAREN (let
835 val loc = s (sqlaggleft, RPARENright)
836
837 val e = (EApp ((EVar (["Basis"], "sql_" ^ sqlagg), loc),
838 (EWild, loc)), loc)
839 val e = (EApp ((EVar (["Basis"], "sql_aggregate"), loc),
840 e), loc)
841 in
842 (EApp (e, sqlexp), loc)
843 end)
834 844
835 wopt : (sql_inject (EVar (["Basis"], "True"), 845 wopt : (sql_inject (EVar (["Basis"], "True"),
836 EVar (["Basis"], "sql_bool"), 846 EVar (["Basis"], "sql_bool"),
837 dummy)) 847 dummy))
838 | CWHERE sqlexp (sqlexp) 848 | CWHERE sqlexp (sqlexp)
890 (EApp ((EVar (["Basis"], "sql_offset"), loc), sqlint), loc) 900 (EApp ((EVar (["Basis"], "sql_offset"), loc), sqlint), loc)
891 end) 901 end)
892 902
893 sqlint : INT (EPrim (Prim.Int INT), s (INTleft, INTright)) 903 sqlint : INT (EPrim (Prim.Int INT), s (INTleft, INTright))
894 | LBRACE eexp RBRACE (eexp) 904 | LBRACE eexp RBRACE (eexp)
905
906 sqlagg : AVG ("avg")
907 | SUM ("sum")
908 | MIN ("min")
909 | MAX ("max")