Skip site navigation (1) Skip section navigation (2)

[PATCH] add CLUSTER table ORDER BY index

From: Holger Schurig <holgerschurig(at)gmx(dot)de>
To: pgsql-patches(at)postgresql(dot)org
Subject: [PATCH] add CLUSTER table ORDER BY index
Date: 2007-03-27 19:36:57
Message-ID: 200703272136.57625.holgerschurig@gmx.de (view raw or flat)
Thread:
Lists: pgsql-patches
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;

Responses

pgsql-patches by date

Next:From: David FetterDate: 2007-03-27 19:39:04
Subject: Re: Arrays of Complex Types
Previous:From: Bruce MomjianDate: 2007-03-27 19:08:12
Subject: Re: BUG #2977: dow doesn't conform to ISO-8601

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group