Changeset: a26fd346c592 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a26fd346c592
Added Files:
        sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
Modified Files:
        sql/storage/store.c
        sql/test/BugTracker-2021/Tests/All
Branch: Jul2021
Log Message:

Added test and fix for bug #7196 Add a dml dependency when adding a column or 
index to a table


diffs (78 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3279,6 +3279,9 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base))))
                return res;
 
+       if (!isNew(t) && isGlobal(t) && !isGlobalTemp(t) && (res = 
sql_trans_add_dependency(tr, t->base.id, dml)))
+               return res;
+
        if (isDeclaredTable(i->t))
                if (!isDeclaredTable(t) && isTable(ni->t) && 
idx_has_column(ni->type))
                        if ((res = store->storage_api.create_idx(tr, ni))) {
@@ -3383,6 +3386,9 @@ sql_trans_copy_column( sql_trans *tr, sq
        if ((res = ol_add(t->columns, &col->base)))
                return res;
 
+       if (!isNew(t) && isGlobal(t) && !isGlobalTemp(t) && (res = 
sql_trans_add_dependency(tr, t->base.id, dml)))
+               return res;
+
        ATOMIC_PTR_INIT(&col->data, NULL);
        if (isDeclaredTable(c->t))
                if (isTable(t))
@@ -6408,8 +6414,10 @@ sql_trans_create_idx(sql_idx **i, sql_tr
 
        ATOMIC_PTR_INIT(&ni->data, NULL);
        if (!isDeclaredTable(t) && isTable(ni->t) && idx_has_column(ni->type))
-               if ((res = store->storage_api.create_idx(tr, ni)))
+               if ((res = store->storage_api.create_idx(tr, ni))) {
+                       ATOMIC_PTR_DESTROY(&ni->data);
                        return res;
+               }
        if (!isDeclaredTable(t))
                if ((res = store->table_api.table_insert(tr, sysidx, 
&ni->base.id, &t->base.id, &ni->type, &ni->base.name))) {
                        ATOMIC_PTR_DESTROY(&ni->data);
diff --git a/sql/test/BugTracker-2021/Tests/All 
b/sql/test/BugTracker-2021/Tests/All
--- a/sql/test/BugTracker-2021/Tests/All
+++ b/sql/test/BugTracker-2021/Tests/All
@@ -30,3 +30,4 @@ merge-table-join.Bug-7172
 truncate-restart.Bug-7173
 remote-table-large.Bug-7178
 grouping-sets-aliases.Bug-7185
+concurrent-add-column.Bug-7196
diff --git 
a/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py 
b/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
@@ -0,0 +1,30 @@
+from MonetDBtesting.sqltest import SQLTestCase
+
+with SQLTestCase() as mdb1:
+    with SQLTestCase() as mdb2:
+        mdb1.connect(username="monetdb", password="monetdb")
+        mdb2.connect(username="monetdb", password="monetdb")
+
+        mdb1.execute('create table test (id bigint);').assertSucceeded()
+        mdb1.execute("insert into test values (1);").assertSucceeded()
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute('alter table test add column data int;').assertSucceeded()
+        mdb2.execute("insert into test values (2);").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 * from test;').assertDataResultMatch([(1,None)])
+        mdb2.execute('select * from test;').assertDataResultMatch([(1,None)])
+
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute('alter table test drop column data;').assertSucceeded()
+        mdb2.execute("insert into test values (3,4);").assertSucceeded()
+        mdb1.execute('commit;').assertSucceeded()
+        mdb2.execute('commit;').assertSucceeded()
+
+        mdb1.execute('select * from test;').assertDataResultMatch([(1,),(3,)])
+        mdb2.execute('select * from test;').assertDataResultMatch([(1,),(3,)])
+
+        mdb1.execute('drop table test;').assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to