Changeset: 90b565cedbd5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=90b565cedbd5 Modified Files: sql/common/sql_types.c sql/server/rel_select.c sql/test/analytics/Tests/analytics08.stable.err sql/test/analytics/Tests/analytics09.sql Branch: analytics Log Message:
Added missing SQL function prototype, plus a more generic window function without from clause handling. diffs (97 lines): diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -1662,6 +1662,12 @@ sqltypeinit( sql_allocator *sa) sql_create_analytic6(sa, "window_bound", "sql", "window_bound", BIT, ANY, INT, INT, INT, FLT, LNG, SCALE_NONE); sql_create_analytic5(sa, "window_bound", "sql", "window_bound", ANY, INT, INT, INT, DBL, LNG, SCALE_NONE); sql_create_analytic6(sa, "window_bound", "sql", "window_bound", BIT, ANY, INT, INT, INT, DBL, LNG, SCALE_NONE); +#ifdef HAVE_HGE + if (have_hge) { + sql_create_analytic5(sa, "window_bound", "sql", "window_bound", ANY, INT, INT, INT, HGE, LNG, SCALE_NONE); + sql_create_analytic6(sa, "window_bound", "sql", "window_bound", BIT, ANY, INT, INT, INT, HGE, LNG, SCALE_NONE); + } +#endif t = decimals; /* BTE */ sql_create_analytic5(sa, "window_bound", "sql", "window_bound", ANY, INT, INT, INT, *(t), LNG, SCALE_NONE); 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 @@ -4724,6 +4724,12 @@ rel_rankop(mvc *sql, sql_rel **rel, symb } } + if(!p->exps->h) { //no from clause, use a constant as the expression to project + sql_exp *exp = exp_atom_lng(sql->sa, 0); + exp_label(sql->sa, exp, ++sql->label); + append(p->exps, exp); + } + fargs = sa_list(sql->sa); if (window_function->token == SQL_RANK) { //rank function call dlist* dnn = window_function->data.lval->h->next->data.lval; @@ -4765,15 +4771,10 @@ rel_rankop(mvc *sql, sql_rel **rel, symb if (n) { if (!n->next->data.sym) { /* count(*) */ - if(!p->exps->h) { //no from clause, use a constant as the expression to project - in = exp_atom_lng(sql->sa, 0); - append(p->exps, in); - } else { - in = p->exps->h->data; - in = exp_column(sql->sa, exp_relname(in), exp_name(in), exp_subtype(in), exp_card(in), has_nil(in), is_intern(in)); - if(!in) - return NULL; - } + in = p->exps->h->data; + in = exp_column(sql->sa, exp_relname(in), exp_name(in), exp_subtype(in), exp_card(in), has_nil(in), is_intern(in)); + if(!in) + return NULL; append(fargs, in); append(fargs, exp_atom_bool(sql->sa, 0)); //don't ignore nills } else { diff --git a/sql/test/analytics/Tests/analytics08.stable.err b/sql/test/analytics/Tests/analytics08.stable.err --- a/sql/test/analytics/Tests/analytics08.stable.err +++ b/sql/test/analytics/Tests/analytics08.stable.err @@ -40,7 +40,7 @@ CODE = 42000 MAPI = (monetdb) /var/tmp/mtest-27127/.s.monetdb.39943 QUERY = select first_value(aa) over (w1 order by bb), last_value(aa) over (w2 order by bb) from analytics window w1 as (w2), w2 as (w3), w3 as (w1); --error, cyclic definition -ERROR = !SELECT: multiple references to window 'w1' found +ERROR = !SELECT: cyclic references to window 'w1' found CODE = 42000 # 12:18:53 > diff --git a/sql/test/analytics/Tests/analytics09.sql b/sql/test/analytics/Tests/analytics09.sql --- a/sql/test/analytics/Tests/analytics09.sql +++ b/sql/test/analytics/Tests/analytics09.sql @@ -1,6 +1,8 @@ create table analytics (aa int, bb int); insert into analytics values (15, 3), (3, 1), (2, 1), (5, 3), (NULL, 2), (3, 2), (4, 1), (6, 3), (8, 2), (NULL, 4); +select sum(1) over (), rank() over (), nth_value(1, 1) over (); + select avg(sum(aa) over ()) from analytics; select sum(1) * count(*) over (); @@ -11,14 +13,16 @@ select aa * count(1) over () from analyt select sum(aa) * count(1) over () from analytics; -select prod(sum(aa)) * count(1 + aa) / avg(null) over () from analytics; +select sum(aa) * count(1 + aa) / avg(1) over () from analytics; select avg(sum(aa)) over () from analytics; -select sum(aa) * 100 / sum(sum(aa)) over (partition by bb) from analytics; +select sum(aa) * 100 / sum(sum(aa)) over (partition by bb) from analytics; --error + +select prod(sum(aa)) * count(1 + aa) / avg(null) over () from analytics; --error -select rank() over (partition by case when aa > 5 then aa else aa + 5 end) from analytics; +select rank() over (partition by case when aa > 5 then aa else aa + 5 end) from analytics; --error, we don't support expressions in partition by as well group by -select rank() over (partition by sum(aa)) from analytics; +select rank() over (partition by sum(aa)) from analytics; --error, we don't support expressions in partition by as well group by drop table analytics; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list