Changeset: aabf6b173b9e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aabf6b173b9e
Modified Files:
        sql/backends/monet5/sql_user.c
        sql/server/sql_privileges.c
        sql/server/sql_privileges.h
        sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
Branch: iso
Log Message:

I forgot the user has a dependency on the schema. Also only add transaction 
dependencies to old objects


diffs (159 lines):

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
@@ -275,6 +275,7 @@ db_password_wrap(Client cntxt, MalBlkPtr
 static void
 monet5_create_privileges(ptr _mvc, sql_schema *s)
 {
+       sql_schema *sys;
        sql_table *t, *uinfo;
        mvc *m = (mvc *) _mvc;
        sqlid schema_id = 0;
@@ -313,7 +314,8 @@ monet5_create_privileges(ptr _mvc, sql_s
        mvc_create_column_(m, t, "default_schema", "int", 9);
        mvc_create_column_(m, t, "schema_path", "clob", 0);
 
-       schema_id = sql_find_schema(m, "sys");
+       sys = find_sql_schema(m->session->tr, "sys");
+       schema_id = sys->base.id;
        assert(schema_id >= 0);
 
        sqlstore *store = m->session->tr->store;
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -199,10 +199,10 @@ sql_grant_table_privs( mvc *sql, char *g
 
        /* Add dependencies created */
        if (privs == all || !c) {
-               if ((log_res = sql_trans_add_dependency(sql->session->tr, 
t->base.id)) != LOG_OK)
+               if (!isNew(t) && (log_res = 
sql_trans_add_dependency(sql->session->tr, t->base.id)) != LOG_OK)
                        throw(SQL, "sql.grant_table", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        } else {
-               if ((log_res = sql_trans_add_dependency(sql->session->tr, 
c->base.id)) != LOG_OK)
+               if (!isNew(c) && (log_res = 
sql_trans_add_dependency(sql->session->tr, c->base.id)) != LOG_OK)
                        throw(SQL, "sql.grant_table", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
        }
        if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id)) 
!= LOG_OK)
@@ -245,7 +245,7 @@ sql_grant_func_privs( mvc *sql, char *gr
                throw(SQL,"sql.grant_func", SQLSTATE(42000) "GRANT: failed%s", 
log_res == LOG_CONFLICT ? " due to conflict with another transaction" : "");
 
        /* Add dependencies created */
-       if ((log_res = sql_trans_add_dependency(sql->session->tr, func_id)) != 
LOG_OK)
+       if (!isNew(f) && (log_res = sql_trans_add_dependency(sql->session->tr, 
func_id)) != LOG_OK)
                throw(SQL, "sql.grant_func", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) != 
LOG_OK)
                throw(SQL, "sql.grant_func", SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -678,28 +678,6 @@ sql_find_auth(mvc *m, str auth)
        return res;
 }
 
-sqlid
-sql_find_schema(mvc *m, str schema)
-{
-       sqlid schema_id = -1;
-       oid rid;
-       sql_schema *sys = find_sql_schema(m->session->tr, "sys");
-       sql_table *schemas = find_sql_table(m->session->tr, sys, "schemas");
-       sql_column *schemas_name = find_sql_column(schemas, "name");
-       sqlstore *store = m->session->tr->store;
-
-       rid = store->table_api.column_find_row(m->session->tr, schemas_name, 
schema, NULL);
-
-       if (!is_oid_nil(rid)) {
-               sql_column *schemas_id = find_sql_column(schemas, "id");
-               sqlid p = store->table_api.column_find_sqlid(m->session->tr, 
schemas_id, rid);
-
-               if (p > -1)
-                       schema_id = p;
-       }
-       return schema_id;
-}
-
 int
 sql_schema_has_user(mvc *m, sql_schema *s)
 {
@@ -800,15 +778,21 @@ char *
 sql_create_user(mvc *sql, char *user, char *passwd, char enc, char *fullname, 
char *schema, char *schema_path)
 {
        char *err;
+       sql_schema *s = NULL;
        sqlid schema_id = 0;
 
        if (!admin_privs(sql->user_id) && !admin_privs(sql->role_id))
                throw(SQL,"sql.create_user", SQLSTATE(42M31) "Insufficient 
privileges to create user '%s'", user);
 
        if (backend_find_user(sql, user) >= 0)
-               throw(SQL,"sql.create_user", SQLSTATE(42M31) "CREATE USER: user 
'%s' already exists", user);
-       if ((schema_id = sql_find_schema(sql, schema)) < 0)
+               throw(SQL,"sql.create_user", SQLSTATE(42M31) "CREATE USER: user 
'%s' already exists", user);    
+
+       if (!(s = find_sql_schema(sql->session->tr, schema)))
                throw(SQL,"sql.create_user", SQLSTATE(3F000) "CREATE USER: no 
such schema '%s'", schema);
+       schema_id = s->base.id;
+       if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, s->base.id) 
!= LOG_OK)
+               throw(SQL, "sql.create_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
        if ((err = backend_create_user(sql, user, passwd, enc, fullname, 
schema_id, schema_path, sql->user_id)) != NULL)
        {
                /* strip off MAL exception decorations */
@@ -928,7 +912,9 @@ sql_drop_user(mvc *sql, char *user)
 char *
 sql_alter_user(mvc *sql, char *user, char *passwd, char enc, char *schema, 
char *schema_path, char *oldpasswd)
 {
+       sql_schema *s = NULL;
        sqlid schema_id = 0;
+
        /* we may be called from MAL (nil) */
        if (strNil(user))
                user = NULL;
@@ -939,8 +925,13 @@ sql_alter_user(mvc *sql, char *user, cha
 
        if (user != NULL && backend_find_user(sql, user) < 0)
                throw(SQL,"sql.alter_user", SQLSTATE(42M32) "ALTER USER: no 
such user '%s'", user);
-       if (schema && (schema_id = sql_find_schema(sql, schema)) < 0)
-               throw(SQL,"sql.alter_user", SQLSTATE(3F000) "ALTER USER: no 
such schema '%s'", schema);
+       if (schema) {
+               if (!(s = find_sql_schema(sql->session->tr, schema)))
+                       throw(SQL,"sql.alter_user", SQLSTATE(3F000) "ALTER 
USER: no such schema '%s'", schema);
+               schema_id = s->base.id;
+               if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, 
s->base.id) != LOG_OK)
+                       throw(SQL, "sql.alter_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       }
        if (backend_alter_user(sql, user, passwd, enc, schema_id, schema_path, 
oldpasswd) == FALSE)
                throw(SQL,"sql.alter_user", SQLSTATE(M0M27) "%s", sql->errstr);
        return NULL;
diff --git a/sql/server/sql_privileges.h b/sql/server/sql_privileges.h
--- a/sql/server/sql_privileges.h
+++ b/sql/server/sql_privileges.h
@@ -32,7 +32,6 @@ extern int execute_priv(mvc *m, sql_func
 extern int sql_privilege(mvc *m, sqlid auth_id, sqlid obj_id, int privs);
 extern int sql_grantable(mvc *m, sqlid grantorid, sqlid obj_id, int privs);
 extern sqlid sql_find_auth(mvc *m, str auth);
-extern sqlid sql_find_schema(mvc *m, str schema);
 
 extern char *sql_create_role(mvc *m, str auth, int grantor);
 extern char *sql_drop_role(mvc *m, str auth);
diff --git a/sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py 
b/sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
--- a/sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
+++ b/sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
@@ -41,9 +41,19 @@ with SQLTestCase() as mdb1:
         mdb1.execute('commit;').assertSucceeded()
         mdb2.execute('commit;').assertFailed(err_code="40000", 
err_message="COMMIT: transaction is aborted because of concurrency conflicts, 
will ROLLBACK instead")
 
+        mdb1.execute('CREATE schema mys2;').assertSucceeded()
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute("CREATE USER duser2 WITH PASSWORD 'ups' NAME 'ups' SCHEMA 
mys2;").assertSucceeded()
+        mdb2.execute('drop schema mys2;').assertSucceeded()
+        mdb1.execute('commit;').assertSucceeded()
+        mdb2.execute('commit;').assertFailed(err_code="40000", 
err_message="COMMIT: transaction is aborted because of concurrency conflicts, 
will ROLLBACK instead")
+
         mdb1.execute('start transaction;').assertSucceeded()
         mdb1.execute('drop table myt;').assertSucceeded()
         mdb1.execute('drop user duser;').assertSucceeded()
         mdb1.execute('drop role myrole;').assertSucceeded()
         mdb1.execute('drop schema mys cascade;').assertSucceeded()
+        mdb1.execute('drop user duser2;').assertSucceeded()
+        mdb1.execute('drop schema mys2;').assertSucceeded()
         mdb1.execute('commit;').assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to