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