Changeset: 297e421cc42a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=297e421cc42a
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out
        sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/server/rel_exp.c
        sql/server/rel_rel.c
        sql/storage/bat/bat_utils.c
        
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
        sql/test/BugTracker-2016/Tests/decimal_vs_integer.Bug-3941.stable.out
        
sql/test/BugTracker-2019/Tests/duplicates-not-eliminated-long-CASE-stmt.Bug-6697.stable.out
        
sql/test/BugTracker-2019/Tests/prepare-non-existing-function.Bug-6725.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-query.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-0join-view.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-query.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-1join-view.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-query.stable.out
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-explain-2join-view.stable.out
        sql/test/mergetables/Tests/mergequery.stable.out
        sql/test/remote/Tests/partition_elim.stable.out
Branch: context
Log Message:

optimize queries used for deriving result types (ie and False etc)


diffs (truncated from 4006 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -11768,8 +11768,8 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:int):void ",       
"SYSMONstop;",  ""      ]
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:lng):void ",       
"SYSMONstop;",  ""      ]
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:sht):void ",       
"SYSMONstop;",  ""      ]
-[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, 
tname:str):bat[:oid] ",    "SQLtid;",      "Return a column with the valid 
tuple identifiers associated with the table sname.tname."       ]
-[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
part_nr:int, nr_parts:int):bat[:oid] ", "SQLtid;",      "Return the tables tid 
column." ]
+[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
all:bit):bat[:oid] ",   "SQLtid;",      "Return a column with the valid tuple 
identifiers associated with the table sname.tname (if all is true)."      ]
+[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
all:bit, part_nr:int, nr_parts:int):bat[:oid] ",        "SQLtid;",      "Return 
the tables tid column (if all is true)."        ]
 [ "sql",       "transaction",  "unsafe pattern sql.transaction():void ",       
"SQLtransaction2;",     "Start an autocommit transaction"       ]
 [ "sql",       "transaction",  "unsafe pattern sql.transaction():void ",       
"SQLtransaction2;",     "Start an autocommit transaction"       ]
 [ "sql",       "transaction_begin",    "pattern 
sql.transaction_begin(chain:int, name:str):void ",     "SQLtransaction_begin;", 
       "A transaction statement (type can be commit,release,rollback or start)" 
       ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -16193,8 +16193,8 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:int):void ",       
"SYSMONstop;",  ""      ]
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:lng):void ",       
"SYSMONstop;",  ""      ]
 [ "sql",       "sysmon_stop",  "pattern sql.sysmon_stop(tag:sht):void ",       
"SYSMONstop;",  ""      ]
-[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, 
tname:str):bat[:oid] ",    "SQLtid;",      "Return a column with the valid 
tuple identifiers associated with the table sname.tname."       ]
-[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
part_nr:int, nr_parts:int):bat[:oid] ", "SQLtid;",      "Return the tables tid 
column." ]
+[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
all:bit):bat[:oid] ",   "SQLtid;",      "Return a column with the valid tuple 
identifiers associated with the table sname.tname (if all is true)."      ]
+[ "sql",       "tid",  "pattern sql.tid(mvc:int, sname:str, tname:str, 
all:bit, part_nr:int, nr_parts:int):bat[:oid] ",        "SQLtid;",      "Return 
the tables tid column (if all is true)."        ]
 [ "sql",       "transaction",  "unsafe pattern sql.transaction():void ",       
"SQLtransaction2;",     "Start an autocommit transaction"       ]
 [ "sql",       "transaction",  "unsafe pattern sql.transaction():void ",       
"SQLtransaction2;",     "Start an autocommit transaction"       ]
 [ "sql",       "transaction_begin",    "pattern 
sql.transaction_begin(chain:int, name:str):void ",     "SQLtransaction_begin;", 
       "A transaction statement (type can be commit,release,rollback or start)" 
       ]
