Changeset: 9c8c54a87acf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c8c54a87acf
Added Files:
sql/test/merge-statements/Tests/mergestmt04.sql
sql/test/merge-statements/Tests/mergestmt04.stable.err
sql/test/merge-statements/Tests/mergestmt04.stable.out
sql/test/miscellaneous/Tests/groupings.sql
sql/test/miscellaneous/Tests/groupings.stable.err
sql/test/miscellaneous/Tests/groupings.stable.out
Modified Files:
monetdb5/modules/atoms/str.c
monetdb5/optimizer/opt_json.c
monetdb5/optimizer/opt_macro.c
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_pipes.c
monetdb5/optimizer/opt_pushselect.c
sql/backends/monet5/UDF/pyapi3/connection3.c
sql/backends/monet5/sql.c
sql/test/merge-statements/Tests/All
sql/test/miscellaneous/Tests/All
Branch: default
Log Message:
Merged with linear-hashing
diffs (truncated from 544 to 300 lines):
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3108,14 +3108,12 @@ strEpilogue(void *ret)
// (1 + ((UC) > 0x7F) + ((UC) > 0x7FF) + ((UC) > 0xFFFF))
static inline size_t
-UTF8_strlen(const char *s)
+UTF8_strlen(const char *s) /* This function assumes, s is never nil */
{
size_t pos = 0;
UTF8_assert(s);
-
- if (strNil(s))
- return 1;
+ assert(!strNil(s));
while (*s) {
/* just count leading bytes of encoded code points; only works
diff --git a/monetdb5/optimizer/opt_json.c b/monetdb5/optimizer/opt_json.c
--- a/monetdb5/optimizer/opt_json.c
+++ b/monetdb5/optimizer/opt_json.c
@@ -44,6 +44,7 @@ OPTjsonImplementation(Client cntxt, MalB
q = addArgument(mb, q, bu);
q = addArgument(mb, q, br);
q = addArgument(mb, q, bj);
+ pushInstruction(mb,q);
j = getArg(q,0);
p= getInstrPtr(mb,0);
setDestVar(q, newTmpVariable(mb, TYPE_str));
diff --git a/monetdb5/optimizer/opt_macro.c b/monetdb5/optimizer/opt_macro.c
--- a/monetdb5/optimizer/opt_macro.c
+++ b/monetdb5/optimizer/opt_macro.c
@@ -169,8 +169,11 @@ inlineMALblock(MalBlkPtr mb, int pc, Mal
/* copy the instruction and fix variable references */
ns[k] = copyInstruction(q);
- if( ns[k] == NULL)
+ if( ns[k] == NULL){
+ GDKfree(nv);
+ GDKfree(ns);
return -1;
+ }
for (n = 0; n < q->argc; n++)
getArg(ns[k], n) = nv[getArg(q, n)];
@@ -311,8 +314,11 @@ replaceMALblock(MalBlkPtr mb, int pc, Ma
p = getInstrPtr(mb, pc);
q = copyInstruction(getInstrPtr(mc, 0)); /* the signature */
- if( q == NULL)
+ if( q == NULL){
+ GDKfree(cvar);
+ GDKfree(mvar);
return -1;
+ }
q->token = ASSIGNsymbol;
mb->stmt[pc] = q;
diff --git a/monetdb5/optimizer/opt_mergetable.c
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -309,8 +309,10 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
for(j=1; j < mat[m].mi->argc; j++) {
if (overlap(ml, getArg(mat[e].mi, k),
getArg(mat[m].mi, j), k, j, 0)){
InstrPtr q = copyInstruction(p);
- if(!q)
+ if(!q){
+ freeInstruction(r);
return NULL;
+ }
/* remove last argument (inserts only
on last part) */
if (k < mat[m].mi->argc-1)
@@ -777,6 +779,7 @@ mat_join2(MalBlkPtr mb, InstrPtr p, matl
if(propagatePartnr(ml, getArg(mat[m].mi, k),
getArg(q,0), nr) ||
propagatePartnr(ml, getArg(mat[n].mi, j),
getArg(q,1), nr)) {
freeInstruction(r);
+ freeInstruction(l);
return -1;
}
@@ -1156,8 +1159,10 @@ mat_group_project(MalBlkPtr mb, InstrPtr
getArg(q,1) = getArg(mat[e].mi,k);
getArg(q,2) = getArg(mat[a].mi,k);
pushInstruction(mb,q);
- if(setPartnr(ml, getArg(mat[a].mi,k), getArg(q,0), k))
+ if(setPartnr(ml, getArg(mat[a].mi,k), getArg(q,0), k)){
+ freeInstruction(ai1);
return -1;
+ }
/* pack the result into a mat */
ai1 = addArgument(mb,ai1,getArg(q,0));
@@ -1202,6 +1207,7 @@ mat_group_aggr(MalBlkPtr mb, InstrPtr p,
InstrPtr q = copyInstruction(p);
if(!q) {
freeInstruction(ai1);
+ freeInstruction(ai10);
return -1;
}
@@ -1518,8 +1524,13 @@ mat_group_derive(MalBlkPtr mb, InstrPtr
pushInstruction(mb,q);
if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,0), i) ||
setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,1), i) ||
- setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,2), i))
+ setPartnr(ml, getArg(ml->v[b].mi,i), getArg(q,2), i)){
+ freeInstruction(r0);
+ freeInstruction(r1);
+ freeInstruction(r2);
+ freeInstruction(attr);
return -1;
+ }
/* add result to mats */
r0 = addArgument(mb,r0,getArg(q,0));
@@ -1530,8 +1541,13 @@ mat_group_derive(MalBlkPtr mb, InstrPtr
getArg(r, 0) = newTmpVariable(mb, atp);
r = addArgument(mb, r, getArg(q,1));
r = addArgument(mb, r, getArg(ml->v[b].mi,i));
- if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(r,0), i))
+ if(setPartnr(ml, getArg(ml->v[b].mi,i), getArg(r,0), i)){
+ freeInstruction(r0);
+ freeInstruction(r1);
+ freeInstruction(r2);
+ freeInstruction(attr);
return -1;
+ }
pushInstruction(mb,r);
attr = addArgument(mb, attr, getArg(r, 0));
@@ -1663,8 +1679,10 @@ mat_topn(MalBlkPtr mb, InstrPtr p, matli
cst.val.lval= 0;
cst.len = 0;
zero = defConstant(mb, cst.vtype, &cst);
- if( zero < 0)
+ if( zero < 0){
+ freeInstruction(pck);
return -1;
+ }
}
assert( (n<0 && o<0) ||
(ml->v[m].mi->argc == ml->v[n].mi->argc &&
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -486,7 +486,7 @@ compileOptimizer(Client cntxt, const cha
compiled =
findSymbol(cntxt->usermodule,getName("optimizer"), getName(pipes[j].name));
if( compiled)
pipes[j].mb =
compiled->def;
- }
+ } else break;
}
}
if (msg != MAL_SUCCEED ||
diff --git a/monetdb5/optimizer/opt_pushselect.c
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -433,6 +433,7 @@ OPTpushselectImplementation(Client cntxt
GDKfree(slices);
GDKfree(rslices);
GDKfree(old);
+ GDKfree(vars);
throw(MAL,"optimizer.pushselect", SQLSTATE(HY013) MAL_MALLOC_FAIL);
}
diff --git a/sql/backends/monet5/UDF/pyapi3/connection3.c
b/sql/backends/monet5/UDF/pyapi3/connection3.c
--- a/sql/backends/monet5/UDF/pyapi3/connection3.c
+++ b/sql/backends/monet5/UDF/pyapi3/connection3.c
@@ -106,6 +106,7 @@ static PyObject *_connection_execute(Py_
}
} else {
PyErr_Format(PyExc_Exception, "Loopback queries are not
supported in parallel.");
+ GDKfree(query);
return NULL;
}
}
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2789,8 +2789,10 @@ mvc_export_row_wrap( Client cntxt, MalBl
goto wrapup_result_set;
}
}
- if (mvc_export_result(cntxt->sqlcontext, s, res, strcmp(filename,
"stdout") == 0, mb->starttime, mb->optimize))
+ if (mvc_export_result(cntxt->sqlcontext, s, res, strcmp(filename,
"stdout") == 0, mb->starttime, mb->optimize)){
msg = createException(SQL, "sql.resultset", SQLSTATE(45000)
"Result set construction failed");
+ goto wrapup_result_set;
+ }
mb->starttime = 0;
mb->optimize = 0;
if (onclient) {
diff --git a/sql/test/merge-statements/Tests/All
b/sql/test/merge-statements/Tests/All
--- a/sql/test/merge-statements/Tests/All
+++ b/sql/test/merge-statements/Tests/All
@@ -2,3 +2,4 @@ mergestmt00
mergestmt01
mergestmt02
mergestmt03
+mergestmt04
diff --git a/sql/test/merge-statements/Tests/mergestmt04.sql
b/sql/test/merge-statements/Tests/mergestmt04.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-statements/Tests/mergestmt04.sql
@@ -0,0 +1,41 @@
+CREATE TABLE food_store (id INT, "name" TEXT, new_item BOOL);
+INSERT INTO food_store VALUES (1, 'bread', false), (2, 'coffee', false), (3,
'tea', false), (4, 'butter', false), (5, 'chocolate', false);
+
+CREATE TABLE releases (id INT, reason CLOB);
+INSERT INTO releases VALUES (5, 'too warm to eat chocolate'), (6, 'end of
chestnuts season');
+
+CREATE TABLE incoming (id INT, "name" CLOB);
+INSERT INTO incoming VALUES (6, 'ice cream');
+
+MERGE INTO food_store AS to_update USING releases AS food_updates
+ ON to_update.id = food_updates.id
+ WHEN MATCHED THEN DELETE;
+
+MERGE INTO food_store USING (SELECT id, "name" FROM incoming) AS new_food
+ ON food_store.id = new_food.id
+ WHEN NOT MATCHED THEN INSERT VALUES (new_food.id, new_food."name", true);
+
+SELECT id, "name", new_item FROM food_store;
+
+TRUNCATE incoming;
+INSERT INTO incoming VALUES (1, 'cookies'), (2, 'cake'), (7, 'peanuts');
+
+MERGE INTO food_store USING (SELECT id, "name" FROM incoming) AS food_updates
+ ON food_store.id = food_updates.id
+ WHEN NOT MATCHED THEN INSERT VALUES (food_updates.id, food_updates."name",
true)
+ WHEN MATCHED THEN UPDATE SET "name" = food_updates."name", new_item = true;
+
+SELECT id, "name", new_item FROM food_store;
+
+TRUNCATE releases;
+INSERT INTO releases VALUES (1, 'chocolate cookies'), (1, 'gluten cookies');
+
+MERGE INTO food_store USING (SELECT id, reason FROM releases) AS food_updates
+ ON food_store.id = food_updates.id
+ WHEN MATCHED THEN UPDATE SET new_item = true; --error, more than one row
match
+
+SELECT id, "name", new_item FROM food_store;
+
+DROP TABLE food_store;
+DROP TABLE releases;
+DROP TABLE incoming;
diff --git a/sql/test/merge-statements/Tests/mergestmt04.stable.err
b/sql/test/merge-statements/Tests/mergestmt04.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-statements/Tests/mergestmt04.stable.err
@@ -0,0 +1,18 @@
+stderr of test 'mergestmt04` in directory 'sql/test/merge-statements` itself:
+
+
+# 14:43:05 >
+# 14:43:05 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-100215" "--port=37878"
+# 14:43:05 >
+
+MAPI = (monetdb) /var/tmp/mtest-100215/.s.monetdb.37878
+QUERY = MERGE INTO food_store USING (SELECT id, reason FROM releases) AS
food_updates
+ ON food_store.id = food_updates.id
+ WHEN MATCHED THEN UPDATE SET new_item = true; --error, more than one
row match
+ERROR = !MERGE UPDATE: Multiple rows in the input relation 'food_updates'
match the same row in the target table 'sys.food_store'
+CODE = M0M29
+
+# 14:43:05 >
+# 14:43:05 > "Done."
+# 14:43:05 >
+
diff --git a/sql/test/merge-statements/Tests/mergestmt04.stable.out
b/sql/test/merge-statements/Tests/mergestmt04.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-statements/Tests/mergestmt04.stable.out
@@ -0,0 +1,77 @@
+stdout of test 'mergestmt04` in directory 'sql/test/merge-statements` itself:
+
+
+# 14:43:05 >
+# 14:43:05 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-100215" "--port=37878"
+# 14:43:05 >
+
+#CREATE TABLE food_store (id INT, name TEXT, new_item BOOL);
+#INSERT INTO food_store VALUES (1, 'bread', false), (2, 'coffee', false), (3,
'tea', false), (4, 'butter', false), (5, 'chocolate', false);
+[ 5 ]
+#CREATE TABLE releases (id INT, reason CLOB);
+#INSERT INTO releases VALUES (5, 'too warm to eat chocolate'), (6, 'end of
chestnuts season');
+[ 2 ]
+#CREATE TABLE incoming (id INT, name CLOB);
+#INSERT INTO incoming VALUES (6, 'ice cream');
+[ 1 ]
+#MERGE INTO food_store AS to_update USING releases AS food_updates
+# ON to_update.id = food_updates.id
+# WHEN MATCHED THEN DELETE;
+[ 1 ]
+#MERGE INTO food_store USING (SELECT id, name FROM incoming) AS new_food
+# ON food_store.id = new_food.id
+# WHEN NOT MATCHED THEN INSERT VALUES (new_food.id, new_food.name, true);
+[ 1 ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list