Support syntax "CLUSTER table USING index", which is more logical.
authorBruce Momjian
Sun, 8 Apr 2007 00:26:34 +0000 (00:26 +0000)
committerBruce Momjian
Sun, 8 Apr 2007 00:26:34 +0000 (00:26 +0000)
Holger Schurig

doc/src/sgml/ref/cluster.sgml
src/backend/parser/gram.y
src/bin/psql/tab-complete.c
src/test/regress/expected/cluster.out
src/test/regress/sql/cluster.sql

index b93d264ae1d4bce2eed48f30d7acc555a99c8afb..c038d387c819944fb73992705ff0c64cedb89a44 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -20,8 +20,7 @@ PostgreSQL documentation
 
  
 
-CLUSTER indexname ON tablename
-CLUSTER tablename
+CLUSTER tablename [ USING indexname ]
 CLUSTER
 
  
@@ -77,19 +76,19 @@ CLUSTER
 
   
    
-    indexname
+    tablename
     
      
-      The name of an index.
+      The name (possibly schema-qualified) of a table.
      
     
    
 
    
-    tablename
+    indexname
     
      
-      The name (possibly schema-qualified) of a table.
+      The name of an index.
      
     
    
@@ -172,9 +171,9 @@ CREATE TABLE newtable AS
 
   
    Cluster the table employees on the basis of
-   its index emp_ind:
+   its index employees_ind:
 
-CLUSTER emp_ind ON emp;
+CLUSTER employees USING employees_ind;
 
   
 
@@ -182,7 +181,7 @@ CLUSTER emp_ind ON emp;
    Cluster the employees table using the same
    index that was used before:
 
-CLUSTER emp;
+CLUSTER employees;
 
   
 
@@ -198,7 +197,12 @@ CLUSTER;
   Compatibility
 
   
-   There is no CLUSTER statement in the SQL standard.
+   The syntax:
+
+CLUSTER indexname ON tablename
+
+  is also supported for compatibility with pre-8.3 PostgreSQL installations.
+  There is no CLUSTER statement in the SQL standard.
   
  
 
index d38393f9865bdaa18e8408139d89c5b3c379bcfe..56278f56e5da13a3fe619177801d1a1097525184 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.586 2007/04/02 22:20:53 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.587 2007/04/08 00:26:34 momjian Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -209,7 +209,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args)
 
 %type         relation_name copy_file_name
                database_name access_method_clause access_method attr_name
-               index_name name file_name
+               index_name name file_name cluster_index_specification
 
 %type    func_name handler_name qual_Op qual_all_Op subquery_Op
                opt_class opt_validator
@@ -5084,7 +5084,7 @@ opt_check_option:
 /*****************************************************************************
  *
  *     QUERY:
- *             load "filename"
+ *             LOAD "filename"
  *
  *****************************************************************************/
 
@@ -5346,25 +5346,18 @@ CreateConversionStmt:
 /*****************************************************************************
  *
  *     QUERY:
- *             cluster  on 
- *             cluster 
- *             cluster
+ *             CLUSTER  [ USING  ]
+ *             CLUSTER
+ *             CLUSTER  ON  (for pre-8.3)
  *
  *****************************************************************************/
 
 ClusterStmt:
-           CLUSTER index_name ON qualified_name
-               {
-                  ClusterStmt *n = makeNode(ClusterStmt);
-                  n->relation = $4;
-                  n->indexname = $2;
-                  $$ = (Node*)n;
-               }
-           | CLUSTER qualified_name
+           CLUSTER qualified_name cluster_index_specification
                {
                   ClusterStmt *n = makeNode(ClusterStmt);
                   n->relation = $2;
-                  n->indexname = NULL;
+                  n->indexname = $3;
                   $$ = (Node*)n;
                }
            | CLUSTER
@@ -5374,13 +5367,27 @@ ClusterStmt:
                   n->indexname = NULL;
                   $$ = (Node*)n;
                }
+           /* kept for pre-8.3 compatibility */
+           | CLUSTER index_name ON qualified_name
+               {
+                  ClusterStmt *n = makeNode(ClusterStmt);
+                  n->relation = $4;
+                  n->indexname = $2;
+                  $$ = (Node*)n;
+               }
+       ;
+
+cluster_index_specification:
+           USING index_name        { $$ = $2; }
+           | /*EMPTY*/             { $$ = NULL; }
        ;
 
+
 /*****************************************************************************
  *
  *     QUERY:
- *             vacuum
- *             analyze
+ *             VACUUM
+ *             ANALYZE
  *
  *****************************************************************************/
 
index 970bbecadf8d53982d529d9a9a734bd1a6df72d3..090030fd0c305d7431c9404e5902dec4ad2323f8 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2007, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.160 2007/03/26 16:58:40 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.161 2007/04/08 00:26:34 momjian Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -822,11 +822,9 @@ psql_completion(char *text, int start, int end)
 
        COMPLETE_WITH_LIST(list_COLUMNALTER);
    }
-   else if (pg_strcasecmp(prev3_wd, "TABLE") == 0 &&
-            pg_strcasecmp(prev_wd, "CLUSTER") == 0)
+   else if (pg_strcasecmp(prev3_wd, "TABLE") == 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;
@@ -929,24 +927,25 @@ psql_completion(char *text, int start, int end)
 
    /*
     * If the previous word is CLUSTER and not without produce list of
-    * indexes.
+    * tables
     */
    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 , then add "ON" */
+       COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
+   /* If we have CLUSTER , then add "USING" */
    else if (pg_strcasecmp(prev2_wd, "CLUSTER") == 0 &&
-            pg_strcasecmp(prev_wd, "ON") != 0)
-       COMPLETE_WITH_CONST("ON");
+            pg_strcasecmp(prev_wd, "ON") != 0) {
+       COMPLETE_WITH_CONST("USING");
+   }
 
    /*
-    * If we have CLUSTER  ON, then add the correct tablename as well.
+    * If we have CLUSTER  ORDER BY, then add the index as well.
     */
    else if (pg_strcasecmp(prev3_wd, "CLUSTER") == 0 &&
-            pg_strcasecmp(prev_wd, "ON") == 0)
+            pg_strcasecmp(prev_wd, "USING") == 0)
    {
        completion_info_charp = prev2_wd;
-       COMPLETE_WITH_QUERY(Query_for_table_owning_index);
+       COMPLETE_WITH_QUERY(Query_for_index_of_table);
    }
 
 /* COMMENT */
index aa8e967269deb317b3e7fce4f4aa97305ec6c7a9..a9fca4d8fead64fe3b7475278bf42a5b7888c7c1 100644 (file)
@@ -329,7 +329,7 @@ INSERT INTO clstr_3 VALUES (1);
 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;
+CLUSTER clstr_2 USING clstr_2_pkey;
 SELECT * FROM clstr_1 UNION ALL
   SELECT * FROM clstr_2 UNION ALL
   SELECT * FROM clstr_3;
index db300b199810b74ba96e7b07e6acb7e0a6f20af8..81a52c23dfa9d003bea70b112fecc18f74bdd8aa 100644 (file)
@@ -122,7 +122,7 @@ INSERT INTO clstr_3 VALUES (1);
 CLUSTER clstr_2;
 
 CLUSTER clstr_1_pkey ON clstr_1;
-CLUSTER clstr_2_pkey ON clstr_2;
+CLUSTER clstr_2 USING clstr_2_pkey;
 SELECT * FROM clstr_1 UNION ALL
   SELECT * FROM clstr_2 UNION ALL
   SELECT * FROM clstr_3;