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

Reply via email to