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

Commit084814d

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 parenta57d168 commit084814d

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
@@ -3521,6 +3521,14 @@ StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound)
35213521
new_val,new_null,new_repl);
35223522
/* Also set the flag */
35233523
((Form_pg_class)GETSTRUCT(newtuple))->relispartition= true;
3524+
3525+
/*
3526+
* We already checked for no inheritance children, but reset
3527+
* relhassubclass in case it was left over.
3528+
*/
3529+
if (rel->rd_rel->relkind==RELKIND_RELATION&&rel->rd_rel->relhassubclass)
3530+
((Form_pg_class)GETSTRUCT(newtuple))->relhassubclass= false;
3531+
35243532
CatalogTupleUpdate(classRel,&newtuple->t_self,newtuple);
35253533
heap_freetuple(newtuple);
35263534
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
@@ -3917,8 +3917,16 @@ ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1);
39173917
ERROR: cannot attach inheritance child as partition
39183918
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
39193919
ERROR: cannot attach inheritance parent as partition
3920+
DROP TABLE child;
3921+
-- now it should work, with a little tweak
3922+
ALTER TABLE parent ADD CONSTRAINT check_a CHECK (a > 0);
3923+
ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1);
3924+
-- test insert/update, per bug #18550
3925+
INSERT INTO parent VALUES (1);
3926+
UPDATE parent SET a = 2 WHERE a = 1;
3927+
ERROR: new row for relation "parent" violates partition constraint
3928+
DETAIL: Failing row contains (2, null).
39203929
DROP TABLE parent CASCADE;
3921-
NOTICE: drop cascades to table child
39223930
-- check any TEMP-ness
39233931
CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a);
39243932
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
@@ -2416,6 +2416,13 @@ CREATE TABLE parent (LIKE list_parted);
24162416
CREATETABLEchild () INHERITS (parent);
24172417
ALTERTABLE list_parted ATTACH PARTITION child FORVALUESIN (1);
24182418
ALTERTABLE list_parted ATTACH PARTITION parent FORVALUESIN (1);
2419+
DROPTABLE child;
2420+
-- now it should work, with a little tweak
2421+
ALTERTABLE parent ADDCONSTRAINT check_aCHECK (a>0);
2422+
ALTERTABLE list_parted ATTACH PARTITION parent FORVALUESIN (1);
2423+
-- test insert/update, per bug #18550
2424+
INSERT INTO parentVALUES (1);
2425+
UPDATE parentSET a=2WHERE a=1;
24192426
DROPTABLE parent CASCADE;
24202427

24212428
-- check any TEMP-ness

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp