Mercurial > urweb
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") |