Changeset: f5282a08aeef for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f5282a08aeef
Modified Files:
sql/backends/monet5/sql_gencode.c
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
Branch: Dec2016
Log Message:
Generate algebra.thetasubselect instead of algebra.subselect.
thetaselect never matches nil, select may in certain conditions match
nil. It's easier to use thetaselect than to work around select.
This causes test null_is_null.Bug-3739 to behave properly again.
diffs (truncated from 426 to 300 lines):
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1473,11 +1473,6 @@ static int
return -1;
k = getDestVar(q);
} else {
- char *cmd = subselectRef;
-
- if (s->flag != cmp_equal && s->flag !=
cmp_notequal)
- cmd = thetasubselectRef;
-
if (get_cmp(s) == cmp_filter) {
node *n;
char *mod, *fimp;
@@ -1522,78 +1517,38 @@ static int
break;
}
+ q = newStmt(mb, algebraRef, thetasubselectRef);
+ q = pushArgument(mb, q, l);
+ if (sub > 0)
+ q = pushArgument(mb, q, sub);
+ q = pushArgument(mb, q, r);
switch (s->flag) {
- case cmp_equal:{
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
- q = pushArgument(mb, q, r);
- q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, FALSE);
- if (q == NULL)
- return -1;
+ case cmp_equal:
+ q = pushStr(mb, q, "==");
break;
- }
- case cmp_notequal:{
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
- q = pushArgument(mb, q, r);
- q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, TRUE);
- q = pushBit(mb, q, TRUE);
- if (q == NULL)
- return -1;
+ case cmp_notequal:
+ q = pushStr(mb, q, "!=");
break;
- }
case cmp_lt:
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
q = pushStr(mb, q, "<");
- if (q == NULL)
- return -1;
break;
case cmp_lte:
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
q = pushStr(mb, q, "<=");
- if (q == NULL)
- return -1;
break;
case cmp_gt:
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
q = pushStr(mb, q, ">");
- if (q == NULL)
- return -1;
break;
case cmp_gte:
- q = newStmt(mb, algebraRef, cmd);
- q = pushArgument(mb, q, l);
- if (sub > 0)
- q = pushArgument(mb, q, sub);
- q = pushArgument(mb, q, r);
q = pushStr(mb, q, ">=");
- if (q == NULL)
- return -1;
break;
default:
showException(GDKout, SQL, "sql",
"SQL2MAL: error impossible subselect compare\n");
+ if (q)
+ freeInstruction(q);
+ q = NULL;
}
+ if (q == NULL)
+ return -1;
}
if (q)
s->nr = getDestVar(q);
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
@@ -312,7 +312,7 @@ function user.s20_1():void;
X_13:bat[:str] := sql.bind(X_3,"sys","functions","name",1:int);
X_16 := sql.projectdelta(C_4,X_7,C_10,r1_12,X_13);
X_74:bat[:bit] := batalgebra.like(X_16,"%optimizers%":str);
- C_23 := algebra.subselect(X_74,true,true,true,true,false);
+ C_23 := algebra.thetasubselect(X_74,true,"==");
X_26:bat[:str] := sql.bind(X_3,"sys","functions","func",0:int);
(C_28:bat[:oid],r1_30:bat[:str]) :=
sql.bind(X_3,"sys","functions","func",2:int);
X_30:bat[:str] := sql.bind(X_3,"sys","functions","func",1:int);
@@ -373,7 +373,7 @@ function user.s22_1():void;
X_13:bat[:str] := sql.bind(X_3,"sys","functions","name",1:int);
X_16 := sql.projectdelta(C_4,X_7,C_10,r1_12,X_13);
X_74:bat[:bit] := batalgebra.not_like(X_16,"%optimizers%":str);
- C_23 := algebra.subselect(X_74,true,true,true,true,false);
+ C_23 := algebra.thetasubselect(X_74,true,"==");
X_26:bat[:str] := sql.bind(X_3,"sys","functions","func",0:int);
(C_28:bat[:oid],r1_30:bat[:str]) :=
sql.bind(X_3,"sys","functions","func",2:int);
X_30:bat[:str] := sql.bind(X_3,"sys","functions","func",1:int);
@@ -434,7 +434,7 @@ function user.s24_1():void;
X_13:bat[:str] := sql.bind(X_3,"sys","functions","name",1:int);
X_16 := sql.projectdelta(C_4,X_7,C_10,r1_12,X_13);
X_74:bat[:bit] := batalgebra.ilike(X_16,"%optimizers%":str);
- C_23 := algebra.subselect(X_74,true,true,true,true,false);
+ C_23 := algebra.thetasubselect(X_74,true,"==");
X_26:bat[:str] := sql.bind(X_3,"sys","functions","func",0:int);
(C_28:bat[:oid],r1_30:bat[:str]) :=
sql.bind(X_3,"sys","functions","func",2:int);
X_30:bat[:str] := sql.bind(X_3,"sys","functions","func",1:int);
@@ -495,7 +495,7 @@ function user.s26_1():void;
X_13:bat[:str] := sql.bind(X_3,"sys","functions","name",1:int);
X_16 := sql.projectdelta(C_4,X_7,C_10,r1_12,X_13);
X_74:bat[:bit] := batalgebra.not_ilike(X_16,"%optimizers%":str);
- C_23 := algebra.subselect(X_74,true,true,true,true,false);
+ C_23 := algebra.thetasubselect(X_74,true,"==");
X_26:bat[:str] := sql.bind(X_3,"sys","functions","func",0:int);
(C_28:bat[:oid],r1_30:bat[:str]) :=
sql.bind(X_3,"sys","functions","func",2:int);
X_30:bat[:str] := sql.bind(X_3,"sys","functions","func",1:int);
diff --git a/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
--- a/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
+++ b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
@@ -44,22 +44,22 @@ Ready.
% 104 # length
function user.s8_1():void;
X_0:void := querylog.define("explain select * from test where value =
1;","sequential_pipe",12:int);
+ X_22 := bat.new(nil:str);
+ X_28 := bat.new(nil:int);
+ X_26 := bat.new(nil:int);
+ X_25 := bat.new(nil:str);
X_24 := bat.new(nil:str);
- X_30 := bat.new(nil:int);
- X_28 := bat.new(nil:int);
- X_27 := bat.new(nil:str);
- X_26 := bat.new(nil:str);
X_3 := sql.mvc();
X_7:bat[:int] := sql.bind(X_3,"sys","test","value",0:int);
C_4:bat[:oid] := sql.tid(X_3,"sys","test");
- C_18 := algebra.subselect(X_7,C_4,1:int,1:int,true,true,false);
- X_22 := algebra.projection(C_18,X_7);
- X_31 := bat.append(X_24,"sys.test");
- X_33 := bat.append(X_26,"value");
- X_34 := bat.append(X_27,"int");
- X_36 := bat.append(X_28,32:int);
- X_38 := bat.append(X_30,0:int);
- sql.resultSet(X_31,X_33,X_34,X_36,X_38,X_22);
+ C_18 := algebra.thetasubselect(X_7,C_4,1:int,"==");
+ X_20 := algebra.projection(C_18,X_7);
+ X_29 := bat.append(X_22,"sys.test");
+ X_31 := bat.append(X_24,"value");
+ X_32 := bat.append(X_25,"int");
+ X_34 := bat.append(X_26,32:int);
+ X_36 := bat.append(X_28,0:int);
+ sql.resultSet(X_29,X_31,X_32,X_34,X_36,X_20);
end user.s8_1;
#inline actions= 0 time=1 usec
#remap actions= 0 time=2 usec
@@ -313,22 +313,22 @@ end user.s16_1;
% 105 # length
function user.s18_1():void;
X_0:void := querylog.define("explain select * from test where value <>
1;","sequential_pipe",12:int);
- X_23 := bat.new(nil:str);
- X_29 := bat.new(nil:int);
- X_27 := bat.new(nil:int);
- X_26 := bat.new(nil:str);
+ X_22 := bat.new(nil:str);
+ X_28 := bat.new(nil:int);
+ X_26 := bat.new(nil:int);
X_25 := bat.new(nil:str);
+ X_24 := bat.new(nil:str);
X_3 := sql.mvc();
X_7:bat[:int] := sql.bind(X_3,"sys","test","value",0:int);
C_4:bat[:oid] := sql.tid(X_3,"sys","test");
- C_18 := algebra.subselect(X_7,C_4,1:int,1:int,true,true,true);
- X_21 := algebra.projection(C_18,X_7);
- X_30 := bat.append(X_23,"sys.test");
- X_32 := bat.append(X_25,"value");
- X_33 := bat.append(X_26,"int");
- X_35 := bat.append(X_27,32:int);
- X_37 := bat.append(X_29,0:int);
- sql.resultSet(X_30,X_32,X_33,X_35,X_37,X_21);
+ C_18 := algebra.thetasubselect(X_7,C_4,1:int,"!=");
+ X_20 := algebra.projection(C_18,X_7);
+ X_29 := bat.append(X_22,"sys.test");
+ X_31 := bat.append(X_24,"value");
+ X_32 := bat.append(X_25,"int");
+ X_34 := bat.append(X_26,32:int);
+ X_36 := bat.append(X_28,0:int);
+ sql.resultSet(X_29,X_31,X_32,X_34,X_36,X_20);
end user.s18_1;
#inline actions= 0 time=1 usec
#remap actions= 0 time=2 usec
diff --git
a/sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
b/sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
--- a/sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
+++ b/sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
@@ -39,10 +39,10 @@ Ready.
function user.s4_1():void;
X_0:void := querylog.define("explain select count(*) from tmp where i =
20160222;","default_pipe",6:int);
X_10 := bat.new(nil:int);
- C_12 := algebra.subselect(X_10,20160222:int,20160222:int,true,true,false);
- X_16 := algebra.projection(C_12,X_10);
- X_17 := aggr.count(X_16);
- sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_17);
+ C_12 := algebra.thetasubselect(X_10,20160222:int,"==");
+ X_14 := algebra.projection(C_12,X_10);
+ X_15 := aggr.count(X_14);
+ sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_15);
end user.s4_1;
# optimizer.mitosis()
# optimizer.dataflow()
@@ -54,10 +54,10 @@ end user.s4_1;
function user.s6_1():void;
X_0:void := querylog.define("explain select count(*) from tmp where i =
\\'20160222\\';","default_pipe",6:int);
X_10 := bat.new(nil:int);
- C_14 := algebra.subselect(X_10,20160222:int,20160222:int,true,true,false);
- X_18 := algebra.projection(C_14,X_10);
- X_19 := aggr.count(X_18);
- sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_19);
+ C_14 := algebra.thetasubselect(X_10,20160222:int,"==");
+ X_16 := algebra.projection(C_14,X_10);
+ X_17 := aggr.count(X_16);
+ sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_17);
end user.s6_1;
# optimizer.mitosis()
# optimizer.dataflow()
@@ -70,10 +70,10 @@ function user.s8_1():void;
X_0:void := querylog.define("explain select count(*) from tmp where i =
201602221;","default_pipe",7:int);
X_10 := bat.new(nil:int);
X_11:bat[:int] := batcalc.int(0:int,X_10,9:int,0:int);
- C_16 :=
algebra.subselect(X_11,201602221:int,201602221:int,true,true,false);
- X_20 := algebra.projection(C_16,X_10);
- X_21 := aggr.count(X_20);
- sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_21);
+ C_16 := algebra.thetasubselect(X_11,201602221:int,"==");
+ X_18 := algebra.projection(C_16,X_10);
+ X_19 := aggr.count(X_18);
+ sql.resultSet("sys.L4","L3","bigint",64:int,0:int,7:int,X_19);
end user.s8_1;
# optimizer.mitosis()
# optimizer.dataflow()
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
@@ -94,21 +94,21 @@ Operation successful
| X_3 := sql.mvc();
|
| X_9:bat[:sht] := sql.bind(X_3,"sys","_tables","type",0:int);
|
| C_6:bat[:oid] := sql.tid(X_3,"sys","_tables");
|
-| C_63 := algebra.subselect(X_9,C_6,2:sht,2:sht,true,true,true);
|
+| C_63 := algebra.thetasubselect(X_9,C_6,2:sht,"!=");
|
| (C_12:bat[:oid],r1_13:bat[:sht]) :=
sql.bind(X_3,"sys","_tables","type",2:int); |
-| C_64 :=
algebra.subselect(r1_13,nil:bat[:oid],2:sht,2:sht,true,true,true);
|
+| C_64 := algebra.thetasubselect(r1_13,nil:bat[:oid],2:sht,"!=");
|
| X_15:bat[:sht] := sql.bind(X_3,"sys","_tables","type",1:int);
|
-| C_66 := algebra.subselect(X_15,C_6,2:sht,2:sht,true,true,true);
|
+| C_66 := algebra.thetasubselect(X_15,C_6,2:sht,"!=");
|
| C_21 := sql.subdelta(C_63,C_6,C_12,C_64,C_66);
|
-| X_24:bat[:str] := sql.bind(X_3,"sys","_tables","name",0:int);
|
-| (C_26:bat[:oid],r1_27:bat[:str]) :=
sql.bind(X_3,"sys","_tables","name",2:int); |
-| X_28:bat[:str] := sql.bind(X_3,"sys","_tables","name",1:int);
|
-| X_31 := sql.projectdelta(C_21,X_24,C_26,r1_27,X_28);
|
-| X_32 := bat.append(X_4,X_31,true);
|
+| X_23:bat[:str] := sql.bind(X_3,"sys","_tables","name",0:int);
|
+| (C_25:bat[:oid],r1_26:bat[:str]) :=
sql.bind(X_3,"sys","_tables","name",2:int); |
+| X_27:bat[:str] := sql.bind(X_3,"sys","_tables","name",1:int);
|
+| X_30 := sql.projectdelta(C_21,X_23,C_25,r1_26,X_27);
|
+| X_31 := bat.append(X_4,X_30,true);
|
| C_33:bat[:oid] := sql.tid(X_3,"tmp","_tables");
|
| X_35:bat[:str] := sql.bind(X_3,"tmp","_tables","name",0:int);
|
| X_36 := algebra.projection(C_33,X_35);
|
-| X_37 := bat.append(X_32,X_36,true);
|
+| X_37 := bat.append(X_31,X_36,true);
|
| X_39 := bat.new(nil:str);
|
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list