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