Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3dd637f

Browse files
committed
Reset relhassubclass upon attaching table as a partition
We don't allow inheritance parents as partitions, and have checks toprevent this; but if a table _was_ in the past an inheritance parentsand all their children are removed, the pg_class.relhassubclass flagmay remain set, which confuses the partition pruning code (mostobviously, it results in an assertion failure; in production builds itmay 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 parent07fbecb commit3dd637f

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
CREATETABLEchild () INHERITS (parent);
24262426
ALTERTABLE list_parted ATTACH PARTITION child FORVALUESIN (1);
24272427
ALTERTABLE list_parted ATTACH PARTITION parent FORVALUESIN (1);
2428+
DROPTABLE child;
2429+
-- now it should work, with a little tweak
2430+
ALTERTABLE parent ADDCONSTRAINT check_aCHECK (a>0);
2431+
ALTERTABLE list_parted ATTACH PARTITION parent FORVALUESIN (1);
2432+
-- test insert/update, per bug #18550
2433+
INSERT INTO parentVALUES (1);
2434+
UPDATE parentSET a=2WHERE a=1;
24282435
DROPTABLE parent CASCADE;
24292436

24302437
-- check any TEMP-ness

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp