Re: [PATCH] add CLUSTER table USING index (take 3) - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [PATCH] add CLUSTER table USING index (take 3)
Date
Msg-id 200703292207.l2TM7vW12125@momjian.us
Whole thread Raw
In response to [PATCH] add CLUSTER table USING index (take 3)  (Holger Schurig <holgerschurig@gmx.de>)
List pgsql-patches
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------


Holger Schurig wrote:
> SGML ref text (swapped parameter list, changed example text)
>
> Also, I noticed that the text of the example spoke about a
> table "employees", but the example used the table "emp". I
> fixed this inconsistency.
>
>
> Index: src/doc/src/sgml/ref/cluster.sgml
> ===================================================================
> *** src.orig/doc/src/sgml/ref/cluster.sgml    2007-03-28 23:03:20.000000000 +0200
> --- src/doc/src/sgml/ref/cluster.sgml    2007-03-29 21:32:26.000000000 +0200
> ***************
> *** 20,27 ****
>
>    <refsynopsisdiv>
>   <synopsis>
> ! CLUSTER <replaceable class="PARAMETER">indexname</replaceable> ON <replaceable
class="PARAMETER">tablename</replaceable>
> ! CLUSTER <replaceable class="PARAMETER">tablename</replaceable>
>   CLUSTER
>   </synopsis>
>    </refsynopsisdiv>
> --- 20,26 ----
>
>    <refsynopsisdiv>
>   <synopsis>
> ! CLUSTER <replaceable class="PARAMETER">tablename</replaceable> [ USING <replaceable
class="PARAMETER">indexname</replaceable>] 
>   CLUSTER
>   </synopsis>
>    </refsynopsisdiv>
> ***************
> *** 77,95 ****
>
>     <variablelist>
>      <varlistentry>
> !     <term><replaceable class="PARAMETER">indexname</replaceable></term>
>       <listitem>
>        <para>
> !       The name of an index.
>        </para>
>       </listitem>
>      </varlistentry>
>
>      <varlistentry>
> !     <term><replaceable class="PARAMETER">tablename</replaceable></term>
>       <listitem>
>        <para>
> !       The name (possibly schema-qualified) of a table.
>        </para>
>       </listitem>
>      </varlistentry>
> --- 76,94 ----
>
>     <variablelist>
>      <varlistentry>
> !     <term><replaceable class="PARAMETER">tablename</replaceable></term>
>       <listitem>
>        <para>
> !       The name (possibly schema-qualified) of a table.
>        </para>
>       </listitem>
>      </varlistentry>
>
>      <varlistentry>
> !     <term><replaceable class="PARAMETER">indexname</replaceable></term>
>       <listitem>
>        <para>
> !       The name of an index.
>        </para>
>       </listitem>
>      </varlistentry>
> ***************
> *** 172,180 ****
>
>     <para>
>      Cluster the table <literal>employees</literal> on the basis of
> !    its index <literal>emp_ind</literal>:
>   <programlisting>
> ! CLUSTER emp_ind ON emp;
>   </programlisting>
>     </para>
>
> --- 171,179 ----
>
>     <para>
>      Cluster the table <literal>employees</literal> on the basis of
> !    its index <literal>employees_ind</literal>:
>   <programlisting>
> ! CLUSTER employees USING employees_ind;
>   </programlisting>
>     </para>
>
> ***************
> *** 182,188 ****
>      Cluster the <literal>employees</literal> table using the same
>      index that was used before:
>   <programlisting>
> ! CLUSTER emp;
>   </programlisting>
>     </para>
>
> --- 181,187 ----
>      Cluster the <literal>employees</literal> table using the same
>      index that was used before:
>   <programlisting>
> ! CLUSTER employees;
>   </programlisting>
>     </para>
>
> Index: src/src/backend/parser/gram.y
> ===================================================================
> *** src.orig/src/backend/parser/gram.y    2007-03-28 23:03:20.000000000 +0200
> --- src/src/backend/parser/gram.y    2007-03-28 23:03:35.000000000 +0200
> ***************
> *** 209,215 ****
>
>   %type <str>        relation_name copy_file_name
>                   database_name access_method_clause access_method attr_name
> !                 index_name name file_name
>
>   %type <list>    func_name handler_name qual_Op qual_all_Op subquery_Op
>                   opt_class opt_validator
> --- 209,215 ----
>
>   %type <str>        relation_name copy_file_name
>                   database_name access_method_clause access_method attr_name
> !                 index_name name file_name opt_cluster_using
>
>   %type <list>    func_name handler_name qual_Op qual_all_Op subquery_Op
>                   opt_class opt_validator
> ***************
> *** 5327,5332 ****
> --- 5327,5333 ----
>    *
>    *        QUERY:
>    *                cluster <index_name> on <qualified_name>
> +  *                cluster <qualified_name> USING <index_name>
>    *                cluster <qualified_name>
>    *                cluster
>    *
> ***************
> *** 5340,5350 ****
>                      n->indexname = $2;
>                      $$ = (Node*)n;
>                   }
> !             | CLUSTER qualified_name
>                   {
>                      ClusterStmt *n = makeNode(ClusterStmt);
>                      n->relation = $2;
> !                    n->indexname = NULL;
>                      $$ = (Node*)n;
>                   }
>               | CLUSTER
> --- 5341,5351 ----
>                      n->indexname = $2;
>                      $$ = (Node*)n;
>                   }
> !             | CLUSTER qualified_name opt_cluster_using
>                   {
>                      ClusterStmt *n = makeNode(ClusterStmt);
>                      n->relation = $2;
> !                    n->indexname = $3;
>                      $$ = (Node*)n;
>                   }
>               | CLUSTER
> ***************
> *** 5356,5361 ****
> --- 5357,5368 ----
>                   }
>           ;
>
> + opt_cluster_using:
> +             USING index_name            { $$ = $2; }
> +             | /*EMPTY*/                { $$ = NULL; }
> +         ;
> +
> +
>   /*****************************************************************************
>    *
>    *        QUERY:
> Index: src/src/bin/psql/tab-complete.c
> ===================================================================
> *** src.orig/src/bin/psql/tab-complete.c    2007-03-28 23:03:20.000000000 +0200
> --- src/src/bin/psql/tab-complete.c    2007-03-28 23:03:35.000000000 +0200
> ***************
> *** 822,832 ****
>
>           COMPLETE_WITH_LIST(list_COLUMNALTER);
>       }
> !     else if (pg_strcasecmp(prev3_wd, "TABLE") == 0 &&
> !              pg_strcasecmp(prev_wd, "CLUSTER") == 0)
>           COMPLETE_WITH_CONST("ON");
>       else if (pg_strcasecmp(prev4_wd, "TABLE") == 0 &&
> -              pg_strcasecmp(prev2_wd, "CLUSTER") == 0 &&
>                pg_strcasecmp(prev_wd, "ON") == 0)
>       {
>           completion_info_charp = prev3_wd;
> --- 822,830 ----
>
>           COMPLETE_WITH_LIST(list_COLUMNALTER);
>       }
> !     else if (pg_strcasecmp(prev3_wd, "TABLE") == 0)
>           COMPLETE_WITH_CONST("ON");
>       else if (pg_strcasecmp(prev4_wd, "TABLE") == 0 &&
>                pg_strcasecmp(prev_wd, "ON") == 0)
>       {
>           completion_info_charp = prev3_wd;
> ***************
> *** 929,952 ****
>
>       /*
>        * If the previous word is CLUSTER and not without produce list of
> !      * indexes.
>        */
>       else if (pg_strcasecmp(prev_wd, "CLUSTER") == 0 &&
>                pg_strcasecmp(prev2_wd, "WITHOUT") != 0)
> !         COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL);
> !     /* If we have CLUSTER <sth>, then add "ON" */
>       else if (pg_strcasecmp(prev2_wd, "CLUSTER") == 0 &&
> !              pg_strcasecmp(prev_wd, "ON") != 0)
> !         COMPLETE_WITH_CONST("ON");
>
>       /*
> !      * If we have CLUSTER <sth> ON, then add the correct tablename as well.
>        */
>       else if (pg_strcasecmp(prev3_wd, "CLUSTER") == 0 &&
> !              pg_strcasecmp(prev_wd, "ON") == 0)
>       {
>           completion_info_charp = prev2_wd;
> !         COMPLETE_WITH_QUERY(Query_for_table_owning_index);
>       }
>
>   /* COMMENT */
> --- 927,951 ----
>
>       /*
>        * If the previous word is CLUSTER and not without produce list of
> !      * tables
>        */
>       else if (pg_strcasecmp(prev_wd, "CLUSTER") == 0 &&
>                pg_strcasecmp(prev2_wd, "WITHOUT") != 0)
> !         COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
> !     /* If we have CLUSTER <sth>, then add "USING" */
>       else if (pg_strcasecmp(prev2_wd, "CLUSTER") == 0 &&
> !              pg_strcasecmp(prev_wd, "ON") != 0) {
> !         COMPLETE_WITH_CONST("USING");
> !     }
>
>       /*
> !      * If we have CLUSTER <sth> ORDER BY, then add the index as well.
>        */
>       else if (pg_strcasecmp(prev3_wd, "CLUSTER") == 0 &&
> !              pg_strcasecmp(prev_wd, "USING") == 0)
>       {
>           completion_info_charp = prev2_wd;
> !         COMPLETE_WITH_QUERY(Query_for_index_of_table);
>       }
>
>   /* COMMENT */
> Index: src/src/test/regress/expected/cluster.out
> ===================================================================
> *** src.orig/src/test/regress/expected/cluster.out    2007-03-28 23:03:20.000000000 +0200
> --- src/src/test/regress/expected/cluster.out    2007-03-28 23:03:35.000000000 +0200
> ***************
> *** 329,335 ****
>   CLUSTER clstr_2;
>   ERROR:  there is no previously clustered index for table "clstr_2"
>   CLUSTER clstr_1_pkey ON clstr_1;
> ! CLUSTER clstr_2_pkey ON clstr_2;
>   SELECT * FROM clstr_1 UNION ALL
>     SELECT * FROM clstr_2 UNION ALL
>     SELECT * FROM clstr_3;
> --- 329,335 ----
>   CLUSTER clstr_2;
>   ERROR:  there is no previously clustered index for table "clstr_2"
>   CLUSTER clstr_1_pkey ON clstr_1;
> ! CLUSTER clstr_2 USING clstr_2_pkey;
>   SELECT * FROM clstr_1 UNION ALL
>     SELECT * FROM clstr_2 UNION ALL
>     SELECT * FROM clstr_3;
> Index: src/src/test/regress/sql/cluster.sql
> ===================================================================
> *** src.orig/src/test/regress/sql/cluster.sql    2007-03-28 23:03:20.000000000 +0200
> --- src/src/test/regress/sql/cluster.sql    2007-03-28 23:03:35.000000000 +0200
> ***************
> *** 122,128 ****
>   CLUSTER clstr_2;
>
>   CLUSTER clstr_1_pkey ON clstr_1;
> ! CLUSTER clstr_2_pkey ON clstr_2;
>   SELECT * FROM clstr_1 UNION ALL
>     SELECT * FROM clstr_2 UNION ALL
>     SELECT * FROM clstr_3;
> --- 122,128 ----
>   CLUSTER clstr_2;
>
>   CLUSTER clstr_1_pkey ON clstr_1;
> ! CLUSTER clstr_2 USING clstr_2_pkey;
>   SELECT * FROM clstr_1 UNION ALL
>     SELECT * FROM clstr_2 UNION ALL
>     SELECT * FROM clstr_3;
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
>                http://archives.postgresql.org

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: DEALLOCATE ALL
Next
From: Neil Conway
Date:
Subject: Re: DEALLOCATE ALL