Changeset: ecf083156419 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ecf083156419
Modified Files:
        sql/common/sql_types.c
        sql/include/sql_relation.h
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_select.c
        sql/server/rel_unnest.c
Branch: window-tunning
Log Message:

Clean window functions without frames for less complexity


diffs (233 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
@@ -1427,50 +1427,50 @@ sqltypeinit( sql_allocator *sa)
                sql_create_analytic(sa, "window_bound", "sql", "window_bound", 
SCALE_NONE, LNG, 6, BIT, ANY, INT, INT, INT, *t);
        }
 
-       sql_create_analytic(sa, "rank", "sql", "rank", SCALE_NONE, INT, 3, ANY, 
BIT, BIT);
-       sql_create_analytic(sa, "dense_rank", "sql", "dense_rank", SCALE_NONE, 
INT, 3, ANY, BIT, BIT);
-       sql_create_analytic(sa, "row_number", "sql", "row_number", SCALE_NONE, 
INT, 3, ANY, BIT, BIT);
-       sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", 
SCALE_NONE, DBL, 3, ANY, BIT, BIT);
-       sql_create_analytic(sa, "cume_dist", "sql", "cume_dist", SCALE_NONE, 
DBL, 3, ANY, BIT, BIT);
+       sql_create_analytic(sa, "rank", "sql", "rank", SCALE_NONE, INT, 1, ANY);
+       sql_create_analytic(sa, "dense_rank", "sql", "dense_rank", SCALE_NONE, 
INT, 1, ANY);
+       sql_create_analytic(sa, "row_number", "sql", "row_number", SCALE_NONE, 
INT, 1, ANY);
+       sql_create_analytic(sa, "percent_rank", "sql", "percent_rank", 
SCALE_NONE, DBL, 1, ANY);
+       sql_create_analytic(sa, "cume_dist", "sql", "cume_dist", SCALE_NONE, 
DBL, 1, ANY);
 
-       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, BTE, 4, 
ANY, BTE, BIT, BIT);
-       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, SHT, 4, 
ANY, SHT, BIT, BIT);
-       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, INT, 4, 
ANY, INT, BIT, BIT);
-       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, LNG, 4, 
ANY, LNG, BIT, BIT);
+       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, BTE, 2, 
ANY, BTE);
+       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, SHT, 2, 
ANY, SHT);
+       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, INT, 2, 
ANY, INT);
+       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, LNG, 2, 
ANY, LNG);
 #ifdef HAVE_HGE
-       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, HGE, 4, 
ANY, HGE, BIT, BIT);
+       sql_create_analytic(sa, "ntile", "sql", "ntile", SCALE_NONE, HGE, 2, 
ANY, HGE);
 #endif
 
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 4, ANY, 
BTE, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 4, ANY, 
SHT, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 4, ANY, 
INT, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 4, ANY, 
LNG, BIT, BIT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 1, ANY);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 2, ANY, 
BTE);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 2, ANY, 
SHT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 2, ANY, 
INT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 2, ANY, 
LNG);
 #ifdef HAVE_HGE
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 4, ANY, 
HGE, BIT, BIT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 2, ANY, 
HGE);
 #endif
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 5, ANY, 
BTE, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 5, ANY, 
SHT, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 5, ANY, 
INT, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 5, ANY, 
LNG, ANY, BIT, BIT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
BTE, ANY);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
SHT, ANY);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
INT, ANY);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
LNG, ANY);
 #ifdef HAVE_HGE
-       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 5, ANY, 
HGE, ANY, BIT, BIT);
+       sql_create_analytic(sa, "lag", "sql", "lag", SCALE_NONE, ANY, 3, ANY, 
HGE, ANY);
 #endif
 
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 4, ANY, 
BTE, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 4, ANY, 
SHT, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 4, ANY, 
INT, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 4, ANY, 
LNG, BIT, BIT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 1, ANY);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 2, ANY, 
BTE);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 2, ANY, 
SHT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 2, ANY, 
INT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 2, ANY, 
LNG);
 #ifdef HAVE_HGE
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 4, ANY, 
HGE, BIT, BIT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 2, ANY, 
HGE);
 #endif
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 5, ANY, 
BTE, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 5, ANY, 
SHT, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 5, ANY, 
INT, ANY, BIT, BIT);
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 5, ANY, 
LNG, ANY, BIT, BIT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
BTE, ANY);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
SHT, ANY);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
INT, ANY);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
LNG, ANY);
 #ifdef HAVE_HGE
