Changeset: 57df81288f30 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=57df81288f30 Modified Files: monetdb5/modules/kernel/arrays.c monetdb5/modules/kernel/arrays.h monetdb5/modules/kernel/arrays.mal sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c Branch: arrays Log Message:
fixed the plans for arrays subrangejoin, the actual implementation of the subrangejoins is missing diffs (143 lines): diff --git a/monetdb5/modules/kernel/arrays.c b/monetdb5/modules/kernel/arrays.c --- a/monetdb5/modules/kernel/arrays.c +++ b/monetdb5/modules/kernel/arrays.c @@ -1252,6 +1252,29 @@ str ALGsubjoin2(ptr *dimsResL, ptr *dims return ALGsubjoin1(dimsResL, dimsResR, dimL, dimsCandsL, dimR, dimsCandsR); } +str ALGsubrangejoin2(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr* dimsR, const ptr *dimsCandL, const ptr *dimsCandR, const bit *li, const bit *hi, const lng *estimate) { + (void) *dimsResL; + (void) *dimsResR; + (void) *dimL; + (void) *dimsL; + (void) *dimR1; + (void) *dimR2; + (void) *dimsR; + (void) *dimsCandL; + (void) *dimsCandR; + (void) *li; + (void) *hi; + (void) *estimate; + + return MAL_SUCCEED; +} + +str ALGsubrangejoin1(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr* dimsR, const bat *sl, const bat *sr, const bit *li, const bit *hi, const lng *estimate) { + (void) *sl; + (void) *sr; + + return ALGsubrangejoin2(dimsResL, dimsResR, dimL, dimsL, dimR1, dimR2, dimsR, NULL, NULL, li, hi, estimate); +} str ALGnonDimensionQRDecomposition(bat *oidsRes, ptr *dimsRes, const bat* vals, const ptr *dims) { diff --git a/monetdb5/modules/kernel/arrays.h b/monetdb5/modules/kernel/arrays.h --- a/monetdb5/modules/kernel/arrays.h +++ b/monetdb5/modules/kernel/arrays.h @@ -55,6 +55,9 @@ algebra_export str ALGnonDimensionThetas algebra_export str ALGsubjoin1(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr *dimsL, const ptr *dimR, const ptr *dimsR); algebra_export str ALGsubjoin2(ptr *dimsResL, ptr *dimsResR, const ptr *dimsCandsL, const ptr *dimL, const ptr *dimsL, const ptr *dimsCandsR, const ptr *dimR, const ptr *dimsR); +algebra_export str ALGsubrangejoin1(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr *dimsR, const bat *sl, const bat *sr, const bit *li, const bit *hi, const lng *estimate); +algebra_export str ALGsubrangejoin2(ptr *dimsResL, ptr *dimsResR, const ptr *dimL, const ptr *dimsL, const ptr *dimR1, const ptr *dimR2, const ptr *dimsR, const ptr *dimsCandL, const ptr *dimsCandR, const bit *li, const bit *hi, const lng *estimate); + algebra_export str ALGprojectDimension(bat* result, const ptr *dim, const ptr *array); algebra_export str ALGprojectNonDimension(bat *result, const bat *vals, const ptr *array); diff --git a/monetdb5/modules/kernel/arrays.mal b/monetdb5/modules/kernel/arrays.mal --- a/monetdb5/modules/kernel/arrays.mal +++ b/monetdb5/modules/kernel/arrays.mal @@ -90,7 +90,13 @@ address ALGsubjoin1; command algebra.subjoin(candDimsl:ptr, diml:ptr, dimsl:ptr, candDimsr:ptr, dimr:ptr, dimsr:ptr) (:ptr,:ptr) address ALGsubjoin2; +command algebra.subrangejoin(diml:ptr, dimsl:ptr, dimr1:ptr, dimr2:ptr, dimsr:ptr, sl:bat[:oid,:oid],sr:bat[:oid,:oid],li:bit,hi:bit,estimate:lng) (:ptr,:ptr) +address ALGsubrangejoin1 +comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2"; +command algebra.subrangejoin(diml:ptr, dimsl:ptr, dimr1:ptr, dimr2:ptr, dimsr:ptr, candDimsl:ptr, candDimsr:ptr,li:bit,hi:bit,estimate:lng) (:ptr,:ptr) +address ALGsubrangejoin2 +comment "Range join: values in l and r1/r2 match if r1 <[=] l <[=] r2"; #projects a dimension command algebra.projectArray(dim:ptr, dims:ptr) :bat[:oid,:any] 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 @@ -1765,8 +1765,11 @@ static stmt *rel2bin_array_join(mvc *sql if (!join) join = s; - else + else if(join->type == st_join) join->op3 = s; + else if(join->type == st_join2) + join->op4.stval = s; + else return NULL; /* error */ } } else { diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -1781,27 +1781,39 @@ static int setVarUDFtype(mb, getArg(q, 0)); // if(s->type == st_join2) // q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid))); - q = pushArgument(mb, q, l); //all the dimensions - q = pushArgument(mb, q, arraySecondVar); //the current dimension + q = pushArgument(mb, q, l); //the dimension + q = pushArgument(mb, q, arraySecondVar); //the array } else q = pushArgument(mb, q, l); - if(sub > 0) { //candidates + if(s->type != st_join2 && sub > 0) { //candidates q = pushArgument(mb, q, sub); - - snprintf(nme, SMALLBUFSIZ, "Y_%d", sub); - if((arraySecondVar = findVariable(mb, nme)) >= 0) - q = pushArgument(mb, q, arraySecondVar); } if (rs) { q = pushArgument(mb, q, rs); } else { q = pushArgument(mb, q, r1); + /* I assume that both are from the same array and give only the second one as an argument + snprintf(nme, SMALLBUFSIZ, "Y_%d", r1); + if((arraySecondVar = findVariable(mb, nme)) >= 0) + q = pushArgument(mb, q, arraySecondVar); + */ q = pushArgument(mb, q, r2); + snprintf(nme, SMALLBUFSIZ, "Y_%d", r2); + if((arraySecondVar = findVariable(mb, nme)) >= 0) + q = pushArgument(mb, q, arraySecondVar); } if (s->type == st_join2) { - q = pushNil(mb, q, TYPE_bat); - q = pushNil(mb, q, TYPE_bat); + if(sub>0) { /* add candidates */ + q = pushArgument(mb, q, sub); + + snprintf(nme, SMALLBUFSIZ, "r1_%d", sub); + if((arraySecondVar = findVariable(mb, nme)) >= 0) + q = pushArgument(mb, q, arraySecondVar); + } else { + q = pushNil(mb, q, TYPE_bat); + q = pushNil(mb, q, TYPE_bat); + } } switch (s->flag & 3) { diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -1740,7 +1740,7 @@ stack_push_children(sql_stack *stk, stmt stack_push_list(stk, s->op4.lval); break; default: - if ((s->type == st_uselect2 || s->type == st_group) && s->op4.stval) + if ((s->type == st_uselect2 || s->type == st_group || s->type == st_join2) && s->op4.stval) stack_push_stmt(stk, s->op4.stval, 1); if (s->op3) stack_push_stmt(stk, s->op3, 1); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list