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

Reply via email to