-       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 5, ANY, 
HGE, ANY, BIT, BIT);
+       sql_create_analytic(sa, "lead", "sql", "lead", SCALE_NONE, ANY, 3, ANY, 
HGE, ANY);
 #endif
 
        /* these analytic functions support frames */
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -52,7 +52,6 @@ typedef struct expression {
         nulls_last:1,  /* return null after all other rows */
         zero_if_empty:1,       /* in case of partial aggregator computation, 
some aggregators need to return 0 instead of NULL */
         distinct:1,
-        frames:1, /* needed for window functions with frame support, ie 
aggregates and last_value, first_value and nth_value functions */
 
         semantics:1,   /* is vs = semantics (nil = nil vs unknown != unknown), 
ranges with or without nil, aggregation with or without nil */
         need_no_nil:1,
@@ -228,10 +227,6 @@ typedef enum operator_type {
 #define set_nulls_first(e)     ((e)->nulls_last=0)
 #define set_direction(e, dir)  ((e)->ascending = (dir&1), (e)->nulls_last = 
(dir&2)?1:0)
 
-#define supports_frames(e)              ((e)->frames)
-#define set_frame_support(e)    ((e)->frames = 1)
-#define reset_supports_frames(e) ((e)->frames = 0)
-
 #define is_anti(e)             ((e)->anti)
 #define set_anti(e)            (e)->anti = 1
 #define is_semantics(e)        ((e)->semantics)
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1065,9 +1065,14 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        f = sql_bind_func_(sql->sa, s, cname, ops, F_FUNC);
                        if (!f)
                                f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
-                       if (!f && nops > 5) {
-                               for (int i = 0 ; i < 5 ; i++)
-                                       list_remove_node(ops, ops->t); /* some 
window functions get extra parameters */
+                       if (!f && nops > 1) { /* window functions without 
frames get 2 extra arguments */
+                               list_remove_node(ops, ops->t);
+                               list_remove_node(ops, ops->t);
+                               f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
+                       }
+                       if (!f && nops > 4) { /* window functions with frames 
get 5 extra arguments */
+                               for (int i = 0 ; i < 3 ; i++)
+                                       list_remove_node(ops, ops->t);
                                f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
                        }
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -663,8 +663,6 @@ exp_propagate(sql_allocator *sa, sql_exp
                set_semantics(ne);
        if (is_ascending(oe))
                set_ascending(ne);
-       if (supports_frames(oe))
-               set_frame_support(ne);
        if (nulls_last(oe))
                set_nulls_last(ne);
        if (need_distinct(oe))
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
@@ -4802,13 +4802,8 @@ rel_rankop(sql_query *query, sql_rel **r
                else
                        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))) {
@@ -4900,9 +4895,9 @@ rel_rankop(sql_query *query, sql_rel **r
        args = sa_list(sql->sa);
        for (node *n = fargs->h ; n ; n = n->next)
                list_append(args, n->data);
+       list_append(args, pe);
+       list_append(args, oe);
        if (supports_frames) {
-               list_append(args, exp_copy(sql, pe));
-               list_append(args, exp_copy(sql, oe));
                list_append(args, exp_atom_int(sql->sa, frame_type));
                if (start && eend) {
                        list_append(args, start);
@@ -4913,8 +4908,6 @@ rel_rankop(sql_query *query, sql_rel **r
                }
        }
        call = exp_rank_op(sql->sa, list_empty(args) ? NULL : args, gbe, obe, 
wf);
-       if (supports_frames)
-               set_frame_support(call);
        *rel = p;
        return call;
 }
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -630,33 +630,24 @@ exp_rewrite(mvc *sql, sql_rel *rel, sql_
                        pe = exp_op(sql->sa, args, df);
                }
 
-               if (!supports_frames(e)) {
-                       for (node *n = rankopargs->h; n ; n = n->next) {
-                               if (n->next == rankopargs->t) {
-                                       n->data = pe;
-                                       break;
-                               }
-                       }
-               } else {
-                       for (node *n = rankopargs->h; n ; n = n->next, i++) {
-                               if (i == list_length(sf->func->ops)) {
-                                       n->data = pe;
-                                       break;
-                               }
+               for (node *n = rankopargs->h; n ; n = n->next, i++) { /* at 
rel_select pe is added right after the function's arguments */
+                       if (i == list_length(sf->func->ops)) {
+                               n->data = pe;
+                               break;
                        }
-                       last = rankopargs->t->data;
-                       if (last && last->type == e_func && 
!strcmp(((sql_subfunc *)last->f)->func->base.name, "window_bound")) {
-                               sql_exp *window1 = list_fetch(rankopargs, 
list_length(rankopargs) - 2), *window2 = list_fetch(rankopargs, 
list_length(rankopargs) - 1);
-                               list *lw1 = window1->l, *lw2 = window2->l; /* 
the value functions require bound functions always */
-
-                               if (has_pe) {
-                                       assert(list_length(window1->l) == 6);
-                                       lw1->h->data = exp_copy(sql, pe);
-                                       lw2->h->data = exp_copy(sql, pe);
-                               } else {
-                                       window1->l = list_prepend(lw1, 
exp_copy(sql, pe));
-                                       window2->l = list_prepend(lw2, 
exp_copy(sql, pe));
-                               }
+               }
+               last = rankopargs->t->data; /* if the window function has 
bounds calls, update them */
+               if (last && last->type == e_func && !strcmp(((sql_subfunc 
*)last->f)->func->base.name, "window_bound")) {
+                       sql_exp *window1 = list_fetch(rankopargs, 
list_length(rankopargs) - 2), *window2 = list_fetch(rankopargs, 
list_length(rankopargs) - 1);
+                       list *lw1 = window1->l, *lw2 = window2->l; /* the value 
functions require bound functions always */
+
+                       if (has_pe) {
+                               assert(list_length(window1->l) == 6);
+                               lw1->h->data = exp_copy(sql, pe);
+                               lw2->h->data = exp_copy(sql, pe);
+                       } else {
+                               window1->l = list_prepend(lw1, exp_copy(sql, 
pe));
+                               window2->l = list_prepend(lw2, exp_copy(sql, 
pe));
                        }
                }
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to