On 04/18/2018 12:52 PM, Heikki Linnakangas wrote:
On 11/04/18 04:20, Michael Paquier wrote:
Hi all,

The documentation of covering indexes is incorrect for CREATE and ALTER
TABLE:
- ALTER TABLE's page is missing the call.
- Exclusion constraints can use INCLUDE clauses.

In order to simplify the documentation, please let me suggest the
attached which moves the definition of the INCLUDE clause into the
section index_parameters, which is compatible with what I read from the
parser.

Committed, thanks!

- Heikki

Following this change, I believe we need to modify UNIQUE and PRIMARY KEY descriptions in CREATE TABLE as they still mention INCLUDE but not the other index_parameters. The attached patch fixes this inconsistency, as well as adds a separate paragraph for INCLUDE in CREATE TABLE to clarify its purpose and avoid repetition in constraint descriptions. It also reorders the paragraphs in CREATE INDEX to follow the syntax.

--
Liudmila Mantrova
Technical writer at Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml
index 3c1223b..c67f187 100644
--- a/doc/src/sgml/ref/create_index.sgml
+++ b/doc/src/sgml/ref/create_index.sgml
@@ -145,52 +145,6 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] <replaceable class=
      </varlistentry>
 
      <varlistentry>
-      <term><literal>INCLUDE</literal></term>
-      <listitem>
-       <para>
-        The optional <literal>INCLUDE</literal> clause specifies a
-        list of columns which will be included in the index
-        as <firstterm>non-key</firstterm> columns.  A non-key column cannot
-        be used in an index scan search qualification, and it is disregarded
-        for purposes of any uniqueness or exclusion constraint enforced by
-        the index.  However, an index-only scan can return the contents of
-        non-key columns without having to visit the index's table, since
-        they are available directly from the index entry.  Thus, addition of
-        non-key columns allows index-only scans to be used for queries that
-        otherwise could not use them.
-       </para>
-
-       <para>
-        It's wise to be conservative about adding non-key columns to an
-        index, especially wide columns.  If an index tuple exceeds the
-        maximum size allowed for the index type, data insertion will fail.
-        In any case, non-key columns duplicate data from the index's table
-        and bloat the size of the index, thus potentially slowing searches.
-       </para>
-
-       <para>
-        Columns listed in the <literal>INCLUDE</literal> clause don't need
-        appropriate operator classes; the clause can include
-        columns whose data types don't have operator classes defined for
-        a given access method.
-       </para>
-
-       <para>
-        Expressions are not supported as included columns since they cannot be
-        used in index-only scans.
-       </para>
-
-       <para>
-        Currently, only the B-tree index access method supports this feature.
-        In B-tree indexes, the values of columns listed in the
-        <literal>INCLUDE</literal> clause are included in leaf tuples which
-        correspond to heap tuples, but are not included in upper-level
-        index entries used for tree navigation.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
       <term><replaceable class="parameter">name</replaceable></term>
       <listitem>
        <para>
@@ -317,6 +271,52 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] <replaceable class=
      </varlistentry>
 
      <varlistentry>
+      <term><literal>INCLUDE</literal></term>
+      <listitem>
+       <para>
+        The optional <literal>INCLUDE</literal> clause specifies a
+        list of columns which will be included in the index
+        as <firstterm>non-key</firstterm> columns.  A non-key column cannot
+        be used in an index scan search qualification, and it is disregarded
+        for purposes of any uniqueness or exclusion constraint enforced by
+        the index.  However, an index-only scan can return the contents of
+        non-key columns without having to visit the index's table, since
+        they are available directly from the index entry.  Thus, addition of
+        non-key columns allows index-only scans to be used for queries that
+        otherwise could not use them.
+       </para>
+
+       <para>
+        It's wise to be conservative about adding non-key columns to an
+        index, especially wide columns.  If an index tuple exceeds the
+        maximum size allowed for the index type, data insertion will fail.
+        In any case, non-key columns duplicate data from the index's table
+        and bloat the size of the index, thus potentially slowing searches.
+       </para>
+
+       <para>
+        Columns listed in the <literal>INCLUDE</literal> clause don't need
+        appropriate operator classes; the clause can include
+        columns whose data types don't have operator classes defined for
+        a given access method.
+       </para>
+
+       <para>
+        Expressions are not supported as included columns since they cannot be
+        used in index-only scans.
+       </para>
+
+       <para>
+        Currently, only the B-tree index access method supports this feature.
+        In B-tree indexes, the values of columns listed in the
+        <literal>INCLUDE</literal> clause are included in leaf tuples which
+        correspond to heap tuples, but are not included in upper-level
+        index entries used for tree navigation.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
       <term><replaceable class="parameter">storage_parameter</replaceable></term>
       <listitem>
        <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index d936de3..460312e 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -830,9 +830,9 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry>
