Changeset: b86245e5174a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b86245e5174a
Added Files:
        sql/test/transactions/Tests/rollback_and_schema-Bug-7499.test
Modified Files:
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_user.c
        sql/include/sql_catalog.h
        sql/storage/store.c
        sql/test/transactions/Tests/All
Branch: Dec2023
Log Message:

fixed issue #7499, ie keep default schema in the session, on missing default 
schema give an error.


diffs (110 lines):

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
@@ -821,7 +821,7 @@ SQLtrans(mvc *m)
                }
                s = m->session;
                if (!s->schema) {
-                       switch (monet5_user_get_def_schema(m, m->user_id, 
&s->schema_name)) {
+                       switch (monet5_user_get_def_schema(m, m->user_id, 
&s->def_schema_name)) {
                                case -1:
                                        mvc_cancel_session(m);
                                        throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -834,6 +834,7 @@ SQLtrans(mvc *m)
                                default:
                                        break;
                        }
+                       s->schema_name = s->def_schema_name;
                        if (!(s->schema = find_sql_schema(s->tr, 
s->schema_name))) {
                                mvc_cancel_session(m);
                                throw(SQL, "sql.trans", SQLSTATE(42000) "The 
session's schema was not found, this session is going to terminate");
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
@@ -849,6 +849,8 @@ monet5_user_set_def_schema(mvc *m, oid u
        }
 
        /* while getting the session's schema, set the search path as well */
+       /* new default schema */
+       m->session->def_schema_name = schema;
        if (!(ok = mvc_set_schema(m, schema)) || (path_err = 
parse_schema_path_str(m, schema_path, true)) != MAL_SUCCEED) {
                if (m->session->tr->active && (other = mvc_rollback(m, 0, NULL, 
false)) != MAL_SUCCEED)
                        freeException(other);
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
@@ -750,6 +750,7 @@ typedef struct sql_session {
        sql_allocator *sa;
        sql_trans *tr;          /* active transaction */
 
+       char *def_schema_name; /* users default schema name */
        char *schema_name; /* transaction's schema name */
        sql_schema *schema;
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -7214,13 +7214,11 @@ sql_session_destroy(sql_session *s)
 int
 sql_session_reset(sql_session *s, int ac)
 {
-       char *def_schema_name = SA_STRDUP(s->sa, "sys");
-
-       if (!s->tr || !def_schema_name)
+       if (!s->tr)
                return 0;
 
        assert(s->tr && s->tr->active == 0);
-       s->schema_name = def_schema_name;
+       s->schema_name = s->def_schema_name;
        s->schema = NULL;
        s->auto_commit = s->ac_on_commit = ac;
        s->level = tr_serializable;
@@ -7236,7 +7234,11 @@ sql_trans_begin(sql_session *s)
        store_lock(store);
        TRC_DEBUG(SQL_STORE, "Enter sql_trans_begin for transaction: " ULLFMT 
"\n", tr->tid);
        tr->ts = store_timestamp(store);
-       if (!(s->schema = find_sql_schema(tr, s->schema_name))) {
+       if (s->schema_name && !(s->schema = find_sql_schema(tr, 
s->schema_name)))
+               s->schema_name = s->def_schema_name;
+       if (!s->schema_name)
+               s->schema_name = "sys";
+       if (s->schema_name && !(s->schema = find_sql_schema(tr, 
s->schema_name))) {
                TRC_DEBUG(SQL_STORE, "Exit sql_trans_begin for transaction: " 
ULLFMT " with error, the schema %s was not found\n", tr->tid, s->schema_name);
                store_unlock(store);
                return -3;
@@ -7268,6 +7270,7 @@ sql_trans_end(sql_session *s, int ok)
        s->tr->active = 0;
        s->tr->status = 0;
        s->auto_commit = s->ac_on_commit;
+       s->schema = NULL;
        list_remove_data(store->active, NULL, s->tr);
        ATOMIC_SET(&store->lastactive, GDKusec());
        ATOMIC_DEC(&store->nr_active);
diff --git a/sql/test/transactions/Tests/All b/sql/test/transactions/Tests/All
--- a/sql/test/transactions/Tests/All
+++ b/sql/test/transactions/Tests/All
@@ -10,3 +10,4 @@ truncate-insert-restart
 update_drop_crash
 update_drop_crash2
 insert_drop_crash
+rollback_and_schema-Bug-7499
diff --git a/sql/test/transactions/Tests/rollback_and_schema-Bug-7499.test 
b/sql/test/transactions/Tests/rollback_and_schema-Bug-7499.test
new file mode 100644
--- /dev/null
+++ b/sql/test/transactions/Tests/rollback_and_schema-Bug-7499.test
@@ -0,0 +1,14 @@
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE SCHEMA test
+
+statement ok
+SET SCHEMA test
+
+statement ok
+ROLLBACK
+
+statement ok
+SET SCHEMA sys
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to