[PATCH] add CLUSTER table USING index

Started by Holger Schurigover 19 years ago3 messagespatches
Jump to latest
#1Holger Schurig
holgerschurig@gmx.de
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_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_order_by:
+ 			USING 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 tablename [USING 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 "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 &&
! XXXXX 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 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-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 USING clstr_2_pkey;
SELECT * FROM clstr_1 UNION ALL
SELECT * FROM clstr_2 UNION ALL
SELECT * FROM clstr_3;

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Holger Schurig (#1)
Re: [PATCH] add CLUSTER table USING index

FWIW you don't need to patch the TODO files. They will be updated by
Bruce. (And in any case we don't remove the entries, but rather mark
them with a "-" meaning "done for the next release").

Also, sql_help.h is a generated file. You need to change the appropiate
SGML source (doc/src/sgml/ref/cluster.sgml I think)

/*
! * 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 &&
! XXXXX pg_strcasecmp(prev2_wd, "ORDER") == 0)
{
! completion_info_charp = prev3_wd;
! COMPLETE_WITH_QUERY(Query_for_index_of_table);
}

Huh?

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#3Holger Schurig
holgerschurig@gmx.de
In reply to: Alvaro Herrera (#2)
Re: [PATCH] add CLUSTER table USING index

Huh?

You're right. I should have done a "quilt refresh -c" before re-posting the patch.