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