Changeset: 0d051e216321 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0d051e216321
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/rel_updates.c
        sql/server/rel_updates.h
        sql/server/sql_partition.c
Branch: default
Log Message:

A leftover I forgot from scoping. While parsing a default value or any other 
expression, set the session's schema to the correspondent table's schema


diffs (139 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1670,9 +1670,9 @@ sql_Nop_(backend *be, const char *fname,
 }
 
 static stmt *
-parse_value(backend *be, char *query, sql_subtype *tpe, char emode)
+parse_value(backend *be, sql_schema *s, char *query, sql_subtype *tpe, char 
emode)
 {
-       sql_exp *e = rel_parse_val(be->mvc, query, tpe, emode, NULL);
+       sql_exp *e = rel_parse_val(be->mvc, s, query, tpe, emode, NULL);
        if (e)
                return exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 
0);
        return sql_error(be->mvc, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
@@ -4740,7 +4740,7 @@ sql_delete_set_Fkeys(backend *be, sql_ke
 
                if (action == ACT_SET_DEFAULT) {
                        if (fc->c->def) {
-                               stmt *sq = parse_value(be, fc->c->def, 
&fc->c->type, sql->emode);
+                               stmt *sq = parse_value(be, fc->c->t->s, 
fc->c->def, &fc->c->type, sql->emode);
                                if (!sq)
                                        return NULL;
                                upd = sq;
@@ -4798,7 +4798,7 @@ sql_update_cascade_Fkeys(backend *be, sq
                        upd = updates[c->c->colnr];
                } else if (action == ACT_SET_DEFAULT) {
                        if (fc->c->def) {
-                               stmt *sq = parse_value(be, fc->c->def, 
&fc->c->type, sql->emode);
+                               stmt *sq = parse_value(be, fc->c->t->s, 
fc->c->def, &fc->c->type, sql->emode);
                                if (!sq)
                                        return NULL;
                                upd = sq;
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -36,7 +36,7 @@ rel_generate_anti_expression(mvc *sql, s
                //res = exp_ref(sql, res);
        } else if (isPartitionedByExpressionTable(mt)) {
                *anti_rel = rel_project(sql->sa, *anti_rel, NULL);
-               if (!(res = rel_parse_val(sql, mt->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
+               if (!(res = rel_parse_val(sql, mt->s, mt->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
                        return NULL;
        } else {
                assert(0);
@@ -100,7 +100,7 @@ rel_generate_anti_insert_expression(mvc 
                res = list_fetch((*anti_rel)->exps, colr);
        } else if (isPartitionedByExpressionTable(t)) {
                *anti_rel = rel_project(sql->sa, *anti_rel, 
rel_projections(sql, *anti_rel, NULL, 1, 1));
-               if (!(res = rel_parse_val(sql, t->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
+               if (!(res = rel_parse_val(sql, t->s, t->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
                        return NULL;
                exp_label(sql->sa, res, ++sql->label);
                append((*anti_rel)->exps, res);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1538,7 +1538,7 @@ sql_alter_table(sql_query *query, dlist 
                        if (!c->base.new || c->base.deleted)
                                continue;
                        if (c->def) {
-                               e = rel_parse_val(sql, c->def, &c->type, 
sql->emode, NULL);
+                               e = rel_parse_val(sql, nt->s, c->def, &c->type, 
sql->emode, NULL);
                        } else {
                                e = exp_atom(sql->sa, atom_general(sql->sa, 
&c->type, NULL));
                        }
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -30,7 +30,7 @@ insert_value(sql_query *query, sql_colum
                return exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL));
        } else if (s->token == SQL_DEFAULT) {
                if (c->def) {
-                       sql_exp *e = rel_parse_val(sql, c->def, &c->type, 
sql->emode, NULL);
+                       sql_exp *e = rel_parse_val(sql, c->t->s, c->def, 
&c->type, sql->emode, NULL);
                        if (!e || (e = exp_check_type(sql, &c->type, r ? *r : 
NULL, e, type_equal)) == NULL)
                                return sql_error(sql, 02, SQLSTATE(HY005) "%s: 
default expression could not be evaluated", action);
                        return e;
@@ -357,7 +357,7 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                                sql_exp *e = NULL;
 
                                if (c->def) {
-                                       e = rel_parse_val(sql, c->def, 
&c->type, sql->emode, NULL);
+                                       e = rel_parse_val(sql, t->s, c->def, 
&c->type, sql->emode, NULL);
                                        if (!e || (e = exp_check_type(sql, 
&c->type, r, e, type_equal)) == NULL)
                                                return sql_error(sql, 02, 
SQLSTATE(HY005) "%s: default expression could not be evaluated", action);
                                } else {
@@ -964,7 +964,7 @@ update_generate_assignments(sql_query *q
                                if (!c)
                                        return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, colname);
                                if (c->def) {
-                                       v = rel_parse_val(sql, c->def, 
&c->type, sql->emode, NULL);
+                                       v = rel_parse_val(sql, t->s, c->def, 
&c->type, sql->emode, NULL);
                                } else {
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' has no valid default value", action, 
c->base.name);
                                }
@@ -1847,7 +1847,7 @@ copyto(sql_query *query, symbol *sq, con
 }
 
 sql_exp *
-rel_parse_val(mvc *m, char *query, sql_subtype *tpe, char emode, sql_rel *from)
+rel_parse_val(mvc *m, sql_schema *sch, char *query, sql_subtype *tpe, char 
emode, sql_rel *from)
 {
        mvc o = *m;
        sql_exp *e = NULL;
@@ -1860,6 +1860,9 @@ rel_parse_val(mvc *m, char *query, sql_s
 
        m->qc = NULL;
 
+       if (sch)
+               m->session->schema = sch;
+
        m->emode = emode;
        b = malloc(sizeof(buffer));
        len += 8; /* add 'select ;' */
diff --git a/sql/server/rel_updates.h b/sql/server/rel_updates.h
--- a/sql/server/rel_updates.h
+++ b/sql/server/rel_updates.h
@@ -22,7 +22,7 @@ extern sql_rel *rel_insert(mvc *sql, sql
 extern sql_rel *rel_delete(sql_allocator *sa, sql_rel *t, sql_rel *deletes);
 extern sql_rel *rel_truncate(sql_allocator *sa, sql_rel *t, int 
restart_sequences, int drop_action);
 
-extern sql_exp *rel_parse_val(mvc *m, char *query, sql_subtype *tpe, char 
emode, sql_rel *from);
+extern sql_exp *rel_parse_val(mvc *m, sql_schema *s, char *query, sql_subtype 
*tpe, char emode, sql_rel *from);
 
 extern sql_rel *rel_updates(sql_query *query, symbol *sym);
 
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -249,7 +249,7 @@ bootstrap_partition_expression(mvc *sql,
 
        r = rel_basetable(sql, mt, mt->base.name);
        query = mt->part.pexp->exp;
-       if ((exp = rel_parse_val(sql, query, NULL, sql->emode, r)) == NULL) {
+       if (!(exp = rel_parse_val(sql, mt->s, query, NULL, sql->emode, r))) {
                if (*sql->errstr) {
                        if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!')
                                throw(SQL, "sql.partition", "%s", sql->errstr);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to