Changeset: a18ffc3ee843 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a18ffc3ee843
Modified Files:
monetdb5/optimizer/opt_pushselect.c
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
sql/test/leaks/Tests/check1.stable.out.int128
sql/test/mergetables/Tests/mergequery.stable.out
Branch: Jul2017
Log Message:
fix pushdown of select (and some more leak fixing)
diffs (truncated from 381 to 300 lines):
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
@@ -132,7 +132,7 @@ str
OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
{
int i, j, limit, slimit, actions=0, *vars, *nvars = NULL, *slices =
NULL, push_down_delta = 0, nr_topn = 0, nr_likes = 0;
- char *rslices = NULL;
+ char *rslices = NULL, *oclean = NULL;
InstrPtr p, *old;
subselect_t subselects;
char buf[256];
@@ -459,12 +459,14 @@ OPTpushselectImplementation(Client cntxt
nvars = (int*) GDKzalloc(sizeof(int)* mb->vtop);
slices = (int*) GDKzalloc(sizeof(int)* mb->vtop);
rslices = (char*) GDKzalloc(sizeof(char)* mb->vtop);
- if (!nvars || !slices || !rslices || newMalBlkStmt(mb,
mb->stop+(5*push_down_delta)) <0 ) {
+ oclean = (char*) GDKzalloc(sizeof(char)* mb->vtop);
+ if (!nvars || !slices || !rslices || !oclean || newMalBlkStmt(mb,
mb->stop+(5*push_down_delta)) <0 ) {
mb->stmt = old;
GDKfree(vars);
GDKfree(nvars);
GDKfree(slices);
GDKfree(rslices);
+ GDKfree(oclean);
goto wrapup;
}
pushInstruction(mb,old[0]);
@@ -503,6 +505,8 @@ OPTpushselectImplementation(Client cntxt
newTmpVariable(mb, getArgType(mb, s, 0));
getArg(s, 1) = getArg(r, 0); /* use result of
slice */
pushInstruction(mb, s);
+ oclean[i] = 1;
+ actions++;
continue;
}
}
@@ -542,13 +546,21 @@ OPTpushselectImplementation(Client cntxt
}
}
q = newAssignment(mb);
- getArg(q, 0) = nvars[getArg(p, 0)];
- (void) pushArgument(mb, q, col);
+ getArg(q, 0) = getArg(p, 0);
+ if (nvars[getArg(p,0)] > 0) {
+ assert(0);
+ getArg(q, 0) = nvars[getArg(p, 0)];
+ }
+ (void) pushArgument(mb, q, getArg(p, 2));
+ if (nvars[getArg(p, 2)] > 0)
+ getArg(q, 1) = nvars[getArg(p, 2)];
+ oclean[i] = 1;
actions++;
continue;
}
} else if (p->argc >= 2 && slices[getArg(p, 1)] != 0) {
/* use new slice candidate list */
+ assert(slices[getArg(p,1)] == nvars[getArg(p,1)]);
getArg(p, 1) = slices[getArg(p, 1)];
}
/* remap */
@@ -614,21 +626,24 @@ OPTpushselectImplementation(Client cntxt
u = pushArgument(mb, u, getArg(t,0));
u->typechk = TYPE_UNKNOWN;
pushInstruction(mb,u);
- freeInstruction(p);
- old[i] = NULL;
+ oclean[i] = 1;
continue;
}
}
- old[i] = NULL;
pushInstruction(mb,p);
}
- for (i=1; i<limit; i++)
+ for (j=1; j<i; j++)
+ if (old[j] && oclean[j])
+ freeInstruction(old[j]);
+ for (; i<limit; i++)
if (old[i])
- pushInstruction(mb,old[i]);
+ freeInstruction(old[i]);
+ //pushInstruction(mb,old[i]);
GDKfree(vars);
GDKfree(nvars);
GDKfree(slices);
GDKfree(rslices);
+ GDKfree(oclean);
GDKfree(old);
/* Defense line against incorrect plans */
diff --git
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
---
a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
+++
b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
@@ -39,11 +39,13 @@ function user.s4_1():void;
X_37 := bat.new(nil:str);
X_5 := sql.mvc();
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+ C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+ C_92 := algebra.likeselect(X_9, C_6, "%optimizers%", "", false);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
+ C_93 := algebra.likeselect(X_15, nil:bat[:oid], "%optimizers%", "", false);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
- X_17 := sql.delta(X_9, C_14, X_15, X_12);
- C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
- C_29 := algebra.likeselect(X_17, C_6, "%optimizers%", "", false);
+ C_95 := algebra.likeselect(X_12, C_6, "%optimizers%", "", false);
+ C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
(C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions",
"func", 2:int);
X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
@@ -98,11 +100,13 @@ function user.s6_1():void;
X_37 := bat.new(nil:str);
X_5 := sql.mvc();
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+ C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+ C_92 := algebra.likeselect(X_9, C_6, "%optimizers%", "", true);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
+ C_93 := algebra.likeselect(X_15, nil:bat[:oid], "%optimizers%", "", true);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
- X_17 := sql.delta(X_9, C_14, X_15, X_12);
- C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
- C_29 := algebra.likeselect(X_17, C_6, "%optimizers%", "", true);
+ C_95 := algebra.likeselect(X_12, C_6, "%optimizers%", "", true);
+ C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
(C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions",
"func", 2:int);
X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
@@ -158,16 +162,18 @@ function user.s8_1():void;
X_37 := bat.new(nil:str);
X_5 := sql.mvc();
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+ C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+ C_92 := algebra.ilikeselect(X_9, C_6, "%optimizers%", "", false);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
+ C_93 := algebra.ilikeselect(X_15, nil:bat[:oid], "%optimizers%", "",
false);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
- X_17 := sql.delta(X_9, C_14, X_15, X_12);
- C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
- X_29 := algebra.ilikeselect(X_17, C_6, "%optimizers%", "", false);
+ C_95 := algebra.ilikeselect(X_12, C_6, "%optimizers%", "", false);
+ C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
(C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions",
"func", 2:int);
X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
- X_33 := sql.projectdelta(X_29, X_19, C_22, X_23, X_21);
- X_32 := sql.projectdelta(X_29, X_9, C_14, X_15, X_12);
+ X_33 := sql.projectdelta(C_29, X_19, C_22, X_23, X_21);
+ X_32 := sql.projectdelta(C_29, X_9, C_14, X_15, X_12);
X_42 := bat.append(X_35, "sys.functions");
X_44 := bat.append(X_37, "name");
X_46 := bat.append(X_38, "varchar");
@@ -216,16 +222,18 @@ function user.s10_1():void;
X_37 := bat.new(nil:str);
X_5 := sql.mvc();
X_9:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 0:int);
+ C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
+ C_92 := algebra.ilikeselect(X_9, C_6, "%optimizers%", "", true);
(C_14:bat[:oid], X_15:bat[:str]) := sql.bind(X_5, "sys", "functions",
"name", 2:int);
+ C_93 := algebra.ilikeselect(X_15, nil:bat[:oid], "%optimizers%", "", true);
X_12:bat[:str] := sql.bind(X_5, "sys", "functions", "name", 1:int);
- X_17 := sql.delta(X_9, C_14, X_15, X_12);
- C_6:bat[:oid] := sql.tid(X_5, "sys", "functions");
- X_29 := algebra.ilikeselect(X_17, C_6, "%optimizers%", "", true);
+ C_95 := algebra.ilikeselect(X_12, C_6, "%optimizers%", "", true);
+ C_29 := sql.subdelta(C_92, C_6, C_14, C_93, C_95);
X_19:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 0:int);
(C_22:bat[:oid], X_23:bat[:str]) := sql.bind(X_5, "sys", "functions",
"func", 2:int);
X_21:bat[:str] := sql.bind(X_5, "sys", "functions", "func", 1:int);
- X_33 := sql.projectdelta(X_29, X_19, C_22, X_23, X_21);
- X_32 := sql.projectdelta(X_29, X_9, C_14, X_15, X_12);
+ X_33 := sql.projectdelta(C_29, X_19, C_22, X_23, X_21);
+ X_32 := sql.projectdelta(C_29, X_9, C_14, X_15, X_12);
X_42 := bat.append(X_35, "sys.functions");
X_44 := bat.append(X_37, "name");
X_46 := bat.append(X_38, "varchar");
diff --git a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
--- a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
+++ b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
@@ -93,11 +93,13 @@ Operation successful
| X_35:bat[:str] := bat.new(nil:str);
|
| X_4 := sql.mvc();
|
| X_18:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 0:int);
|
+| C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");
|
+| C_89 := algebra.thetaselect(X_18, C_5, 2:sht, "!=");
|
| (C_21:bat[:oid], X_22:bat[:sht]) := sql.bind(X_4, "sys", "_tables",
"type", 2:int); |
+| C_90 := algebra.thetaselect(X_22, nil:bat[:oid], 2:sht, "!=");
|
| X_20:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 1:int);
|
-| X_23 := sql.delta(X_18, C_21, X_22, X_20);
|
-| C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");
|
-| C_27 := algebra.thetaselect(X_23, C_5, 2:sht, "!=");
|
+| C_92 := algebra.thetaselect(X_20, C_5, 2:sht, "!=");
|
+| C_27 := sql.subdelta(C_89, C_5, C_21, C_90, C_92);
|
| X_8:bat[:str] := sql.bind(X_4, "sys", "_tables", "name", 0:int);
|
| (C_13:bat[:oid], X_14:bat[:str]) := sql.bind(X_4, "sys", "_tables",
"name", 2:int); |
| X_11:bat[:str] := sql.bind(X_4, "sys", "_tables", "name", 1:int);
|
@@ -119,30 +121,30 @@ Operation successful
| X_55 := bat.append(X_46, 0:int);
|
| sql.resultSet(X_47, X_49, X_51, X_53, X_55, X_39);
|
| end user.s4_1;
|
-| #inline actions= 0 time=1 usec
|
-| #remap actions= 0 time=1 usec
|
-| #costmodel actions= 1 time=1 usec
|
-| #coercion actions= 1 time=2 usec
|
-| #evaluate actions= 0 time=1 usec
|
-| #emptybind actions= 0 time=0 usec
|
-| #pushselect actions= 5 time=10 usec
|
-| #aliases actions= 2 time=3 usec
|
-| #mergetable actions= 0 time=11 usec
|
-| #deadcode actions= 2 time=3 usec
|
+| #inline actions= 0 time=2 usec
|
+| #remap actions= 0 time=3 usec
|
+| #costmodel actions= 1 time=3 usec
|
+| #coercion actions= 1 time=11 usec
|
+| #evaluate actions= 0 time=6 usec
|
+| #emptybind actions= 0 time=1 usec
|
+| #pushselect actions= 5 time=47 usec
|
+| #aliases actions= 2 time=14 usec
|
+| #mergetable actions= 0 time=62 usec
|
+| #deadcode actions= 3 time=13 usec
|
| #aliases actions= 0 time=0 usec
|
-| #constants actions= 2 time=3 usec
|
-| #commonTerms actions= 0 time=2 usec
|
-| #projectionpath actions= 0 time=2 usec
|
-| #reorder actions= 1 time=9 usec
|
-| #deadcode actions= 0 time=2 usec
|
+| #constants actions= 2 time=13 usec
|
+| #commonTerms actions= 0 time=11 usec
|
+| #projectionpath actions= 0 time=7 usec
|
+| #reorder actions= 1 time=48 usec
|
+| #deadcode actions= 0 time=10 usec
|
| #matpack actions= 0 time=0 usec
|
-| #multiplex actions= 0 time=4 usec
|
-| #profiler actions=1 time=1 usec
|
-| #candidates actions=1 time=0 usec
|
-| #garbagecollector actions= 1 time=24 usec
|
-| #total actions=23 time=118 usec
|
+| #multiplex actions= 0 time=3 usec
|
+| #profiler actions=1 time=3 usec
|
+| #candidates actions=1 time=2 usec
|
+| #garbagecollector actions= 1 time=74 usec
|
+| #total actions=23 time=487 usec
|
+-----------------------------------------------------------------------------------------------------------+
-53 rows
+55 rows
# 10:24:50 >
# 10:24:50 > "Done."
diff --git a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
--- a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
+++ b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
@@ -51,11 +51,13 @@ Operation successful
| X_38:bat[:lng] := bat.new(nil:lng);
|
| X_4 := sql.mvc();
|
| X_18:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 0:int);
|
+| C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");
|
+| C_84 := algebra.thetaselect(X_18, C_5, 2:sht, "!=");
|
| (C_21:bat[:oid], X_22:bat[:sht]) := sql.bind(X_4, "sys", "_tables",
"type", 2:int); |
+| C_85 := algebra.thetaselect(X_22, nil:bat[:oid], 2:sht, "!=");
|
| X_20:bat[:sht] := sql.bind(X_4, "sys", "_tables", "type", 1:int);
|
-| X_23 := sql.delta(X_18, C_21, X_22, X_20);
|
-| C_5:bat[:oid] := sql.tid(X_4, "sys", "_tables");
|
-| C_27 := algebra.thetaselect(X_23, C_5, 2:sht, "!=");
|
+| C_87 := algebra.thetaselect(X_20, C_5, 2:sht, "!=");
|
+| C_27 := sql.subdelta(C_84, C_5, C_21, C_85, C_87);
|
| X_8:bat[:int] := sql.bind(X_4, "sys", "_tables", "id", 0:int);
|
| (C_13:bat[:oid], X_14:bat[:int]) := sql.bind(X_4, "sys", "_tables",
"id", 2:int); |
| X_11:bat[:int] := sql.bind(X_4, "sys", "_tables", "id", 1:int);
|
@@ -72,29 +74,29 @@ Operation successful
| sql.resultSet(".L42", "L41", "bigint", 64:int, 0:int, 7:int, X_43);
|
| end user.s4_1;
|
| #inline actions= 0 time=1 usec
|
-| #remap actions= 0 time=1 usec
|
-| #costmodel actions= 1 time=1 usec
|
-| #coercion actions= 1 time=2 usec
|
-| #evaluate actions= 0 time=2 usec
|
-| #emptybind actions= 0 time=0 usec
|
-| #pushselect actions= 5 time=9 usec
|
-| #aliases actions= 2 time=3 usec
|
-| #mergetable actions= 0 time=11 usec
|
-| #deadcode actions= 2 time=3 usec
|
+| #remap actions= 0 time=3 usec
|
+| #costmodel actions= 1 time=3 usec
|
+| #coercion actions= 1 time=9 usec
|
+| #evaluate actions= 0 time=5 usec
|
+| #emptybind actions= 0 time=1 usec
|
+| #pushselect actions= 5 time=43 usec
|
+| #aliases actions= 2 time=14 usec
|
+| #mergetable actions= 0 time=56 usec
|
+| #deadcode actions= 3 time=13 usec
|
| #aliases actions= 0 time=0 usec
|
-| #constants actions= 1 time=3 usec
|
-| #commonTerms actions= 0 time=2 usec
|
-| #projectionpath actions= 0 time=1 usec
|
-| #reorder actions= 1 time=9 usec
|
-| #deadcode actions= 0 time=1 usec
|
+| #constants actions= 1 time=11 usec
|
+| #commonTerms actions= 0 time=10 usec
|
+| #projectionpath actions= 0 time=6 usec
|
+| #reorder actions= 1 time=42 usec
|
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list