diff --git a/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out 
b/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out
--- a/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out
+++ b/sql/backends/monet5/UDF/udf/Tests/udf-fuse.stable.out
@@ -170,24 +170,24 @@ end user.main;
 % 114 # length
 function user.main():void;
     X_1:void := querylog.define("explain select fuse(a,b) from udf_fuse;":str, 
"sequential_pipe":str, 26:int);
-    X_29:bat[:str] := bat.new(nil:str);
-    X_35:bat[:int] := bat.new(nil:int);
-    X_33:bat[:int] := bat.new(nil:int);
+    X_30:bat[:str] := bat.new(nil:str);
+    X_36:bat[:int] := bat.new(nil:int);
+    X_34:bat[:int] := bat.new(nil:int);
+    X_33:bat[:str] := bat.new(nil:str);
     X_32:bat[:str] := bat.new(nil:str);
-    X_31:bat[:str] := bat.new(nil:str);
     X_4:int := sql.mvc();
-    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str);
-    X_8:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "a":str, 
0:int);
-    X_17:bat[:bte] := algebra.projection(C_5:bat[:oid], X_8:bat[:bte]);
-    X_18:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "b":str, 
0:int);
-    X_24:bat[:bte] := algebra.projection(C_5:bat[:oid], X_18:bat[:bte]);
-    X_25:bat[:sht] := batudf.fuse(X_17:bat[:bte], X_24:bat[:bte]);
-    X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str);
-    X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str);
-    X_40:bat[:str] := bat.append(X_32:bat[:str], "smallint":str);
-    X_42:bat[:int] := bat.append(X_33:bat[:int], 16:int);
-    X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int);
-    sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], 
X_42:bat[:int], X_44:bat[:int], X_25:bat[:sht]);
+    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str, true:bit);
+    X_9:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "a":str, 
0:int);
+    X_18:bat[:bte] := algebra.projection(C_5:bat[:oid], X_9:bat[:bte]);
+    X_19:bat[:bte] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "b":str, 
0:int);
+    X_25:bat[:bte] := algebra.projection(C_5:bat[:oid], X_19:bat[:bte]);
+    X_26:bat[:sht] := batudf.fuse(X_18:bat[:bte], X_25:bat[:bte]);
+    X_37:bat[:str] := bat.append(X_30:bat[:str], "sys.L1":str);
+    X_39:bat[:str] := bat.append(X_32:bat[:str], "L1":str);
+    X_41:bat[:str] := bat.append(X_33:bat[:str], "smallint":str);
+    X_43:bat[:int] := bat.append(X_34:bat[:int], 16:int);
+    X_45:bat[:int] := bat.append(X_36:bat[:int], 0:int);
+    sql.resultSet(X_37:bat[:str], X_39:bat[:str], X_41:bat[:str], 
X_43:bat[:int], X_45:bat[:int], X_26:bat[:sht]);
 end user.main;
 #inline               actions= 0 time=0 usec 
 #remap                actions= 1 time=9 usec 
@@ -221,24 +221,24 @@ end user.main;
 % 114 # length
 function user.main():void;
     X_1:void := querylog.define("explain select fuse(c,d) from udf_fuse;":str, 
"sequential_pipe":str, 26:int);
-    X_29:bat[:str] := bat.new(nil:str);
-    X_35:bat[:int] := bat.new(nil:int);
-    X_33:bat[:int] := bat.new(nil:int);
+    X_30:bat[:str] := bat.new(nil:str);
+    X_36:bat[:int] := bat.new(nil:int);
+    X_34:bat[:int] := bat.new(nil:int);
+    X_33:bat[:str] := bat.new(nil:str);
     X_32:bat[:str] := bat.new(nil:str);
-    X_31:bat[:str] := bat.new(nil:str);
     X_4:int := sql.mvc();
