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