Changeset: a0fd49ad604c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a0fd49ad604c Modified Files: sql/backends/monet5/sql_execute.c sql/server/rel_exp.c sql/server/sql_mvc.h sql/server/sql_var.c Branch: default Log Message:
Added missing value extraction for stack variables. Disable value based optimization on the remote side, because stack variables are not yet defined, and also optimization is already done on the local side diffs (78 lines): diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -771,7 +771,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS refs = sa_list(m->sa); rel = rel_read(m, *expr, &pos, refs); if (*opt && rel) - rel = sql_processrelation(m, rel, 0, 1, 1); + rel = sql_processrelation(m, rel, 0, 0, 0); if (!rel) { if (strlen(m->errstr) > 6 && m->errstr[5] == '!') msg = createException(SQL, "RAstatement", "%s", m->errstr); @@ -967,7 +967,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb, refs = sa_list(m->sa); rel = rel_read(m, expr, &pos, refs); if (rel) - rel = sql_processrelation(m, rel, 0, 1, 1); + rel = sql_processrelation(m, rel, 0, 0, 0); if (!rel) { if (strlen(m->errstr) > 6 && m->errstr[5] == '!') msg = createException(SQL, "RAstatement2", "%s", m->errstr); 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 @@ -565,12 +565,12 @@ exp_value(mvc *sql, sql_exp *e) return e->l; } else if (e->r) { /* param (ie not set) */ sql_var_name *vname = (sql_var_name*) e->r; - sql_var *var; assert(e->flag != 0 || vname->sname); /* global variables must have a schema */ - if (e->flag == 0 && (var = find_global_var(sql, mvc_bind_schema(sql, vname->sname), vname->name))) /* global variable */ + sql_var *var = e->flag == 0 ? find_global_var(sql, mvc_bind_schema(sql, vname->sname), vname->name) : + stack_find_var_at_level(sql, vname->name, e->flag); + if (var) return &(var->var); - return NULL; } return NULL; } 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 @@ -268,6 +268,7 @@ extern void stack_pop_until(mvc *sql, in /* find variable in the stack */ extern sql_var *stack_find_var_frame(mvc *sql, const char *name, int *level); +extern sql_var *stack_find_var_at_level(mvc *sql, const char *name, int level); extern sql_table *stack_find_table(mvc *sql, const char *name); extern sql_table *frame_find_table(mvc *sq, const char *name); extern sql_rel *stack_find_rel_view(mvc *sql, 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 @@ -596,6 +596,23 @@ stack_find_var_frame(mvc *sql, const cha return NULL; } +sql_var* +stack_find_var_at_level(mvc *sql, const char *name, int level) +{ + for (int i = sql->topframes-1; i >= 0; i--) { + sql_frame *f = sql->frames[i]; + if (f->frame_number == level && f->vars) { + for (node *n = f->vars->h; n ; n = n->next) { + sql_var *var = (sql_var*) n->data; + assert(var->name); + if (!strcmp(var->name, name)) + return var; + } + } + } + return NULL; +} + int stack_has_frame(mvc *sql, const char *name) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list