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

Reply via email to