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

Reply via email to