Changeset: ff8701f2ddf6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ff8701f2ddf6
Modified Files:
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/sql_mvc.h
        sql/server/sql_var.c
        sql/test/scoping/Tests/scoping01.sql
Branch: scoping
Log Message:

Using schemas to find variables on the stack


diffs (truncated from 357 to 300 lines):

diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -90,7 +90,7 @@ psm_set_exp(sql_query *query, dnode *n)
                        e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(e));
                }
 
-               level = stack_find_frame(sql, s, vname);
+               level = stack_find_var_frame(sql, s, vname);
                e = rel_check_type(sql, tpe, rel, e, type_cast);
                if (!e)
                        return NULL;
@@ -131,7 +131,7 @@ psm_set_exp(sql_query *query, dnode *n)
                                tpe = stack_find_type(sql, vname);
                        }
 
-                       level = stack_find_frame(sql, s, vname);
+                       level = stack_find_var_frame(sql, s, vname);
                        if (!exp_name(v)) 
                                exp_label(sql->sa, v, ++sql->label);
                        v = exp_ref(sql->sa, v);
@@ -224,7 +224,7 @@ rel_psm_declare_table(sql_query *query, 
        if (baset->flag != ddl_create_table)
                return NULL;
        t = 
(sql_table*)((atom*)((sql_exp*)baset->exps->t->data)->l)->data.val.pval;
-       if (!stack_push_table(sql, s, name, t))
+       if (!stack_push_table(sql, t))
                return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return exp_table(sql->sa, sa_strdup(sql->sa, s->base.name), 
sa_strdup(sql->sa, name), t, sql->frame);
 }
