Skip to content

Commit 29d29d6

Browse files
committed
Fix fuzzy thinking about amcanmulticol versus amcaninclude.
These flags should be independent: in particular an index AM should be able to say that it supports include columns without necessarily supporting multiple key columns. The included-columns patch got this wrong, possibly aided by the fact that it didn't bother to update the documentation. While here, clarify some text about amcanreturn, which was a little vague about what should happen when amcanreturn reports that only some of the index columns are returnable. Noted while reviewing the SP-GiST included-columns patch, which quite incorrectly (and unsafely) changed SP-GiST to claim amcanmulticol = true as a workaround for this bug. Backpatch to v11 where included columns were introduced.
1 parent 46cf3c7 commit 29d29d6

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

doc/src/sgml/indexam.sgml

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ typedef struct IndexAmRoutine
197197
implications. The requirements of <structfield>amcanunique</structfield>
198198
are discussed in <xref linkend="index-unique-checks"/>.
199199
The <structfield>amcanmulticol</structfield> flag asserts that the
200-
access method supports multicolumn indexes, while
200+
access method supports multi-key-column indexes, while
201201
<structfield>amoptionalkey</structfield> asserts that it allows scans
202202
where no indexable restriction clause is given for the first index column.
203203
When <structfield>amcanmulticol</structfield> is false,
@@ -233,6 +233,19 @@ typedef struct IndexAmRoutine
233233
conditions.
234234
</para>
235235

236+
<para>
237+
The <structfield>amcaninclude</structfield> flag indicates whether the
238+
access method supports <quote>included</quote> columns, that is it can
239+
store (without processing) additional columns beyond the key column(s).
240+
The requirements of the preceding paragraph apply only to the key
241+
columns. In particular, the combination
242+
of <structfield>amcanmulticol</structfield>=<literal>false</literal>
243+
and <structfield>amcaninclude</structfield>=<literal>true</literal> is
244+
sensible: it means that there can only be one key column, but there can
245+
also be included column(s). Also, included columns must be allowed to be
246+
null, independently of <structfield>amoptionalkey</structfield>.
247+
</para>
248+
236249
</sect1>
237250

238251
<sect1 id="index-functions">
@@ -383,10 +396,13 @@ amcanreturn (Relation indexRelation, int attno);
383396
</programlisting>
384397
Check whether the index can support <link
385398
linkend="indexes-index-only-scans"><firstterm>index-only scans</firstterm></link> on
386-
the given column, by returning the indexed column values for an index entry
387-
in the form of an <structname>IndexTuple</structname>. The attribute number
388-
is 1-based, i.e., the first column's attno is 1. Returns true if supported,
389-
else false. If the access method does not support index-only scans at all,
399+
the given column, by returning the column's original indexed value.
400+
The attribute number is 1-based, i.e., the first column's attno is 1.
401+
Returns true if supported, else false.
402+
This function should always return true for included columns
403+
(if those are supported), since there's little point in an included
404+
column that can't be retrieved.
405+
If the access method does not support index-only scans at all,
390406
the <structfield>amcanreturn</structfield> field in its <structname>IndexAmRoutine</structname>
391407
struct can be set to NULL.
392408
</para>
@@ -476,7 +492,7 @@ amproperty (Oid index_oid, int attno,
476492
core code does not know how to do that and will return NULL. It may
477493
also be advantageous to implement <literal>AMPROP_RETURNABLE</literal> testing,
478494
if that can be done more cheaply than by opening the index and calling
479-
<structfield>amcanreturn</structfield>, which is the core code's default behavior.
495+
<function>amcanreturn</function>, which is the core code's default behavior.
480496
The default behavior should be satisfactory for all other standard
481497
properties.
482498
</para>
@@ -621,10 +637,13 @@ amgettuple (IndexScanDesc scan,
621637

622638
<para>
623639
If the index supports <link linkend="indexes-index-only-scans">index-only
624-
scans</link> (i.e., <function>amcanreturn</function> returns true for it),
640+
scans</link> (i.e., <function>amcanreturn</function> returns true for any
641+
of its columns),
625642
then on success the AM must also check <literal>scan-&gt;xs_want_itup</literal>,
626643
and if that is true it must return the originally indexed data for the
627-
index entry. The data can be returned in the form of an
644+
index entry. Columns for which <function>amcanreturn</function> returns
645+
false can be returned as nulls.
646+
The data can be returned in the form of an
628647
<structname>IndexTuple</structname> pointer stored at <literal>scan-&gt;xs_itup</literal>,
629648
with tuple descriptor <literal>scan-&gt;xs_itupdesc</literal>; or in the form of
630649
a <structname>HeapTuple</structname> pointer stored at <literal>scan-&gt;xs_hitup</literal>,

src/backend/commands/indexcmds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ DefineIndex(Oid relationId,
597597
stmt->indexIncludingParams);
598598
numberOfAttributes = list_length(allIndexParams);
599599

600-
if (numberOfAttributes <= 0)
600+
if (numberOfKeyAttributes <= 0)
601601
ereport(ERROR,
602602
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
603603
errmsg("must specify at least one column")));
@@ -820,7 +820,7 @@ DefineIndex(Oid relationId,
820820
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
821821
errmsg("access method \"%s\" does not support included columns",
822822
accessMethodName)));
823-
if (numberOfAttributes > 1 && !amRoutine->amcanmulticol)
823+
if (numberOfKeyAttributes > 1 && !amRoutine->amcanmulticol)
824824
ereport(ERROR,
825825
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
826826
errmsg("access method \"%s\" does not support multicolumn indexes",

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy