Changeset: 08b9aa1d9db1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/08b9aa1d9db1
Modified Files:
        clients/Tests/exports.stable.out
        monetdb5/optimizer/opt_mergetable.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        sql/server/rel_optimizer.c
Branch: Jan2022
Log Message:

properly detect (safe cases) of cross product to handle by merge table


diffs (99 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -915,6 +915,7 @@ InstrPtr copyInstructionArgs(InstrPtr p,
 MalBlkPtr copyMalBlk(MalBlkPtr mb);
 const char *copyRef;
 const char *copy_fromRef;
+const char *corrRef;
 const char *countRef;
 const char *count_no_nilRef;
 int cpyConstant(MalBlkPtr mb, VarPtr vr);
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -2095,6 +2095,20 @@ OPTmergetableImplementation(Client cntxt
                        actions++;
                        continue;
                }
+               if (match > 0 && getModuleId(p) == algebraRef && 
getFunctionId(p) == crossRef &&
+                       p->argc == 5 && p->retc == 2 && bats == 2) {
+                       int max_one = (isVarConstant(mb,getArg(p,4)) && 
getVarConstant(mb,getArg(p,4)).val.btval);
+                       if (!max_one) {
+                               m = is_a_mat(getArg(p,p->retc), &ml);
+                               n = is_a_mat(getArg(p,p->retc+1), &ml);
+                               if(mat_join2(mb, p, &ml, m, n, -1, -1)) {
+                                       msg = 
createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       goto cleanup;
+                               }
+                               actions++;
+                               continue;
+                       }
+               }
                /*
                 * Aggregate handling is a prime target for optimization.
                 * The simple cases are dealt with first.
diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -84,6 +84,7 @@ const char *connectRef;
 const char *contextRef;
 const char *copy_fromRef;
 const char *copyRef;
+const char *corrRef;
 const char *count_no_nilRef;
 const char *countRef;
 const char *create_constraintRef;
@@ -401,6 +402,7 @@ void optimizerInit(void)
        contextRef = putName("context");
        copy_fromRef = putName("copy_from");
        copyRef = putName("copy");
+       corrRef = putName("corr");
        count_no_nilRef = putName("count_no_nil");
        countRef = putName("count");
        create_constraintRef = putName("create_constraint");
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -80,6 +80,7 @@ mal_export  const char *connectRef;
 mal_export  const char *contextRef;
 mal_export  const char *copy_fromRef;
 mal_export  const char *copyRef;
+mal_export  const char *corrRef;
 mal_export  const char *count_no_nilRef;
 mal_export  const char *countRef;
 mal_export  const char *create_constraintRef;
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -519,7 +519,7 @@ isOrderDepenent(InstrPtr p)
 {
        if( getModuleId(p) != batsqlRef)
                return 0;
-       if ( getFunctionId(p) == differenceRef ||
+       if (getFunctionId(p) == differenceRef ||
                getFunctionId(p) == window_boundRef ||
                getFunctionId(p) == row_numberRef ||
                getFunctionId(p) == rankRef ||
@@ -531,7 +531,8 @@ isOrderDepenent(InstrPtr p)
                getFunctionId(p) == last_valueRef ||
                getFunctionId(p) == nth_valueRef ||
                getFunctionId(p) == lagRef ||
-               getFunctionId(p) == leadRef)
+               getFunctionId(p) == leadRef ||
+               getFunctionId(p) == corrRef)
                return 1;
        return 0;
 }
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6497,7 +6497,7 @@ rel_push_project_up(visitor *v, sql_rel 
        return rel;
 }
 
-/* if local_proj is >= -1, the current expression is from the same projection 
+/* if local_proj is >= -1, the current expression is from the same projection
    if local_proj is -1, then we don't care about self references (eg used to 
check for order by exps) */
 static int exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to