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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list