-    <term><literal>UNIQUE</literal> (column constraint)</term>
+    <term><literal>UNIQUE</literal> <replaceable class="parameter">index_parameters</replaceable> (column constraint)</term>
     <term><literal>UNIQUE ( <replaceable class="parameter">column_name</replaceable> [, ... ] )</literal>
-    <optional> INCLUDE ( <replaceable class="parameter">column_name</replaceable> [, ...]) </optional> (table constraint)</term>
+    <replaceable class="parameter">index_parameters</replaceable> (table constraint)</term>
 
     <listitem>
      <para>
@@ -863,22 +863,19 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
-      Adding a unique constraint will automatically create a unique btree
+      Adding a unique constraint will automatically create a unique B-tree
       index on the column or group of columns used in the constraint.
-      The optional clause <literal>INCLUDE</literal> adds to that index
-      one or more columns on which the uniqueness is not enforced.
-      Note that although the constraint is not enforced on the included columns,
-      it still depends on them.  Consequently, some operations on these columns
-      (e.g. <literal>DROP COLUMN</literal>) can cause cascaded constraint and
-      index deletion.
+      Optionally, you can adjust index properties using
+      <literal>INCLUDE</literal>, <literal>WITH</literal>, and
+      <literal>USING INDEX TABLESPACES</literal> clauses, as explained below.
      </para>
     </listitem>
    </varlistentry>
 
    <varlistentry>
-    <term><literal>PRIMARY KEY</literal> (column constraint)</term>
+    <term><literal>PRIMARY KEY</literal> <replaceable class="parameter">index_parameters</replaceable> (column constraint)</term>
     <term><literal>PRIMARY KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] )</literal>
-    <optional> INCLUDE ( <replaceable class="parameter">column_name</replaceable> [, ...]) </optional> (table constraint)</term>
+    <replaceable class="parameter">index_parameters</replaceable> (table constraint)</term>
     <listitem>
      <para>
       The <literal>PRIMARY KEY</literal> constraint specifies that a column or
@@ -910,13 +907,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
 
      <para>
       Adding a <literal>PRIMARY KEY</literal> constraint will automatically
-      create a unique btree index on the column or group of columns used in the
-      constraint.  The optional <literal>INCLUDE</literal> clause allows a list
-      of columns to be specified which will be included in the non-key portion
-      of the index.  Although uniqueness is not enforced on the included columns,
-      the constraint still depends on them. Consequently, some operations on the
-      included columns (e.g. <literal>DROP COLUMN</literal>) can cause cascaded
-      constraint and index deletion.
+      create a unique B-tree index on the column or group of columns used in
+      the constraint. Optionally, you can adjust index properties using
+      <literal>INCLUDE</literal>, <literal>WITH</literal>, and
+      <literal>USING INDEX TABLESPACES</literal> clauses, as explained below.
      </para>
     </listitem>
    </varlistentry>
@@ -951,6 +945,9 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
       can optionally specify an operator class and/or ordering options;
       these are described fully under
       <xref linkend="sql-createindex"/>.
+      You can also adjust index properties using <literal>INCLUDE</literal>,
+      <literal>WITH</literal>, and <literal>USING INDEX TABLESPACES</literal>
+      clauses, as explained below.
      </para>
 
      <para>
@@ -1137,6 +1134,27 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
    </varlistentry>
 
    <varlistentry>
+    <term><literal>INCLUDE ( <replaceable class="parameter">column_name</replaceable> [, ... ] )</literal></term>
+    <listitem>
+     <para>
+      The optional <literal>INCLUDE</literal> clause adds non-key columns
+      to the index created for <literal>UNIQUE</literal>,
+      <literal>PRIMARY KEY</literal>, and <literal>EXCLUDE</literal>
+      constraints, without enforcing the constraint on these columns.
+      The contents of non-key columns can be returned by index-only scans,
+      so you can use this clause to expand the constraint-related index to
+      the columns that are likely to be queried.
+      Note that although the constraint is not enforced on the non-key columns,
+      it still depends on them. Consequently, some operations on these columns
+      (e.g. <literal>DROP COLUMN</literal>) can cause cascaded constraint and
+      index deletion.
+      For details on non-key columns, see the <literal>INCLUDE</literal>
+      description in <xref linkend="sql-createindex"/>.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
     <term><literal>WITH ( <replaceable class="parameter">storage_parameter</replaceable> [= <replaceable class="parameter">value</replaceable>] [, ... ] )</literal></term>
     <listitem>
      <para>

Reply via email to