pgsql: Avoid unnecessary failure in SELECT concurrent with ALTER NOINH
От | Tom Lane |
---|---|
Тема | pgsql: Avoid unnecessary failure in SELECT concurrent with ALTER NOINH |
Дата | |
Msg-id | E1ea6EN-0005Dv-Uf@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Avoid unnecessary failure in SELECT concurrent with ALTER NO INHERIT. If a query against an inheritance tree runs concurrently with an ALTER TABLE that's disinheriting one of the tree members, it's possible to get a "could not find inherited attribute" error because after obtaining lock on the removed member, make_inh_translation_list sees that its columns have attinhcount=0 and decides they aren't the columns it's looking for. An ideal fix, perhaps, would avoid including such a just-removed member table in the query at all; but there seems no way to accomplish that without adding expensive catalog rechecks or creating a likelihood of deadlocks. Instead, let's just drop the check on attinhcount. In this way, a query that's included a just-disinherited child will still succeed, which is not a completely unreasonable behavior. This problem has existed for a long time, so back-patch to all supported branches. Also add an isolation test verifying related behaviors. Patch by me; the new isolation test is based on Kyotaro Horiguchi's work. Discussion: https://postgr.es/m/20170626.174612.23936762.horiguchi.kyotaro@lab.ntt.co.jp Branch ------ REL9_6_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/c2a7044a5128a17256c771b545a534c7dccb7736 Modified Files -------------- src/backend/optimizer/prep/prepunion.c | 4 +- src/test/isolation/expected/alter-table-4.out | 57 +++++++++++++++++++++++++++ src/test/isolation/isolation_schedule | 1 + src/test/isolation/specs/alter-table-4.spec | 37 +++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-)
В списке pgsql-committers по дате отправления: