diff --git a/doc/src/sgml/indexam.sgml b/doc/src/sgml/indexam.sgml
index 76fa5891b00..2f73b7b5b87 100644
--- a/doc/src/sgml/indexam.sgml
+++ b/doc/src/sgml/indexam.sgml
@@ -196,7 +196,7 @@ typedef struct IndexAmRoutine
implications. The requirements of amcanunique
are discussed in .
The amcanmulticol flag asserts that the
- access method supports multicolumn indexes, while
+ access method supports multi-key-column indexes, while
amoptionalkey asserts that it allows scans
where no indexable restriction clause is given for the first index column.
When amcanmulticol is false,
@@ -232,6 +232,19 @@ typedef struct IndexAmRoutine
conditions.
+
+ The amcaninclude flag indicates whether the
+ access method supports included columns, that is it can
+ store (without processing) additional columns beyond the key column(s).
+ The requirements of the preceding paragraph apply only to the key
+ columns. In particular, the combination
+ of amcanmulticol=false
+ and amcaninclude=true is
+ sensible: it means that there can only be one key column, but there can
+ also be included column(s). Also, included columns must be allowed to be
+ null, independently of amoptionalkey.
+
+
@@ -383,10 +396,13 @@ amcanreturn (Relation indexRelation, int attno);
Check whether the index can support index-only scans on
- the given column, by returning the indexed column values for an index entry
- in the form of an IndexTuple. The attribute number
- is 1-based, i.e., the first column's attno is 1. Returns true if supported,
- else false. If the access method does not support index-only scans at all,
+ the given column, by returning the column's original indexed value.
+ The attribute number is 1-based, i.e., the first column's attno is 1.
+ Returns true if supported, else false.
+ This function should always return true for included columns
+ (if those are supported), since there's little point in an included
+ column that can't be retrieved.
+ If the access method does not support index-only scans at all,
the amcanreturn field in its IndexAmRoutine
struct can be set to NULL.
@@ -476,7 +492,7 @@ amproperty (Oid index_oid, int attno,
core code does not know how to do that and will return NULL. It may
also be advantageous to implement AMPROP_RETURNABLE testing,
if that can be done more cheaply than by opening the index and calling
- amcanreturn, which is the core code's default behavior.
+ amcanreturn, which is the core code's default behavior.
The default behavior should be satisfactory for all other standard
properties.
@@ -580,10 +596,13 @@ amgettuple (IndexScanDesc scan,
If the index supports index-only
- scans (i.e., amcanreturn returns true for it),
+ scans (i.e., amcanreturn returns true for any
+ of its columns),
then on success the AM must also check scan->xs_want_itup,
and if that is true it must return the originally indexed data for the
- index entry. The data can be returned in the form of an
+ index entry. Columns for which amcanreturn returns
+ false can be returned as nulls.
+ The data can be returned in the form of an
IndexTuple pointer stored at scan->xs_itup,
with tuple descriptor scan->xs_itupdesc; or in the form of
a HeapTuple pointer stored at scan->xs_hitup,
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 4d9a19a16a7..69329361fa7 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -584,7 +584,7 @@ DefineIndex(Oid relationId,
stmt->indexIncludingParams);
numberOfAttributes = list_length(allIndexParams);
- if (numberOfAttributes <= 0)
+ if (numberOfKeyAttributes <= 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg("must specify at least one column")));
@@ -807,7 +807,7 @@ DefineIndex(Oid relationId,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("access method \"%s\" does not support included columns",
accessMethodName)));
- if (numberOfAttributes > 1 && !amRoutine->amcanmulticol)
+ if (numberOfKeyAttributes > 1 && !amRoutine->amcanmulticol)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("access method \"%s\" does not support multicolumn indexes",