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