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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to