Changeset: 9e83c393c704 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9e83c393c704
Modified Files:
        sql/storage/store.c
        sql/test/dict/Tests/dict02.SQL.py
Branch: Jan2022
Log Message:

If a transaction changes the storage of a column, disallow concurrent dml on 
the table


diffs (46 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6137,6 +6137,8 @@ sql_trans_alter_storage(sql_trans *tr, s
                dup->storage_type = NULL;
                if (storage)
                        dup->storage_type = SA_STRDUP(tr->sa, storage);
+               if (!isNew(col) && isGlobal(col->t) && !isGlobalTemp(col->t) && 
(res = sql_trans_add_dependency(tr, col->t->base.id, dml)))
+                       return res;
                if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql functions depending on the table */
                        return res;
        }
diff --git a/sql/test/dict/Tests/dict02.SQL.py 
b/sql/test/dict/Tests/dict02.SQL.py
--- a/sql/test/dict/Tests/dict02.SQL.py
+++ b/sql/test/dict/Tests/dict02.SQL.py
@@ -29,3 +29,30 @@ with SQLTestCase() as cli:
     DROP TABLE mct00;
     DROP PROCEDURE "sys"."dict_compress";
     COMMIT;""").assertSucceeded()
+
+# if one transaction compresses a column, disallow concurrent 
inserts/updates/deletes on the table
+with SQLTestCase() as mdb1:
+    with SQLTestCase() as mdb2:
+        mdb1.connect(username="monetdb", password="monetdb")
+        mdb2.connect(username="monetdb", password="monetdb")
+
+        mdb1.execute("""
+        START TRANSACTION;
+        create table t0(c0 int);
+        insert into t0 values (1),(2),(3);
+        create procedure "sys"."dict_compress"(sname string, tname string, 
cname string, ordered_values bool) external name "dict"."compress";
+        COMMIT;""").assertSucceeded()
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute('call 
"sys"."dict_compress"(\'sys\',\'t0\',\'c0\',false);').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("""
+        START TRANSACTION;
+        drop table t0;
+        drop procedure "sys"."dict_compress";
+        COMMIT;""").assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to