@@ -547,7 +547,7 @@ rel_select_into( sql_query *query, symbo
                if (!stack_find_var(sql, s, name)) 
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT INTO: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", name);
                tpe = stack_find_type(sql, name);
-               level = stack_find_frame(sql, s, name);
+               level = stack_find_var_frame(sql, s, name);
                if (!exp_name(v)) 
                        exp_label(sql->sa, v, ++sql->label);
                v = exp_ref(sql->sa, v);
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
@@ -1076,7 +1076,7 @@ rel_var_ref(mvc *sql, const char *sname,
 
        if (stack_find_var(sql, s, name)) {
                sql_subtype *tpe = stack_find_type(sql, name);
-               int frame = stack_find_frame(sql, s, name);
+               int frame = stack_find_var_frame(sql, s, name);
                return exp_param_or_declared(sql->sa, s->base.name, name, tpe, 
frame);
        } else {
                return sql_error(sql, 02, SQLSTATE(42000) "SELECT: identifier 
'%s%s%s' unknown", sname ? sname : "", sname ? "." : "", name);
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
@@ -81,7 +81,6 @@ typedef struct sql_window_definition {
 } sql_window_definition;
 
 typedef struct sql_local_table { /* declared tables during session */
-       char *name;
        sql_table *table;
 } sql_local_table;
 
@@ -91,7 +90,7 @@ typedef struct sql_rel_view { /* CTEs */
 } sql_rel_view;
 
 typedef struct sql_var { /* Declared variables and parameters */
-       char *sname; /* Declared variables may have a schema */
+       char *sname; /* Declared variables have a schema */
        char *name;
        atom var;
 } sql_var;
@@ -251,7 +250,7 @@ extern int mvc_check_dependency(mvc *m, 
 
 /* variable management */
 extern sql_var* stack_push_var(mvc *sql, sql_schema *s, const char *name, 
sql_subtype *type);
-extern sql_local_table* stack_push_table(mvc *sql, sql_schema *s, const char 
*name, sql_table *t);
+extern sql_local_table* stack_push_table(mvc *sql, sql_table *t);
 extern sql_rel_view* stack_push_rel_view(mvc *sql, const char *name, sql_rel 
*var);
 extern sql_window_definition* stack_push_window_def(mvc *sql, const char 
*name, dlist *wdef);
 extern dlist* stack_get_window_def(mvc *sql, const char *name, int *pos);
@@ -269,7 +268,7 @@ extern void clear_frame(mvc *sql, sql_fr
 extern void stack_pop_until(mvc *sql, int frame);
 
 /* find variable in the stack */
-extern int stack_find_frame(mvc *sql, sql_schema *s, const char *name);
+extern int stack_find_var_frame(mvc *sql, sql_schema *s, const char *name);
 extern int stack_find_var(mvc *sql, sql_schema *s, const char *name);
 extern sql_subtype *stack_find_type(mvc *sql, const char *name);
 extern sql_table *stack_find_table(mvc *sql, sql_schema *s, const char *name);
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
@@ -21,6 +21,7 @@ destroy_sql_var(void *data)
        sql_var *svar = (sql_var*) data;
        VALclear(&(svar->var.data));
        svar->var.data.vtype = 0;
+       _DELETE(svar->sname);
        _DELETE(svar->name);
        _DELETE(svar);
 }
@@ -28,9 +29,8 @@ destroy_sql_var(void *data)
 sql_var*
 stack_push_var(mvc *sql, sql_schema *s, const char *name, sql_subtype *type)
 {
-       (void) s; /* for now ignore sname */
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_var *svar = MNEW(sql_var);
+       sql_var *svar = ZNEW(sql_var);
 
        if (!svar)
                return NULL;
@@ -38,6 +38,11 @@ stack_push_var(mvc *sql, sql_schema *s, 
                _DELETE(svar);
                return NULL;
        }
+       if (s && !(svar->sname = _STRDUP(s->base.name))) {
+               _DELETE(svar->name);
+               _DELETE(svar);
+               return NULL;
+       }
        atom_init(&(svar->var));
        if (type) {
                int tpe = type->type->localtype;
@@ -46,11 +51,13 @@ stack_push_var(mvc *sql, sql_schema *s, 
        }
        if (!f->vars && !(f->vars = list_create(destroy_sql_var))) {
                _DELETE(svar->name);
+               _DELETE(svar->sname);
                _DELETE(svar);
                return NULL;
        }
        if (!list_append(f->vars, svar)) {
                _DELETE(svar->name);
+               _DELETE(svar->sname);
                _DELETE(svar);
                return NULL;
        }
@@ -62,31 +69,23 @@ destroy_sql_local_table(void *data)
 {
        sql_local_table *slt = (sql_local_table*) data;
        table_destroy(slt->table); /* TODO check if this is needed */
-       _DELETE(slt->name);
        _DELETE(slt);
 }
 
 sql_local_table*
-stack_push_table(mvc *sql, sql_schema *s, const char *name, sql_table *t)
+stack_push_table(mvc *sql, sql_table *t)
 {
-       (void) s; /* for now ignore sname */
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_local_table *slt = MNEW(sql_local_table);
+       sql_local_table *slt = ZNEW(sql_local_table);
 
        if (!slt)
                return NULL;
-       if (!(slt->name = _STRDUP(name))) {
-               _DELETE(slt);
-               return NULL;
-       }
        slt->table = t;
        if (!f->tables && !(f->tables = list_create(destroy_sql_local_table))) {
-               _DELETE(slt->name);
                _DELETE(slt);
                return NULL;
        }
        if (!list_append(f->tables, slt)) {
-               _DELETE(slt->name);
                _DELETE(slt);
                return NULL;
        }
@@ -106,7 +105,7 @@ sql_rel_view*
 stack_push_rel_view(mvc *sql, const char *name, sql_rel *var)
 {
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_rel_view *srv = MNEW(sql_rel_view);
+       sql_rel_view *srv = ZNEW(sql_rel_view);
 
        if (!srv)
                return NULL;
@@ -140,7 +139,7 @@ sql_window_definition*
 stack_push_window_def(mvc *sql, const char *name, dlist *wdef)
 {
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_window_definition *swd = MNEW(sql_window_definition);
+       sql_window_definition *swd = ZNEW(sql_window_definition);
 
        if (!swd)
                return NULL;
@@ -174,7 +173,7 @@ sql_groupby_expression*
 stack_push_groupby_expression(mvc *sql, symbol *def, sql_exp *exp)
 {
        sql_frame *f = sql->frames[sql->topframes - 1];
-       sql_groupby_expression *sge = MNEW(sql_groupby_expression);
+       sql_groupby_expression *sge = ZNEW(sql_groupby_expression);
 
        if (!sge)
                return NULL;
@@ -267,13 +266,13 @@ stack_clear_frame_visited_flag(mvc *sql)
 atom *
 stack_set_var(mvc *sql, sql_schema *s, const char *name, ValRecord *v)
 {
-       (void) s; /* for now ignore sname */
+       const char *sname = s->base.name;
        for (int i = sql->topframes-1; i >= 0; i--) {
                sql_frame *f = sql->frames[i];
                if (f->vars) {
                        for (node *n = f->vars->h; n ; n = n->next) {
                                sql_var *var = (sql_var*) n->data;
-                               if (var->name && !strcmp(var->name, name)) {
+                               if ((!var->sname || !strcmp(var->sname, sname)) 
&& !strcmp(var->name, name)) { /* Function parameters don't have a schema */
                                        VALclear(&(var->var.data));
                                        if (VALcopy(&(var->var.data), v) == 
NULL)
                                                return NULL;
@@ -293,13 +292,13 @@ stack_set_var(mvc *sql, sql_schema *s, c
 atom *
 stack_get_var(mvc *sql, sql_schema *s, const char *name)
 {
-       (void) s; /* for now ignore sname */
+       const char *sname = s->base.name;
        for (int i = sql->topframes-1; i >= 0; i--) {
                sql_frame *f = sql->frames[i];
                if (f->vars) {
                        for (node *n = f->vars->h; n ; n = n->next) {
                                sql_var *var = (sql_var*) n->data;
-                               if (var->name && !strcmp(var->name, name))
+                               if ((!var->sname || !strcmp(var->sname, sname)) 
&& !strcmp(var->name, name)) /* Function parameters don't have a schema */
                                        return &(var->var);
                        }
                }
@@ -381,13 +380,13 @@ stack_find_type(mvc *sql, const char *na
 sql_table *
 stack_find_table(mvc *sql, sql_schema *s, const char *name)
 {
-       (void) s; /* for now ignore sname */
+       const char *sname = s->base.name;
        for (int i = sql->topframes-1; i >= 0; i--) {
                sql_frame *f = sql->frames[i];
                if (f->tables) {
                        for (node *n = f->tables->h; n ; n = n->next) {
                                sql_local_table *var = (sql_local_table*) 
n->data;
-                               if (var->name && !strcmp(var->name, name))
+                               if (!strcmp(var->table->s->base.name, sname) && 
!strcmp(var->table->base.name, name))
                                        return var->table;
                        }
                }
@@ -398,12 +397,12 @@ stack_find_table(mvc *sql, sql_schema *s
 sql_table *
 frame_find_table(mvc *sql, sql_schema *s, const char *name)
 {
-       (void) s; /* for now ignore sname */
+       const char *sname = s->base.name;
        sql_frame *f = sql->frames[sql->topframes - 1];
        if (f->tables) {
                for (node *n = f->tables->h; n ; n = n->next) {
                        sql_local_table *var = (sql_local_table*) n->data;
-                       if (var->name && !strcmp(var->name, name))
+                       if (!strcmp(var->table->s->base.name, sname) && 
!strcmp(var->table->base.name, name))
                                return var->table;
                }
        }
@@ -418,7 +417,8 @@ stack_find_rel_view(mvc *sql, const char
                if (f->rel_views) {
                        for (node *n = f->rel_views->h; n ; n = n->next) {
                                sql_rel_view *var = (sql_rel_view*) n->data;
-                               if (var->name && !strcmp(var->name, name))
+                               assert(var->name);
+                               if (!strcmp(var->name, name))
                                        return rel_dup(var->rel_view);
                        }
                }
@@ -433,8 +433,9 @@ frame_find_rel_view(mvc *sql, const char
        if (f->rel_views) {
                for (node *n = f->rel_views->h; n ; n = n->next) {
                        sql_rel_view *var = (sql_rel_view*) n->data;
-                       if (var->name && !strcmp(var->name, name))
-                               return var->rel_view;
+                               assert(var->name);
+                               if (!strcmp(var->name, name))
+                                       return var->rel_view;
                }
        }
        return NULL;
@@ -448,7 +449,8 @@ stack_update_rel_view(mvc *sql, const ch
                if (f->rel_views) {
                        for (node *n = f->rel_views->h; n ; n = n->next) {
                                sql_rel_view *var = (sql_rel_view*) n->data;
-                               if (var->name && !strcmp(var->name, name)) {
+                               assert(var->name);
+                               if (!strcmp(var->name, name)) {
                                        rel_destroy(var->rel_view);
                                        var->rel_view = view;
                                        return;
@@ -461,13 +463,14 @@ stack_update_rel_view(mvc *sql, const ch
 int 
 stack_find_var(mvc *sql, sql_schema *s, const char *name)
 {
-       (void) s; /* for now ignore sname */
+       const char *sname = s->base.name;
        for (int i = sql->topframes-1; i >= 0; i--) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to