Changeset: 5bf70c350bf3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5bf70c350bf3 Modified Files: monetdb5/mal/mal_builder.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_pushselect.c sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py sql/test/bugs/Tests/select_select_bug.stable.out Branch: Jun2016 Log Message:
fixed problems with push down of (sub)slice diffs (208 lines): diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c --- a/monetdb5/mal/mal_builder.c +++ b/monetdb5/mal/mal_builder.c @@ -96,7 +96,7 @@ newFcnCall(MalBlkPtr mb, char *mod, char InstrPtr newComment(MalBlkPtr mb, const char *val) { - InstrPtr q = newInstruction(NULL,REMsymbol); + InstrPtr q = newInstruction(mb, REMsymbol); ValRecord cst; if (q == NULL) 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 @@ -238,8 +238,9 @@ mat_set_prop(matlist_t *ml, MalBlkPtr mb static InstrPtr mat_delta(matlist_t *ml, MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int n, int o, int e, int mvar, int nvar, int ovar, int evar) { - int tpe, k, j, is_subdelta = (getFunctionId(p) == subdeltaRef); + int tpe, k, j, is_subdelta = (getFunctionId(p) == subdeltaRef), is_projectdelta = (getFunctionId(p) == projectdeltaRef); InstrPtr r = NULL; + int pushed = 0; //printf("# %s.%s(%d,%d,%d,%d)", getModuleId(p), getFunctionId(p), m, n, o, e); @@ -303,7 +304,24 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I setPartnr(ml, is_subdelta?getArg(mat[m].mi, k):-1, getArg(q,0), k); r = pushArgument(mb, r, getArg(q, 0)); } + if (evar == 1 && e >= 0 && mat[e].type == mat_slc && is_projectdelta) { + InstrPtr q = newInstruction(mb, ASSIGNsymbol); + + setModuleId(q, algebraRef); + setFunctionId(q, projectionRef); + getArg(q, 0) = getArg(r, 0); + q = pushArgument(mb, q, getArg(mat[e].mi, 0)); + getArg(r, 0) = newTmpVariable(mb, tpe); + q = pushArgument(mb, q, getArg(r, 0)); + pushInstruction(mb, r); + pushInstruction(mb, q); + pushed = 1; + r = q; + } } + mat_add_var(ml, r, NULL, getArg(r, 0), mat_type(mat, m), -1, -1, pushed); + if (pushed) + mat[ml->top-1].packed = 1; return r; } @@ -1426,6 +1444,7 @@ mat_topn(MalBlkPtr mb, InstrPtr p, matli pushInstruction(mb,r); q = copyInstruction(p); + setFunctionId(q, subsliceRef); if (ml->v[m].type != mat_tpn || is_slice) getArg(q,1) = getArg(r,0); pushInstruction(mb,q); @@ -1729,8 +1748,8 @@ OPTmergetableImplementation(Client cntxt (n=is_a_mat(getArg(p,fn), &ml)) >= 0 && (o=is_a_mat(getArg(p,fo), &ml)) >= 0){ if ((r = mat_delta(&ml, mb, p, ml.v, m, n, o, -1, fm, fn, fo, 0)) != NULL) - mat_add(&ml, r, mat_type(ml.v, m), getFunctionId(p)); - actions++; + actions++; + continue; } if (match == 4 && bats == 5 && isDelta(p) && @@ -1739,8 +1758,7 @@ OPTmergetableImplementation(Client cntxt (o=is_a_mat(getArg(p,fo), &ml)) >= 0 && (e=is_a_mat(getArg(p,fe), &ml)) >= 0){ if ((r = mat_delta(&ml, mb, p, ml.v, m, n, o, e, fm, fn, fo, fe)) != NULL) - mat_add(&ml, r, mat_type(ml.v, m), getFunctionId(p)); - actions++; + actions++; continue; } 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 @@ -131,7 +131,8 @@ no_updates(InstrPtr *old, int *vars, int int OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { - int i, j, limit, slimit, actions=0, *vars, push_down_delta = 0, nr_topn = 0, nr_likes = 0; + int i, j, limit, slimit, actions=0, *vars, *slices = NULL, push_down_delta = 0, nr_topn = 0, nr_likes = 0; + char *rslices = NULL; InstrPtr p, *old; subselect_t subselects; @@ -454,9 +455,13 @@ OPTpushselectImplementation(Client cntxt slimit= mb->ssize; old = mb->stmt; - if (newMalBlkStmt(mb, mb->stop+(5*push_down_delta)) <0 ) { + slices = (int*) GDKzalloc(sizeof(int)* mb->vtop); + rslices = (char*) GDKzalloc(sizeof(char)* mb->vtop); + if (!slices || !rslices || newMalBlkStmt(mb, mb->stop+(5*push_down_delta)) <0 ) { mb->stmt = old; GDKfree(vars); + GDKfree(slices); + GDKfree(rslices); return actions; } @@ -478,17 +483,15 @@ OPTpushselectImplementation(Client cntxt if (getModuleId(q) == sqlRef && getFunctionId(q) == projectdeltaRef) { InstrPtr r = copyInstruction(p); InstrPtr s = copyInstruction(q); - ValRecord cst; + /* keep new output of slice */ + slices[getArg(s, 1)] = getArg(p, 0); + rslices[getArg(p,0)] = 1; /* slice the candidates */ setFunctionId(r, sliceRef); - getArg(r, 0) = newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid)); + getArg(r, 0) = getArg(p, 0); setVarCList(mb,getArg(r,0)); getArg(r, 1) = getArg(s, 1); - cst.vtype = getArgType(mb, r, 2); - cst.len = 0; - cst.val.wval = 0; - getArg(r, 2) = defConstant(mb, cst.vtype, &cst); /* start from zero */ pushInstruction(mb,r); /* dummy result for the old q, will be removed by deadcode optimizer */ @@ -496,8 +499,35 @@ OPTpushselectImplementation(Client cntxt getArg(s, 1) = getArg(r, 0); /* use result of subslice */ pushInstruction(mb, s); + + freeInstruction(p); + old[i] = r; + continue; } } + /* Leftfetchjoins involving rewriten sliced candidates ids need to be flattend + * l = projection(t, c); => l = c; + * and + * l = projection(s, ntids); => l = s; + */ + else if (getModuleId(p) == algebraRef && getFunctionId(p) == projectionRef) { + int var = getArg(p, 1); + InstrPtr r = old[vars[var]]; + + if (isSlice(r) && rslices[getArg(p,1)] != 0 && getArg(r, 0) == getArg(p, 1)) { + InstrPtr q = newAssignment(mb); + + getArg(q, 0) = getArg(p, 0); + (void) pushArgument(mb, q, getArg(p, 2)); + actions++; + freeInstruction(p); + continue; + } + } else if (p->argc >= 2 && slices[getArg(p, 1)] != 0) { + /* use new slice candidate list */ + getArg(p, 1) = slices[getArg(p, 1)]; + } + /* c = delta(b, uid, uvl, ins) * s = subselect(c, C1..) * @@ -561,6 +591,8 @@ OPTpushselectImplementation(Client cntxt if (old[i]) pushInstruction(mb,old[i]); GDKfree(vars); + GDKfree(slices); + GDKfree(rslices); GDKfree(old); return actions; } diff --git a/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py b/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py --- a/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py +++ b/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py @@ -7,7 +7,8 @@ import sys s = process.server(stdin = process.PIPE, stdout = process.PIPE, stderr = process.PIPE) c = process.client('sql', stdin = process.PIPE, stdout = process.PIPE, stderr = process.PIPE) -out, err = c.communicate('''create table table3282 (i int); +out, err = c.communicate('''start transaction; +create table table3282 (i int); insert into table3282 values (0); insert into table3282 select * from table3282; insert into table3282 select * from table3282; @@ -31,6 +32,7 @@ insert into table3282 select * from tabl insert into table3282 select * from table3282; insert into table3282 select * from table3282; select * from table3282 offset 2097140; +commit; ''') sys.stdout.write(out) sys.stderr.write(err) diff --git a/sql/test/bugs/Tests/select_select_bug.stable.out b/sql/test/bugs/Tests/select_select_bug.stable.out --- a/sql/test/bugs/Tests/select_select_bug.stable.out +++ b/sql/test/bugs/Tests/select_select_bug.stable.out @@ -29,7 +29,7 @@ Ready. #SELECT (SELECT current_timestamp), count(DISTINCT mmsi) FROM vessels; % .L1, sys.L2 # table_name % L1, L2 # name -% tinyint, wrd # type +% tinyint, bigint # type % 1, 1 # length [ 1, 0 ] #drop table vessels; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list