Changeset: ddacb800f797 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ddacb800f797
Modified Files:
sql/server/rel_select.c
sql/test/analytics/Tests/analytics02.sql
sql/test/analytics/Tests/analytics02.stable.err
sql/test/analytics/Tests/analytics02.stable.out
Branch: window-tunning
Log Message:
Test for function existance before adding frame parameters
diffs (truncated from 312 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
@@ -4803,6 +4803,22 @@ rel_rankop(sql_query *query, sql_rel **r
ie = oe;
}
+ if (!pe || !oe)
+ return NULL;
+ if (!supports_frames) {
+ list_append(fargs, pe);
+ list_append(fargs, oe);
+ }
+
+ types = exp_types(sql->sa, fargs);
+ if (!(wf = bind_func_(sql, s, aname, types, F_ANALYTIC))) {
+ wf = find_func(sql, s, aname, list_length(types), F_ANALYTIC,
NULL);
+ if (!wf || (!(fargs =
check_arguments_and_find_largest_any_type(sql, NULL, fargs, wf, 0)))) {
+ char *arg_list = nfargs ?
window_function_arg_types_2str(sql, types, nfargs) : NULL;
+ return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
window function '%s(%s)' not found", aname, arg_list ? arg_list : "");
+ }
+ }
+
/* Frame */
if (frame_clause) {
dnode *d = frame_clause->data.lval->h;
@@ -4867,7 +4883,7 @@ rel_rankop(sql_query *query, sql_rel **r
} else if (supports_frames) { /* for analytic functions with no frame
clause, we use the standard default values */
if (is_value) {
sql_subtype *it = sql_bind_localtype("int"), *lon =
sql_bind_localtype("lng"),
- *bt = (frame_type == FRAME_ROWS
|| frame_type == FRAME_GROUPS) ? lon : exp_subtype(ie);;
+ *bt = (frame_type == FRAME_ROWS
|| frame_type == FRAME_GROUPS) ? lon : exp_subtype(ie);
unsigned char sclass = bt->type->eclass;
fstart = exp_atom(sql->sa, atom_max_value(sql->sa,
EC_NUMBER(sclass) ? bt : it));
@@ -4881,21 +4897,6 @@ rel_rankop(sql_query *query, sql_rel **r
}
}
- if (!pe || !oe)
- return NULL;
- if (!supports_frames) {
- list_append(fargs, pe);
- list_append(fargs, oe);
- }
-
- types = exp_types(sql->sa, fargs);
- if (!(wf = bind_func_(sql, s, aname, types, F_ANALYTIC))) {
- wf = find_func(sql, s, aname, list_length(types), F_ANALYTIC,
NULL);
- if (!wf || (!(fargs =
check_arguments_and_find_largest_any_type(sql, NULL, fargs, wf, 0)))) {
- char *arg_list = nfargs ?
window_function_arg_types_2str(sql, types, nfargs) : NULL;
- return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
window function '%s(%s)' not found", aname, arg_list ? arg_list : "");
- }
- }
args = sa_list(sql->sa);
for (node *n = fargs->h ; n ; n = n->next)
list_append(args, n->data);
diff --git a/sql/test/analytics/Tests/analytics02.sql
b/sql/test/analytics/Tests/analytics02.sql
--- a/sql/test/analytics/Tests/analytics02.sql
+++ b/sql/test/analytics/Tests/analytics02.sql
@@ -163,6 +163,8 @@ select dense_rank() over (rows 200 prece
select ntile(1) over (rows 200 preceding) from analytics; --error
select lead(aa) over (partition by bb order by bb rows between 2 preceding and
0 following) from analytics; --error
+select last_value() over () from analytics; --error, function not found
+
prepare select count(*) over (partition by ?) from analytics; --error
drop table analytics;
diff --git a/sql/test/analytics/Tests/analytics02.stable.err
b/sql/test/analytics/Tests/analytics02.stable.err
--- a/sql/test/analytics/Tests/analytics02.stable.err
+++ b/sql/test/analytics/Tests/analytics02.stable.err
@@ -44,7 +44,11 @@ MAPI = (monetdb) /var/tmp/mtest-13031/.
QUERY = select lead(aa) over (partition by bb order by bb rows between 2
preceding and 0 following) from analytics; --error
ERROR = !OVER: frame extend only possible with aggregation and first_value,
last_value and nth_value functions
CODE = 42000
-MAPI = (monetdb) /var/tmp/mtest-193075/.s.monetdb.38205
+MAPI = (monetdb) /var/tmp/mtest-113500/.s.monetdb.33379
+QUERY = select last_value() over () from analytics; --error, function not found
+ERROR = !SELECT: window function 'last_value()' not found
+CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-113500/.s.monetdb.33379
QUERY = prepare select count(*) over (partition by ?) from analytics; --error
ERROR = !SELECT: parameters not allowed at PARTITION BY clause from window
functions
CODE = 42000
diff --git a/sql/test/analytics/Tests/analytics02.stable.out
b/sql/test/analytics/Tests/analytics02.stable.out
--- a/sql/test/analytics/Tests/analytics02.stable.out
+++ b/sql/test/analytics/Tests/analytics02.stable.out
@@ -76,8 +76,8 @@ stdout of test 'analytics02` in director
[ "stress" ]
[ "please" ]
#select cast(sum(aa) over (rows between 5 preceding and 0 following) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 15 ]
@@ -91,8 +91,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ 21 ]
#select cast(sum(aa) over (rows between 5 preceding and 2 following) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 20 ]
@@ -106,8 +106,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ 21 ]
#select cast(sum(aa) over (partition by bb order by bb rows between 5
preceding and 0 following) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 3 ]
@@ -121,8 +121,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ NULL ]
#select cast(sum(aa) over (partition by bb order by bb rows between 5
preceding and 2 following) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 9 ]
@@ -136,8 +136,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ NULL ]
#select cast(prod(aa) over (rows between 5 preceding and 0 following) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 4 # length
[ 15 ]
@@ -151,8 +151,8 @@ stdout of test 'analytics02` in director
[ 2880 ]
[ 576 ]
#select cast(prod(aa) over (rows between 5 preceding and 2 following) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 5 # length
[ 90 ]
@@ -166,8 +166,8 @@ stdout of test 'analytics02` in director
[ 2880 ]
[ 576 ]
#select cast(prod(aa) over (partition by bb order by bb rows between 5
preceding and 0 following) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 3 # length
[ 3 ]
@@ -181,8 +181,8 @@ stdout of test 'analytics02` in director
[ 450 ]
[ NULL ]
#select cast(prod(aa) over (partition by bb order by bb rows between 5
preceding and 2 following) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 3 # length
[ 24 ]
@@ -766,20 +766,20 @@ stdout of test 'analytics02` in director
[ 1 ]
[ 1 ]
#select count(*) over (rows unbounded preceding);
-% .%1 # table_name
-% %1 # name
+% .%2 # table_name
+% %2 # name
% bigint # type
% 1 # length
[ 1 ]
#select count(*) over (rows 200 preceding);
-% .%1 # table_name
-% %1 # name
+% .%2 # table_name
+% %2 # name
% bigint # type
% 1 # length
[ 1 ]
#select count(*) over (rows between 5 preceding and 0 following);
-% .%1 # table_name
-% %1 # name
+% .%2 # table_name
+% %2 # name
% bigint # type
% 1 # length
[ 1 ]
@@ -844,8 +844,8 @@ stdout of test 'analytics02` in director
[ 15 ]
[ NULL ]
#select cast(sum(aa) over (rows unbounded preceding) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 15 ]
@@ -859,8 +859,8 @@ stdout of test 'analytics02` in director
[ 46 ]
[ 46 ]
#select cast(sum(aa) over (partition by bb order by bb rows unbounded
preceding) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 3 ]
@@ -874,8 +874,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ NULL ]
#select cast(prod(aa) over (rows unbounded preceding) as bigint) from
analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 6 # length
[ 15 ]
@@ -889,8 +889,8 @@ stdout of test 'analytics02` in director
[ 259200 ]
[ 259200 ]
#select cast(prod(aa) over (partition by bb order by bb rows unbounded
preceding) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 3 # length
[ 3 ]
@@ -1054,8 +1054,8 @@ stdout of test 'analytics02` in director
[ 15 ]
[ NULL ]
#select cast(sum(aa) over (rows 2 preceding) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 15 ]
@@ -1069,8 +1069,8 @@ stdout of test 'analytics02` in director
[ 18 ]
[ 14 ]
#select cast(sum(aa) over (partition by bb order by bb rows 2 preceding) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 2 # length
[ 3 ]
@@ -1084,8 +1084,8 @@ stdout of test 'analytics02` in director
[ 26 ]
[ NULL ]
#select cast(prod(aa) over (rows 2 preceding) as bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 3 # length
[ 15 ]
@@ -1099,8 +1099,8 @@ stdout of test 'analytics02` in director
[ 192 ]
[ 48 ]
#select cast(prod(aa) over (partition by bb order by bb rows 2 preceding) as
bigint) from analytics;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% bigint # type
% 3 # length
[ 3 ]
@@ -1642,16 +1642,16 @@ stdout of test 'analytics02` in director
#insert into overflowme values (2147483644), (2147483645), (2147483646);
[ 3 ]
#select floor(avg(a) over (rows between 2 preceding and 0 following)) from
overflowme;
-% sys.%2 # table_name
-% %2 # name
+% sys.%1 # table_name
+% %1 # name
% double # type
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list