Changeset: e2ff8c5bf7c0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e2ff8c5bf7c0 Modified Files: monetdb5/modules/mal/calc_arrays.mal sql/backends/monet5/sql_gencode.c Branch: arrays Log Message:
MAL plans from scalar addition and multiplication diffs (121 lines): diff --git a/monetdb5/modules/mal/calc_arrays.mal b/monetdb5/modules/mal/calc_arrays.mal --- a/monetdb5/modules/mal/calc_arrays.mal +++ b/monetdb5/modules/mal/calc_arrays.mal @@ -25,8 +25,12 @@ #comment "Unary dimension values - 1"; #+ +#When adding two dimensions we get result similar to dimsCands (ptr) and oisdCands (bat) pattern calc.+(dim1:ptr, dims1:ptr, dim2:ptr, dims2:ptr) (:ptr, :bat[:oid,:lng]) address CMDdimensionsADDsingnal comment "Return a bat with the sum of the two dimensions"; +#when adding a constant to the nonDimensional column we get result similar to vals (bat), array (ptr) +pattern calc.+(v:lng, vals:bat[:oid,:lng], array:ptr) (:bat[:oid,:lng], :ptr) address CMDnonDimensionADDsingnal_lng +comment "Add v to all values in the BAT"; #pattern +(v:bte, dim:ptr, dims:ptr) (:ptr, :ptr) address CMDdimensionADDsignal #comment "Return V + dimension values, guarantee no overflow by returning larger type"; #pattern +(v:sht, dim:ptr, dims:ptr) (:ptr, :ptr) address CMDdimensionADDsignal @@ -68,6 +72,9 @@ comment "Return V * dimension values, gu pattern calc.*(v:flt, dim:ptr, dims:ptr, tp:int) (:ptr, :ptr) address CMDdimensionMULsignal comment "Return V * dimension values, guarantee no overflow by returning larger type"; +pattern calc.*(v:lng, vals:bat[:oid,:lng], array:ptr) (:bat[:oid,:lng], :ptr) address CMDnonDimensionMULsingnal_lng +comment "Return a bat with the sum of the two dimensions"; + ##/ #pattern /(dim:ptr, dims:ptr, v:bte) (:ptr, :ptr) address CMDdimensionDIVsignal #comment "Return dimension values / V, signal error on overflow"; @@ -320,6 +327,10 @@ comment "Cast dimension values to oid"; command batcalc.str(dim:ptr, dims:ptr) (:ptr, :ptr) address CMDdimensionCONVERT_str comment "Cast dimension values to str"; +pattern batcalc.lng(:bat[:oid,:int], :ptr) (:bat[:oid,:lng], :ptr) +address CMDnonDimensionCONVERT_lng +comment "Cast from int to long"; + #pattern ptr(dim:ptr, dims:ptr) (:ptr, :ptr) address CMDdimensionCONVERTptr #comment "Cast dimension values to ptr"; # 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 @@ -2125,9 +2125,12 @@ static int snprintf(nme, SMALLBUFSIZ, "Y_%d", l); if((arraySecondVar = findVariable(mb, nme)) >=0) { - setVarType(mb, getArg(q, 0), TYPE_ptr); + if(isDimension(s->op1)) + setVarType(mb, getArg(q, 0), TYPE_ptr); + else + setVarType(mb, getArg(q, 0), newBatType(TYPE_oid, t->type->localtype)); setVarUDFtype(mb, getArg(q, 0)); - q = pushArgument(mb, q, arraySecondVar); + q = pushArgument(mb, q, arraySecondVar); q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); } @@ -2159,6 +2162,7 @@ static int node *n; int arrayRelated = 0; + int dimensionsInvolved =0; /* dump operands */ if (_dumpstmt(sql, mb, s->op1) < 0) @@ -2172,7 +2176,10 @@ static int //check if any of the arguments is array related for(n=s->op1->op4.lval->h ; n ; n=n->next) { stmt *op = n->data; - arrayRelated += isDimension(op); + //check if each operator has a second argument + snprintf(nme, SMALLBUFSIZ, "Y_%d", op->nr); + arrayRelated = (findVariable(mb, nme) >= 0); + dimensionsInvolved += isDimension(op); } if (s->nrcols && !arrayRelated) { @@ -2230,22 +2237,31 @@ static int if((arraySecondVar = findVariable(mb, nme)) >=0) q = pushArgument(mb, q, arraySecondVar); } - if(arrayRelated == 1) { - //push the type the result should be - sql_subtype *res = f->res->h->data; - q = pushInt(mb, q, res->type->localtype); - setVarType(mb, getArg(q, 0), TYPE_ptr); - setVarUDFtype(mb, getArg(q, 0)); - //push one more return argument - q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); - } else if(arrayRelated > 1) { - //the second argument is a bat with the correct type - sql_subtype *res = f->res->h->data; - setVarType(mb, getArg(q, 0), TYPE_ptr); - setVarUDFtype(mb, getArg(q, 0)); - q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, res->type->localtype))); + if(arrayRelated) { + if(dimensionsInvolved == 1) { + //push the type the result should be + sql_subtype *res = f->res->h->data; + q = pushInt(mb, q, res->type->localtype); + setVarType(mb, getArg(q, 0), TYPE_ptr); + setVarUDFtype(mb, getArg(q, 0)); + //push one more return argument + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); + } else if(dimensionsInvolved > 1) { + //the second argument is a bat with the correct type + sql_subtype *res = f->res->h->data; + setVarType(mb, getArg(q, 0), TYPE_ptr); + setVarUDFtype(mb, getArg(q, 0)); + q = pushReturn(mb, q, newTmpVariable(mb, newBatType(TYPE_oid, res->type->localtype))); + } else { + //the first argument is a BAT as was the first argument (is the nonDimensional values of the array) + sql_subtype *res = f->res->h->data; + setVarType(mb, getArg(q, 0), newBatType(TYPE_oid, res->type->localtype)); + setVarUDFtype(mb, getArg(q, 0)); + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_ptr)); + } } arrayRelated = 0; + dimensionsInvolved =0 ; if (q == NULL) return -1; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list