Changeset: 9188bb6aecfe for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9188bb6aecfe
Modified Files:
        gdk/gdk_select.c
        monetdb5/modules/mal/pcre.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_pushselect.c
        sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
        sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_optimizer.c
        sql/storage/bat/bat_storage.c
        sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        sql/test/BugTracker-2009/Tests/explain_gives_crash.SF-2741829.stable.out
        
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        sql/test/BugTracker-2011/Tests/exists-select.Bug-2933.stable.out
        sql/test/BugTracker-2011/Tests/func_iter_vs_bulk.Bug-2826.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
Branch: default
Log Message:

Second part of pushing selects through delta handling.

fixed problems in subselect related to full (delta) candidate lists, but
only partial delta bats.


diffs (truncated from 2171 to 300 lines):

diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -170,9 +170,9 @@ BAT_hashselect(BAT *b, BAT *s, BAT *bn, 
                            "scanselect %s\n", BATgetId(b), BATcount(b), \
                            s ? BATgetId(s) : "NULL", anti, #TEST);     \
                while (p < q) {                                         \
-                       v = BUNtail(bi, p);                             \
+                       v = BUNtail(bi, p-off);                         \
                        if (TEST) {                                     \
-                               o = (oid) p + off;                      \
+                               o = (oid) p;                            \
                                bunfastins(bn, NULL, &o);               \
                        }                                               \
                        p++;                                            \
@@ -367,8 +367,8 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn, 
                        p += BUNfirst(b);
                        q += BUNfirst(b);
                } else {
-                       p = BUNfirst(b);
-                       q = BUNlast(b);
+                       p = BUNfirst(b) + off;
+                       q = BUNlast(b) + off;
                }
                switch(ATOMstorage(b->ttype) ){
                case TYPE_bte: SCANLOOP(bte); break;
@@ -673,11 +673,11 @@ BATsubselect(BAT *b, BAT *s, const void 
                        BUN first = SORTfndlast(b, nil);
                        /* match: [first..low) + [high..count) */
                        if (s) {
-                               oid o = (oid) first;
+                               oid o = (oid) first + b->H->seq;
                                first = SORTfndfirst(s, &o);
-                               o = (oid) low;
+                               o = (oid) low + b->H->seq;
                                low = SORTfndfirst(s, &o);
-                               o = (oid) high;
+                               o = (oid) high + b->H->seq;
                                high = SORTfndfirst(s, &o);
                                v = VIEWhead(BATmirror(s));
                        } else {
@@ -687,9 +687,9 @@ BATsubselect(BAT *b, BAT *s, const void 
                } else {
                        /* match: [low..high) */
                        if (s) {
-                               oid o = (oid) low;
+                               oid o = (oid) low + b->H->seq;
                                low = SORTfndfirst(s, &o);
-                               o = (oid) high;
+                               o = (oid) high + b->H->seq;
                                high = SORTfndfirst(s, &o);
                                v = VIEWhead(BATmirror(s));
                        } else {
diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -379,37 +379,37 @@ pcre_index(int *res, pcre * pattern, str
 /* these two defines are copies from gdk_select.c */
 
 /* scan select loop with candidates */
-#define candscanloop(TEST)                                                     
                        \
-       do {                                                                    
                                        \
-               ALGODEBUG fprintf(stderr,                                       
                        \
+#define candscanloop(TEST)                                                     
\
+       do {                                                                    
\
+               ALGODEBUG fprintf(stderr,                                       
\
                            "#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): "       
\
                            "scanselect %s\n", BATgetId(b), BATcount(b),        
\
-                           s ? BATgetId(s) : "NULL", anti, #TEST);             
        \
-               while (p < q) {                                                 
                                \
-                       o = *candlist++;                                        
                                \
-                       r = (BUN) (o - off);                                    
                        \
-                       v = BUNtail(bi, r);                                     
                                \
-                       if (TEST)                                               
                                        \
-                               bunfastins(bn, NULL, &o);                       
                        \
-                       p++;                                                    
                                        \
-               }                                                               
                                                \
+                           s ? BATgetId(s) : "NULL", anti, #TEST);             
\
+               while (p < q) {                                                 
\
+                       o = *candlist++;                                        
\
+                       r = (BUN) (o - off);                                    
\
+                       v = BUNtail(bi, r);                                     
\
+                       if (TEST)                                               
\
+                               bunfastins(bn, NULL, &o);                       
\
+                       p++;                                                    
\
+               }                                                               
\
        } while (0)
 
 /* scan select loop without candidates */
-#define scanloop(TEST)                                                         
                        \
-       do {                                                                    
                                        \
-               ALGODEBUG fprintf(stderr,                                       
                        \
+#define scanloop(TEST)                                                         
\
+       do {                                                                    
\
+               ALGODEBUG fprintf(stderr,                                       
\
                            "#BATsubselect(b=%s#"BUNFMT",s=%s,anti=%d): "       
\
                            "scanselect %s\n", BATgetId(b), BATcount(b),        
\
-                           s ? BATgetId(s) : "NULL", anti, #TEST);             
        \
-               while (p < q) {                                                 
                                \
-                       v = BUNtail(bi, p);                                     
                                \
-                       if (TEST) {                                             
                                        \
-                               o = (oid) p + off;                              
                                \
-                               bunfastins(bn, NULL, &o);                       
                        \
-                       }                                                       
                                                \
-                       p++;                                                    
                                        \
-               }                                                               
                                                \
+                           s ? BATgetId(s) : "NULL", anti, #TEST);             
\
+               while (p < q) {                                                 
\
+                       v = BUNtail(bi, p-off);                                 
\
+                       if (TEST) {                                             
\
+                               o = (oid) p;                                    
\
+                               bunfastins(bn, NULL, &o);                       
\
+                       }                                                       
\
+                       p++;                                                    
\
+               }                                                               
\
        } while (0)
 
 static str
@@ -483,8 +483,8 @@ pcre_likesubselect(BAT **bnp, BAT *b, BA
                        p += BUNfirst(b);
                        q += BUNfirst(b);
                } else {
-                       p = BUNfirst(b);
-                       q = BUNlast(b);
+                       p = BUNfirst(b) + off;
+                       q = BUNlast(b) + off;
                }
                if (anti)
                        scanloop(v && *v != '\200' &&
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -45,7 +45,8 @@ str batmmathRef;
 str bbpRef;
 str tidRef;
 str deltaRef;
-str delta_projectRef;
+str subdeltaRef;
+str projectdeltaRef;
 str binddbatRef;
 str bindidxRef;
 str bindRef;
@@ -280,7 +281,8 @@ void optimizerInit(void){
                bbpRef = putName("bbp",3);
                tidRef = putName("tid",3);
                deltaRef = putName("delta",5);
-               delta_projectRef = putName("delta_project",13);
+               subdeltaRef = putName("subdelta",8);
+               projectdeltaRef = putName("projectdelta",12);
                binddbatRef = putName("bind_dbat",9);
                bindidxRef = putName("bind_idxbat",11);
                bindRef = putName("bind",4);
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -44,7 +44,8 @@ opt_export  str batmmathRef;
 opt_export  str bbpRef;
 opt_export  str tidRef;
 opt_export  str deltaRef;
-opt_export  str delta_projectRef;
+opt_export  str subdeltaRef;
+opt_export  str projectdeltaRef;
 opt_export  str binddbatRef;
 opt_export  str bindidxRef;
 opt_export  str bindRef;
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
@@ -32,6 +32,18 @@ PushArgument(MalBlkPtr mb, InstrPtr p, i
        return p;
 }
 
+static InstrPtr
+RemoveArgument(InstrPtr p, int pos)
+{
+       int i;
+
+       p->argc--;
+       for (i = pos; i < p->argc; i++) 
+               getArg(p, i) = getArg(p, i+1);
+       return p;
+}
+
+
 #define MAX_TABLES 64
 
 typedef struct subselect_t {
@@ -189,6 +201,7 @@ OPTpushselectImplementation(Client cntxt
 
                        if ((tid = subselect_find_tids(&subselects, getArg(p, 
0))) >= 0) {
                                p = PushArgument(mb, p, tid, 2);
+                               /* make sure to resolve again */
                                p->token = ASSIGNsymbol; 
                                p->typechk = TYPE_UNKNOWN;
                                p->fcn = NULL;
@@ -229,14 +242,14 @@ OPTpushselectImplementation(Client cntxt
                                        freeInstruction(p);
                                        continue;
                                }
-                               /* c = sql.delta(b,ins,upd);
+                               /* c = sql.delta(b,uid,uval,ins);
                                 * l = leftfetchjoin(x, c); 
                                 * into
-                                * l = sql.project(b,x,ins,upd);
+                                * l = sql.projectdelta(b,x,ins,upd);
                                 */
-                               else if (getModuleId(q) == sqlRef && 
getFunctionId(q) == deltaRef && q->argc == 4) {
+                               else if (getModuleId(q) == sqlRef && 
getFunctionId(q) == deltaRef && q->argc == 5) {
                                        q = copyInstruction(q);
-                                       setFunctionId(q, delta_projectRef);
+                                       setFunctionId(q, projectdeltaRef);
                                        getArg(q, 0) = getArg(p, 0); 
                                        p = PushArgument(mb, q, getArg(p, 1), 
1);
                                        actions++;
@@ -252,7 +265,7 @@ OPTpushselectImplementation(Client cntxt
                if (old[i])
                        freeInstruction(old[i]);
        GDKfree(old);
-       if (1 || !push_down_delta) {
+       if (!push_down_delta) {
                GDKfree(vars);
                return actions;
        }
@@ -278,15 +291,13 @@ OPTpushselectImplementation(Client cntxt
                        vars[res] = i;
                }
 
-               /* c = delta(b, ins, upd)
+               /* c = delta(b, uid, uvl, ins)
                 * s = subselect(c, C1..)
                 *
                 * nc = subselect(b, C1..)
                 * ni = subselect(ins, C1..)
-                * uid = upd.tail_rever(upd);
-                * uv = upd.tail_rever(upd);
-                * nu = subselect(uv, C1..)
-                * s = subdelta(c (original length), i (not needed), uid, nc, 
ni, nu);
+                * nu = subselect(uvl, C1..)
+                * s = subdelta(nc, uid, nu, ni);
                 */
                if (getModuleId(p) == algebraRef && 
                   (getFunctionId(p) == subselectRef || getFunctionId(p) == 
thetasubselectRef || getFunctionId(p) == likesubselectRef)) { 
@@ -307,16 +318,24 @@ OPTpushselectImplementation(Client cntxt
                                getArg(r, 1) = getArg(q, 1); /* column */
                                pushInstruction(mb,r);
                                getArg(s, 0) = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-                               getArg(s, 1) = getArg(q, 2); /* inserts */
+                               getArg(s, 1) = getArg(q, 3); /* updates */
+                               RemoveArgument(s, 2);   /* no candidate list on 
updates */
+                               /* make sure to resolve again */
+                               s->token = ASSIGNsymbol; 
+                               s->typechk = TYPE_UNKNOWN;
+                               s->fcn = NULL;
+                               s->blk = NULL;
                                pushInstruction(mb,s);
                                getArg(t, 0) = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-                               getArg(t, 1) = getArg(q, 3); /* updates */
+                               getArg(t, 1) = getArg(q, 4); /* inserts */
                                pushInstruction(mb,t);
 
+                               setFunctionId(u, subdeltaRef);
                                getArg(u, 0) = getArg(p,0);
                                getArg(u, 1) = getArg(r,0);
-                               getArg(u, 2) = getArg(s,0);
-                               getArg(u, 3) = getArg(t,0);
+                               getArg(u, 2) = getArg(q,2); /* update ids */
+                               getArg(u, 3) = getArg(s,0);
+                               getArg(u, 4) = getArg(t,0);
                                pushInstruction(mb,u);  
                                freeInstruction(p);
                                continue;
diff --git a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
@@ -96,25 +96,25 @@ end s4_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 65 # length
+% 60 # length
 function user.s11_1{autoCommit=true}():void;
     X_2 := sql.mvc();
     X_3:bat[:oid,:oid]  := sql.tid(X_2,"sys","udf_fuse");
-    X_6:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",0);
-    X_9:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",2);
-    X_11:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",1);
-    X_13 := sql.delta(X_6,X_9,X_11);
-    X_14 := algebra.leftfetchjoin(X_3,X_13);
-    X_15:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",0);
-    X_17:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",2);
-    X_18:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",1);
-    X_19 := sql.delta(X_15,X_17,X_18);
-    X_20 := algebra.leftfetchjoin(X_3,X_19);
-    X_21:bat[:oid,:sht]  := batudf.fuse(X_14,X_20);
-    X_23 := sql.resultSet(1,1,X_21);
-    sql.rsColumn(X_23,"sys.","fuse_a","smallint",16,0,X_21);
-    X_28 := io.stdout();
-    sql.exportResult(X_28,X_23);
+    X_6 := sql.bind(X_2,"sys","udf_fuse","a",0);
+    (X_9,r1_9) := sql.bind(X_2,"sys","udf_fuse","a",2);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to