diff src/prepare.sml @ 486:8e055bbbd28b

Remove some allocation
author Adam Chlipala <adamc@hcoop.net>
date Sun, 09 Nov 2008 18:19:47 -0500
parents 4efab85405be
children 0fd65c50e0e2
line wrap: on
line diff
--- a/src/prepare.sml	Sun Nov 09 17:27:34 2008 -0500
+++ b/src/prepare.sml	Sun Nov 09 18:19:47 2008 -0500
@@ -176,13 +176,21 @@
         end
 
       | EQuery {exps, tables, rnum, state, query, body, initial, ...} =>
-        (case prepString (query, [], 0) of
-             NONE => (e, sns)
-           | SOME (ss, n) =>
-             ((EQuery {exps = exps, tables = tables, rnum = rnum,
-                       state = state, query = query, body = body,
-                       initial = initial, prepared = SOME (#2 sns)}, loc),
-              ((String.concat (rev ss), n) :: #1 sns, #2 sns + 1)))
+        let
+            val (body, sns) = prepExp (body, sns)
+        in
+            case prepString (query, [], 0) of
+                NONE =>
+                ((EQuery {exps = exps, tables = tables, rnum = rnum,
+                          state = state, query = query, body = body,
+                          initial = initial, prepared = SOME (#2 sns)}, loc),
+                 sns)
+              | SOME (ss, n) =>
+                ((EQuery {exps = exps, tables = tables, rnum = rnum,
+                          state = state, query = query, body = body,
+                          initial = initial, prepared = SOME (#2 sns)}, loc),
+                 ((String.concat (rev ss), n) :: #1 sns, #2 sns + 1))
+        end
 
       | EDml {dml, ...} =>
         (case prepString (dml, [], 0) of
@@ -193,8 +201,15 @@
 
       | ENextval {seq, ...} =>
         let
-            val s = (EFfiApp ("Basis", "strcat", [seq, (EPrim (Prim.String "')"), loc)]), loc)
-            val s = (EFfiApp ("Basis", "strcat", [(EPrim (Prim.String "SELECT NEXTVAL('"), loc), s]), loc)
+            val s = case seq of
+                        (EPrim (Prim.String s), loc) =>
+                        (EPrim (Prim.String ("SELECT NEXTVAL('" ^ s ^ "')")), loc)
+                      | _ =>
+                        let
+                            val s' = (EFfiApp ("Basis", "strcat", [seq, (EPrim (Prim.String "')"), loc)]), loc)
+                        in
+                            (EFfiApp ("Basis", "strcat", [(EPrim (Prim.String "SELECT NEXTVAL('"), loc), s']), loc)
+                        end
         in
             case prepString (s, [], 0) of
                 NONE => (e, sns)