The following table add's a new variant of the CLUSTER command. The old
variants are preserved, as suggested in the TODO entry.

Things I changed:

* The grammar
* psql help text
* psql tab-completion, it favours now CLUSTER table ORDER BY index"
* two uses of CLUSTER in the regression, so that both the old and
  new syntax get checked

Things to consider:

* not yet in the documentation
* psql should probably no longer emit "CLUSTER index ON table"


Index: src/doc/TODO
===================================================================
*** src.orig/doc/TODO   2007-03-27 21:18:01.000000000 +0200
--- src/doc/TODO        2007-03-27 21:18:26.000000000 +0200
***************
*** 624,631 ****
  
        o %Add VERBOSE option to report tables as they are processed,
          like VACUUM VERBOSE
-       o Add more logical syntax CLUSTER table ORDER BY index; 
-         support current syntax for backward compatibility
  
  
  * COPY
--- 624,629 ----
Index: src/doc/src/FAQ/TODO.html
===================================================================
*** src.orig/doc/src/FAQ/TODO.html      2007-03-27 21:18:01.000000000 +0200
--- src/doc/src/FAQ/TODO.html   2007-03-27 21:18:26.000000000 +0200
***************
*** 558,565 ****
  </p>
      </li><li>%Add VERBOSE option to report tables as they are processed,
            like VACUUM VERBOSE
-     </li><li>Add more logical syntax CLUSTER table ORDER BY index; 
-           support current syntax for backward compatibility
    </li></ul>
    </li><li>COPY
    <ul>
--- 558,563 ----
Index: src/src/backend/parser/gram.y
===================================================================
*** src.orig/src/backend/parser/gram.y  2007-03-27 21:18:01.000000000 +0200
--- src/src/backend/parser/gram.y       2007-03-27 21:18:26.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_order_by
  
  %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> ORDER BY <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_order_by
                                {
                               ClusterStmt *n = makeNode(ClusterStmt);
                                   n->relation = $2;
!                                  n->indexname = $3;
                                   $$ = (Node*)n;
                                }
                        | CLUSTER
***************
*** 5356,5361 ****
--- 5357,5368 ----
                                }
                ;
  
+ opt_cluster_order_by:
+                       ORDER BY index_name                     { $$ = $3; }
+                       | /*EMPTY*/                             { $$ = NULL; }
+               ;
+ 
+ 
  /*****************************************************************************
   *
   *            QUERY:
Index: src/src/bin/psql/sql_help.h
===================================================================
*** src.orig/src/bin/psql/sql_help.h    2007-03-27 21:18:01.000000000 +0200
--- src/src/bin/psql/sql_help.h 2007-03-27 21:18:26.000000000 +0200
***************
*** 119,125 ****
  
      { "CLUSTER",
        N_("cluster a table according to an index"),
!       N_("CLUSTER indexname ON tablename\nCLUSTER tablename\nCLUSTER") },
  
      { "COMMENT",
        N_("define or change the comment of an object"),
--- 119,125 ----
  
      { "CLUSTER",
        N_("cluster a table according to an index"),
!       N_("CLUSTER indexname ON tablename\nCLUSTER tablename [ORDER BY 
indexname]\nCLUSTER") },
  
      { "COMMENT",
        N_("define or change the comment of an object"),
Index: src/src/bin/psql/tab-complete.c
===================================================================
*** src.orig/src/bin/psql/tab-complete.c        2007-03-27 21:18:01.000000000 
+0200
--- src/src/bin/psql/tab-complete.c     2007-03-27 21:18:26.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,952 ----
  
        /*
         * 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 "ORDER BY" */
        else if (pg_strcasecmp(prev2_wd, "CLUSTER") == 0 &&
!                        pg_strcasecmp(prev_wd, "ON") != 0) {
!               COMPLETE_WITH_CONST("ORDER BY");
!       }
  
        /*
!        * If we have CLUSTER <sth> ORDER BY, then add the index as well.
         */
!       else if (pg_strcasecmp(prev4_wd, "CLUSTER") == 0 &&
!                        pg_strcasecmp(prev_wd, "BY") == 0 &&
!                        pg_strcasecmp(prev2_wd, "ORDER") == 0)
        {
!               completion_info_charp = prev3_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-27 
21:18:01.000000000 +0200
--- src/src/test/regress/expected/cluster.out   2007-03-27 21:18:26.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 ORDER BY 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-27 21:18:01.000000000 
+0200
--- src/src/test/regress/sql/cluster.sql        2007-03-27 21:18:26.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 ORDER BY clstr_2_pkey;
  SELECT * FROM clstr_1 UNION ALL
    SELECT * FROM clstr_2 UNION ALL
    SELECT * FROM clstr_3;

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Reply via email to