Changeset: 39ca098a4c1c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=39ca098a4c1c
Modified Files:
monetdb5/mal/mal_builder.c
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_pushselect.c
sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.py
sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out.single
sql/test/bugs/Tests/select_select_bug.stable.out
Branch: default
Log Message:
merged with jun2016
diffs (196 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);
@@ -1731,8 +1750,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) &&
@@ -1741,8 +1760,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;
char buf[256];
@@ -456,9 +457,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;
}
@@ -480,17 +485,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));
+ getArg(r, 0) = getArg(p, 0);
setVarCList(mb,getArg(r,0));
getArg(r, 1) = getArg(s, 1);
- cst.vtype = getArgType(mb, r, 2);
- cst.val.lval = 0;
- cst.len = 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 */
@@ -498,8 +501,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..)
*
@@ -565,6 +595,8 @@ OPTpushselectImplementation(Client cntxt
if (old[i])
pushInstruction(mb,old[i]);
GDKfree(vars);
+ GDKfree(slices);
+ GDKfree(rslices);
GDKfree(old);
/* Defense line against incorrect plans */
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)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list