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