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 -- [email protected]
To unsubscribe send an email to [email protected]