Fix crash when ALTER TABLE recreates indexes on partitions
The skip_build flag was not being passed correctly when recursing to indexes on partitions, leading to attempts to rebuild indexes when they were not yet ready to be rebuilt. Reported-by: Rajkumar Raghuwanshi Discussion: https://postgr.es/m/CAKcux6mxNCGsgATwf5CGMF8g4WSupCXicCVMeKUTuWbyxHOMsQ@mail.gmail.com
This commit is contained in:
parent
dad335b89f
commit
41372071df
|
@ -1033,7 +1033,7 @@ DefineIndex(Oid relationId,
|
|||
indexRelationId, /* this is our child */
|
||||
createdConstraintId,
|
||||
is_alter_table, check_rights, check_not_in_use,
|
||||
false, quiet);
|
||||
skip_build, quiet);
|
||||
}
|
||||
|
||||
pfree(attmap);
|
||||
|
|
|
@ -40,6 +40,14 @@ SELECT col2 FROM idxpart_two fk LEFT OUTER JOIN idxpart pk ON (col1 = col2);
|
|||
(0 rows)
|
||||
|
||||
DROP table idxpart, idxpart_two;
|
||||
-- Verify bugfix with index rewrite on ALTER TABLE / SET DATA TYPE
|
||||
-- https://postgr.es/m/CAKcux6mxNCGsgATwf5CGMF8g4WSupCXicCVMeKUTuWbyxHOMsQ@mail.gmail.com
|
||||
CREATE TABLE idxpart (a INT, b TEXT, c INT) PARTITION BY RANGE(a);
|
||||
CREATE TABLE idxpart1 PARTITION OF idxpart FOR VALUES FROM (MINVALUE) TO (MAXVALUE);
|
||||
CREATE INDEX partidx_abc_idx ON idxpart (a, b, c);
|
||||
INSERT INTO idxpart (a, b, c) SELECT i, i, i FROM generate_series(1, 50) i;
|
||||
ALTER TABLE idxpart ALTER COLUMN c TYPE numeric;
|
||||
DROP TABLE idxpart;
|
||||
-- If a table without index is attached as partition to a table with
|
||||
-- an index, the index is automatically created
|
||||
create table idxpart (a int, b int, c text) partition by range (a);
|
||||
|
|
|
@ -26,6 +26,15 @@ CREATE TABLE idxpart_two (col2 INT);
|
|||
SELECT col2 FROM idxpart_two fk LEFT OUTER JOIN idxpart pk ON (col1 = col2);
|
||||
DROP table idxpart, idxpart_two;
|
||||
|
||||
-- Verify bugfix with index rewrite on ALTER TABLE / SET DATA TYPE
|
||||
-- https://postgr.es/m/CAKcux6mxNCGsgATwf5CGMF8g4WSupCXicCVMeKUTuWbyxHOMsQ@mail.gmail.com
|
||||
CREATE TABLE idxpart (a INT, b TEXT, c INT) PARTITION BY RANGE(a);
|
||||
CREATE TABLE idxpart1 PARTITION OF idxpart FOR VALUES FROM (MINVALUE) TO (MAXVALUE);
|
||||
CREATE INDEX partidx_abc_idx ON idxpart (a, b, c);
|
||||
INSERT INTO idxpart (a, b, c) SELECT i, i, i FROM generate_series(1, 50) i;
|
||||
ALTER TABLE idxpart ALTER COLUMN c TYPE numeric;
|
||||
DROP TABLE idxpart;
|
||||
|
||||
-- If a table without index is attached as partition to a table with
|
||||
-- an index, the index is automatically created
|
||||
create table idxpart (a int, b int, c text) partition by range (a);
|
||||
|
|
Loading…
Reference in New Issue