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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list