Changeset: ffe13a882b07 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ffe13a882b07
Added Files:
        sql/test/scoping/Tests/scoping04.sql
        sql/test/scoping/Tests/scoping04.stable.err
        sql/test/scoping/Tests/scoping04.stable.out
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_user.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/sql_env.c
        sql/server/sql_mvc.c
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
        sql/storage/store.c
        sql/test/scoping/Tests/All
Branch: scoping
Log Message:

Added transaction semantics to the session's schema


diffs (truncated from 760 to 300 lines):

diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -1632,7 +1632,7 @@ str
 SQLrename_schema(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        mvc *sql = NULL;
-       str msg = MAL_SUCCEED;
+       str msg = MAL_SUCCEED, onn;
        str old_name = *getArgReference_str(stk, pci, 1);
        str new_name = *getArgReference_str(stk, pci, 2);
        sql_schema *s;
@@ -1653,9 +1653,15 @@ SQLrename_schema(Client cntxt, MalBlkPtr
 
        if (!sql_trans_rename_schema(sql->session->tr, s->base.id, new_name))
                throw(SQL, "sql.rename_schema",SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       if (s == cur_schema(sql))
-               if (!mvc_set_schema(sql, new_name))
+       if (s == cur_schema(sql)) /* change current session schema name */
+               if (!mvc_set_schema_name(sql, new_name))
                        throw(SQL, "sql.rename_schema",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       if (strcmp(sql->session->old_schema_name, old_name) == 0) { /* change 
old schema name for the session */
+               if (!(onn = _STRDUP(new_name)))
+                       throw(SQL, "sql.rename_schema",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               _DELETE(sql->session->old_schema_name);
+               sql->session->old_schema_name = onn;
+       }
        return msg;
 }
 
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1174,7 +1174,6 @@ mal_function_find_implementation_address
        stream *buf = NULL;
        char *n = NULL;
        int len = _strlen(f->query);
-       sql_schema *s = cur_schema(m);
        dlist *l, *ext_name;
 
        if (!(m = ZNEW(mvc))) {
@@ -1191,9 +1190,6 @@ mal_function_find_implementation_address
                (void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
                goto bailout;
        }
-       if (s)
-               m->session->schema = s;
-
        if (!(m->sa = sa_create())) {
                (void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
                goto bailout;
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -620,16 +620,19 @@ SQLtrans(mvc *m)
                        throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                s = m->session;
                if (!s->schema) {
-                       if (s->schema_name)
-                               GDKfree(s->schema_name);
-                       s->schema_name = monet5_user_get_def_schema(m, 
m->user_id);
-                       if (!s->schema_name) {
+                       int sres;
+                       str found = monet5_user_get_def_schema(m, m->user_id);
+
+                       if (!found) {
                                mvc_cancel_session(m);
                                throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        }
-                       assert(s->schema_name);
-                       s->schema = find_sql_schema(s->tr, s->schema_name);
-                       assert(s->schema);
+                       sres = mvc_set_schema_name(m, found);
+                       _DELETE(found);
+                       if (!sres) {
+                               mvc_cancel_session(m);
+                               throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       }
                }
        }
        return MAL_SUCCEED;
@@ -1102,7 +1105,7 @@ SQLparser(Client c)
                sqlcleanup(m, err);
                goto finalize;
        }
-       assert(m->session->schema != NULL);
+       assert(m->session->schema);
        /*
         * We have dealt with the first parsing step and advanced the input 
reader
         * to the next statement (if any).
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -476,8 +476,6 @@ monet5_user_get_def_schema(mvc *m, int u
        rid = table_funcs.column_find_row(m->session->tr, schemas_id, 
&schema_id, NULL);
        if (!is_oid_nil(rid))
                schema = table_funcs.column_find_value(m->session->tr, 
schemas_name, rid);
-       if (!sqlvar_set_string(find_global_var(m, mvc_bind_schema(m, "sys"), 
"current_schema"), schema))
-               return NULL;
        return schema;
 }
 
@@ -510,7 +508,7 @@ monet5_user_set_def_schema(mvc *m, oid u
                return (NULL);  /* don't reveal that the user doesn't exist */
        }
 
-       if(mvc_trans(m) < 0) {
+       if (mvc_trans(m) < 0) {
                GDKfree(username);
                return NULL;
        }
@@ -552,9 +550,9 @@ monet5_user_set_def_schema(mvc *m, oid u
                schema = NULL;
        }
 
-       if (!schema || !mvc_set_schema(m, schema)) {
+       if (!schema || !mvc_set_schema_name(m, schema)) {
                if (m->session->tr->active) {
-                       if((other = mvc_rollback(m, 0, NULL, false)) != 
MAL_SUCCEED)
+                       if ((other = mvc_rollback(m, 0, NULL, false)) != 
MAL_SUCCEED)
                                freeException(other);
                }
                GDKfree(username);
@@ -567,7 +565,7 @@ monet5_user_set_def_schema(mvc *m, oid u
                schema = NULL;
        }
        GDKfree(username);
-       if((other = mvc_rollback(m, 0, NULL, false)) != MAL_SUCCEED) {
+       if ((other = mvc_commit(m, 0, NULL, false)) != MAL_SUCCEED) { /* has to 
commit the new session schema value */
                freeException(other);
                return NULL;
        }
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -695,7 +695,8 @@ typedef struct res_table {
 typedef struct sql_session {
        sql_trans *tr;          /* active transaction */        
 
-       char *schema_name;
+       char *old_schema_name; /* transaction's old schema name (from previous 
transaction), needed for rollback */
+       char *schema_name; /* transaction's schema name */
        sql_schema *schema;
 
        char ac_on_commit;      /* if 1, auto_commit should be enabled on
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
@@ -991,17 +991,19 @@ rel_create_func(sql_query *query, dlist 
                } else if (body) { /* SQL implementation */
                        sql_arg *ra = (restype && type != 
F_UNION)?restype->h->data:NULL;
                        list *b = NULL;
-                       sql_schema *old_schema = cur_schema(sql);
+                       sql_schema *os = cur_schema(sql);
 
                        if (create) { /* needed for recursive functions */
                                q = query_cleaned(q);
                                sql->forward = f = mvc_create_func(sql, 
sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg, FALSE);
                                GDKfree(q);
                        }
-                       sql->session->schema = s;
+                       if (!mvc_set_schema(query->sql, s))
+                               return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        b = sequential_block(query, (ra)?&ra->type:NULL, 
ra?NULL:restype, body, NULL, is_func);
                        sql->forward = NULL;
-                       sql->session->schema = old_schema;
+                       if (!mvc_set_schema(query->sql, os))
+                               return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                        sql->params = NULL;
                        if (!b)
                                return NULL;
@@ -1377,9 +1379,11 @@ create_trigger(sql_query *query, dlist *
                if (old_name)
                        stack_update_rel_view(sql, old_name, 
new_name?rel_dup(rel):rel);
        }
-       sql->session->schema = ss;
+       if (!mvc_set_schema(query->sql, ss))
+               return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        sq = sequential_block(query, NULL, NULL, stmts, NULL, 1);
-       sql->session->schema = old_schema;
+       if (!mvc_set_schema(query->sql, old_schema))
+               return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        if (!sq) {
                if (!instantiate)
                        stack_pop_frame(sql);
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
@@ -1367,8 +1367,8 @@ rel_create_schema(sql_query *query, dlis
                        return sql_error(sql, 02, SQLSTATE(3F000) "CREATE 
SCHEMA: name '%s' already in use", name);
                return rel_psm_block(sql->sa, new_exp_list(sql->sa));
        } else {
-               sql_schema *os = sql->session->schema;
-               dnode *n;
+               sql_schema *os = cur_schema(sql);
+               dnode *n = schema_elements->h;
                sql_schema *ss = SA_ZNEW(sql->sa, sql_schema);
                sql_rel *ret = rel_create_schema_dll(sql->sa, name, auth, 0);
 
@@ -1376,19 +1376,20 @@ rel_create_schema(sql_query *query, dlis
                ss->auth_id = auth_id;
                ss->owner = sql->user_id;
 
-               sql->session->schema = ss;
-               n = schema_elements->h;
+               if (!mvc_set_schema(query->sql, ss))
+                       return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                while (n) {
                        sql_rel *res = rel_semantic(query, n->data.sym);
                        if (!res) {
                                rel_destroy(ret);
-                               sql->session->schema = os;
+                               (void) mvc_set_schema(query->sql, os);
                                return NULL;
                        }
                        ret = rel_list(sql->sa, ret, res);
                        n = n->next;
                }
-               sql->session->schema = os;
+               if (!mvc_set_schema(query->sql, os))
+                       return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                return ret;
        }
 }
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
@@ -6071,12 +6071,15 @@ rel_selects(sql_query *query, symbol *s)
 sql_rel *
 schema_selects(sql_query *query, sql_schema *schema, symbol *s)
 {
+       mvc *sql = query->sql;
        sql_rel *res;
-       sql_schema *os = query->sql->session->schema;
-
-       query->sql->session->schema = schema;
+       sql_schema *os = cur_schema(sql);
+
+       if (!mvc_set_schema(sql, schema))
+               return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        res = rel_selects(query, s);
-       query->sql->session->schema = os;
+       if (!mvc_set_schema(sql, os))
+               return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return res;
 }
 
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -17,12 +17,12 @@
 #include "rel_psm.h"
 #include "rel_sequence.h"
 #include "rel_exp.h"
+#include "sql_privileges.h"
 
 #include <unistd.h>
 #include <string.h>
 #include <ctype.h>
 
-
 sql_rel *
 rel_parse(mvc *m, sql_schema *s, char *query, char emode)
 {
@@ -40,13 +40,11 @@ rel_parse(mvc *m, sql_schema *s, char *q
 
        m->caching = 0;
        m->emode = emode;
-       if (s)
-               m->session->schema = s;
+       if (s && !mvc_set_schema_name(m, s->base.name))
+               return NULL;
 
-       b = (buffer*)GDKmalloc(sizeof(buffer));
-       if (!b) {
+       if (!(b = (buffer*)GDKmalloc(sizeof(buffer))))
                return NULL;
-       }
        n = GDKmalloc(len + 1 + 1);
        if (!n) {
                GDKfree(b);
@@ -105,7 +103,8 @@ rel_parse(mvc *m, sql_schema *s, char *q
                *m = o;
                m->label = label;
        }
-       m->session->schema = c;
+       if (!mvc_set_schema_name(m, c->base.name))
+               return NULL;
        return rel;
 }
 
diff --git a/sql/server/sql_env.c b/sql/server/sql_env.c
--- a/sql/server/sql_env.c
+++ b/sql/server/sql_env.c
@@ -69,7 +69,7 @@ sql_update_var(mvc *m, sql_schema *s, co
                } else if (strcmp(name, "current_schema") == 0 || strcmp(name, 
"current_role") == 0) {
                        if (VALisnil(ptr))
                                throw(SQL,"sql.update_var", SQLSTATE(42000) 
"Variable '%s.%s' cannot be NULL\n", s->base.name, name);
-                       if (strcmp(name, "current_schema") == 0 && 
!mvc_set_schema(m, ptr->val.sval))
+                       if (strcmp(name, "current_schema") == 0 && 
!mvc_set_schema_name(m, ptr->val.sval))
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to