-    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str);
-    X_8:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "c":str, 
0:int);
-    X_17:bat[:sht] := algebra.projection(C_5:bat[:oid], X_8:bat[:sht]);
-    X_18:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "d":str, 
0:int);
-    X_24:bat[:sht] := algebra.projection(C_5:bat[:oid], X_18:bat[:sht]);
-    X_25:bat[:int] := batudf.fuse(X_17:bat[:sht], X_24:bat[:sht]);
-    X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str);
-    X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str);
-    X_40:bat[:str] := bat.append(X_32:bat[:str], "int":str);
-    X_42:bat[:int] := bat.append(X_33:bat[:int], 32:int);
-    X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int);
-    sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], 
X_42:bat[:int], X_44:bat[:int], X_25:bat[:int]);
+    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str, true:bit);
+    X_9:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "c":str, 
0:int);
+    X_18:bat[:sht] := algebra.projection(C_5:bat[:oid], X_9:bat[:sht]);
+    X_19:bat[:sht] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "d":str, 
0:int);
+    X_25:bat[:sht] := algebra.projection(C_5:bat[:oid], X_19:bat[:sht]);
+    X_26:bat[:int] := batudf.fuse(X_18:bat[:sht], X_25:bat[:sht]);
+    X_37:bat[:str] := bat.append(X_30:bat[:str], "sys.L1":str);
+    X_39:bat[:str] := bat.append(X_32:bat[:str], "L1":str);
+    X_41:bat[:str] := bat.append(X_33:bat[:str], "int":str);
+    X_43:bat[:int] := bat.append(X_34:bat[:int], 32:int);
+    X_45:bat[:int] := bat.append(X_36:bat[:int], 0:int);
+    sql.resultSet(X_37:bat[:str], X_39:bat[:str], X_41:bat[:str], 
X_43:bat[:int], X_45:bat[:int], X_26:bat[:int]);
 end user.main;
 #inline               actions= 0 time=0 usec 
 #remap                actions= 1 time=4 usec 
@@ -272,24 +272,24 @@ end user.main;
 % 114 # length
 function user.main():void;
     X_1:void := querylog.define("explain select fuse(e,f) from udf_fuse;":str, 
"sequential_pipe":str, 26:int);
-    X_29:bat[:str] := bat.new(nil:str);
-    X_35:bat[:int] := bat.new(nil:int);
-    X_33:bat[:int] := bat.new(nil:int);
+    X_30:bat[:str] := bat.new(nil:str);
+    X_36:bat[:int] := bat.new(nil:int);
+    X_34:bat[:int] := bat.new(nil:int);
+    X_33:bat[:str] := bat.new(nil:str);
     X_32:bat[:str] := bat.new(nil:str);
-    X_31:bat[:str] := bat.new(nil:str);
     X_4:int := sql.mvc();
-    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str);
-    X_8:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "e":str, 
0:int);
-    X_17:bat[:int] := algebra.projection(C_5:bat[:oid], X_8:bat[:int]);
-    X_18:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "f":str, 
0:int);
-    X_24:bat[:int] := algebra.projection(C_5:bat[:oid], X_18:bat[:int]);
-    X_25:bat[:lng] := batudf.fuse(X_17:bat[:int], X_24:bat[:int]);
-    X_36:bat[:str] := bat.append(X_29:bat[:str], "sys.L1":str);
-    X_38:bat[:str] := bat.append(X_31:bat[:str], "L1":str);
-    X_40:bat[:str] := bat.append(X_32:bat[:str], "bigint":str);
-    X_42:bat[:int] := bat.append(X_33:bat[:int], 64:int);
-    X_44:bat[:int] := bat.append(X_35:bat[:int], 0:int);
-    sql.resultSet(X_36:bat[:str], X_38:bat[:str], X_40:bat[:str], 
X_42:bat[:int], X_44:bat[:int], X_25:bat[:lng]);
+    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_fuse":str, true:bit);
+    X_9:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "e":str, 
0:int);
+    X_18:bat[:int] := algebra.projection(C_5:bat[:oid], X_9:bat[:int]);
+    X_19:bat[:int] := sql.bind(X_4:int, "sys":str, "udf_fuse":str, "f":str, 
0:int);
+    X_25:bat[:int] := algebra.projection(C_5:bat[:oid], X_19:bat[:int]);
+    X_26:bat[:lng] := batudf.fuse(X_18:bat[:int], X_25:bat[:int]);
+    X_37:bat[:str] := bat.append(X_30:bat[:str], "sys.L1":str);
+    X_39:bat[:str] := bat.append(X_32:bat[:str], "L1":str);
+    X_41:bat[:str] := bat.append(X_33:bat[:str], "bigint":str);
+    X_43:bat[:int] := bat.append(X_34:bat[:int], 64:int);
+    X_45:bat[:int] := bat.append(X_36:bat[:int], 0:int);
+    sql.resultSet(X_37:bat[:str], X_39:bat[:str], X_41:bat[:str], 
X_43:bat[:int], X_45:bat[:int], X_26:bat[:lng]);
 end user.main;
 #inline               actions= 0 time=1 usec 
 #remap                actions= 1 time=5 usec 
