Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)