pgsql: Fix handling of CREATE TABLE LIKE with inheritance. - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Fix handling of CREATE TABLE LIKE with inheritance.
Date
Msg-id E1k9CHs-0003LA-JY@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix handling of CREATE TABLE LIKE with inheritance.

If a CREATE TABLE command uses both LIKE and traditional inheritance,
Vars in CHECK constraints and expression indexes that are absorbed
from a LIKE parent table tended to get mis-numbered, resulting in
wrong answers and/or bizarre error messages (though probably not any
actual crashes, thanks to validation occurring in the executor).

In v12 and up, the same could happen to Vars in GENERATED expressions,
even in cases with no LIKE clause but multiple traditional-inheritance
parents.

The cause of the problem for LIKE is that parse_utilcmd.c supposed
it could renumber such Vars correctly during transformCreateStmt(),
which it cannot since we have not yet accounted for columns added via
inheritance.  Fix that by postponing processing of LIKE INCLUDING
CONSTRAINTS, DEFAULTS, GENERATED, INDEXES till after we've performed
DefineRelation().

The error with GENERATED and multiple inheritance is a simple oversight
in MergeAttributes(); it knows it has to renumber Vars in inherited
CHECK constraints, but forgot to apply the same processing to inherited
GENERATED expressions (a/k/a defaults).

Per bug #16272 from Tom Gottfried.  The non-GENERATED variants of the
issue are ancient, presumably dating right back to the addition of
CREATE TABLE LIKE; hence back-patch to all supported branches.

Discussion: https://postgr.es/m/16272-6e32da020e9a9381@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/50289819230d8ddad510879ee4793b04a05cf13b

Modified Files
--------------
src/backend/commands/tablecmds.c                   | 126 +++++--
src/backend/parser/parse_utilcmd.c                 | 381 +++++++++++++--------
src/backend/tcop/utility.c                         |  36 +-
src/include/nodes/parsenodes.h                     |   1 +
src/include/parser/parse_utilcmd.h                 |   2 +
.../test_ddl_deparse/expected/create_table.out     |   2 +
.../modules/test_ddl_deparse/test_ddl_deparse.c    |   3 +
src/test/regress/expected/create_table_like.out    |  40 ++-
src/test/regress/sql/create_table_like.sql         |  19 +-
9 files changed, 435 insertions(+), 175 deletions(-)


pgsql-committers by date:

Previous
From: Fujii Masao
Date:
Subject: pgsql: Fix explain regression test failure.
Next
From: Bruce Momjian
Date:
Subject: pgsql: docs: add COMMENT examples for new features, rename rtree