Changeset: 9ccc37c9d8ec for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9ccc37c9d8ec Modified Files: sql/server/rel_select.c sql/server/sql_mvc.h sql/server/sql_var.c Branch: scoping Log Message:
Window function may be called from outside SELECT statements, so remove topframes assertion diffs (143 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 @@ -4700,7 +4700,7 @@ rel_rankop(sql_query *query, sql_rel **r int distinct = 0, frame_type, pos, nf = f, nfargs = 0; bool is_nth_value, supports_frames; - frame_clear_frame_visited_flag(sql); /* clear visited flags before iterating */ + frame_clear_visited_flag(sql); /* clear visited flags before iterating */ if (l->h->next->type == type_list) { window_specification = l->h->next->data.lval; diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -265,7 +265,7 @@ extern void stack_update_rel_view(mvc *s extern bool frame_check_var_visited(mvc *sql, int i); extern void frame_set_var_visited(mvc *sql, int i); -extern void frame_clear_frame_visited_flag(mvc *sql); +extern void frame_clear_visited_flag(mvc *sql); extern sql_frame *stack_push_frame(mvc *sql, const char *name); extern void stack_pop_frame(mvc *sql); diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c --- a/sql/server/sql_var.c +++ b/sql/server/sql_var.c @@ -272,16 +272,17 @@ frame_push_groupby_expression(mvc *sql, dlist * frame_get_window_def(mvc *sql, const char *name, int *pos) { - assert(sql->topframes > 0); - sql_frame *f = sql->frames[sql->topframes - 1]; - if (f->windows) { - int i = 0; - for (node *n = f->windows->h; n ; n = n->next, i++) { - sql_window_definition *var = (sql_window_definition*) n->data; - if (var->name && !strcmp(var->name, name)) { - if (pos) - *pos = i; - return var->wdef; + if (sql->topframes > 0) { + sql_frame *f = sql->frames[sql->topframes - 1]; + if (f->windows) { + int i = 0; + for (node *n = f->windows->h; n ; n = n->next, i++) { + sql_window_definition *var = (sql_window_definition*) n->data; + if (var->name && !strcmp(var->name, name)) { + if (pos) + *pos = i; + return var->wdef; + } } } } @@ -291,13 +292,14 @@ frame_get_window_def(mvc *sql, const cha sql_exp* frame_get_groupby_expression(mvc *sql, symbol *def) { - assert(sql->topframes > 0); - sql_frame *f = sql->frames[sql->topframes - 1]; - if (f->group_expressions) { - for (node *n = f->group_expressions->h; n ; n = n->next) { - sql_groupby_expression *var = (sql_groupby_expression*) n->data; - if (var->token == def->token && !symbol_cmp(sql, var->sdef, def)) - return var->exp; + if (sql->topframes > 0) { + sql_frame *f = sql->frames[sql->topframes - 1]; + if (f->group_expressions) { + for (node *n = f->group_expressions->h; n ; n = n->next) { + sql_groupby_expression *var = (sql_groupby_expression*) n->data; + if (var->token == def->token && !symbol_cmp(sql, var->sdef, def)) + return var->exp; + } } } return NULL; @@ -308,40 +310,44 @@ frame_get_groupby_expression(mvc *sql, s bool frame_check_var_visited(mvc *sql, int i) { - assert(sql->topframes > 0); - sql_frame *f = sql->frames[sql->topframes - 1]; - sql_window_definition *win; + if (sql->topframes > 0) { + sql_frame *f = sql->frames[sql->topframes - 1]; + sql_window_definition *win; - if (i < 0 || i >= list_length(f->windows)) - return false; + if (i < 0 || i >= list_length(f->windows)) + return false; - win = (sql_window_definition*) list_fetch(f->windows, i); - return win->visited; + win = (sql_window_definition*) list_fetch(f->windows, i); + return win->visited; + } + return false; } void frame_set_var_visited(mvc *sql, int i) { - assert(sql->topframes > 0); - sql_frame *f = sql->frames[sql->topframes - 1]; - sql_window_definition *win; + if (sql->topframes > 0) { + sql_frame *f = sql->frames[sql->topframes - 1]; + sql_window_definition *win; - if (i < 0 || i >= list_length(f->windows)) - return; + if (i < 0 || i >= list_length(f->windows)) + return; - win = (sql_window_definition*) list_fetch(f->windows, i); - win->visited = true; + win = (sql_window_definition*) list_fetch(f->windows, i); + win->visited = true; + } } void -frame_clear_frame_visited_flag(mvc *sql) +frame_clear_visited_flag(mvc *sql) { - assert(sql->topframes > 0); - sql_frame *f = sql->frames[sql->topframes - 1]; - if (f->windows) { - for (node *n = f->windows->h; n ; n = n->next) { - sql_window_definition *var = (sql_window_definition*) n->data; - var->visited = false; + if (sql->topframes > 0) { + sql_frame *f = sql->frames[sql->topframes - 1]; + if (f->windows) { + for (node *n = f->windows->h; n ; n = n->next) { + sql_window_definition *var = (sql_window_definition*) n->data; + var->visited = false; + } } } } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list