pgsql: Fix ALTER COLUMN TYPE failure with a partial exclusionconstrain - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Fix ALTER COLUMN TYPE failure with a partial exclusionconstrain
Date
Msg-id E1hb68d-0006pg-VL@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix ALTER COLUMN TYPE failure with a partial exclusion constraint.

ATExecAlterColumnType failed to consider the possibility that an index
that needs to be rebuilt might be a child of a constraint that needs to be
rebuilt.  We missed this so far because usually a constraint index doesn't
have a direct dependency on its table, just on the constraint object.
But if there's a WHERE clause, then dependency analysis of the WHERE
clause results in direct dependencies on the column(s) mentioned in WHERE.
This led to trying to drop and rebuild both the constraint and its
underlying index.

In v11/HEAD, we successfully drop both the index and the constraint,
and then try to rebuild both, and of course the second rebuild hits a
duplicate-index-name problem.  Before v11, it fails with obscure messages
about a missing relation OID, due to trying to drop the index twice.

This is essentially the same kind of problem noted in commit
20bef2c31: the possible dependency linkages are broader than what
ATExecAlterColumnType was designed for.  It was probably OK when
written, but it's certainly been broken since the introduction of
partial exclusion constraints.  Fix by adding an explicit check
for whether any of the indexes-to-be-rebuilt belong to any of the
constraints-to-be-rebuilt, and ignoring any that do.

In passing, fix a latent bug introduced by commit 8b08f7d48: in
get_constraint_index() we must "continue" not "break" when rejecting
a relation of a wrong relkind.  This is harmless today because we don't
expect that code path to be taken anyway; but if there ever were any
relations to be ignored, the existing coding would have an extremely
undesirable dependency on the order of pg_depend entries.

Also adjust a couple of obsolete comments.

Per bug #15835 from Yaroslav Schekin.  Back-patch to all supported
branches.

Discussion: https://postgr.es/m/15835-32d9b7a76c06a7a9@postgresql.org

Branch
------
REL9_5_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/f7e99de95654b124330b06e0c406d56db5922794

Modified Files
--------------
src/backend/catalog/pg_depend.c           |  9 ++---
src/backend/commands/tablecmds.c          | 58 +++++++++++++++++++++++++++----
src/test/regress/expected/alter_table.out | 40 +++++++++++++++++++++
src/test/regress/sql/alter_table.sql      | 17 +++++++++
4 files changed, 113 insertions(+), 11 deletions(-)


pgsql-committers by date:

Previous
From: Michael Paquier
Date:
Subject: pgsql: Fix handling of COMMENT for domain constraints
Next
From: Tom Lane
Date:
Subject: pgsql: In walreceiver, don't try to do ereport() in a signal handler.