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