Changeset: 611ac5ca111f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=611ac5ca111f
Modified Files:
        monetdb5/modules/mal/array.mx
        sql/scripts/29_array.sql
        sql/test/sciql/Tests/07_tiling_01.sql
        sql/test/sciql/Tests/07_tiling_01.stable.out
        sql/test/sciql/Tests/07_tiling_02.sql
        sql/test/sciql/Tests/07_tiling_02.stable.out
        sql/test/sciql/Tests/07_tiling_03.sql
        sql/test/sciql/Tests/07_tiling_03.stable.out
Branch: sciql
Log Message:

[bat]array.sum(): always create largest type to avoid overflow

Just as with SQL aggregation (aggr.sum()), also SciQL aggregation 
([bat]array.sum())
now aggregates into the largest integer (bigint / lng) resp. floating point 
(double / dbl)
type to avoid overflows (as far as possible).

Extended tests accordingly.


diffs (truncated from 1026 to 300 lines):

diff --git a/monetdb5/modules/mal/array.mx b/monetdb5/modules/mal/array.mx
--- a/monetdb5/modules/mal/array.mx
+++ b/monetdb5/modules/mal/array.mx
@@ -88,7 +88,11 @@ end filler_;
 #address ARRAYtilesAvg
 #comment "Construct the average over all tiles";
 
-pattern sum(val:any_1, any...):any_1
+pattern sum(val:any, any...):lng
+address ARRAYtilesSum
+comment "Construct the sum over all tiles";
+
+pattern sum(val:any, any...):dbl
 address ARRAYtilesSum
 comment "Construct the sum over all tiles";
 
@@ -99,7 +103,11 @@ comment "Construct the average over all 
 module batarray;
 
 # The BAT version of the AGGR functions over array tiles
-pattern sum(val:bat[:oid,:any_1], any...):bat[:oid,:any_1]
+pattern sum(val:bat[:oid,:any], any...):bat[:oid,:lng]
+address ARRAYtilesSum
+comment "Construct the sum over all tiles";
+
+pattern sum(val:bat[:oid,:any], any...):bat[:oid,:dbl]
 address ARRAYtilesSum
 comment "Construct the sum over all tiles";
 
