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

Reply via email to