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