Skip to content

Commit 3dd637f

Browse files
committed
Reset relhassubclass upon attaching table as a partition
We don't allow inheritance parents as partitions, and have checks to prevent this; but if a table _was_ in the past an inheritance parents and all their children are removed, the pg_class.relhassubclass flag may remain set, which confuses the partition pruning code (most obviously, it results in an assertion failure; in production builds it may be worse.) Fix by resetting relhassubclass on attach. Backpatch to all supported versions. Reported-by: Alexander Lakhin <exclusion@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/18550-d5e047e9a897a889@postgresql.org
1 parent 07fbecb commit 3dd637f

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/backend/catalog/heap.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3520,6 +3520,14 @@ StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound)
35203520
new_val, new_null, new_repl);
35213521
/* Also set the flag */
35223522
((Form_pg_class) GETSTRUCT(newtuple))->relispartition = true;
3523+
3524+
/*
3525+
* We already checked for no inheritance children, but reset
3526+
* relhassubclass in case it was left over.
3527+
*/
3528+
if (rel->rd_rel->relkind == RELKIND_RELATION && rel->rd_rel->relhassubclass)
3529+
((Form_pg_class) GETSTRUCT(newtuple))->relhassubclass = false;
3530+
35233531
CatalogTupleUpdate(classRel, &newtuple->t_self, newtuple);
35243532
heap_freetuple(newtuple);
35253533
table_close(classRel, RowExclusiveLock);

src/test/regress/expected/alter_table.out

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3950,8 +3950,16 @@ ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1);
39503950
ERROR: cannot attach inheritance child as partition
39513951
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
39523952
ERROR: cannot attach inheritance parent as partition
3953+
DROP TABLE child;
3954+
-- now it should work, with a little tweak
3955+
ALTER TABLE parent ADD CONSTRAINT check_a CHECK (a > 0);
3956+
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
3957+
-- test insert/update, per bug #18550
3958+
INSERT INTO parent VALUES (1);
3959+
UPDATE parent SET a = 2 WHERE a = 1;
3960+
ERROR: new row for relation "parent" violates partition constraint
3961+
DETAIL: Failing row contains (2, null).
39533962
DROP TABLE parent CASCADE;
3954-
NOTICE: drop cascades to table child
39553963
-- check any TEMP-ness
39563964
CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a);
39573965
CREATE TABLE perm_part (a int);

src/test/regress/sql/alter_table.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,6 +2425,13 @@ CREATE TABLE parent (LIKE list_parted);
24252425
CREATE TABLE child () INHERITS (parent);
24262426
ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1);
24272427
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
2428+
DROP TABLE child;
2429+
-- now it should work, with a little tweak
2430+
ALTER TABLE parent ADD CONSTRAINT check_a CHECK (a > 0);
2431+
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
2432+
-- test insert/update, per bug #18550
2433+
INSERT INTO parent VALUES (1);
2434+
UPDATE parent SET a = 2 WHERE a = 1;
24282435
DROP TABLE parent CASCADE;
24292436

24302437
-- check any TEMP-ness

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy