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<top; k++)
>                               postponed += postpone[k]== TRUE;
>                       if ( postponed == top){
> +                             for( --top; top>=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-l...@monetdb.org
> http://mail.monetdb.org/mailman/listinfo/checkin-list


-- 
Sjoerd Mullender

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
_______________________________________________
Monetdb-developers mailing list
Monetdb-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/monetdb-developers

Reply via email to