From 992a4690544a9bbb36c392d3c883952593eb7b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Rodr=C3=ADguez?= Date: Thu, 14 May 2026 15:27:30 +0200 Subject: [PATCH v1 1/3] Add regression test to highlight unexpected behavior when running 'safe' alter column types on partitioned tables --- src/test/regress/expected/alter_table.out | 41 +++++++++++++++++++++++ src/test/regress/sql/alter_table.sql | 33 ++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 6dd22be0e8d..b43392316bb 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -2326,6 +2326,47 @@ select conname, obj_description(oid, 'pg_constraint') as desc -- Don't remove this DROP, it exposes bug #15672 drop table at_partitioned; +-- Alter column type when no index rewrite is required +-- for partitioned tables. Reindex is required although +-- it shouldn't be. +create table at_idx_part (id int, code varchar(10), + primary key (id, code)) + partition by range (id); +create table at_idx_part_p1 partition of at_idx_part + for values from (0) to (100); +create table at_idx_part_p2 partition of at_idx_part + for values from (100) to (200); +create index at_idx_part_code_idx on at_idx_part (code); +insert into at_idx_part values (1, 'a'), (101, 'b'); +create temp table at_idx_old as + select relname, oid as oldoid, relfilenode as oldfilenode + from pg_class where relname like 'at_idx_part%'; +alter table at_idx_part alter column code type varchar(20); +select relname, + c.oid = oldoid as same_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage + from pg_class c join at_idx_old using (relname) + where relname like 'at_idx_part%' + order by relname; + relname | same_oid | storage +-------------------------+----------+--------- + at_idx_part | t | none + at_idx_part_code_idx | f | none + at_idx_part_p1 | t | own + at_idx_part_p1_code_idx | f | own + at_idx_part_p1_pkey | f | own + at_idx_part_p2 | t | own + at_idx_part_p2_code_idx | f | own + at_idx_part_p2_pkey | f | own + at_idx_part_pkey | f | none +(9 rows) + +drop table at_idx_part; -- disallow recursive containment of row types create temp table recur1 (f1 int); alter table recur1 add column f2 recur1; -- fails diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index f5f13bbd3e7..54dc9a85b8b 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1529,6 +1529,39 @@ select conname, obj_description(oid, 'pg_constraint') as desc -- Don't remove this DROP, it exposes bug #15672 drop table at_partitioned; +-- Alter column type when no index rewrite is required +-- for partitioned tables. Reindex is required although +-- it shouldn't be. +create table at_idx_part (id int, code varchar(10), + primary key (id, code)) + partition by range (id); +create table at_idx_part_p1 partition of at_idx_part + for values from (0) to (100); +create table at_idx_part_p2 partition of at_idx_part + for values from (100) to (200); +create index at_idx_part_code_idx on at_idx_part (code); +insert into at_idx_part values (1, 'a'), (101, 'b'); + +create temp table at_idx_old as + select relname, oid as oldoid, relfilenode as oldfilenode + from pg_class where relname like 'at_idx_part%'; + +alter table at_idx_part alter column code type varchar(20); + +select relname, + c.oid = oldoid as same_oid, + case relfilenode + when 0 then 'none' + when c.oid then 'own' + when oldfilenode then 'orig' + else 'OTHER' + end as storage + from pg_class c join at_idx_old using (relname) + where relname like 'at_idx_part%' + order by relname; + +drop table at_idx_part; + -- disallow recursive containment of row types create temp table recur1 (f1 int); alter table recur1 add column f2 recur1; -- fails -- 2.52.0