@@ -734,7 +742,8 @@ ARRAYtilesSum_@1(Client cntxt, MalBlkPtr
        int *ret = (int*) getArgReference(stk,pci,0), i = 0, ndims = 0, err = 0;
        BATiter bValI, *bDimsI = NULL, *bOffsetsI = NULL;
        BUN p, q, tmpbun, r, s;
-       @1 sum = 0, elm = 0;
+       @1 elm = 0;
+       @2 sum = 0;
        /* FIXME: this code only deal with INT dimensions */
        int os = 0, cidx = 0, *dMin = NULL, *dMax = NULL, *dSize = NULL, *apidx 
= NULL;
        oid tid = 0, osid = 0, vid = 0, mul = 0;
@@ -783,7 +792,7 @@ ARRAYtilesSum_@1(Client cntxt, MalBlkPtr
 
        /* For each anchor piont, compute all cells belong to this tile 
(bVal.head
         * is the group nr.) and compute the SUM */
-       bRes =  BATnew(TYPE_oid, TYPE_@1, BATcount(bVal));
+       bRes =  BATnew(TYPE_oid, TYPE_@2, BATcount(bVal));
        BATloop(bVal, p, q) {
                sum = 0;
                tid = *(oid*) BUNhead(bValI, p);
diff --git a/sql/scripts/29_array.sql b/sql/scripts/29_array.sql
--- a/sql/scripts/29_array.sql
+++ b/sql/scripts/29_array.sql
@@ -66,8 +66,8 @@ create function array_avg(val real,     
 create function array_avg(val double,   dim1 int, offsets1 int, size1 int) 
returns double external name "array".avg;
 
 create function array_sum(val tinyint,  dim1 int, offsets1 int, size1 int) 
returns bigint external name "array".sum;
-create function array_sum(val smallint, dim1 int, offsets1 int, size1 int) 
returns double external name "array".sum;
-create function array_sum(val int,      dim1 int, offsets1 int, size1 int) 
returns double external name "array".sum;
+create function array_sum(val smallint, dim1 int, offsets1 int, size1 int) 
returns bigint external name "array".sum;
+create function array_sum(val int,      dim1 int, offsets1 int, size1 int) 
returns bigint external name "array".sum;
 create function array_sum(val bigint,   dim1 int, offsets1 int, size1 int) 
returns bigint external name "array".sum;
 create function array_sum(val real,     dim1 int, offsets1 int, size1 int) 
returns double external name "array".sum;
 create function array_sum(val double,   dim1 int, offsets1 int, size1 int) 
returns double external name "array".sum;
@@ -80,8 +80,8 @@ create function array_avg(val real,     
 create function array_avg(val double,   dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns double external name "array".avg;
 
 create function array_sum(val tinyint,  dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns bigint external name "array".sum;
-create function array_sum(val smallint, dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns double external name "array".sum;
-create function array_sum(val int,      dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns double external name "array".sum;
+create function array_sum(val smallint, dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns bigint external name "array".sum;
+create function array_sum(val int,      dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns bigint external name "array".sum;
 create function array_sum(val bigint,   dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns bigint external name "array".sum;
 create function array_sum(val real,     dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns double external name "array".sum;
 create function array_sum(val double,   dim1 int, offsets1 int, size1 int, 
dim2 int, offsets2 int, size2 int) returns double external name "array".sum;
diff --git a/sql/test/sciql/Tests/07_tiling_01.sql 
b/sql/test/sciql/Tests/07_tiling_01.sql
--- a/sql/test/sciql/Tests/07_tiling_01.sql
+++ b/sql/test/sciql/Tests/07_tiling_01.sql
@@ -1,5 +1,30 @@
-create array a (x int dimension[4], y int dimension[4], v float default 37);
+create array a (x int dimension[4], y int dimension[4], v tinyint default 37);
 select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
 select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
 drop array a;
 
+create array a (x int dimension[4], y int dimension[4], v smallint default 37);
+select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+drop array a;
+
+create array a (x int dimension[4], y int dimension[4], v integer default 37);
+select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+drop array a;
+
+create array a (x int dimension[4], y int dimension[4], v bigint default 37);
+select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+drop array a;
+
+create array a (x int dimension[4], y int dimension[4], v real default 37);
+select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+drop array a;
+
+create array a (x int dimension[4], y int dimension[4], v double default 37);
+select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+drop array a;
+
diff --git a/sql/test/sciql/Tests/07_tiling_01.stable.out 
b/sql/test/sciql/Tests/07_tiling_01.stable.out
--- a/sql/test/sciql/Tests/07_tiling_01.stable.out
+++ b/sql/test/sciql/Tests/07_tiling_01.stable.out
@@ -45,7 +45,227 @@ Ready.
 # 14:43:17 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=jarl" 
"--port=39237"
 # 14:43:17 >  
 
-#create array a (x int dimension[4], y int dimension[4], v float default 37);
+#create array a (x int dimension[4], y int dimension[4], v tinyint default 37);
+#select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    double # type
+% 1,   1,      24 # length
+[ 0,   0,      37      ]
+[ 0,   1,      37      ]
+[ 0,   2,      37      ]
+[ 0,   3,      37      ]
+[ 1,   0,      37      ]
+[ 1,   1,      37      ]
+[ 1,   2,      37      ]
+[ 1,   3,      37      ]
+[ 2,   0,      37      ]
+[ 2,   1,      37      ]
+[ 2,   2,      37      ]
+[ 2,   3,      37      ]
+[ 3,   0,      37      ]
+[ 3,   1,      37      ]
+[ 3,   2,      37      ]
+[ 3,   3,      37      ]
+#select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    bigint # type
+% 1,   1,      3 # length
+[ 0,   0,      74      ]
+[ 0,   1,      148     ]
+[ 0,   2,      222     ]
+[ 0,   3,      222     ]
+[ 1,   0,      111     ]
+[ 1,   1,      222     ]
+[ 1,   2,      333     ]
+[ 1,   3,      333     ]
+[ 2,   0,      111     ]
+[ 2,   1,      222     ]
+[ 2,   2,      333     ]
+[ 2,   3,      333     ]
+[ 3,   0,      74      ]
+[ 3,   1,      148     ]
+[ 3,   2,      222     ]
+[ 3,   3,      222     ]
+
+#create array a (x int dimension[4], y int dimension[4], v smallint default 
37);
+#select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    double # type
+% 1,   1,      24 # length
+[ 0,   0,      37      ]
+[ 0,   1,      37      ]
+[ 0,   2,      37      ]
+[ 0,   3,      37      ]
+[ 1,   0,      37      ]
+[ 1,   1,      37      ]
+[ 1,   2,      37      ]
+[ 1,   3,      37      ]
+[ 2,   0,      37      ]
+[ 2,   1,      37      ]
+[ 2,   2,      37      ]
+[ 2,   3,      37      ]
+[ 3,   0,      37      ]
+[ 3,   1,      37      ]
+[ 3,   2,      37      ]
+[ 3,   3,      37      ]
+#select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    bigint # type
+% 1,   1,      3 # length
+[ 0,   0,      74      ]
+[ 0,   1,      148     ]
+[ 0,   2,      222     ]
+[ 0,   3,      222     ]
+[ 1,   0,      111     ]
+[ 1,   1,      222     ]
+[ 1,   2,      333     ]
+[ 1,   3,      333     ]
+[ 2,   0,      111     ]
+[ 2,   1,      222     ]
+[ 2,   2,      333     ]
+[ 2,   3,      333     ]
+[ 3,   0,      74      ]
+[ 3,   1,      148     ]
+[ 3,   2,      222     ]
+[ 3,   3,      222     ]
+
+#create array a (x int dimension[4], y int dimension[4], v integer default 37);
+#select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    double # type
+% 1,   1,      24 # length
+[ 0,   0,      37      ]
+[ 0,   1,      37      ]
+[ 0,   2,      37      ]
+[ 0,   3,      37      ]
+[ 1,   0,      37      ]
+[ 1,   1,      37      ]
+[ 1,   2,      37      ]
+[ 1,   3,      37      ]
+[ 2,   0,      37      ]
+[ 2,   1,      37      ]
+[ 2,   2,      37      ]
+[ 2,   3,      37      ]
+[ 3,   0,      37      ]
+[ 3,   1,      37      ]
+[ 3,   2,      37      ]
+[ 3,   3,      37      ]
+#select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    bigint # type
+% 1,   1,      3 # length
+[ 0,   0,      74      ]
+[ 0,   1,      148     ]
+[ 0,   2,      222     ]
+[ 0,   3,      222     ]
+[ 1,   0,      111     ]
+[ 1,   1,      222     ]
+[ 1,   2,      333     ]
+[ 1,   3,      333     ]
+[ 2,   0,      111     ]
+[ 2,   1,      222     ]
+[ 2,   2,      333     ]
+[ 2,   3,      333     ]
+[ 3,   0,      74      ]
+[ 3,   1,      148     ]
+[ 3,   2,      222     ]
+[ 3,   3,      222     ]
+
+#create array a (x int dimension[4], y int dimension[4], v bigint default 37);
+#select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    double # type
+% 1,   1,      24 # length
+[ 0,   0,      37      ]
+[ 0,   1,      37      ]
+[ 0,   2,      37      ]
+[ 0,   3,      37      ]
+[ 1,   0,      37      ]
+[ 1,   1,      37      ]
+[ 1,   2,      37      ]
+[ 1,   3,      37      ]
+[ 2,   0,      37      ]
+[ 2,   1,      37      ]
+[ 2,   2,      37      ]
+[ 2,   3,      37      ]
+[ 3,   0,      37      ]
+[ 3,   1,      37      ]
+[ 3,   2,      37      ]
+[ 3,   3,      37      ]
+#select x, y,  sum(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    bigint # type
+% 1,   1,      3 # length
+[ 0,   0,      74      ]
+[ 0,   1,      148     ]
+[ 0,   2,      222     ]
+[ 0,   3,      222     ]
+[ 1,   0,      111     ]
+[ 1,   1,      222     ]
+[ 1,   2,      333     ]
+[ 1,   3,      333     ]
+[ 2,   0,      111     ]
+[ 2,   1,      222     ]
+[ 2,   2,      333     ]
+[ 2,   3,      333     ]
+[ 3,   0,      74      ]
+[ 3,   1,      148     ]
+[ 3,   2,      222     ]
+[ 3,   3,      222     ]
+
+#create array a (x int dimension[4], y int dimension[4], v real default 37);
+#select x, y,  avg(v) from a group by a[x-1:x+2][y-2:y+1];
+% sys.a,       sys.a,  sys. # table_name
+% x,   y,      L1 # name
+% int, int,    double # type
+% 1,   1,      24 # length
+[ 0,   0,      37      ]
+[ 0,   1,      37      ]
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to