changeset 1421:3dab4696d116

Subqueries may always return NULL
author Adam Chlipala <adam@chlipala.net>
date Thu, 03 Feb 2011 21:04:12 -0500
parents 146b69c53304
children 07ef5771568d
files doc/manual.tex lib/ur/basis.urs src/monoize.sml
diffstat 3 files changed, 13 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/doc/manual.tex	Thu Feb 03 11:12:48 2011 -0500
+++ b/doc/manual.tex	Thu Feb 03 21:04:12 2011 -0500
@@ -1726,8 +1726,8 @@
 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.
--- a/lib/ur/basis.urs	Thu Feb 03 11:12:48 2011 -0500
+++ b/lib/ur/basis.urs	Thu Feb 03 21:04:12 2011 -0500
@@ -529,9 +529,10 @@
                    -> 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 *)
 
--- a/src/monoize.sml	Thu Feb 03 11:12:48 2011 -0500
+++ b/src/monoize.sml	Thu Feb 03 21:04:12 2011 -0500
@@ -2796,7 +2796,9 @@
              (L.ECApp (
               (L.ECApp (
                (L.ECApp (
-                (L.EFfi ("Basis", "sql_subquery"), _),
+                (L.ECApp (
+                 (L.EFfi ("Basis", "sql_subquery"), _),
+                 _), _),
                 _), _),
                _), _),
               _), _),
@@ -2806,10 +2808,11 @@
                 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