]> granicus.if.org Git - postgresql/commitdiff
Fix partitioned index creation bug with dropped columns
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 26 Mar 2019 23:19:28 +0000 (20:19 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Tue, 26 Mar 2019 23:19:28 +0000 (20:19 -0300)
ALTER INDEX .. ATTACH PARTITION fails if the partitioned table where the
index is defined contains more dropped columns than its partition, with
this message:
  ERROR:  incorrect attribute map
The cause was that one caller of CompareIndexInfo was passing the number
of attributes of the partition rather than the parent, which confused
the length check.  Repair.

This can cause pg_upgrade to fail when used on such a database.  Leave
some more objects around after regression tests, so that the case is
detected by pg_upgrade test suite.

Remove some spurious empty lines noticed while looking for other cases
of the same problem.

Discussion: https://postgr.es/m/20190326213924.GA2322@alvherre.pgsql

src/backend/catalog/index.c
src/backend/commands/indexcmds.c
src/backend/commands/tablecmds.c
src/test/regress/expected/indexing.out
src/test/regress/sql/indexing.sql

index d2e284f6de6115e2fc77f0eaccad4f3570fe8f88..af367c95c080f1a4ec7c789e4587761284910459 100644 (file)
@@ -1850,7 +1850,6 @@ CompareIndexInfo(IndexInfo *info1, IndexInfo *info2,
        if (info1->ii_NumIndexKeyAttrs != info2->ii_NumIndexKeyAttrs)
                return false;
 
-
        /*
         * and columns match through the attribute map (actual attribute numbers
         * might differ!)  Note that this implies that index columns that are
index c3a53d81aabc1b09556455dfd5896d44cf2f4820..d6eb48cb4e639638459107dd0a7587403ffdef9e 100644 (file)
@@ -925,7 +925,6 @@ DefineIndex(Oid relationId,
                                                                                           gettext_noop("could not convert row type"));
                                maplen = parentDesc->natts;
 
-
                                foreach(cell, childidxs)
                                {
                                        Oid                     cldidxid = lfirst_oid(cell);
index 3183b2aaa12d693ed49be0467845af3665d9989e..048c1196685b1026e156729707162fae73eb12fd 100644 (file)
@@ -15591,7 +15591,7 @@ ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
                                                          partIdx->rd_opfamily,
                                                          parentIdx->rd_opfamily,
                                                          attmap,
-                                                         RelationGetDescr(partTbl)->natts))
+                                                         RelationGetDescr(parentTbl)->natts))
                        ereport(ERROR,
                                        (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
                                         errmsg("cannot attach index \"%s\" as a partition of index \"%s\"",
index 8f25d71ba128c89d525997a7a15c539291b358f2..cfbc06da07edceb30f3f106ebe38fa586fff674b 100644 (file)
@@ -1411,6 +1411,11 @@ alter index idxpart2_a_idx attach partition idxpart22_a_idx;
 create index on idxpart (a);
 create table idxpart_another (a int, b int, primary key (a, b)) partition by range (a);
 create table idxpart_another_1 partition of idxpart_another for values from (0) to (100);
+create table idxpart3 (c int, b int, a int) partition by range (a);
+alter table idxpart3 drop column b, drop column c;
+create table idxpart31 partition of idxpart3 for values from (1000) to (1200);
+create table idxpart32 partition of idxpart3 for values from (1200) to (1400);
+alter table idxpart attach partition idxpart3 for values from (1000) to (2000);
 -- More objects intentionally left behind, to verify some pg_dump/pg_upgrade
 -- behavior; see https://postgr.es/m/20190321204928.GA17535@alvherre.pgsql
 create schema regress_indexing;
index 2ccea02cae0a8feea54f9ab11a4ba470f9253dc7..954632b14ec5498dbe81b55dc2c1278330f0e804 100644 (file)
@@ -747,6 +747,11 @@ alter index idxpart2_a_idx attach partition idxpart22_a_idx;
 create index on idxpart (a);
 create table idxpart_another (a int, b int, primary key (a, b)) partition by range (a);
 create table idxpart_another_1 partition of idxpart_another for values from (0) to (100);
+create table idxpart3 (c int, b int, a int) partition by range (a);
+alter table idxpart3 drop column b, drop column c;
+create table idxpart31 partition of idxpart3 for values from (1000) to (1200);
+create table idxpart32 partition of idxpart3 for values from (1200) to (1400);
+alter table idxpart attach partition idxpart3 for values from (1000) to (2000);
 
 -- More objects intentionally left behind, to verify some pg_dump/pg_upgrade
 -- behavior; see https://postgr.es/m/20190321204928.GA17535@alvherre.pgsql