Changeset: b30481e0c063 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b30481e0c063
Added Files:
sql/test/analytics/Tests/analytics03.stable.err
sql/test/analytics/Tests/analytics03.stable.out
Modified Files:
sql/server/rel_select.c
sql/test/analytics/Tests/All
sql/test/analytics/Tests/analytics03.sql
Branch: analytics
Log Message:
Approve test and fix range boundary case.
diffs (truncated from 551 to 300 lines):
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4712,16 +4712,19 @@ rel_rankop(mvc *sql, sql_rel **rel, symb
if(!obe && frame_type == FRAME_GROUPS)
return sql_error(sql, 02, SQLSTATE(42000) "GROUPS frame
requires an order by expression");
if(!obe && frame_type == FRAME_RANGE) {
- atom *a = NULL;
+ bool ok_preceding = false, ok_following = false;
if(d->data.sym->token == SQL_ATOM) {
- a = ((AtomNode*) d->data.sym)->a;
- if(a->data.vtype == TYPE_lng &&
a->data.val.lval == GDK_lng_max)
- return sql_error(sql, 02,
SQLSTATE(42000) "RANGE frame with PRECEDING offset requires an order by
expression");
- } else if(d->next->data.sym->token == SQL_ATOM) {
- a = ((AtomNode*) d->next->data.sym)->a;
- if(a->data.vtype == TYPE_lng &&
a->data.val.lval == GDK_lng_max)
- return sql_error(sql, 02,
SQLSTATE(42000) "RANGE frame with FOLLOWING offset requires an order by
expression");
+ atom *a = ((AtomNode*) d->data.sym)->a;
+ if(a->data.vtype == TYPE_lng &&
(a->data.val.lval == 0 || a->data.val.lval == GDK_lng_max))
+ ok_preceding = true;
}
+ if(d->next->data.sym->token == SQL_ATOM) {
+ atom *a = ((AtomNode*) d->next->data.sym)->a;
+ if(a->data.vtype == TYPE_lng &&
(a->data.val.lval == 0 || a->data.val.lval == GDK_lng_max))
+ ok_following = true;
+ }
+ if(!ok_preceding || !ok_following)
+ return sql_error(sql, 02, SQLSTATE(42000)
"RANGE frame with PRECEDING/FOLLOWING offset requires an order by expression");
frame_type = FRAME_ALL; //special case, iterate the
entire partition
}
diff --git a/sql/test/analytics/Tests/All b/sql/test/analytics/Tests/All
--- a/sql/test/analytics/Tests/All
+++ b/sql/test/analytics/Tests/All
@@ -1,3 +1,4 @@
analytics00
analytics01
analytics02
+analytics03
diff --git a/sql/test/analytics/Tests/analytics03.sql
b/sql/test/analytics/Tests/analytics03.sql
--- a/sql/test/analytics/Tests/analytics03.sql
+++ b/sql/test/analytics/Tests/analytics03.sql
@@ -1,68 +1,60 @@
-start transaction;
+create table rowsvsrangevsgroups (aa int, bb int, cc real);
-create table rowsvsrange (aa int, bb int, cc real);
-insert into rowsvsrange values (1,1,1), (2,1,2), (3,1,3), (1,2,1), (1,2,1),
(1,2,1), (2,2,2), (3,2,3), (4,2,4), (2,2,2);
+start transaction;
+insert into rowsvsrangevsgroups values (1,1,1), (2,1,2), (3,1,3), (1,2,1),
(1,2,1), (1,2,1), (2,2,2), (3,2,3), (4,2,4), (2,2,2);
select cast(sum(aa) over (rows unbounded preceding) as bigint),
cast(sum(aa) over (range unbounded preceding) as bigint),
cast(sum(aa) over (order by aa rows unbounded preceding) as bigint),
cast(sum(aa) over (order by aa range unbounded preceding) as bigint),
+ cast(sum(aa) over (order by aa groups unbounded preceding) as bigint),
cast(sum(aa) over (partition by bb order by bb rows unbounded
preceding) as bigint),
- cast(sum(aa) over (partition by bb order by bb range unbounded
preceding) as bigint) from rowsvsrange;
-
-select sum(cc) over (rows unbounded preceding),
- sum(cc) over (range unbounded preceding),
- sum(cc) over (order by cc rows unbounded preceding),
- sum(cc) over (order by cc range unbounded preceding),
- sum(cc) over (partition by bb order by bb rows unbounded preceding),
- sum(cc) over (partition by bb order by bb range unbounded preceding)
from rowsvsrange;
+ cast(sum(aa) over (partition by bb order by bb range unbounded
preceding) as bigint),
+ cast(sum(aa) over (partition by bb order by bb groups unbounded
preceding) as bigint) from rowsvsrangevsgroups;
-select cast(sum(aa) over (order by aa range between current row and unbounded
following) as bigint) from rowsvsrange;
-select sum(cc) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select count(*) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select count(aa) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select min(aa) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select max(aa) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select avg(aa) over (order by cc range between current row and unbounded
following) from rowsvsrange;
-select avg(cc) over (order by aa range between current row and unbounded
following) from rowsvsrange;
+select cast(sum(aa) over (order by aa range between unbounded preceding and
current row) as bigint),
+ cast(sum(cc) over (order by aa range between unbounded preceding and
current row) as bigint),
+ count(*) over (order by aa range between unbounded preceding and
current row),
+ count(aa) over (order by aa range between unbounded preceding and
current row),
+ min(aa) over (order by aa range between unbounded preceding and current
row),
+ max(aa) over (order by aa range between unbounded preceding and current
row),
+ avg(aa) over (order by aa range between unbounded preceding and current
row),
+ avg(cc) over (order by aa range between unbounded preceding and current
row) from rowsvsrangevsgroups;
-create table analytics (aa int, bb int, cc bigint);
-insert into analytics values (15, 3, 15), (3, 1, 3), (2, 1, 2), (5, 3, 5),
(NULL, 2, NULL), (3, 2, 3), (4, 1, 4), (6, 3, 6), (8, 2, 8), (NULL, 4, NULL);
+select cast(sum(aa) over (order by aa groups between unbounded preceding and
current row) as bigint),
+ cast(sum(cc) over (order by aa groups between unbounded preceding and
current row) as bigint),
+ count(*) over (order by aa groups between unbounded preceding and
current row),
+ count(aa) over (order by aa groups between unbounded preceding and
current row),
+ min(aa) over (order by aa groups between unbounded preceding and
current row),
+ max(aa) over (order by aa groups between unbounded preceding and
current row),
+ avg(aa) over (order by aa groups between unbounded preceding and
current row),
+ avg(cc) over (order by aa groups between unbounded preceding and
current row) from rowsvsrangevsgroups;
-select count(*) over (rows between current row and unbounded following),
- count(*) over (range between current row and unbounded following),
- count(*) over (order by bb rows between current row and unbounded
following),
- count(*) over (order by bb range between current row and unbounded
following),
- count(*) over (partition by bb order by bb rows unbounded preceding),
- count(*) over (partition by bb order by bb range unbounded preceding)
from analytics;
+select cast(sum(aa) over (order by aa groups between 1 preceding and current
row) as bigint),
+ avg(cc) over (order by aa groups between 1 preceding and current row)
from rowsvsrangevsgroups;
-select count(aa) over (rows between current row and unbounded following),
- count(aa) over (range between current row and unbounded following),
- count(aa) over (order by bb rows between current row and unbounded
following),
- count(aa) over (order by bb range between current row and unbounded
following),
- count(aa) over (partition by bb order by bb rows unbounded preceding),
- count(aa) over (partition by bb order by bb range unbounded preceding)
from analytics;
+delete from rowsvsrangevsgroups where aa = 2;
-select min(aa) over (rows between current row and unbounded following),
- min(aa) over (range between current row and unbounded following),
- min(aa) over (order by bb rows between current row and unbounded
following),
- min(aa) over (order by bb range between current row and unbounded
following),
- min(aa) over (partition by bb order by bb rows unbounded preceding),
- min(aa) over (partition by bb order by bb range unbounded preceding)
from analytics;
+select cast(sum(aa) over (order by aa range between unbounded preceding and
current row) as bigint),
+ cast(sum(cc) over (order by aa range between unbounded preceding and
current row) as bigint),
+ count(*) over (order by aa range between unbounded preceding and
current row),
+ count(aa) over (order by aa range between unbounded preceding and
current row),
+ min(aa) over (order by aa range between unbounded preceding and current
row),
+ max(aa) over (order by aa range between unbounded preceding and current
row),
+ avg(aa) over (order by aa range between unbounded preceding and current
row),
+ avg(cc) over (order by aa range between unbounded preceding and current
row) from rowsvsrangevsgroups;
-select max(aa) over (rows between current row and unbounded following),
- max(aa) over (range between current row and unbounded following),
- max(aa) over (order by bb rows between current row and unbounded
following),
- max(aa) over (order by bb range between current row and unbounded
following),
- max(aa) over (partition by bb order by bb rows unbounded preceding),
- max(aa) over (partition by bb order by bb range unbounded preceding)
from analytics;
+select cast(sum(aa) over (order by aa groups between unbounded preceding and
current row) as bigint),
+ cast(sum(cc) over (order by aa groups between unbounded preceding and
current row) as bigint),
+ count(*) over (order by aa groups between unbounded preceding and
current row),
+ count(aa) over (order by aa groups between unbounded preceding and
current row),
+ min(aa) over (order by aa groups between unbounded preceding and
current row),
+ max(aa) over (order by aa groups between unbounded preceding and
current row),
+ avg(aa) over (order by aa groups between unbounded preceding and
current row),
+ avg(cc) over (order by aa groups between unbounded preceding and
current row) from rowsvsrangevsgroups;
-select avg(aa) over (rows between current row and unbounded following),
- avg(aa) over (range between current row and unbounded following),
- avg(aa) over (order by bb rows between current row and unbounded
following),
- avg(aa) over (order by bb range between current row and unbounded
following),
- avg(aa) over (partition by bb order by bb rows unbounded preceding),
- avg(aa) over (partition by bb order by bb range unbounded preceding)
from analytics;
+select cast(sum(aa) over (order by aa groups between 1 preceding and current
row) as bigint),
+ avg(cc) over (order by aa groups between 1 preceding and current row)
from rowsvsrangevsgroups;
create table stressme (aa varchar(64), bb int);
insert into stressme values ('one', 1), ('another', 1), ('stress', 1), (NULL,
2), ('ok', 2), ('check', 3), ('me', 3), ('please', 3), (NULL, 4);
@@ -71,22 +63,36 @@ select count(aa) over (rows between curr
count(aa) over (range between current row and unbounded following),
count(aa) over (order by bb rows between current row and unbounded
following),
count(aa) over (order by bb range between current row and unbounded
following),
+ count(aa) over (order by bb groups between current row and unbounded
following),
count(aa) over (partition by bb order by bb rows unbounded preceding),
- count(aa) over (partition by bb order by bb range unbounded preceding)
from stressme;
+ count(aa) over (partition by bb order by bb range unbounded preceding),
+ count(aa) over (partition by bb order by bb groups unbounded preceding)
from stressme;
select min(aa) over (rows between current row and unbounded following),
min(aa) over (range between current row and unbounded following),
min(aa) over (order by bb rows between current row and unbounded
following),
min(aa) over (order by bb range between current row and unbounded
following),
+ min(aa) over (order by bb groups between current row and unbounded
following),
min(aa) over (partition by bb order by bb rows unbounded preceding),
- min(aa) over (partition by bb order by bb range unbounded preceding)
from stressme;
+ min(aa) over (partition by bb order by bb range unbounded preceding),
+ min(aa) over (partition by bb order by bb groups unbounded preceding)
from stressme;
select max(aa) over (rows between current row and unbounded following),
max(aa) over (range between current row and unbounded following),
max(aa) over (order by bb rows between current row and unbounded
following),
max(aa) over (order by bb range between current row and unbounded
following),
+ max(aa) over (order by bb groups between current row and unbounded
following),
max(aa) over (partition by bb order by bb rows unbounded preceding),
- max(aa) over (partition by bb order by bb range unbounded preceding)
from stressme;
+ max(aa) over (partition by bb order by bb range unbounded preceding),
+ max(aa) over (partition by bb order by bb groups unbounded preceding)
from stressme;
+
+select max(aa) over (order by bb groups between 1 preceding and current row),
+ count(aa) over (order by bb groups between 1 preceding and current row)
from stressme;
+
+delete from stressme where bb = 2;
+
+select max(aa) over (order by bb groups between 1 preceding and current row),
+ count(aa) over (order by bb groups between 1 preceding and current row)
from stressme;
create table overflowme (aa int, bb int);
insert into overflowme values (2147483644, 1), (2147483645, 2), (2147483646,
1), (2147483644, 2), (2147483645, 1), (2147483646, 2);
@@ -99,3 +105,12 @@ select avg(aa) over (rows between curren
avg(aa) over (partition by bb order by bb range unbounded preceding)
from overflowme;
rollback;
+
+select count(*) over (rows between NULL preceding and unbounded following)
from rowsvsrangevsgroups; --error
+select count(*) over (rows between unbounded preceding and -1 following) from
rowsvsrangevsgroups; --error
+select count(*) over (range between 1 preceding and unbounded following) from
rowsvsrangevsgroups; --error
+select count(*) over (range between unbounded preceding and 1 following) from
rowsvsrangevsgroups; --error
+select count(*) over (groups between 1 preceding and 1 following) from
rowsvsrangevsgroups; --error
+select count(*) over (groups between current row and unbounded following) from
rowsvsrangevsgroups; --error
+
+drop table rowsvsrangevsgroups;
diff --git a/sql/test/analytics/Tests/analytics03.stable.err
b/sql/test/analytics/Tests/analytics03.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/analytics/Tests/analytics03.stable.err
@@ -0,0 +1,59 @@
+stderr of test 'analytics03` in directory 'sql/test/analytics` itself:
+
+
+# 17:06:35 >
+# 17:06:35 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=34302" "--set"
"mapi_usock=/var/tmp/mtest-29260/.s.monetdb.34302" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics"
"--set" "embedded_c=true"
+# 17:06:35 >
+
+# builtin opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-analytics/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt gdk_debug = 0
+# builtin opt gdk_vmtrim = no
+# builtin opt monet_prompt = >
+# builtin opt monet_daemon = no
+# builtin opt mapi_port = 50000
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# cmdline opt gdk_nr_threads = 0
+# cmdline opt mapi_open = true
+# cmdline opt mapi_port = 34302
+# cmdline opt mapi_usock = /var/tmp/mtest-29260/.s.monetdb.34302
+# cmdline opt monet_prompt =
+# cmdline opt gdk_dbpath =
/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics
+# cmdline opt embedded_c = true
+# cmdline opt gdk_debug = 553648138
+
+# 17:06:35 >
+# 17:06:35 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-29260" "--port=34302"
+# 17:06:35 >
+
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (rows between NULL preceding and unbounded
following) from rowsvsrangevsgroups; --error
+ERROR = !PRECEDING offset column must be of a countable SQL type
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (rows between unbounded preceding and -1
following) from rowsvsrangevsgroups; --error
+ERROR = !The FOLLOWING boundary must be non-negative
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (range between 1 preceding and unbounded
following) from rowsvsrangevsgroups; --error
+ERROR = !RANGE frame with PRECEDING/FOLLOWING offset requires an order by
expression
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (range between unbounded preceding and 1
following) from rowsvsrangevsgroups; --error
+ERROR = !RANGE frame with PRECEDING/FOLLOWING offset requires an order by
expression
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (groups between 1 preceding and 1 following) from
rowsvsrangevsgroups; --error
+ERROR = !GROUPS frame requires an order by expression
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-29260/.s.monetdb.34302
+QUERY = select count(*) over (groups between current row and unbounded
following) from rowsvsrangevsgroups; --error
+ERROR = !GROUPS frame requires an order by expression
+CODE = 42000
+
+# 17:06:35 >
+# 17:06:35 > "Done."
+# 17:06:35 >
+
diff --git a/sql/test/analytics/Tests/analytics03.stable.out
b/sql/test/analytics/Tests/analytics03.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/analytics/Tests/analytics03.stable.out
@@ -0,0 +1,275 @@
+stdout of test 'analytics03` in directory 'sql/test/analytics` itself:
+
+
+# 17:06:35 >
+# 17:06:35 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=34302" "--set"
"mapi_usock=/var/tmp/mtest-29260/.s.monetdb.34302" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-analytics/BUILD/var/MonetDB/mTests_sql_test_analytics"
"--set" "embedded_c=true"
+# 17:06:35 >
+
+# MonetDB 5 server v11.32.0
+# This is an unreleased version
+# Serving database 'mTests_sql_test_analytics', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.492 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://wired-142.cwi.nl:34302/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-29260/.s.monetdb.34302
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+# 17:06:35 >
+# 17:06:35 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-29260" "--port=34302"
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list