Changeset: c25f2c788ba3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c25f2c788ba3
Modified Files:
        sql/storage/store.c
        sql/test/transactions/Tests/transaction_isolation5.SQL.py
Branch: Jan2022
Log Message:

At the moment, disallow concurrent dml if a transaction changes the access of a 
table


diffs (34 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6072,6 +6072,8 @@ sql_trans_alter_access(sql_trans *tr, sq
                        return res;
                t = dup;
                t->access = access;
+               if (!isNew(t) && isGlobal(t) && !isGlobalTemp(t) && (res = 
sql_trans_add_dependency(tr, t->base.id, dml)))
+                       return res;
                if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset 
sql functions depending on the table */
                        return res;
        }
diff --git a/sql/test/transactions/Tests/transaction_isolation5.SQL.py 
b/sql/test/transactions/Tests/transaction_isolation5.SQL.py
--- a/sql/test/transactions/Tests/transaction_isolation5.SQL.py
+++ b/sql/test/transactions/Tests/transaction_isolation5.SQL.py
@@ -200,3 +200,18 @@ with SQLTestCase() as mdb1:
         mdb1.execute('drop function otherfunc;').assertSucceeded()
         mdb1.execute('drop view otherview;').assertSucceeded()
         mdb1.execute('commit;').assertSucceeded()
+
+        # If one transaction changes read access of a table, disallow 
concurrent dml
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb1.execute('create table t0(c0 int);').assertSucceeded()
+        mdb1.execute('insert into t0 values (1),(2),(3);').assertSucceeded()
+        mdb1.execute('commit;').assertSucceeded()
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute('alter table t0 set read only;').assertSucceeded()
+        mdb2.execute("insert into t0 values (4),(5),(6);").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('select c0 from 
t0;').assertSucceeded().assertDataResultMatch([(1,),(2,),(3,)])
+        mdb2.execute('select c0 from 
t0;').assertSucceeded().assertDataResultMatch([(1,),(2,),(3,)])
+        mdb1.execute('drop table t0;').assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to