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