Changeset: a686ed10439a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a686ed10439a
Modified Files:
        sql/backends/monet5/sql_statement.c
        sql/server/rel_updates.c
Branch: default
Log Message:

Merged with Jan2022


diffs (217 lines):

diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -1265,10 +1265,10 @@ addArgument(MalBlkPtr mb, InstrPtr p, in
        if (p->argc == p->maxarg) {
                pn = extendInstruction(mb, p);
 #ifndef NDEBUG
-               if (p != pn) {
-                       for (int i = mb->stop - 1; i >= 0; i--)
-                               assert(mb->stmt[i] != p);
-              }
+               if (p != pn) {
+                       for (int i = mb->stop - 1; i >= 0; i--)
+                               assert(mb->stmt[i] != p);
+               }
 #endif
                p = pn;
                if (mb->errors)
diff --git a/monetdb5/optimizer/opt_dict.c b/monetdb5/optimizer/opt_dict.c
--- a/monetdb5/optimizer/opt_dict.c
+++ b/monetdb5/optimizer/opt_dict.c
@@ -126,26 +126,26 @@ OPTdictImplementation(Client cntxt, MalB
                                                InstrPtr r = 
newInstructionArgs(mb, dictRef, thetaselectRef, 6);
 
                                                getArg(r, 0) = getArg(p, 0);
-                                               addArgument(mb, r, 
varisdict[k]);
-                                               addArgument(mb, r, getArg(p, 
2)); /* cand */
-                                               addArgument(mb, r, 
vardictvalue[k]);
-                                               addArgument(mb, r, getArg(p, 
3)); /* val */
-                                               addArgument(mb, r, getArg(p, 
4)); /* op */
+                                               r = addArgument(mb, r, 
varisdict[k]);
+                                               r = addArgument(mb, r, 
getArg(p, 2)); /* cand */
+                                               r = addArgument(mb, r, 
vardictvalue[k]);
+                                               r = addArgument(mb, r, 
getArg(p, 3)); /* val */
+                                               r = addArgument(mb, r, 
getArg(p, 4)); /* op */
                                                pushInstruction(mb,r);
                                        } else if (getFunctionId(p) == 
selectRef && p->argc == 9) {
                                                /* select (c, s, l, h, li, hi, 
anti, unknown ) */
                                                InstrPtr r = 
newInstructionArgs(mb, dictRef, selectRef, 10);
 
                                                getArg(r, 0) = getArg(p, 0);
-                                               addArgument(mb, r, 
varisdict[k]);
-                                               addArgument(mb, r, getArg(p, 
2)); /* cand */
-                                               addArgument(mb, r, 
vardictvalue[k]);
-                                               addArgument(mb, r, getArg(p, 
3)); /* l */
-                                               addArgument(mb, r, getArg(p, 
4)); /* h */
-                                               addArgument(mb, r, getArg(p, 
5)); /* li */
-                                               addArgument(mb, r, getArg(p, 
6)); /* hi */
-                                               addArgument(mb, r, getArg(p, 
7)); /* anti */
-                                               addArgument(mb, r, getArg(p, 
8)); /* unknown */
+                                               r = addArgument(mb, r, 
varisdict[k]);
+                                               r = addArgument(mb, r, 
getArg(p, 2)); /* cand */
+                                               r = addArgument(mb, r, 
vardictvalue[k]);
+                                               r = addArgument(mb, r, 
getArg(p, 3)); /* l */
+                                               r = addArgument(mb, r, 
getArg(p, 4)); /* h */
+                                               r = addArgument(mb, r, 
getArg(p, 5)); /* li */
+                                               r = addArgument(mb, r, 
getArg(p, 6)); /* hi */
+                                               r = addArgument(mb, r, 
getArg(p, 7)); /* anti */
+                                               r = addArgument(mb, r, 
getArg(p, 8)); /* unknown */
                                                pushInstruction(mb,r);
                                        } else {
                                                /* pos = select(col, cand, l, 
h, ...) with col = dict.decompress(o,u)
@@ -164,13 +164,13 @@ OPTdictImplementation(Client cntxt, MalB
                                                int tpe = getVarType(mb, 
varisdict[k]);
                                                InstrPtr s = 
newInstructionArgs(mb, dictRef, putName("convert"), 3);
                                                getArg(s, 0) = 
newTmpVariable(mb, tpe);
-                                               addArgument(mb, s, getArg(r, 
0));
+                                               s = addArgument(mb, s, 
getArg(r, 0));
                                                pushInstruction(mb,s);
 
                                                InstrPtr t = 
newInstructionArgs(mb, algebraRef, intersectRef, 9);
                                                getArg(t, 0) = getArg(p, 0);
-                                               addArgument(mb, t, 
varisdict[k]);
-                                               addArgument(mb, t, getArg(s, 
0));
+                                               t = addArgument(mb, t, 
varisdict[k]);
+                                               t = addArgument(mb, t, 
getArg(s, 0));
                                                if (has_cand)
                                                        t = addArgument(mb, t, 
getArg(p, 2));
                                                else
diff --git a/monetdb5/optimizer/opt_generator.c 
b/monetdb5/optimizer/opt_generator.c
--- a/monetdb5/optimizer/opt_generator.c
+++ b/monetdb5/optimizer/opt_generator.c
@@ -32,20 +32,20 @@ pushInstruction(mb,P);
                        p->argc = p->retc;\
                        q= newInstruction(0,calcRef, TPE##Ref);\
                        setDestVar(q, newTmpVariable(mb, TYPE_##TPE));\
-                       addArgument(mb,q,getArg(series[k],1));\
+                       q = addArgument(mb,q,getArg(series[k],1));\
                        typeChecker(cntxt->usermodule, mb, q, 0, TRUE);\
                        p = addArgument(mb,p, getArg(q,0));\
                        pushInstruction(mb,q);\
                        q= newInstruction(0,calcRef,TPE##Ref);\
                        setDestVar(q, newTmpVariable(mb, TYPE_##TPE));\
-                       addArgument(mb,q,getArg(series[k],2));\
+                       q = addArgument(mb,q,getArg(series[k],2));\
                        pushInstruction(mb,q);\
                        typeChecker(cntxt->usermodule, mb, q, 0, TRUE);\
                        p = addArgument(mb,p, getArg(q,0));\
                        if( p->argc == 4){\
                                q= newInstruction(0,calcRef,TPE##Ref);\
                                setDestVar(q, newTmpVariable(mb, TYPE_##TPE));\
-                               addArgument(mb,q,getArg(series[k],3));\
+                               q = addArgument(mb,q,getArg(series[k],3));\
                                typeChecker(cntxt->usermodule, mb, q, 0, TRUE);\
                                p = addArgument(mb,p, getArg(q,0));\
                                pushInstruction(mb,q);\
diff --git a/monetdb5/optimizer/opt_multiplex.c 
b/monetdb5/optimizer/opt_multiplex.c
--- a/monetdb5/optimizer/opt_multiplex.c
+++ b/monetdb5/optimizer/opt_multiplex.c
@@ -96,7 +96,7 @@ OPTexpandMultiplex(Client cntxt, MalBlkP
 
        /* resB := new(refBat) */
        for (i = 0; i < pci->retc; i++) {
-               q = newFcnCallArgs(mb, batRef, newRef, 2);
+               q = newFcnCallArgs(mb, batRef, newRef, 3);
                resB[i] = getArg(q, 0);
 
                tt = getBatType(getArgType(mb, pci, i));
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
@@ -646,7 +646,7 @@ OPTpushselectImplementation(Client cntxt
                                }
                                q = newAssignment(mb);
                                getArg(q, 0) = getArg(p, 0);
-                               (void) addArgument(mb, q, getArg(p, 2));
+                               q = addArgument(mb, q, getArg(p, 2));
                                if (nvars[getArg(p, 2)] > 0)
                                        getArg(q, 1) = nvars[getArg(p, 2)];
                                oclean[i] = 1;
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3020,7 +3020,7 @@ stmt_dependency_change(backend *be, sql_
 
        if (!t || cnt->nr < 0)
                return NULL;
-       q = newStmtArgs(mb, sqlRef, dependRef, 3);
+       q = newStmtArgs(mb, sqlRef, dependRef, 4);
        q = pushSchema(mb, q, t);
        q = pushStr(mb, q, t->base.name);
        q = pushArgument(mb, q, cnt->nr);
@@ -3047,7 +3047,7 @@ stmt_column_predicate(backend *be, sql_c
 
        if (!c)
                return NULL;
-       q = newStmtArgs(mb, sqlRef, predicateRef, 3);
+       q = newStmtArgs(mb, sqlRef, predicateRef, 4);
        q = pushSchema(mb, q, c->t);
        q = pushStr(mb, q, c->t->base.name);
        q = pushStr(mb, q, c->base.name);
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -323,6 +323,7 @@ rel_inserts(mvc *sql, sql_table *t, sql_
        sql_exp **inserts = insert_exp_array(sql, t, &len);
        list *exps = NULL;
        node *n, *m;
+       bool has_rel = false, all_values = true;
 
        if (r->exps) {
                if (!copy) {
@@ -334,6 +335,8 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' specified more than once", action, 
c->base.name);
                                if (!(inserts[c->colnr] = exp_check_type(sql, 
&c->type, r, e, type_equal)))
                                        return NULL;
+                               has_rel = (has_rel || exp_has_rel(e));
+                               all_values &= is_values(e);
                        }
                } else {
                        for (m = collist->h; m; m = m->next) {
@@ -345,6 +348,8 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                                        if (inserts[c->colnr])
                                                return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' specified more than once", action, 
c->base.name);
                                        inserts[c->colnr] = exp_ref(sql, e);
+                                       has_rel = has_rel || exp_has_rel(e);
+                                       all_values &= is_values(e);
                                }
                        }
                }
@@ -385,10 +390,32 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                        assert(inserts[c->colnr]);
                }
        }
-       /* now rewrite project exps in proper table order */
-       exps = new_exp_list(sql->sa);
-       for (i = 0; i<len; i++)
-               list_append(exps, inserts[i]);
+       /* rewrite into unions */
+       if (has_rel && rowcount && all_values) {
+               sql_rel *c = NULL;
+               for (size_t j = 0; j < rowcount; j++) {
+                       sql_rel *p = rel_project(sql->sa, NULL, 
sa_list(sql->sa));
+                       for (m = ol_first_node(t->columns); m; m = m->next) {
+                               sql_column *c = m->data;
+                               sql_exp *e = inserts[c->colnr];
+                               assert(is_values(e));
+                               list *vals = e->f;
+                               append(p->exps, list_fetch(vals, j));
+                       }
+                       if (c) {
+                               c = rel_setop(sql->sa, c, p, op_union);
+                               rel_setop_set_exps(sql, c, rel_projections(sql, 
c->l, NULL, 1, 1), false);
+                       } else
+                               c = p;
+               }
+               r->l = c;
+               exps = rel_projections(sql, r->l, NULL, 1, 1);
+       } else {
+               /* now rewrite project exps in proper table order */
+               exps = new_exp_list(sql->sa);
+               for (i = 0; i<len; i++)
+                       list_append(exps, inserts[i]);
+       }
        return exps;
 }
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to