Changeset: 6638dd212363 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6638dd212363
Modified Files:
        monetdb5/extras/jaql/Tests/transform00.mal
        monetdb5/extras/jaql/Tests/transform00.stable.out
        monetdb5/extras/jaql/jaqlgencode.c
Branch: jacqueline
Log Message:

transform: fix object or array creation with more than one member

due to ids not being "reserved" we accidentially overwrote previous
members in case of more columns, leading to weird results


diffs (138 lines):

diff --git a/monetdb5/extras/jaql/Tests/transform00.mal 
b/monetdb5/extras/jaql/Tests/transform00.mal
--- a/monetdb5/extras/jaql/Tests/transform00.mal
+++ b/monetdb5/extras/jaql/Tests/transform00.mal
@@ -10,3 +10,10 @@ jaql.x("[1,2,3] -> transform ($ * 2.0) /
 jaql.x("[1,2,3] -> transform [$, $];");
 jaql.x("[1,2,3] -> transform {\"value\":$};");
 jaql.x("[1,2,3] -> transform {\"value\":$ + $};");
+
+jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.a};");
+jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.b};");
+jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.c};");
+jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.a};");
+jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.b};");
+jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.a,$.b};");
diff --git a/monetdb5/extras/jaql/Tests/transform00.stable.out 
b/monetdb5/extras/jaql/Tests/transform00.stable.out
--- a/monetdb5/extras/jaql/Tests/transform00.stable.out
+++ b/monetdb5/extras/jaql/Tests/transform00.stable.out
@@ -29,6 +29,12 @@ function user.main():void;
     jaql.x("[1,2,3] -> transform [$, $];");
     jaql.x("[1,2,3] -> transform {\"value\":$};");
     jaql.x("[1,2,3] -> transform {\"value\":$ + $};");
+    jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.a};");
+    jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.b};");
+    jaql.x("[{\"a\":1},{\"b\":2}] -> transform {$.c};");
+    jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.a};");
+    jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.b};");
+    jaql.x("[{\"a\":1,\"b\":3},{\"b\":2}] -> transform {$.a,$.b};");
 end main;
 [ 4, 4, 4 ]
 [ { "value": 4 }, { "value": 4 }, { "value": 4 } ]
@@ -42,6 +48,12 @@ end main;
 [ [ 1, 1 ], [ 2, 2 ], [ 3, 3 ] ]
 [ { "value": 1 }, { "value": 2 }, { "value": 3 } ]
 [ { "value": 2 }, { "value": 4 }, { "value": 6 } ]
+[ { "a": 1 }, {  } ]
+[ { "b": 2 }, {  } ]
+[ {  }, {  } ]
+[ { "a": 1 }, {  } ]
+[ { "b": 3 }, { "b": 2 } ]
+[ { "a": 1, "b": 3 }, { "b": 2 } ]
 
 # 21:27:13 >  
 # 21:27:13 >  "Done."
diff --git a/monetdb5/extras/jaql/jaqlgencode.c 
b/monetdb5/extras/jaql/jaqlgencode.c
--- a/monetdb5/extras/jaql/jaqlgencode.c
+++ b/monetdb5/extras/jaql/jaqlgencode.c
@@ -1617,14 +1617,38 @@ dumpvariabletransformation(MalBlkPtr mb,
                        g = 1;
                case j_json_arr:
                        g++;
-                       a = -1;
+
+                       f = dumpnextid(mb, *j1);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, markHRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, elems);
+                       q = pushArgument(mb, q, f);
+                       d = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, projectRef);
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, d);
+                       q = pushChr(mb, q, g == 2 ? 'o' : 'a');
+                       a = getArg(q, 0);
+                       pushInstruction(mb, q);
+                       q = newInstruction(mb, ASSIGNsymbol);
+                       setModuleId(q, algebraRef);
+                       setFunctionId(q, putName("kunion", 6));
+                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
+                       q = pushArgument(mb, q, *j1);
+                       q = pushArgument(mb, q, a);
+                       *j1 = getArg(q, 0);
+                       pushInstruction(mb, q);
+
                        c = -1;
                        t = t->tval1;
                        while (t != NULL) {
                                b = dumpvariabletransformation(mb, t, elems,
                                                j1, j2, j3, j4, j5, j6, j7);
-                               if (a == -1)
-                                       a = dumpnextid(mb, *j1);
                                q = newInstruction(mb, ASSIGNsymbol);
                                setModuleId(q, batRef);
                                setFunctionId(q, reverseRef);
@@ -1637,7 +1661,7 @@ dumpvariabletransformation(MalBlkPtr mb,
                                setFunctionId(q, markHRef);
                                q = pushReturn(mb, q, newTmpVariable(mb, 
TYPE_any));
                                q = pushArgument(mb, q, b);
-                               q = pushArgument(mb, q, a);
+                               q = pushArgument(mb, q, f);
                                b = getArg(q, 0);
                                pushInstruction(mb, q);
                                if (c == -1) {
@@ -1655,8 +1679,6 @@ dumpvariabletransformation(MalBlkPtr mb,
                                }
                                t = t->next;
                        }
-                       if (a == -1)
-                               a = dumpnextid(mb, *j1);
 
                        if (c != -1) {
                                /* can have duplicates, see above */
@@ -1681,31 +1703,6 @@ dumpvariabletransformation(MalBlkPtr mb,
                                pushInstruction(mb, q);
                        }
 
-                       q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
-                       setFunctionId(q, markHRef);
-                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, elems);
-                       q = pushArgument(mb, q, a);
-                       d = getArg(q, 0);
-                       pushInstruction(mb, q);
-                       q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
-                       setFunctionId(q, projectRef);
-                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, d);
-                       q = pushChr(mb, q, g == 2 ? 'o' : 'a');
-                       a = getArg(q, 0);
-                       pushInstruction(mb, q);
-                       q = newInstruction(mb, ASSIGNsymbol);
-                       setModuleId(q, algebraRef);
-                       setFunctionId(q, putName("kunion", 6));
-                       q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any));
-                       q = pushArgument(mb, q, *j1);
-                       q = pushArgument(mb, q, a);
-                       *j1 = getArg(q, 0);
-                       pushInstruction(mb, q);
-
                        return a;
                default:
                        assert(0);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to