mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
OK, here's the final version of ALTER TABLE ... SET WITHOUT CLUSTER.
Has docs + regression test. Christopher Kings-Lynne
This commit is contained in:
parent
6f1aa94fd9
commit
1cdc58722c
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$PostgreSQL: pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.70 2004/05/27 03:30:11 tgl Exp $
|
$PostgreSQL: pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.71 2004/06/02 21:01:08 momjian Exp $
|
||||||
PostgreSQL documentation
|
PostgreSQL documentation
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@ -42,6 +42,7 @@ where <replaceable class="PARAMETER">action</replaceable> is one of:
|
|||||||
SET WITHOUT OIDS
|
SET WITHOUT OIDS
|
||||||
OWNER TO <replaceable class="PARAMETER">new_owner</replaceable>
|
OWNER TO <replaceable class="PARAMETER">new_owner</replaceable>
|
||||||
CLUSTER ON <replaceable class="PARAMETER">index_name</replaceable>
|
CLUSTER ON <replaceable class="PARAMETER">index_name</replaceable>
|
||||||
|
SET WITHOUT CLUSTER
|
||||||
</synopsis>
|
</synopsis>
|
||||||
</refsynopsisdiv>
|
</refsynopsisdiv>
|
||||||
|
|
||||||
@ -213,12 +214,24 @@ where <replaceable class="PARAMETER">action</replaceable> is one of:
|
|||||||
<term><literal>CLUSTER</literal></term>
|
<term><literal>CLUSTER</literal></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
This form selects the default controlling index for future <xref linkend="SQL-CLUSTER" endterm="sql-cluster-title">
|
This form selects the default index for future
|
||||||
|
<xref linkend="SQL-CLUSTER" endterm="sql-cluster-title">
|
||||||
operations.
|
operations.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><literal>SET WITHOUT CLUSTER</literal></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This form removes the most recently used
|
||||||
|
<xref linkend="SQL-CLUSTER" endterm="sql-cluster-title">
|
||||||
|
index specification from the table.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><literal>RENAME</literal></term>
|
<term><literal>RENAME</literal></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.108 2004/05/26 04:41:12 neilc Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.109 2004/06/02 21:01:08 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -233,6 +233,7 @@ static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab);
|
|||||||
static void ATPostAlterTypeParse(char *cmd, List **wqueue);
|
static void ATPostAlterTypeParse(char *cmd, List **wqueue);
|
||||||
static void ATExecChangeOwner(Oid relationOid, int32 newOwnerSysId);
|
static void ATExecChangeOwner(Oid relationOid, int32 newOwnerSysId);
|
||||||
static void ATExecClusterOn(Relation rel, const char *indexName);
|
static void ATExecClusterOn(Relation rel, const char *indexName);
|
||||||
|
static void ATExecDropCluster(Relation rel);
|
||||||
static int ri_trigger_type(Oid tgfoid);
|
static int ri_trigger_type(Oid tgfoid);
|
||||||
static void update_ri_trigger_args(Oid relid,
|
static void update_ri_trigger_args(Oid relid,
|
||||||
const char *oldname,
|
const char *oldname,
|
||||||
@ -1922,8 +1923,9 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
|||||||
pass = AT_PASS_MISC;
|
pass = AT_PASS_MISC;
|
||||||
break;
|
break;
|
||||||
case AT_ClusterOn: /* CLUSTER ON */
|
case AT_ClusterOn: /* CLUSTER ON */
|
||||||
|
case AT_DropCluster: /* SET WITHOUT CLUSTER */
|
||||||
ATSimplePermissions(rel, false);
|
ATSimplePermissions(rel, false);
|
||||||
/* This command never recurses */
|
/* These commands never recurse */
|
||||||
/* No command-specific prep needed */
|
/* No command-specific prep needed */
|
||||||
pass = AT_PASS_MISC;
|
pass = AT_PASS_MISC;
|
||||||
break;
|
break;
|
||||||
@ -2083,6 +2085,9 @@ ATExecCmd(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd)
|
|||||||
case AT_ClusterOn: /* CLUSTER ON */
|
case AT_ClusterOn: /* CLUSTER ON */
|
||||||
ATExecClusterOn(rel, cmd->name);
|
ATExecClusterOn(rel, cmd->name);
|
||||||
break;
|
break;
|
||||||
|
case AT_DropCluster: /* SET WITHOUT CLUSTER */
|
||||||
|
ATExecDropCluster(rel);
|
||||||
|
break;
|
||||||
case AT_DropOids: /* SET WITHOUT OIDS */
|
case AT_DropOids: /* SET WITHOUT OIDS */
|
||||||
/*
|
/*
|
||||||
* Nothing to do here; we'll have generated a DropColumn subcommand
|
* Nothing to do here; we'll have generated a DropColumn subcommand
|
||||||
@ -5044,6 +5049,19 @@ ATExecClusterOn(Relation rel, const char *indexName)
|
|||||||
mark_index_clustered(rel, indexOid);
|
mark_index_clustered(rel, indexOid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ALTER TABLE SET WITHOUT CLUSTER
|
||||||
|
*
|
||||||
|
* We have to find any indexes on the table that have indisclustered bit
|
||||||
|
* set and turn it off.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ATExecDropCluster(Relation rel)
|
||||||
|
{
|
||||||
|
mark_index_clustered(rel, InvalidOid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ALTER TABLE CREATE TOAST TABLE
|
* ALTER TABLE CREATE TOAST TABLE
|
||||||
*
|
*
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.459 2004/06/01 03:28:48 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.460 2004/06/02 21:01:09 momjian Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -1277,6 +1277,14 @@ alter_table_cmd:
|
|||||||
n->name = $3;
|
n->name = $3;
|
||||||
$$ = (Node *)n;
|
$$ = (Node *)n;
|
||||||
}
|
}
|
||||||
|
/* ALTER TABLE <name> SET WITHOUT CLUSTER */
|
||||||
|
| SET WITHOUT CLUSTER
|
||||||
|
{
|
||||||
|
AlterTableCmd *n = makeNode(AlterTableCmd);
|
||||||
|
n->subtype = AT_DropCluster;
|
||||||
|
n->name = NULL;
|
||||||
|
$$ = (Node *)n;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
alter_column_default:
|
alter_column_default:
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.256 2004/05/26 13:57:02 momjian Exp $
|
* $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.257 2004/06/02 21:01:09 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -793,6 +793,7 @@ typedef enum AlterTableType
|
|||||||
AT_ToastTable, /* create toast table */
|
AT_ToastTable, /* create toast table */
|
||||||
AT_ChangeOwner, /* change owner */
|
AT_ChangeOwner, /* change owner */
|
||||||
AT_ClusterOn, /* CLUSTER ON */
|
AT_ClusterOn, /* CLUSTER ON */
|
||||||
|
AT_DropCluster, /* SET WITHOUT CLUSTER */
|
||||||
AT_DropOids /* SET WITHOUT OIDS */
|
AT_DropOids /* SET WITHOUT OIDS */
|
||||||
} AlterTableType;
|
} AlterTableType;
|
||||||
|
|
||||||
|
@ -297,6 +297,17 @@ WHERE pg_class.oid=indexrelid
|
|||||||
clstr_tst_b_c
|
clstr_tst_b_c
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- Try turning off all clustering
|
||||||
|
ALTER TABLE clstr_tst SET WITHOUT CLUSTER;
|
||||||
|
SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2
|
||||||
|
WHERE pg_class.oid=indexrelid
|
||||||
|
AND indrelid=pg_class_2.oid
|
||||||
|
AND pg_class_2.relname = 'clstr_tst'
|
||||||
|
AND indisclustered;
|
||||||
|
relname
|
||||||
|
---------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- Verify that clustering all tables does in fact cluster the right ones
|
-- Verify that clustering all tables does in fact cluster the right ones
|
||||||
CREATE USER clstr_user;
|
CREATE USER clstr_user;
|
||||||
CREATE TABLE clstr_1 (a INT PRIMARY KEY);
|
CREATE TABLE clstr_1 (a INT PRIMARY KEY);
|
||||||
|
@ -95,6 +95,14 @@ WHERE pg_class.oid=indexrelid
|
|||||||
AND pg_class_2.relname = 'clstr_tst'
|
AND pg_class_2.relname = 'clstr_tst'
|
||||||
AND indisclustered;
|
AND indisclustered;
|
||||||
|
|
||||||
|
-- Try turning off all clustering
|
||||||
|
ALTER TABLE clstr_tst SET WITHOUT CLUSTER;
|
||||||
|
SELECT pg_class.relname FROM pg_index, pg_class, pg_class AS pg_class_2
|
||||||
|
WHERE pg_class.oid=indexrelid
|
||||||
|
AND indrelid=pg_class_2.oid
|
||||||
|
AND pg_class_2.relname = 'clstr_tst'
|
||||||
|
AND indisclustered;
|
||||||
|
|
||||||
-- Verify that clustering all tables does in fact cluster the right ones
|
-- Verify that clustering all tables does in fact cluster the right ones
|
||||||
CREATE USER clstr_user;
|
CREATE USER clstr_user;
|
||||||
CREATE TABLE clstr_1 (a INT PRIMARY KEY);
|
CREATE TABLE clstr_1 (a INT PRIMARY KEY);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user