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