It discovers one more bug in CompareIndexInfo(), should be fixed first.
Oid tablespaceId;
Oid createdConstraintId = InvalidOid;
List *indexColNames;
- List *allIndexParams;
Relation rel;
Relation indexRelation;
HeapTuple tuple;
numberOfKeyAttributes = list_length(stmt->indexParams);
/*
- * Calculate the new list of index columns including both key columns and
- * INCLUDE columns. Later we can determine which of these are key columns,
- * and which are just part of the INCLUDE list by checking the list
- * position. A list item in a position less than ii_NumIndexKeyAttrs is
- * part of the key columns, and anything equal to and over is part of the
- * INCLUDE columns.
+ * We append any INCLUDE columns onto the indexParams list so that we have
+ * one list with all columns. Later we can determine which of these are
+ * key columns, and which are just part of the INCLUDE list by checking
+ * the list position. A list item in a position less than
+ * ii_NumIndexKeyAttrs is part of the key columns, and anything equal to
+ * and over is part of the INCLUDE columns.
*/
- allIndexParams = list_concat(list_copy(stmt->indexParams),
- list_copy(stmt->indexIncludingParams));
- numberOfAttributes = list_length(allIndexParams);
+ stmt->indexParams = list_concat(stmt->indexParams,
+ stmt->indexIncludingParams);
+ numberOfAttributes = list_length(stmt->indexParams);
if (numberOfAttributes <= 0)
ereport(ERROR,
/*
* Choose the index column names.
*/
- indexColNames = ChooseIndexColumnNames(allIndexParams);
+ indexColNames = ChooseIndexColumnNames(stmt->indexParams);
/*
* Select name for index if caller didn't specify
coloptions = (int16 *) palloc(numberOfAttributes * sizeof(int16));
ComputeIndexAttrs(indexInfo,
typeObjectId, collationObjectId, classObjectId,
- coloptions, allIndexParams,
+ coloptions, stmt->indexParams,
stmt->excludeOpNames, relationId,
accessMethodName, accessMethodId,
amcanorder, stmt->isconstraint);
memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts);
parentDesc = CreateTupleDescCopy(RelationGetDescr(rel));
- opfamOids = palloc(sizeof(Oid) * numberOfKeyAttributes);
- for (i = 0; i < numberOfKeyAttributes; i++)
+ opfamOids = palloc(sizeof(Oid) * numberOfAttributes);
+ for (i = 0; i < numberOfAttributes; i++)
opfamOids[i] = get_opclass_family(classObjectId[i]);
heap_close(rel, NoLock);
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);
--- Test that covering partitioned indexes work in various cases
-create table covidxpart (a int, b int) partition by list (a);
-create unique index on covidxpart (a) include (b);
-create table covidxpart1 partition of covidxpart for values in (1);
-create table covidxpart2 partition of covidxpart for values in (2);
-insert into covidxpart values (1, 1);
-insert into covidxpart values (1, 1);
-ERROR: duplicate key value violates unique constraint "covidxpart1_a_b_idx"
-DETAIL: Key (a)=(1) already exists.
-create table covidxpart3 (b int, c int, a int);
-alter table covidxpart3 drop c;
-alter table covidxpart attach partition covidxpart3 for values in (3);
-insert into covidxpart values (3, 1);
-insert into covidxpart values (3, 1);
-ERROR: duplicate key value violates unique constraint "covidxpart3_a_b_idx"
-DETAIL: Key (a)=(3) already exists.
-create table covidxpart4 (b int, a int);
-create unique index on covidxpart4 (a) include (b);
-create unique index on covidxpart4 (a);
-alter table covidxpart attach partition covidxpart4 for values in (4);
-insert into covidxpart values (4, 1);
-insert into covidxpart values (4, 1);
-ERROR: duplicate key value violates unique constraint "covidxpart4_a_b_idx"
-DETAIL: Key (a)=(4) already exists.
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);
-
--- Test that covering partitioned indexes work in various cases
-create table covidxpart (a int, b int) partition by list (a);
-create unique index on covidxpart (a) include (b);
-create table covidxpart1 partition of covidxpart for values in (1);
-create table covidxpart2 partition of covidxpart for values in (2);
-insert into covidxpart values (1, 1);
-insert into covidxpart values (1, 1);
-create table covidxpart3 (b int, c int, a int);
-alter table covidxpart3 drop c;
-alter table covidxpart attach partition covidxpart3 for values in (3);
-insert into covidxpart values (3, 1);
-insert into covidxpart values (3, 1);
-create table covidxpart4 (b int, a int);
-create unique index on covidxpart4 (a) include (b);
-create unique index on covidxpart4 (a);
-alter table covidxpart attach partition covidxpart4 for values in (4);
-insert into covidxpart values (4, 1);
-insert into covidxpart values (4, 1);