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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list