From cc45d075e576b2d21da8c1e8aa898efb274cfcae Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Tue, 23 Jul 2024 18:49:58 +0200 Subject: [PATCH] Reset relhassubclass when attaching as a partition --- src/backend/catalog/heap.c | 8 ++++++++ src/test/regress/expected/create_table.out | 12 ++++++++++++ src/test/regress/sql/create_table.sql | 11 +++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 0bf9625cc9..e1c66c53df 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -3849,6 +3849,14 @@ StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound) new_val, new_null, new_repl); /* Also set the flag */ ((Form_pg_class) GETSTRUCT(newtuple))->relispartition = true; + + /* + * Already checked for no children, but reset relhassubclass in case it was + * left over. + */ + if (rel->rd_rel->relkind == RELKIND_RELATION && rel->rd_rel->relhassubclass) + ((Form_pg_class) GETSTRUCT(newtuple))->relhassubclass = false; + CatalogTupleUpdate(classRel, &newtuple->t_self, newtuple); heap_freetuple(newtuple); table_close(classRel, RowExclusiveLock); diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index a958b84979..374d0f10e8 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -1270,6 +1270,18 @@ insert into defcheck_def values (0, 0); create table defcheck_0 partition of defcheck for values in (0); ERROR: updated partition constraint for default partition "defcheck_def" would be violated by some row drop table defcheck; +-- test that we can use a table that was an inheritance parent +-- as a partition. (Bug #18550) +create table part_test_18550_1 (a int); +create table part_test_18550_2 () inherits (part_test_18550_1); +drop table part_test_18550_2; +create table part_test_18550 (a int) partition by list (a); +alter table part_test_18550 attach partition part_test_18550_1 for values in (1); +insert into part_test_18550_1 values (1); +update part_test_18550_1 set a = 2 where a = 1; +ERROR: new row for relation "part_test_18550_1" violates partition constraint +DETAIL: Failing row contains (2). +drop table part_test_18550; -- tests of column drop with partition tables and indexes using -- predicates and expressions. create table part_column_drop ( diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index cc41f58ba2..91e5ec73ee 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -953,6 +953,17 @@ insert into defcheck_def values (0, 0); create table defcheck_0 partition of defcheck for values in (0); drop table defcheck; +-- test that we can use a table that was an inheritance parent +-- as a partition. (Bug #18550) +create table part_test_18550_1 (a int); +create table part_test_18550_2 () inherits (part_test_18550_1); +drop table part_test_18550_2; +create table part_test_18550 (a int) partition by list (a); +alter table part_test_18550 attach partition part_test_18550_1 for values in (1); +insert into part_test_18550_1 values (1); +update part_test_18550_1 set a = 2 where a = 1; +drop table part_test_18550; + -- tests of column drop with partition tables and indexes using -- predicates and expressions. create table part_column_drop ( -- 2.39.2