pgsql: Further fix ALTER COLUMN TYPE's handling of indexes and indexco - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Further fix ALTER COLUMN TYPE's handling of indexes and indexco
Date
Msg-id E1hfVok-00070b-26@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Further fix ALTER COLUMN TYPE's handling of indexes and index constraints.

This patch reverts all the code changes of commit e76de8861, which turns
out to have been seriously misguided.  We can't wait till later to compute
the definition string for an index; we must capture that before applying
the data type change for any column it depends on, else ruleutils.c will
deliverr wrong/misleading results.  (This fine point was documented
nowhere, of course.)

I'd also managed to forget that ATExecAlterColumnType executes once per
ALTER COLUMN TYPE clause, not once per statement; which resulted in the
code being basically completely broken for any case in which multiple ALTER
COLUMN TYPE clauses are applied to a table having non-constraint indexes
that must be rebuilt.  Through very bad luck, none of the existing test
cases nor the ones added by e76de8861 caught that, but of course it was
soon found in the field.

The previous patch also had an implicit assumption that if a constraint's
index had a dependency on a table column, so would the constraint --- but
that isn't actually true, so it didn't fix such cases.

Instead of trying to delete unneeded index dependencies later, do the
is-there-a-constraint lookup immediately on seeing an index dependency,
and switch to remembering the constraint if so.  In the unusual case of
multiple column dependencies for a constraint index, this will result in
duplicate constraint lookups, but that's not that horrible compared to all
the other work that happens here.  Besides, such cases did not work at all
before, so it's hard to argue that they're performance-critical for anyone.

Per bug #15865 from Keith Fiske.  As before, back-patch to all supported
branches.

Discussion: https://postgr.es/m/15865-17940eacc8f8b081@postgresql.org

Branch
------
REL9_5_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/316f6893282450b5a748550d922aa72141f97d1c

Modified Files
--------------
src/backend/commands/tablecmds.c          | 184 +++++++++++++++---------------
src/test/regress/expected/alter_table.out |  22 +++-
src/test/regress/sql/alter_table.sql      |  12 +-
3 files changed, 125 insertions(+), 93 deletions(-)


pgsql-committers by date:

Previous
From: Peter Geoghegan
Date:
Subject: pgsql: Correct obsolete amcheck comments.
Next
From: Peter Eisentraut
Date:
Subject: pgsql: Correct script name in README file