Shouldn't this have gone to the Dec2011 branch? On 2012-01-04 22:30, Martin Kersten wrote:
Changeset: fa4034576f02 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fa4034576f02 Modified Files: monetdb5/optimizer/opt_joinpath.mx Branch: default Log Message:
Fix for bug 2965 Typechecking should be included as extra defense line. Furthermore, we need to remove reference counts during error handling.
diffs (74 lines):
diff --git a/monetdb5/optimizer/opt_joinpath.mx b/monetdb5/optimizer/opt_joinpath.mx --- a/monetdb5/optimizer/opt_joinpath.mx +++ b/monetdb5/optimizer/opt_joinpath.mx @@ -580,7 +580,7 @@ ALGjoinPathBody(Client cntxt, int top, B * BEWARE. you may not use a size estimation, because it * may fire a BATproperty check in a few cases. * In case a join fails, we may try another order first before - * abandoning the task. + * abandoning the task. It can handle cases where a Cartesian product emerges. * * A left-join sequence only requires the result to be sorted * against the first operand. For all others operand pairs, the cheapest join suffice. @@ -599,12 +599,20 @@ ALGjoinPathBody(Client cntxt, int top, B b = BATsemijoin(joins[j], joins[j + 1]); } if (b==NULL){ + if ( postpone[j] && postpone[j+1]){ + for( --top; top>=0; top--) + BBPreleaseref(joins[top]->batCacheid); + GDKfree(postpone); + return NULL; + } postpone[j] = TRUE; postpone[j+1] = TRUE; postponed = 0; for( k=0; k
=0; top--) + BBPreleaseref(joins[top]->batCacheid); GDKfree(postpone); return NULL; } @@ -624,6 +632,12 @@ ALGjoinPathBody(Client cntxt, int top, B mnstr_printf(cntxt->fdout, "#joinPath %d:= join(%d,%d)\n", b->batCacheid, joins[j]->batCacheid, joins[j + 1]->batCacheid); + if ( b == 0 ){ + for( --top; top>=0; top--) + BBPreleaseref(joins[top]->batCacheid); + GDKfree(postpone); + return 0; + } BBPdecref(joins[j]->batCacheid, FALSE); BBPdecref(joins[j+1]->batCacheid, FALSE); joins[j] = b; @@ -645,17 +659,25 @@ ALGjoinPath(Client cntxt, MalBlkPtr mb, BAT *b, **joins = (BAT**)GDKmalloc(pci->argc*sizeof(BAT*)); str joinPathRef = putName("joinPath",8); str leftjoinPathRef = putName("leftjoinPath",12); + int error = 0;
if ( joins == NULL) throw(MAL, "algebra.joinPath", MAL_MALLOC_FAIL); (void)mb; for (i = pci->retc; i < pci->argc; i++) { bid = (int *) getArgReference(stk, pci, i); - if ((b = BATdescriptor(*bid)) == NULL) { + b = BATdescriptor(*bid); + if ( b && top ) { + if (TYPEerror(joins[top-1]->ttype, b->htype) ) { + b= NULL; + error = 1; + } + } + if ( b == NULL) { for( --top; top>=0; top--) BBPreleaseref(joins[top]->batCacheid); GDKfree(joins); - throw(MAL, "algebra.joinPath", INTERNAL_BAT_ACCESS); + throw(MAL, "algebra.joinPath", error? SEMANTIC_TYPE_MISMATCH: INTERNAL_BAT_ACCESS); } joins[top++] = b; } _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list
-- Sjoerd Mullender