Changeset: bd22e6f3bb47 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bd22e6f3bb47 Modified Files: monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/rel_bin.c Branch: Jun2020 Log Message:
use intersect/diff for in-value-list handling, to make sure a in-expression returns a proper unique candidate list. diffs (113 lines): 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 @@ -650,7 +650,7 @@ mat_apply4(MalBlkPtr mb, InstrPtr p, mat } static int -mat_setop(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n) +mat_setop(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o) { int tpe = getArgType(mb,p, 0), k, j; InstrPtr r = newInstruction(mb, matRef, packRef); @@ -665,6 +665,9 @@ mat_setop(MalBlkPtr mb, InstrPtr p, matl assert(m>=0 || n>=0); if (m >= 0 && n >= 0) { int nr = 1; + + assert(o < 0 || mat[m].mi->argc == mat[o].mi->argc); + for(k=1; k<mat[m].mi->argc; k++) { InstrPtr q = copyInstruction(p); InstrPtr s = newInstruction(mb, matRef, packRef); @@ -700,6 +703,8 @@ mat_setop(MalBlkPtr mb, InstrPtr p, matl getArg(q,0) = newTmpVariable(mb, tpe); getArg(q,1) = getArg(mat[m].mi,k); getArg(q,2) = getArg(s,0); + if (o >= 0) + getArg(q,3) = getArg(mat[o].mi, k); if(setPartnr(ml, getArg(mat[m].mi,k), getArg(q,0), nr)) { freeInstruction(q); freeInstruction(r); @@ -712,6 +717,8 @@ mat_setop(MalBlkPtr mb, InstrPtr p, matl } } else { assert(m >= 0); + assert(o < 0 || mat[m].mi->argc == mat[o].mi->argc); + for(k=1; k<mat[m].mi->argc; k++) { InstrPtr q = copyInstruction(p); if(!q) { @@ -721,6 +728,8 @@ mat_setop(MalBlkPtr mb, InstrPtr p, matl getArg(q,0) = newTmpVariable(mb, tpe); getArg(q,1) = getArg(mat[m].mi, k); + if (o >= 0) + getArg(q,3) = getArg(mat[o].mi, k); pushInstruction(mb,q); if(setPartnr(ml, getArg(q, 2), getArg(q,0), k)) { @@ -2251,7 +2260,8 @@ OPTmergetableImplementation(Client cntxt getFunctionId(p) == intersectRef) && (m=is_a_mat(getArg(p,1), &ml)) >= 0) { n=is_a_mat(getArg(p,2), &ml); - if(mat_setop(mb, p, &ml, m, n)) { + o=is_a_mat(getArg(p,3), &ml); + if(mat_setop(mb, p, &ml, m, n, o)) { msg = createException(MAL,"optimizer.mergetable",SQLSTATE(HY013) MAL_MALLOC_FAIL); goto cleanup; } 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 @@ -363,7 +363,7 @@ subrel_project( backend *be, stmt *s, li } static stmt * -handle_in_exps(backend *be, sql_exp *ce, list *nl, stmt *left, stmt *right, stmt *grp, stmt *ext, stmt *cnt, stmt *sel, int in, int use_r, int depth, int reduce) +handle_in_exps(backend *be, sql_exp *ce, list *nl, stmt *left, stmt *right, stmt *grp, stmt *ext, stmt *cnt, stmt *sel, bool in, int use_r, int depth, int reduce) { mvc *sql = be->mvc; node *n; @@ -433,10 +433,9 @@ handle_in_exps(backend *be, sql_exp *ce, s = stmt_project(be, stmt_selectnonil(be, s, NULL), s); } - s = stmt_join(be, c, s, in, cmp_equal, 1, 0, false); - s = stmt_result(be, s, 0); - - if (!in) { + if (in) { + s = stmt_semijoin(be, c, s, sel, NULL, 0, false); + } else { if (last_null_value) { /* CORNER CASE ALERT: In case of a not-in-expression with the associated in-value-list containing a null value, @@ -448,24 +447,15 @@ handle_in_exps(backend *be, sql_exp *ce, list* singleton_bat = sa_list(sql->sa); list_append(singleton_bat, null_value); */ s = stmt_uselect(be, c, last_null_value, cmp_equal, NULL, 0, 0); - return s; - } - else { + } else { /* BACK TO HAPPY FLOW: Make sure that null values are never returned. */ stmt* non_nulls; - non_nulls = stmt_selectnonil(be, c, NULL); - s = stmt_tdiff(be, non_nulls, s, NULL); + non_nulls = stmt_selectnonil(be, c, sel); + s = stmt_tdiff(be, stmt_project(be, non_nulls, c), s, NULL); s = stmt_project(be, s, non_nulls); } } - - if (sel) { - stmt* oid_intersection; - oid_intersection = stmt_tinter(be, s, sel, false); - s = stmt_project(be, oid_intersection, s); - s = stmt_result(be, s, 0); - } } return s; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list