diff options
author | Adam Chlipala <adam@chlipala.net> | 2011-02-03 21:04:12 -0500 |
---|---|---|
committer | Adam Chlipala <adam@chlipala.net> | 2011-02-03 21:04:12 -0500 |
commit | 58c927541d3960c0bca5636c05e499246d3cecef (patch) | |
tree | 0d7561a584be03f1fbd5a3297a101e3c54bf7ba9 | |
parent | 426f4427ff7a2d58e86f533ad8bb79a0b6b89d31 (diff) |
Subqueries may always return NULL
-rw-r--r-- | doc/manual.tex | 4 | ||||
-rw-r--r-- | lib/ur/basis.urs | 5 | ||||
-rw-r--r-- | src/monoize.sml | 13 |
3 files changed, 13 insertions, 9 deletions
diff --git a/doc/manual.tex b/doc/manual.tex index ad6edeb9..c39d92df 100644 --- a/doc/manual.tex +++ b/doc/manual.tex @@ -1726,8 +1726,8 @@ $$\begin{array}{l} Any SQL query that returns single columns may be turned into a subquery expression. $$\begin{array}{l} -\mt{val} \; \mt{sql\_subquery} : \mt{tables} ::: \{\{\mt{Type}\}\} \to \mt{agg} ::: \{\{\mt{Type}\}\} \to \mt{exps} ::: \{\mt{Type}\} \to \mt{nm} ::: \mt{Name} \to \mt{t} ::: \mt{Type} \\ -\hspace{.1in} \to \mt{sql\_query} \; \mt{tables} \; \mt{agg} \; [\mt{nm} = \mt{t}] \to \mt{sql\_exp} \; \mt{tables} \; \mt{agg} \; \mt{exps} \; \mt{t} +\mt{val} \; \mt{sql\_subquery} : \mt{tables} ::: \{\{\mt{Type}\}\} \to \mt{agg} ::: \{\{\mt{Type}\}\} \to \mt{exps} ::: \{\mt{Type}\} \to \mt{nm} ::: \mt{Name} \to \mt{t} ::: \mt{Type} \to \mt{nt} ::: \mt{Type} \\ +\hspace{.1in} \to \mt{nullify} \; \mt{t} \; \mt{nt} \to \mt{sql\_query} \; \mt{tables} \; \mt{agg} \; [\mt{nm} = \mt{t}] \to \mt{sql\_exp} \; \mt{tables} \; \mt{agg} \; \mt{exps} \; \mt{nt} \end{array}$$ \texttt{FROM} clauses are specified using a type family, whose arguments are the free table variables and the table variables bound by this clause. diff --git a/lib/ur/basis.urs b/lib/ur/basis.urs index da703d40..795b4f9a 100644 --- a/lib/ur/basis.urs +++ b/lib/ur/basis.urs @@ -529,9 +529,10 @@ val sql_nullable : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} -> -> sql_exp tables agg exps t -> sql_exp tables agg exps (option t) -val sql_subquery : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} -> nm ::: Name -> t ::: Type +val sql_subquery : tables ::: {{Type}} -> agg ::: {{Type}} -> exps ::: {Type} -> nm ::: Name -> t ::: Type -> nt ::: Type + -> nullify t nt -> sql_query tables agg [] [nm = t] - -> sql_exp tables agg exps t + -> sql_exp tables agg exps nt (*** Executing queries *) diff --git a/src/monoize.sml b/src/monoize.sml index de518c81..9f76dbee 100644 --- a/src/monoize.sml +++ b/src/monoize.sml @@ -2796,7 +2796,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) = (L.ECApp ( (L.ECApp ( (L.ECApp ( - (L.EFfi ("Basis", "sql_subquery"), _), + (L.ECApp ( + (L.EFfi ("Basis", "sql_subquery"), _), + _), _), _), _), _), _), _), _), @@ -2806,10 +2808,11 @@ fun monoExp (env, st, fm) (all as (e, loc)) = val s = (L'.TFfi ("Basis", "string"), loc) fun sc s = (L'.EPrim (Prim.String s), loc) in - ((L'.EAbs ("x", s, s, - strcat [sc "(", - (L'.ERel 0, loc), - sc ")"]), loc), + ((L'.EAbs ("_", (L'.TRecord [], loc), (L'.TFun (s, s), loc), + (L'.EAbs ("x", s, s, + strcat [sc "(", + (L'.ERel 0, loc), + sc ")"]), loc)), loc), fm) end |