Changeset: 36cfd271b55b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/36cfd271b55b
Modified Files:
        sql/storage/store.c
        sql/test/miscellaneous/Tests/transaction_isolation4.SQL.py
Branch: iso
Log Message:

Don't enforce DML conflicts on non-partitioned merge table children


diffs (130 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4937,7 +4937,7 @@ sql_trans_drop_schema(sql_trans *tr, sql
 }
 
 static int
-sql_trans_propagate_dependencies_parents(sql_trans *tr, sql_table *mt)
+sql_trans_propagate_dependencies_parents(sql_trans *tr, sql_table *mt, bool 
*child_of_partitioned)
 {
        int res = LOG_OK;
        sql_part *pt = NULL;
@@ -4945,13 +4945,15 @@ sql_trans_propagate_dependencies_parents
        for (; mt; mt = pt?pt->t:NULL) {
                if (!isNew(mt) && (res = sql_trans_add_dependency(tr, 
mt->base.id, ddl))) /* protect from another transaction changing the table's 
schema */
                        return res;
+               if (child_of_partitioned)
+                       *child_of_partitioned |= (isRangePartitionTable(mt) || 
isListPartitionTable(mt));
                pt = partition_find_part(tr, mt, NULL);
        }
        return res;
 }
 
 static int
-sql_trans_propagate_dependencies_children(sql_trans *tr, sql_table *pt)
+sql_trans_propagate_dependencies_children(sql_trans *tr, sql_table *pt, bool 
child_of_partitioned)
 {
        int res = LOG_OK;
 
@@ -4960,7 +4962,7 @@ sql_trans_propagate_dependencies_childre
                        return res;
                if ((res = sql_trans_add_dependency_change(tr, pt->base.id, 
ddl))) /* protect from being added twice */
                        return res;
-               if (isTable(pt) && (res = sql_trans_add_dependency(tr, 
pt->base.id, dml))) /* disallow concurrent updates on pt */
+               if (child_of_partitioned && isTable(pt) && (res = 
sql_trans_add_dependency(tr, pt->base.id, dml))) /* disallow concurrent updates 
on pt */
                        return res;
        }
        if (isMergeTable(pt) && !list_empty(pt->members)) {
@@ -4968,7 +4970,8 @@ sql_trans_propagate_dependencies_childre
                        sql_part *pd = nt->data;
                        sql_table *t = find_sql_table_id(tr, pt->s, pd->member);
 
-                       if ((res = 
sql_trans_propagate_dependencies_children(tr, t)))
+                       child_of_partitioned |= (isRangePartitionTable(t) || 
isListPartitionTable(t));
+                       if ((res = 
sql_trans_propagate_dependencies_children(tr, t, child_of_partitioned)))
                                return res;
                }
        }
@@ -4983,6 +4986,7 @@ sql_trans_add_table(sql_trans *tr, sql_t
        sql_table *sysobj = find_sql_table(tr, syss, "objects");
        int res = 0;
        sql_table *dup = NULL;
+       bool child_of_partitioned = false;
 
        /* merge table depends on part table */
        if ((res = sql_trans_create_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY)))
@@ -5004,9 +5008,9 @@ sql_trans_add_table(sql_trans *tr, sql_t
                return res;
        if ((res = os_add(mt->s->parts, tr, p->base.name, dup_base(&p->base))))
                return res;
-       if ((res = sql_trans_propagate_dependencies_parents(tr, mt)))
+       if ((res = sql_trans_propagate_dependencies_parents(tr, mt, 
&child_of_partitioned)))
                return res;
-       if ((res = sql_trans_propagate_dependencies_children(tr, pt)))
+       if ((res = sql_trans_propagate_dependencies_children(tr, pt, 
child_of_partitioned)))
                return res;
        return res;
 }
@@ -5140,9 +5144,9 @@ sql_trans_add_range_partition(sql_trans 
 
        if (!update)
                res = os_add(mt->s->parts, tr, p->base.name, 
dup_base(&p->base));
-       if ((res = sql_trans_propagate_dependencies_parents(tr, mt)))
+       if ((res = sql_trans_propagate_dependencies_parents(tr, mt, NULL)))
                return res;
-       if ((res = sql_trans_propagate_dependencies_children(tr, pt)))
+       if ((res = sql_trans_propagate_dependencies_children(tr, pt, true)))
                return res;
 finish:
        VALclear(&vmin);
@@ -5268,9 +5272,9 @@ sql_trans_add_value_partition(sql_trans 
                if ((res = os_add(mt->s->parts, tr, p->base.name, 
dup_base(&p->base))))
                        return res;
        }
-       if ((res = sql_trans_propagate_dependencies_parents(tr, mt)))
+       if ((res = sql_trans_propagate_dependencies_parents(tr, mt, NULL)))
                return res;
-       if ((res = sql_trans_propagate_dependencies_children(tr, pt)))
+       if ((res = sql_trans_propagate_dependencies_children(tr, pt, true)))
                return res;
        return 0;
 }
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
@@ -71,6 +71,17 @@ with SQLTestCase() as mdb1:
         mdb1.execute('commit;').assertSucceeded()
         mdb2.execute('rollback;').assertSucceeded()
 
+        mdb1.execute('create merge table parent5(a int);').assertSucceeded()
+        mdb1.execute('create merge table parent6(a int);').assertSucceeded()
+        mdb1.execute('create table child3(a int);').assertSucceeded()
+        mdb1.execute('alter table parent6 add table child3;').assertSucceeded()
+        mdb1.execute('start transaction;').assertSucceeded()
+        mdb2.execute('start transaction;').assertSucceeded()
+        mdb1.execute("ALTER TABLE parent5 ADD TABLE 
parent6;").assertSucceeded()
+        mdb2.execute("insert into child3 values (10);").assertSucceeded()
+        mdb1.execute('commit;').assertSucceeded()
+        mdb2.execute('commit;').assertSucceeded()
+
         mdb1.execute('start transaction;').assertSucceeded()
         mdb1.execute('drop table myt;').assertSucceeded()
         mdb1.execute('drop user duser;').assertSucceeded()
@@ -81,11 +92,16 @@ with SQLTestCase() as mdb1:
         mdb1.execute('alter table parent2 drop table 
child1;').assertSucceeded()
         mdb1.execute('alter table parent3 drop table 
parent4;').assertSucceeded()
         mdb1.execute('alter table parent4 drop table 
child2;').assertSucceeded()
+        mdb1.execute('alter table parent5 drop table 
parent6;').assertSucceeded()
+        mdb1.execute('alter table parent6 drop table 
child3;').assertSucceeded()
         mdb1.execute('drop table child1;').assertSucceeded()
         mdb1.execute('drop table child2;').assertSucceeded()
+        mdb1.execute('drop table child3;').assertSucceeded()
         mdb1.execute('drop table parent1;').assertSucceeded()
         mdb1.execute('drop table parent2;').assertSucceeded()
         mdb1.execute('drop table parent3;').assertSucceeded()
         mdb1.execute('drop table parent4;').assertSucceeded()
+        mdb1.execute('drop table parent5;').assertSucceeded()
+        mdb1.execute('drop table parent6;').assertSucceeded()
         mdb1.execute('drop schema mys2;').assertSucceeded()
         mdb1.execute('commit;').assertSucceeded()
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to