# HG changeset patch # User Adam Chlipala # Date 1220811316 14400 # Node ID 7204fab29486d070c35d53483fe7505dc34a942e # Parent bc89dfdbc49544ab972e45128579fa01b99df404 Parsing UPDATE diff -r bc89dfdbc495 -r 7204fab29486 lib/basis.urs --- a/lib/basis.urs Sun Sep 07 14:07:10 2008 -0400 +++ b/lib/basis.urs Sun Sep 07 14:15:16 2008 -0400 @@ -210,7 +210,8 @@ -> dml val update : changed ::: {Type} -> unchanged ::: {Type} -> changed ~ unchanged - -> $changed + -> $(fold (fn nm (t :: Type) acc => [nm] ~ acc => + [nm = sql_exp [T = changed ++ unchanged] [] [] t] ++ acc) [] changed) -> sql_table (changed ++ unchanged) -> sql_exp [T = changed ++ unchanged] [] [] bool -> dml diff -r bc89dfdbc495 -r 7204fab29486 src/urweb.grm --- a/src/urweb.grm Sun Sep 07 14:07:10 2008 -0400 +++ b/src/urweb.grm Sun Sep 07 14:15:16 2008 -0400 @@ -283,6 +283,7 @@ | texp of exp | fields of con list | sqlexps of exp list + | fsets of (con * exp) list %verbose (* print summary of errors *) @@ -747,6 +748,16 @@ (); (EApp (e, (ERecord (ListPair.zip (fields, sqlexps)), loc)), loc) end) + | LPAREN UPDATE texp SET fsets CWHERE sqlexp RPAREN + (let + val loc = s (LPARENleft, RPARENright) + + val e = (EVar (["Basis"], "update"), loc) + val e = (EApp (e, (ERecord fsets, loc)), loc) + val e = (EApp (e, texp), loc) + in + (EApp (e, sqlexp), loc) + end) | UNDER (EWild, s (UNDERleft, UNDERright)) @@ -759,6 +770,9 @@ sqlexps: sqlexp ([sqlexp]) | sqlexp COMMA sqlexps (sqlexp :: sqlexps) +fsets : fident EQ sqlexp ([(fident, sqlexp)]) + | fident EQ sqlexp COMMA fsets ((fident, sqlexp) :: fsets) + idents : ident ([ident]) | ident DOT idents (ident :: idents) diff -r bc89dfdbc495 -r 7204fab29486 tests/update.ur --- a/tests/update.ur Sun Sep 07 14:07:10 2008 -0400 +++ b/tests/update.ur Sun Sep 07 14:15:16 2008 -0400 @@ -1,5 +1,5 @@ table t1 : {A : int, B : string, C : float, D : bool} fun main () : transaction page = - () <- dml (update {B = "6", C = 7.0} t1 (WHERE T.A = 5)); + () <- dml (UPDATE t1 SET B = '6', C = 7.0 WHERE T.A = 5); return Updated.