diff --git a/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out 
b/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out
--- a/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out
+++ b/sql/backends/monet5/UDF/udf/Tests/udf-reverse.stable.out
@@ -108,22 +108,22 @@ end user.main;
 % 114 # length
 function user.main():void;
     X_1:void := querylog.define("explain select reverse(x) from 
udf_reverse;":str, "sequential_pipe":str, 21:int);
-    X_22:bat[:str] := bat.new(nil:str);
-    X_28:bat[:int] := bat.new(nil:int);
-    X_26:bat[:int] := bat.new(nil:int);
+    X_23:bat[:str] := bat.new(nil:str);
+    X_29:bat[:int] := bat.new(nil:int);
+    X_27:bat[:int] := bat.new(nil:int);
+    X_26:bat[:str] := bat.new(nil:str);
     X_25:bat[:str] := bat.new(nil:str);
-    X_24:bat[:str] := bat.new(nil:str);
     X_4:int := sql.mvc();
-    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_reverse":str);
-    X_8:bat[:str] := sql.bind(X_4:int, "sys":str, "udf_reverse":str, "x":str, 
0:int);
-    X_17:bat[:str] := algebra.projection(C_5:bat[:oid], X_8:bat[:str]);
-    X_18:bat[:str] := batudf.reverse(X_17:bat[:str]);
-    X_29:bat[:str] := bat.append(X_22:bat[:str], "sys.L1":str);
-    X_31:bat[:str] := bat.append(X_24:bat[:str], "L1":str);
-    X_33:bat[:str] := bat.append(X_25:bat[:str], "clob":str);
-    X_35:bat[:int] := bat.append(X_26:bat[:int], 0:int);
-    X_36:bat[:int] := bat.append(X_28:bat[:int], 0:int);
-    sql.resultSet(X_29:bat[:str], X_31:bat[:str], X_33:bat[:str], 
X_35:bat[:int], X_36:bat[:int], X_18:bat[:str]);
+    C_5:bat[:oid] := sql.tid(X_4:int, "sys":str, "udf_reverse":str, true:bit);
+    X_9:bat[:str] := sql.bind(X_4:int, "sys":str, "udf_reverse":str, "x":str, 
0:int);
+    X_18:bat[:str] := algebra.projection(C_5:bat[:oid], X_9:bat[:str]);
+    X_19:bat[:str] := batudf.reverse(X_18:bat[:str]);
+    X_30:bat[:str] := bat.append(X_23:bat[:str], "sys.L1":str);
+    X_32:bat[:str] := bat.append(X_25:bat[:str], "L1":str);
+    X_34:bat[:str] := bat.append(X_26:bat[:str], "clob":str);
+    X_36:bat[:int] := bat.append(X_27:bat[:int], 0:int);
+    X_37:bat[:int] := bat.append(X_29:bat[:int], 0:int);
+    sql.resultSet(X_30:bat[:str], X_32:bat[:str], X_34:bat[:str], 
X_36:bat[:int], X_37:bat[:int], X_19:bat[:str]);
 end user.main;
 #inline               actions= 0 time=1 usec 
 #remap                actions= 1 time=5 usec 
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -446,6 +446,92 @@ exp_count_no_nil_arg( sql_exp *e, stmt *
        return as;
 }
 
+static stmt *
+exp_bin_or(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt 
*ext, stmt *cnt, stmt *sel) 
+{
+       sql_subtype *bt = sql_bind_localtype("bit");
+       list *l = e->l;
+       node *n;
+       stmt *sel1 = NULL, *sel2 = NULL, *s = NULL;
+       int anti = is_anti(e);
+
+       sel1 = sel;
+       sel2 = sel;
+       for( n = l->h; n; n = n->next ) {
+               sql_exp *c = n->data;
+               stmt *sin = (sel1 && sel1->nrcols)?sel1:NULL;
+
+               /* propagate the anti flag */
+               if (anti) 
+                       set_anti(c);
+               s = exp_bin(be, c, left, right, grp, ext, cnt, sin); 
+               if (!s) 
+                       return s;
+
+               if (!sin && sel1 && sel1->nrcols == 0 && s->nrcols == 0) {
+                       sql_subfunc *f = sql_bind_func(be->mvc->sa, 
be->mvc->session->schema, anti?"or":"and", bt, bt, F_FUNC);
+                       assert(f);
+                       s = stmt_binop(be, sel1, s, f);
+               } else if (sel1 && (sel1->nrcols == 0 || s->nrcols == 0)) {
+                       stmt *predicate = bin_first_column(be, left);
+                               
+                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+                       if (s->nrcols == 0)
+                               s = stmt_uselect(be, predicate, s, cmp_equal, 
sel1, anti);
+                       else
+                               s = stmt_uselect(be, predicate, sel1, 
cmp_equal, s, anti);
+               }
+               sel1 = s;
+       }
+       l = e->r;
+       for( n = l->h; n; n = n->next ) {
+               sql_exp *c = n->data;
+               stmt *sin = (sel2 && sel2->nrcols)?sel2:NULL;
+
+               /* propagate the anti flag */
+               if (anti) 
+                       set_anti(c);
+               s = exp_bin(be, c, left, right, grp, ext, cnt, sin); 
+               if (!s) 
+                       return s;
+
+               if (!sin && sel2 && sel2->nrcols == 0 && s->nrcols == 0) {
+                       sql_subfunc *f = sql_bind_func(be->mvc->sa, 
be->mvc->session->schema, anti?"or":"and", bt, bt, F_FUNC);
+                       assert(f);
+                       s = stmt_binop(be, sel2, s, f);
+               } else if (sel2 && (sel2->nrcols == 0 || s->nrcols == 0)) {
+                       stmt *predicate = bin_first_column(be, left);
+                               
+                       predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+                       if (s->nrcols == 0)
+                               s = stmt_uselect(be, predicate, s, cmp_equal, 
sel2, anti);
+                       else
+                               s = stmt_uselect(be, predicate, sel2, 
cmp_equal, s, anti);
+               }
+               sel2 = s;
+       }
+       if (sel1->nrcols == 0 && sel2->nrcols == 0) {
+               sql_subfunc *f = sql_bind_func(be->mvc->sa, 
be->mvc->session->schema, anti?"and":"or", bt, bt, F_FUNC);
+               assert(f);
+               return stmt_binop(be, sel1, sel2, f);
+       }
+       if (sel1->nrcols == 0) {
+               stmt *predicate = bin_first_column(be, left);
+               
+               predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+               sel1 = stmt_uselect(be, predicate, sel1, cmp_equal, NULL, 
0/*anti*/);
+       }
+       if (sel2->nrcols == 0) {
+               stmt *predicate = bin_first_column(be, left);
+               
+               predicate = stmt_const(be, predicate, stmt_bool(be, 1));
+               sel2 = stmt_uselect(be, predicate, sel2, cmp_equal, NULL, 
0/*anti*/);
+       }
+       if (anti)
+               return stmt_project(be, stmt_tinter(be, sel1, sel2), sel1);
+       return stmt_tunion(be, sel1, sel2);
+}
+
 stmt *
 exp_bin(backend *be, sql_exp *e, stmt *left, stmt *right, stmt *grp, stmt 
*ext, stmt *cnt, stmt *sel) 
 {
@@ -782,89 +868,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                if (e->flag == cmp_in || e->flag == cmp_notin) {
                        return handle_in_exps(be, e->l, e->r, left, right, grp, 
ext, cnt, sel, (e->flag == cmp_in), 0);
                }
-               if (get_cmp(e) == cmp_or && (!right || right->nrcols == 1)) {
-                       sql_subtype *bt = sql_bind_localtype("bit");
-                       list *l = e->l;
-                       node *n;
-                       stmt *sel1 = NULL, *sel2 = NULL;
-                       int anti = is_anti(e);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to