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