Changeset: 122c2c36b794 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=122c2c36b794 Modified Files: monetdb5/optimizer/opt_pushselect.c 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/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/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/miscellaneous/Tests/simple_plans.stable.out sql/test/remote/Tests/partition_elim.stable.out Branch: Oct2020 Log Message:
Merged with Jun2020 diffs (253 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,6 +132,8 @@ no_updates(InstrPtr *old, int *vars, int return 1; } +#define isIntersect(p) (getModuleId(p) == algebraRef && getFunctionId(p) == intersectRef) + str OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { @@ -169,7 +171,7 @@ OPTpushselectImplementation(Client cntxt } if (getModuleId(p) == algebraRef && - (getFunctionId(p) == intersectRef || + ((!no_mito && getFunctionId(p) == intersectRef) || getFunctionId(p) == differenceRef)) { GDKfree(vars); goto wrapup; @@ -181,6 +183,9 @@ OPTpushselectImplementation(Client cntxt if (isLikeOp(p)) nr_likes++; + if (no_mito && isIntersect(p)) + push_down_delta++; + if ((getModuleId(p) == sqlRef && getFunctionId(p) == deltaRef) || (no_mito && getModuleId(p) == matRef && getFunctionId(p) == packRef && p->argc == (p->retc+2))) push_down_delta++; @@ -804,6 +809,74 @@ OPTpushselectImplementation(Client cntxt oclean[i] = 1; actions++; } + } else if (isIntersect(p) && p->retc == 1 && lastbat == 4) { + /* c = delta(b, uid, uvl, ins) + * s = intersect(l, r, li, ..) + * + * nc = intersect(b, r, li..) + * ni = intersect(ins, r, li..) + * nu = intersect(uvl, r, ..) + * s = subdelta(nc, uid, nu, ni); + */ + int var = getArg(p, 1); + InstrPtr q = old[vars[var]]; + + if (q && q->token == ASSIGNsymbol) { + var = getArg(q, 1); + q = old[vars[var]]; + } + if (q && getModuleId(q) == sqlRef && getFunctionId(q) == deltaRef) { + InstrPtr r = copyInstruction(p); + InstrPtr s = copyInstruction(p); + InstrPtr t = copyInstruction(p); + InstrPtr u = copyInstruction(q); + + if( r == NULL || s == NULL || t== NULL ||u == NULL){ + freeInstruction(r); + freeInstruction(s); + freeInstruction(t); + freeInstruction(u); + GDKfree(vars); + GDKfree(nvars); + GDKfree(slices); + GDKfree(rslices); + GDKfree(oclean); + GDKfree(old); + throw(MAL,"optimizer.pushselect", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + getArg(r, 0) = newTmpVariable(mb, newBatType(TYPE_oid)); + setVarCList(mb,getArg(r,0)); + getArg(r, 1) = getArg(q, 1); /* column */ + r->typechk = TYPE_UNKNOWN; + pushInstruction(mb,r); + getArg(s, 0) = newTmpVariable(mb, newBatType(TYPE_oid)); + setVarCList(mb,getArg(s,0)); + getArg(s, 1) = getArg(q, 3); /* updates */ + s = ReplaceWithNil(mb, s, 3, TYPE_bat); /* no candidate list */ + setArgType(mb, s, 3, newBatType(TYPE_oid)); + /* make sure to resolve again */ + s->token = ASSIGNsymbol; + s->typechk = TYPE_UNKNOWN; + s->fcn = NULL; + s->blk = NULL; + pushInstruction(mb,s); + getArg(t, 0) = newTmpVariable(mb, newBatType(TYPE_oid)); + setVarCList(mb,getArg(t,0)); + getArg(t, 1) = getArg(q, 4); /* inserts */ + pushInstruction(mb,t); + + setFunctionId(u, subdeltaRef); + getArg(u, 0) = getArg(p,0); + getArg(u, 1) = getArg(r,0); + getArg(u, 2) = getArg(p,3); /* pre-cands */ + getArg(u, 3) = getArg(q,2); /* update ids */ + getArg(u, 4) = getArg(s,0); + u = pushArgument(mb, u, getArg(t,0)); + u->typechk = TYPE_UNKNOWN; + pushInstruction(mb,u); + oclean[i] = 1; + continue; + } } assert (p == old[i] || oclean[i]); pushInstruction(mb,p); 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 @@ -2199,6 +2199,7 @@ split_join_exps(sql_rel *rel, list *join } #define is_equi_exp(e) ((e)->flag == cmp_equal || (e)->flag == mark_in || (e)->flag == mark_notin) +#define is_equi_exp_(e) ((e)->flag == cmp_equal || (e)->flag == mark_in) static list * get_equi_joins_first(mvc *sql, list *exps, int *equality_only) @@ -2209,7 +2210,7 @@ get_equi_joins_first(mvc *sql, list *exp sql_exp *e = n->data; assert(e->type == e_cmp && e->flag != cmp_in && e->flag != cmp_notin && e->flag != cmp_or); - if (is_equi_exp(e)) + if (is_equi_exp_(e)) list_append(new_exps, e); else *equality_only = 0; @@ -2217,7 +2218,7 @@ get_equi_joins_first(mvc *sql, list *exp for( node *n = exps->h; n; n = n->next ) { sql_exp *e = n->data; - if (!is_equi_exp(e)) + if (!is_equi_exp_(e)) list_append(new_exps, e); } return new_exps; @@ -2523,6 +2524,7 @@ rel2bin_semijoin(backend *be, sql_rel *r list *l, *sexps = NULL; node *en = NULL, *n; stmt *left = NULL, *right = NULL, *join = NULL, *jl, *jr, *c, *lcand = NULL; + int semijoin_only = 0; if (rel->op == op_anti && !list_empty(rel->exps) && list_length(rel->exps) == 1 && ((sql_exp*)rel->exps->h->data)->flag == mark_notin) return rel2bin_antijoin(be, rel, refs); @@ -2601,7 +2603,13 @@ rel2bin_semijoin(backend *be, sql_rel *r if (!l || !r) return NULL; - s = stmt_join_cand(be, column(be, l), column(be, r), left->cand, NULL/*right->cand*/, e->anti, (comp_type) e->flag, 0, is_semantics(e), false); + if (be->no_mitosis && list_length(jexps) == 1 && list_empty(sexps) && rel->op == op_semi && !e->anti && is_equi_exp_(e)) { + join = stmt_semijoin(be, column(be, l), column(be, r), left->cand, NULL/*right->cand*/, is_semantics(e), false); + semijoin_only = 1; + en = NULL; + break; + } else + s = stmt_join_cand(be, column(be, l), column(be, r), left->cand, NULL/*right->cand*/, e->anti, (comp_type) e->flag, 0, is_semantics(e), false); lcand = left->cand; } else { s = exp_bin(be, e, left, right, NULL, NULL, NULL, NULL, 0, 1, 0); @@ -2708,14 +2716,16 @@ rel2bin_semijoin(backend *be, sql_rel *r /* We did a full join, thats too much. Reduce this using difference and intersect */ - c = stmt_mirror(be, bin_first_column(be, left)); - if (rel->op == op_anti) { - join = stmt_tdiff(be, c, jl, lcand); - } else { - if (lcand) - join = stmt_semijoin(be, c, jl, lcand, NULL/*right->cand*/, 0, false); - else - join = stmt_tinter(be, c, jl, false); + if (!semijoin_only) { + c = stmt_mirror(be, bin_first_column(be, left)); + if (rel->op == op_anti) { + join = stmt_tdiff(be, c, jl, lcand); + } else { + if (lcand) + join = stmt_semijoin(be, c, jl, lcand, NULL/*right->cand*/, 0, false); + else + join = stmt_tinter(be, c, jl, false); + } } /* project all the left columns */ diff --git a/sql/test/BugTracker/Tests/case_in_aggr_bug.SF-1506545.stable.out b/sql/test/BugTracker/Tests/case_in_aggr_bug.SF-1506545.stable.out --- a/sql/test/BugTracker/Tests/case_in_aggr_bug.SF-1506545.stable.out +++ b/sql/test/BugTracker/Tests/case_in_aggr_bug.SF-1506545.stable.out @@ -58,8 +58,8 @@ stdout of test 'case_in_aggr_bug.SF-1506 #); #select avg(target_id / case (system_id - 1) WHEN 0 THEN cast(null as int) #ELSE system_id - 1 END) from configuration; -% sys.%1 # table_name -% %1 # name +% sys.%2 # table_name +% %2 # name % double # type % 24 # length [ NULL ] diff --git a/sql/test/BugTracker/Tests/cast_interval2time.SF-1488247.stable.out b/sql/test/BugTracker/Tests/cast_interval2time.SF-1488247.stable.out --- a/sql/test/BugTracker/Tests/cast_interval2time.SF-1488247.stable.out +++ b/sql/test/BugTracker/Tests/cast_interval2time.SF-1488247.stable.out @@ -20,8 +20,8 @@ stdout of test 'cast_interval2time.SF-14 % 6 # length [ 60.000 ] #select cast(interval '60' second as time); -% .%2 # table_name -% %2 # name +% .%1 # table_name +% %1 # name % time # type % 8 # length [ 00:01:00 ] diff --git a/sql/test/BugTracker/Tests/crash_on_cast.SF-1357271.stable.out b/sql/test/BugTracker/Tests/crash_on_cast.SF-1357271.stable.out --- a/sql/test/BugTracker/Tests/crash_on_cast.SF-1357271.stable.out +++ b/sql/test/BugTracker/Tests/crash_on_cast.SF-1357271.stable.out @@ -14,8 +14,8 @@ stdout of test 'crash_on_cast.SF-1357271 #select cast( 1 as varchar(10)); -% .%2 # table_name -% %2 # name +% .%1 # table_name +% %1 # name % varchar # type % 1 # length [ "1" ] diff --git a/sql/test/BugTracker/Tests/mdb_starts_with_sql_debug_64.SF-1999354.stable.out b/sql/test/BugTracker/Tests/mdb_starts_with_sql_debug_64.SF-1999354.stable.out --- a/sql/test/BugTracker/Tests/mdb_starts_with_sql_debug_64.SF-1999354.stable.out +++ b/sql/test/BugTracker/Tests/mdb_starts_with_sql_debug_64.SF-1999354.stable.out @@ -36,8 +36,8 @@ stdout of test 'mdb_starts_with_sql_debu #-- minutes #SET d = 60.0 * (d-nd); #SELECT f2(1,2,3); -% .%2 # table_name -% %2 # name +% .%4 # table_name +% %4 # name % varchar # type % 12 # length [ "00:04:00.004" ] diff --git a/sql/test/BugTracker/Tests/orderby_in_function.SF-1892708.stable.out b/sql/test/BugTracker/Tests/orderby_in_function.SF-1892708.stable.out --- a/sql/test/BugTracker/Tests/orderby_in_function.SF-1892708.stable.out +++ b/sql/test/BugTracker/Tests/orderby_in_function.SF-1892708.stable.out @@ -38,8 +38,8 @@ stdout of test 'orderby_in_function.SF-1 # LIMIT 1; #END; #select CHECK_VIDEO(); -% .%13 # table_name -% %13 # name +% .%15 # table_name +% %15 # name % varchar # type % 7 # length [ "schemas" ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list