diff options
Diffstat (limited to 'src/backend/commands/indexcmds.c')
-rw-r--r-- | src/backend/commands/indexcmds.c | 60 |
1 files changed, 13 insertions, 47 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 7631cacf348..13b04e68f01 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -213,7 +213,7 @@ CheckIndexCompatible(Oid oldId, } /* Any change in operator class or collation breaks compatibility. */ - old_natts = indexForm->indnkeyatts; + old_natts = indexForm->indnatts; Assert(old_natts == numberOfAttributes); d = SysCacheGetAttr(INDEXRELID, tuple, Anum_pg_index_indcollation, &isnull); @@ -327,7 +327,6 @@ DefineIndex(Oid relationId, int16 *coloptions; IndexInfo *indexInfo; int numberOfAttributes; - int numberOfKeyAttributes; TransactionId limitXmin; VirtualTransactionId *old_snapshots; ObjectAddress address; @@ -338,27 +337,14 @@ DefineIndex(Oid relationId, Snapshot snapshot; int i; - if(list_intersection(stmt->indexParams, stmt->indexIncludingParams) != NIL) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("included columns must not intersect with key columns"))); - /* - * count key attributes in index - */ - numberOfKeyAttributes = list_length(stmt->indexParams); - /* - * We append any INCLUDING 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 INCLUDING list by check - * 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 INCLUDING columns. + * count attributes in index */ - stmt->indexParams = list_concat(stmt->indexParams, - stmt->indexIncludingParams); numberOfAttributes = list_length(stmt->indexParams); - + if (numberOfAttributes <= 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("must specify at least one column"))); if (numberOfAttributes > INDEX_MAX_KEYS) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_COLUMNS), @@ -521,11 +507,6 @@ DefineIndex(Oid relationId, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("access method \"%s\" does not support unique indexes", accessMethodName))); - if (list_length(stmt->indexIncludingParams) > 0 && !amRoutine->amcaninclude) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("access method \"%s\" does not support included columns", - accessMethodName))); if (numberOfAttributes > 1 && !amRoutine->amcanmulticol) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -563,7 +544,6 @@ DefineIndex(Oid relationId, */ indexInfo = makeNode(IndexInfo); indexInfo->ii_NumIndexAttrs = numberOfAttributes; - indexInfo->ii_NumIndexKeyAttrs = numberOfKeyAttributes; indexInfo->ii_Expressions = NIL; /* for now */ indexInfo->ii_ExpressionsState = NIL; indexInfo->ii_Predicate = make_ands_implicit((Expr *) stmt->whereClause); @@ -579,7 +559,7 @@ DefineIndex(Oid relationId, typeObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); collationObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); - classObjectId = (Oid *) palloc(numberOfKeyAttributes * sizeof(Oid)); + classObjectId = (Oid *) palloc(numberOfAttributes * sizeof(Oid)); coloptions = (int16 *) palloc(numberOfAttributes * sizeof(int16)); ComputeIndexAttrs(indexInfo, typeObjectId, collationObjectId, classObjectId, @@ -986,15 +966,16 @@ ComputeIndexAttrs(IndexInfo *indexInfo, ListCell *nextExclOp; ListCell *lc; int attn; - int nkeycols = indexInfo->ii_NumIndexKeyAttrs; /* Allocate space for exclusion operator info, if needed */ if (exclusionOpNames) { - Assert(list_length(exclusionOpNames) == nkeycols); - indexInfo->ii_ExclusionOps = (Oid *) palloc(sizeof(Oid) * nkeycols); - indexInfo->ii_ExclusionProcs = (Oid *) palloc(sizeof(Oid) * nkeycols); - indexInfo->ii_ExclusionStrats = (uint16 *) palloc(sizeof(uint16) * nkeycols); + int ncols = list_length(attList); + + Assert(list_length(exclusionOpNames) == ncols); + indexInfo->ii_ExclusionOps = (Oid *) palloc(sizeof(Oid) * ncols); + indexInfo->ii_ExclusionProcs = (Oid *) palloc(sizeof(Oid) * ncols); + indexInfo->ii_ExclusionStrats = (uint16 *) palloc(sizeof(uint16) * ncols); nextExclOp = list_head(exclusionOpNames); } else @@ -1047,11 +1028,6 @@ ComputeIndexAttrs(IndexInfo *indexInfo, Node *expr = attribute->expr; Assert(expr != NULL); - - if (attn >= nkeycols) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("expressions are not supported in included columns"))); atttype = exprType(expr); attcollation = exprCollation(expr); @@ -1130,16 +1106,6 @@ ComputeIndexAttrs(IndexInfo *indexInfo, collationOidP[attn] = attcollation; /* - * Skip opclass and ordering options for included columns. - */ - if (attn >= nkeycols) - { - colOptionP[attn] = 0; - attn++; - continue; - } - - /* * Identify the opclass to use. */ classOidP[attn] = GetIndexOpClass(attribute->opclass, |