Changeset: b29754e1a0e9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b29754e1a0e9
Modified Files:
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_user.c
        sql/test/Users/Tests/createUserRollback.SQL.py
        sql/test/Users/Tests/createUserRollback.stable.err
        sql/test/Users/Tests/createUserRollback.stable.out
Branch: Jun2020
Log Message:

Fix for createUserRollback test. Return earlier at 
monet5_user_(g/s)et_def_schema calls if the user doesn't exist and added a 
proper bailout scenario at SQLprepareClient


diffs (143 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
@@ -262,25 +262,27 @@ SQLgetquery(Client c)
 static char*
 SQLprepareClient(Client c, int login)
 {
-       mvc *m;
-       str schema;
-       backend *be;
+       mvc *m = NULL;
+       backend *be = NULL;
+       str msg = MAL_SUCCEED;
 
        c->getquery = SQLgetquery;
        if (c->sqlcontext == 0) {
                m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
-               if (m == NULL)
-                       throw(SQL,"sql.initClient",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               if (m == NULL) {
+                       msg = createException(SQL,"sql.initClient", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
                if (global_variables(m, "monetdb", "sys") < 0) {
-                       mvc_destroy(m);
-                       throw(SQL,"sql.initClient",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       msg = createException(SQL,"sql.initClient", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
                }
                if (c->scenario && strcmp(c->scenario, "msql") == 0)
                        m->reply_size = -1;
                be = (void *) backend_create(m, c);
                if ( be == NULL) {
-                       mvc_destroy(m);
-                       throw(SQL,"sql.initClient", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       msg = createException(SQL,"sql.initClient", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
                }
        } else {
                be = c->sqlcontext;
@@ -290,21 +292,24 @@ SQLprepareClient(Client c, int login)
                */
                if (m->session->tr->active)
                        return NULL;
-               if (mvc_reset(m, c->fdin, c->fdout, SQLdebug) < 0)
-                       throw(SQL,"sql.initClient", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               if (mvc_reset(m, c->fdin, c->fdout, SQLdebug) < 0) {
+                       msg = createException(SQL,"sql.initClient", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
                backend_reset(be);
        }
        if (m->session->tr)
                reset_functions(m->session->tr);
        if (login) {
-               schema = monet5_user_set_def_schema(m, c->user);
+               str schema = monet5_user_set_def_schema(m, c->user);
                if (!schema) {
-                       _DELETE(schema);
-                       throw(PERMD, "SQLinitClient", SQLSTATE(08004) "schema 
authorization error");
+                       msg = createException(PERMD,"sql.initClient", 
SQLSTATE(08004) "Schema authorization error");
+                       goto bailout;
                }
                _DELETE(schema);
        } 
 
+bailout:
        /*expect SQL text first */
        be->language = 'S';
        /* Set state, this indicates an initialized client scenario */
@@ -312,7 +317,9 @@ SQLprepareClient(Client c, int login)
        c->state[MAL_SCENARIO_PARSER] = c;
        c->state[MAL_SCENARIO_OPTIMIZE] = c;
        c->sqlcontext = be;
-       return NULL;
+       if (msg)
+               c->mode = FINISHCLIENT;
+       return msg;
 }
 
 str
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
@@ -454,8 +454,9 @@ monet5_user_get_def_schema(mvc *m, int u
        auths_id = find_sql_column(auths, "id");
        auths_name = find_sql_column(auths, "name");
        rid = table_funcs.column_find_row(m->session->tr, auths_id, &user, 
NULL);
-       if (!is_oid_nil(rid))
-               username = table_funcs.column_find_value(m->session->tr, 
auths_name, rid);
+       if (is_oid_nil(rid))
+               return NULL;
+       username = table_funcs.column_find_value(m->session->tr, auths_name, 
rid);
 
        user_info = find_sql_table(sys, "db_user_info");
        users_name = find_sql_column(user_info, "name");
@@ -521,8 +522,9 @@ monet5_user_set_def_schema(mvc *m, oid u
        users_schema = find_sql_column(user_info, "default_schema");
 
        rid = table_funcs.column_find_row(m->session->tr, users_name, username, 
NULL);
-       if (!is_oid_nil(rid))
-               p = table_funcs.column_find_value(m->session->tr, users_schema, 
rid);
+       if (is_oid_nil(rid))
+               return NULL;
+       p = table_funcs.column_find_value(m->session->tr, users_schema, rid);
 
        assert(p);
        schema_id = *(sqlid *) p;
diff --git a/sql/test/Users/Tests/createUserRollback.SQL.py 
b/sql/test/Users/Tests/createUserRollback.SQL.py
--- a/sql/test/Users/Tests/createUserRollback.SQL.py
+++ b/sql/test/Users/Tests/createUserRollback.SQL.py
@@ -13,7 +13,7 @@ with process.client('sql', stdin=process
         CREATE USER "1" WITH PASSWORD '1' NAME '1' SCHEMA "sys";
         ROLLBACK;
 
-        SELECT CAST(COUNT(*) - (SELECT c FROM sys.myvar) AS BIGINT) FROM 
sys.users; --the total count, cannot change
+        SELECT CAST(COUNT(*) - (SELECT c FROM sys.myvar) AS BIGINT) FROM 
sys.users; -- The MAL authorization is not transaction aware, so the count 
changes :/
         DROP TABLE sys.myvar;
     ''')
     sys.stdout.write(out)
diff --git a/sql/test/Users/Tests/createUserRollback.stable.err 
b/sql/test/Users/Tests/createUserRollback.stable.err
--- a/sql/test/Users/Tests/createUserRollback.stable.err
+++ b/sql/test/Users/Tests/createUserRollback.stable.err
@@ -5,6 +5,7 @@ stderr of test 'createUserRollback` in d
 # 12:24:01 >  "/usr/bin/python3" "createUserRollback.SQL.py" 
"createUserRollback"
 # 12:24:01 >  
 
+Schema authorization error
 
 # 12:24:01 >  
 # 12:24:01 >  "Done."
diff --git a/sql/test/Users/Tests/createUserRollback.stable.out 
b/sql/test/Users/Tests/createUserRollback.stable.out
--- a/sql/test/Users/Tests/createUserRollback.stable.out
+++ b/sql/test/Users/Tests/createUserRollback.stable.out
@@ -16,7 +16,7 @@ stdout of test 'createUserRollback` in d
 % %7 # name
 % bigint # type
 % 1 # length
-[ 0    ]
+[ 1    ]
 #DROP TABLE sys.myvar;
 
 # 12:24:01 >  
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to