diff options
author | Adam Chlipala <adamc@hcoop.net> | 2008-08-28 11:17:14 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2008-08-28 11:17:14 -0400 |
commit | 6c18967e19b76d109c49d7c9e34dc8fe2bfb15ad (patch) | |
tree | 798d6dafbd07b429df05e56a34697c62b51719d1 /src | |
parent | a8a9ea33b3e9b7d072f0843ba3bb709a4a3eb7a9 (diff) |
SELECTing arbitrary expressions
Diffstat (limited to 'src')
-rw-r--r-- | src/elaborate.sml | 3 | ||||
-rw-r--r-- | src/lacweb.grm | 70 |
2 files changed, 41 insertions, 32 deletions
diff --git a/src/elaborate.sml b/src/elaborate.sml index 97643170..9ea2ab58 100644 --- a/src/elaborate.sml +++ b/src/elaborate.sml @@ -1520,7 +1520,8 @@ fun elabExp (env, denv) (eAll as (e, loc)) = let val r = ref NONE in - ((L'.EUnif r, loc), ran, [TypeClass (env, dom, r, loc)]) + ((L'.EApp (e1', (L'.EUnif r, loc)), loc), + ran, [TypeClass (env, dom, r, loc)]) end | SOME pf => ((L'.EApp (e1', pf), loc), ran, gs1 @ gs2 @ enD gs3 @ enD gs4) end diff --git a/src/lacweb.grm b/src/lacweb.grm index 4352fa8c..8c6199dd 100644 --- a/src/lacweb.grm +++ b/src/lacweb.grm @@ -42,6 +42,7 @@ fun entable t = datatype select_item = Field of con * con + | Exp of con * exp datatype select = Star @@ -56,25 +57,27 @@ fun eqTnames ((c1, _), (c2, _)) = | (CName x1, CName x2) => x1 = x2 | _ => false -fun amend_select loc (si, tabs) = - let - val (tx, c) = case si of - Field (tx, fx) => (tx, (CRecord ([(fx, (CWild (KType, loc), loc))]), loc)) - - val (tabs, found) = ListUtil.foldlMap (fn ((tx', c'), found) => - if eqTnames (tx, tx') then - ((tx', (CConcat (c, c'), loc)), true) - else - ((tx', c'), found)) - false tabs - in - if found then - () - else - ErrorMsg.errorAt loc "Select of field from unbound table"; - - tabs - end +fun amend_select loc (si, (tabs, exps)) = + case si of + Field (tx, fx) => + let + val c = (CRecord ([(fx, (CWild (KType, loc), loc))]), loc) + + val (tabs, found) = ListUtil.foldlMap (fn ((tx', c'), found) => + if eqTnames (tx, tx') then + ((tx', (CConcat (c, c'), loc)), true) + else + ((tx', c'), found)) + false tabs + in + if found then + () + else + ErrorMsg.errorAt loc "Select of field from unbound table"; + + (tabs, exps) + end + | Exp (c, e) => (tabs, (c, e) :: exps) fun amend_group loc (gi, tabs) = let @@ -681,22 +684,24 @@ query1 : SELECT select FROM tables wopt gopt hopt (let val loc = s (SELECTleft, tablesright) - val sel = + val (sel, exps) = case select of - Star => map (fn (nm, _) => - (nm, (CTuple [(CWild (KRecord (KType, loc), loc), - loc), - (CRecord [], loc)], - loc))) tables + Star => (map (fn (nm, _) => + (nm, (CTuple [(CWild (KRecord (KType, loc), loc), + loc), + (CRecord [], loc)], + loc))) tables, + []) | Items sis => let val tabs = map (fn (nm, _) => (nm, (CRecord [], loc))) tables - val tabs = foldl (amend_select loc) tabs sis + val (tabs, exps) = foldl (amend_select loc) (tabs, []) sis in - map (fn (nm, c) => (nm, - (CTuple [c, - (CWild (KRecord (KType, loc), loc), - loc)], loc))) tabs + (map (fn (nm, c) => (nm, + (CTuple [c, + (CWild (KRecord (KType, loc), loc), + loc)], loc))) tabs, + exps) end val sel = (CRecord sel, loc) @@ -733,7 +738,9 @@ query1 : SELECT select FROM tables wopt gopt hopt hopt), ((CName "SelectFields", loc), (ECApp ((EVar (["Basis"], "sql_subset"), loc), - sel), loc))], loc) + sel), loc)), + ((CName "SelectExps", loc), + (ERecord exps, loc))], loc) val e = (EApp (e, re), loc) in @@ -762,6 +769,7 @@ fident : CSYMBOL (CName CSYMBOL, s (CSYMBOLleft, CSYMBOLr | LBRACE cexp RBRACE (cexp) seli : tident DOT fident (Field (tident, fident)) + | sqlexp AS fident (Exp (fident, sqlexp)) selis : seli ([seli]) | seli COMMA selis (seli :: selis) |