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