Changeset: 08018d805930 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/08018d805930
Modified Files:
        sql/server/sql_privileges.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
Branch: iso
Log Message:

Add dependencies/removals on privileges


diffs (truncated from 324 to 300 lines):

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
@@ -128,6 +128,12 @@ sql_grant_global_privs( mvc *sql, char *
                throw(SQL,"sql.grant_global",SQLSTATE(01007) "GRANT: User/role 
'%s' already has this privilege", grantee);
        if ((log_res = sql_insert_priv(sql, grantee_id, GLOBAL_OBJID, privs, 
grantor, grant)))
                throw(SQL,"sql.grant_global",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, grantee_id)) 
!= LOG_OK)
+               throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) != 
LOG_OK)
+               throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return MAL_SUCCEED;
 }
 
@@ -190,6 +196,20 @@ sql_grant_table_privs( mvc *sql, char *g
                if ((log_res = sql_insert_priv(sql, grantee_id, c->base.id, 
privs, grantor, grant)))
                        throw(SQL, "sql.grant_table", SQLSTATE(42000) "GRANT: 
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another 
transaction" : "");
        }
+
+       /* Add dependencies created */
+       if (privs == all || !c) {
+               if ((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)
+                       throw(SQL, "sql.grant_table", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       }
+       if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id)) 
!= LOG_OK)
+               throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) != 
LOG_OK)
+               throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
        return NULL;
 }
 
@@ -223,6 +243,12 @@ sql_grant_func_privs( mvc *sql, char *gr
                throw(SQL,"sql.grant_func", SQLSTATE(01007) "GRANT: User/role 
'%s' already has this privilege", grantee);
        if ((log_res = sql_insert_priv(sql, grantee_id, f->base.id, privs, 
grantor, grant)))
                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)
+               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);
        return NULL;
 }
 
