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