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