@@ -420,6 +446,10 @@ sql_drop_role(mvc *m, str auth)
        store->table_api.rids_destroy(A);
        if (log_res != LOG_OK)
                throw(SQL, "sql.drop_role", SQLSTATE(42000) "DROP ROLE: 
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another 
transaction" : "");
+
+       /* Flag as removed */
+       if ((log_res = sql_trans_add_removal(tr, role_id)) != LOG_OK)
+               throw(SQL, "sql.drop_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return NULL;
 }
 
@@ -562,14 +592,22 @@ sql_grant_role(mvc *m, str grantee, str 
                throw(SQL,"sql.grant_role", SQLSTATE(M1M05) "GRANT: User '%s' 
already has ROLE '%s'", grantee, role);
 
        if ((log_res = store->table_api.table_insert(m->session->tr, roles, 
&grantee_id, &role_id)) != LOG_OK)
-               throw(SQL, "sql.revoke_role", SQLSTATE(42000) "GRANT: 
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another 
transaction" : "");
+               throw(SQL, "sql.grant_role", SQLSTATE(42000) "GRANT: failed%s", 
log_res == LOG_CONFLICT ? " due to conflict with another transaction" : "");
        if (admin) {
                int priv = PRIV_ROLE_ADMIN, one = 1;
                sql_table *privs = find_sql_table(m->session->tr, sys, 
"privileges");
 
                if ((log_res = store->table_api.table_insert(m->session->tr, 
privs, &role_id, &grantee_id, &priv, &grantor, &one)) != LOG_OK)
-                       throw(SQL, "sql.revoke_role", SQLSTATE(42000) "GRANT: 
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another 
transaction" : "");
+                       throw(SQL, "sql.grant_role", 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(m->session->tr, grantee_id)) != 
LOG_OK)
+               throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       if ((log_res = sql_trans_add_dependency(m->session->tr, role_id)) != 
LOG_OK)
+               throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       if ((log_res = sql_trans_add_dependency(m->session->tr, grantor)) != 
LOG_OK)
+               throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return NULL;
 }
 
@@ -880,6 +918,10 @@ sql_drop_user(mvc *sql, char *user)
                throw(SQL, "sql.drop_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        msg = sql_drop_granted_users(sql, user_id, user, deleted);
        list_destroy(deleted);
+
+       /* Flag as removed */
+       if (!msg && sql_trans_add_removal(sql->session->tr, user_id) != LOG_OK)
+               throw(SQL, "sql.drop_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return msg;
 }
 
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -409,6 +409,7 @@ extern int sql_trans_begin(sql_session *
 extern int sql_trans_end(sql_session *s, int commit /* rollback=0, or commit=1 
temporaries */);
 
 extern int sql_trans_add_dependency(sql_trans* tr, sqlid id);
+extern int sql_trans_add_removal(sql_trans *tr, sqlid id);
 extern list* sql_trans_schema_user_dependencies(sql_trans *tr, sqlid 
schema_id);
 extern int sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid 
depend_id, sql_dependency depend_type);
 extern int sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -276,8 +276,8 @@ sql_trans_add_dependency(sql_trans* tr, 
        return LOG_OK;
 }
 
-static int
-transaction_add_removal(sql_trans *tr, sqlid id)
+int
+sql_trans_add_removal(sql_trans *tr, sqlid id)
 {
        sqlid *local_id = MNEW(sqlid);
        if (!local_id)
@@ -3918,7 +3918,7 @@ sys_drop_idx(sql_trans *tr, sql_idx * i,
        if (isGlobal(i->t))
                if ((res = os_del(i->t->s->idxs, tr, i->base.name, 
dup_base(&i->base))))
                        return res;
-       if (!isNew(i) && (res = transaction_add_removal(tr, i->base.id)))
+       if (!isNew(i) && (res = sql_trans_add_removal(tr, i->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, i->base.id)))
                return res;
@@ -3974,7 +3974,7 @@ sys_drop_key(sql_trans *tr, sql_key *k, 
        if (k->t->pkey == (sql_ukey*)k)
                k->t->pkey = NULL;
 
-       if (!isNew(k) && (res = transaction_add_removal(tr, k->base.id)))
+       if (!isNew(k) && (res = sql_trans_add_removal(tr, k->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, k->base.id)))
                return res;
@@ -4014,7 +4014,7 @@ sys_drop_sequence(sql_trans *tr, sql_seq
 
        if ((res = store->table_api.table_delete(tr, sysseqs, rid)))
                return res;
-       if (!isNew(seq) && (res = transaction_add_removal(tr, seq->base.id)))
+       if (!isNew(seq) && (res = sql_trans_add_removal(tr, seq->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, seq->base.id)))
                return res;
@@ -4121,7 +4121,7 @@ sys_drop_trigger(sql_trans *tr, sql_trig
        if (isGlobal(i->t))
                if ((res = os_del(i->t->s->triggers, tr, i->base.name, 
dup_base(&i->base))))
                        return res;
-       if (!isNew(i) && (res = transaction_add_removal(tr, i->base.id)))
+       if (!isNew(i) && (res = sql_trans_add_removal(tr, i->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, i->base.id)))
                return res;
@@ -4141,7 +4141,7 @@ sys_drop_column(sql_trans *tr, sql_colum
                return -1;
        if ((res = store->table_api.table_delete(tr, syscolumn, rid)))
                return res;
-       if (!isNew(col) && (res = transaction_add_removal(tr, col->base.id)))
+       if (!isNew(col) && (res = sql_trans_add_removal(tr, col->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, col->base.id)))
                return res;
@@ -4258,7 +4258,7 @@ sys_drop_part(sql_trans *tr, sql_part *p
                store->table_api.rids_destroy(rs);
        }
        /* merge table depends on part table */
-       if (!isNew(pt) && (res = transaction_add_removal(tr, mt->base.id)))
+       if (!isNew(pt) && (res = sql_trans_add_removal(tr, mt->base.id)))
                return res;
        if ((res = sql_trans_drop_dependency(tr, pt->member, mt->base.id, 
TABLE_DEPENDENCY)))
                return res;
@@ -4343,7 +4343,7 @@ sys_drop_table(sql_trans *tr, sql_table 
 
        if ((res = sql_trans_drop_any_comment(tr, t->base.id)))
                return res;
-       if (!isNew(t) && (res = transaction_add_removal(tr, t->base.id)))
+       if (!isNew(t) && (res = sql_trans_add_removal(tr, t->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, t->base.id)))
                return res;
@@ -4372,7 +4372,7 @@ sys_drop_type(sql_trans *tr, sql_type *t
 
        if ((res = store->table_api.table_delete(tr, sys_tab_type, rid)))
                return res;
-       if (!isNew(type) && (res = transaction_add_removal(tr, type->base.id)))
+       if (!isNew(type) && (res = sql_trans_add_removal(tr, type->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, type->base.id)))
                return res;
@@ -4409,7 +4409,7 @@ sys_drop_func(sql_trans *tr, sql_func *f
        if ((res = store->table_api.table_delete(tr, sys_tab_func, rid_func)))
                return res;
 
-       if (!isNew(func) && (res = transaction_add_removal(tr, func->base.id)))
+       if (!isNew(func) && (res = sql_trans_add_removal(tr, func->base.id)))
                return res;
        if ((res = sql_trans_drop_dependencies(tr, func->base.id)))
                return res;
@@ -4780,7 +4780,7 @@ sql_trans_rename_schema(sql_trans *tr, s
        if ((res = store->table_api.column_update_value(tr, 
find_sql_column(sysschema, "name"), rid, (void*) new_name)))
                return res;
 
-       if (!isNew(s) && (res = transaction_add_removal(tr, id)))
+       if (!isNew(s) && (res = sql_trans_add_removal(tr, id)))
                return res;
        /* delete schema, add schema */
        if ((res = os_del(tr->cat->schemas, tr, s->base.name, 
dup_base(&s->base))))
@@ -4820,7 +4820,7 @@ sql_trans_drop_schema(sql_trans *tr, sql
 
        if ((res = store->table_api.table_delete(tr, sysschema, rid)))
                return res;
-       if (!isNew(s) && (res = transaction_add_removal(tr, id)))
+       if (!isNew(s) && (res = sql_trans_add_removal(tr, id)))
                return res;
        if ((res = sys_drop_funcs(tr, s, drop_action)))
                return res;
@@ -4878,7 +4878,7 @@ sql_trans_add_table(sql_trans *tr, sql_t
                return res;
        if (!isNew(mt) && (res = sql_trans_add_dependency(tr, mt->base.id))) /* 
protect from another transaction changing the table's schema */
                return res;
-       if (!isNew(pt) && (res = transaction_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
+       if (!isNew(pt) && (res = sql_trans_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
                return res;
        return res;
 }
@@ -5016,7 +5016,7 @@ sql_trans_add_range_partition(sql_trans 
                return res;
        if (!isNew(mt) && (res = sql_trans_add_dependency(tr, mt->base.id))) /* 
protect from another transaction changing the table's schema */
                return res;
-       if (!isNew(pt) && (res = transaction_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
+       if (!isNew(pt) && (res = sql_trans_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
                return res;
 finish:
        VALclear(&vmin);
@@ -5146,7 +5146,7 @@ sql_trans_add_value_partition(sql_trans 
                return res;
        if (!isNew(mt) && (res = sql_trans_add_dependency(tr, mt->base.id))) /* 
protect from another transaction changing the table's schema */
                return res;
-       if (!isNew(pt) && (res = transaction_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
+       if (!isNew(pt) && (res = sql_trans_add_removal(tr, pt->base.id))) /* 
protect from being added twice */
                return res;
        return 0;
 }
@@ -5168,7 +5168,7 @@ sql_trans_rename_table(sql_trans *tr, sq
                return res;
 
        if (isGlobal(t)) {
-               if (!isNew(t) && (res = transaction_add_removal(tr, id)))
+               if (!isNew(t) && (res = sql_trans_add_removal(tr, id)))
                        return res;
                if ((res = os_del(s->tables, tr, t->base.name, 
dup_base(&t->base))))
                        return res;
@@ -5201,7 +5201,7 @@ sql_trans_set_table_schema(sql_trans *tr
        if ((res = store->table_api.column_update_value(tr, 
find_sql_column(systable, "schema_id"), rid, &(ns->base.id))))
                return res;
 
-       if (!isNew(t) && (res = transaction_add_removal(tr, id)))
+       if (!isNew(t) && (res = sql_trans_add_removal(tr, id)))
                return res;
        if ((res = os_del(os->tables, tr, t->base.name, dup_base(&t->base))))
                return res;
@@ -5596,9 +5596,9 @@ sql_trans_rename_column(sql_trans *tr, s
                return -1;
        sql_column *c = n->data;
 
-       if (!isNew(c->t) && (res = transaction_add_removal(tr, c->t->base.id)))
+       if (!isNew(c->t) && (res = sql_trans_add_removal(tr, c->t->base.id)))
                return res;
-       if (!isNew(c) && (res = transaction_add_removal(tr, id)))
+       if (!isNew(c) && (res = sql_trans_add_removal(tr, id)))
                return res;
 
        _DELETE(c->base.name);
@@ -5667,7 +5667,7 @@ sql_trans_drop_column(sql_trans *tr, sql
                list_append(tr->dropped, local_id);
        }
 
-       if (!isNew(col) && (res = transaction_add_removal(tr, col->t->base.id)))
+       if (!isNew(col) && (res = sql_trans_add_removal(tr, col->t->base.id)))
                return res;
        if ((res = sys_drop_column(tr, col, drop_action)))
                return res;
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
@@ -9,19 +9,21 @@ with SQLTestCase() as mdb1:
         mdb1.execute("insert into myt values (1, 1), (2, 2)").assertSucceeded()
         mdb1.execute('start transaction;').assertSucceeded()
         mdb2.execute('start transaction;').assertSucceeded()
-        mdb1.execute("alter table myt add primary key (i);").assertSucceeded()
-        mdb2.execute("alter table myt add primary key 
(j);").assertFailed(err_code="42000", err_message="NOT NULL CONSTRAINT: 
transaction conflict detected") # only one pk per table
+        mdb1.execute("alter table myt add constraint pk1 primary key 
(i);").assertSucceeded()
+        mdb2.execute("alter table myt add constraint pk2 primary key 
(j);").assertFailed(err_code="42000", err_message="NOT NULL CONSTRAINT: 
transaction conflict detected") # only one pk per table
         mdb1.execute('commit;').assertSucceeded()
         mdb2.execute('rollback;').assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to