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

Reply via email to