Changeset: eed3d16b33f6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/eed3d16b33f6 Modified Files: monetdb5/optimizer/opt_mergetable.c Branch: Dec2023 Log Message:
enable partitioning on rangejoins diffs (88 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 @@ -945,6 +945,68 @@ mat_join2(MalBlkPtr mb, InstrPtr p, matl } static int +mat_rangejoin(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n) +{ + int tpe1 = getArgType(mb, p, 0), tpe2 = getArgType(mb, p, 1), k, nr = 1; + mat_t *mat = ml->v; + InstrPtr l; + InstrPtr r; + + //printf("# %s.%s(%d,%d)", getModuleId(p), getFunctionId(p), m, n); + + assert(m >= 0 && n >= 0 && mat[m].mi->argc == mat[n].mi->argc); + l = newInstructionArgs(mb, matRef, packRef, mat[m].mi->argc * mat[n].mi->argc); + r = newInstructionArgs(mb, matRef, packRef, mat[m].mi->argc * mat[n].mi->argc); + if (!l || !r) { + freeInstruction(l); + freeInstruction(r); + return -1; + } + + getArg(l, 0) = getArg(p, 0); + getArg(r, 0) = getArg(p, 1); + + for (k = 1; k < mat[m].mi->argc; k++) { + InstrPtr q = copyInstruction(p); + + if (!q) { + freeInstruction(l); + freeInstruction(r); + return -1; + } + + getArg(q, 0) = newTmpVariable(mb, tpe1); + getArg(q, 1) = newTmpVariable(mb, tpe2); + + getArg(q, 3) = getArg(mat[m].mi, k); + getArg(q, 4) = getArg(mat[n].mi, k); + pushInstruction(mb, q); + + if (mb->errors || propagatePartnr(ml, getArg(mat[m].mi, k), getArg(q, 0), nr) + || propagatePartnr(ml, getArg(mat[n].mi, k), getArg(q, 1), nr)) { + freeInstruction(r); + freeInstruction(l); + return -1; + } + + /* add result to mat */ + l = pushArgument(mb, l, getArg(q, 0)); + r = pushArgument(mb, r, getArg(q, 1)); + nr++; + } + if (mb->errors || mat_add(ml, l, mat_none, getFunctionId(p))) { + freeInstruction(l); + freeInstruction(r); + return -1; + } + if (mat_add(ml, r, mat_none, getFunctionId(p))) { + freeInstruction(r); + return -1; + } + return 0; +} + +static int join_split(Client cntxt, InstrPtr p, int args) { char *name = NULL; @@ -2420,6 +2482,15 @@ OPTmergetableImplementation(Client cntxt goto cleanup; } } else { + if (bats + nilbats == 5 && !is_a_mat(getArg(p, p->retc), &ml) && match == 2) { + n = is_a_mat(getArg(p, p->retc + 1), &ml); + o = is_a_mat(getArg(p, p->retc + 2), &ml); + if (mat_rangejoin(mb, p, &ml, n, o)) { + msg = createException(MAL, "optimizer.mergetable", + SQLSTATE(HY013) MAL_MALLOC_FAIL); + goto cleanup; + } + } else if (mat_joinNxM(cntxt, mb, p, &ml, bats)) { msg = createException(MAL, "optimizer.mergetable", SQLSTATE(HY013) MAL_MALLOC_FAIL); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org