mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Add CREATE TABLESPACE ... WITH ... Options
Tablespaces have a few options which can be set on them to give PG hints as to how the tablespace behaves (perhaps it's faster for sequential scans, or better able to handle random access, etc). These options were only available through the ALTER TABLESPACE command. This adds the ability to set these options at CREATE TABLESPACE time, removing the need to do both a CREATE TABLESPACE and ALTER TABLESPACE to get the correct options set on the tablespace. Vik Fearing, reviewed by Michael Paquier.
This commit is contained in:
parent
115f414124
commit
5254958e92
@ -21,7 +21,10 @@ PostgreSQL documentation
|
||||
|
||||
<refsynopsisdiv>
|
||||
<synopsis>
|
||||
CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable> [ OWNER <replaceable class="parameter">user_name</replaceable> ] LOCATION '<replaceable class="parameter">directory</replaceable>'
|
||||
CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable>
|
||||
[ OWNER <replaceable class="parameter">user_name</replaceable> ]
|
||||
LOCATION '<replaceable class="parameter">directory</replaceable>'
|
||||
[ WITH ( <replaceable class="PARAMETER">tablespace_option</replaceable> = <replaceable class="PARAMETER">value</replaceable> [, ... ] ) ]
|
||||
</synopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
@ -87,6 +90,24 @@ CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable> [
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="parameter">tablespace_option</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
A tablespace parameter to be set or reset. Currently, the only
|
||||
available parameters are <varname>seq_page_cost</> and
|
||||
<varname>random_page_cost</>. Setting either value for a particular
|
||||
tablespace will override the planner's usual estimate of the cost of
|
||||
reading pages from tables in that tablespace, as established by
|
||||
the configuration parameters of the same name (see
|
||||
<xref linkend="guc-seq-page-cost">,
|
||||
<xref linkend="guc-random-page-cost">). This may be useful if one
|
||||
tablespace is located on a disk which is faster or slower than the
|
||||
remainder of the I/O subsystem.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
|
@ -239,6 +239,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
|
||||
Oid tablespaceoid;
|
||||
char *location;
|
||||
Oid ownerId;
|
||||
Datum newOptions;
|
||||
|
||||
/* Must be super user */
|
||||
if (!superuser())
|
||||
@ -322,7 +323,16 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
|
||||
values[Anum_pg_tablespace_spcowner - 1] =
|
||||
ObjectIdGetDatum(ownerId);
|
||||
nulls[Anum_pg_tablespace_spcacl - 1] = true;
|
||||
nulls[Anum_pg_tablespace_spcoptions - 1] = true;
|
||||
|
||||
/* Generate new proposed spcoptions (text array) */
|
||||
newOptions = transformRelOptions((Datum) 0,
|
||||
stmt->options,
|
||||
NULL, NULL, false, false);
|
||||
(void) tablespace_reloptions(newOptions, true);
|
||||
if (newOptions != (Datum) 0)
|
||||
values[Anum_pg_tablespace_spcoptions - 1] = newOptions;
|
||||
else
|
||||
nulls[Anum_pg_tablespace_spcoptions - 1] = true;
|
||||
|
||||
tuple = heap_form_tuple(rel->rd_att, values, nulls);
|
||||
|
||||
|
@ -3370,6 +3370,7 @@ _copyCreateTableSpaceStmt(const CreateTableSpaceStmt *from)
|
||||
COPY_STRING_FIELD(tablespacename);
|
||||
COPY_STRING_FIELD(owner);
|
||||
COPY_STRING_FIELD(location);
|
||||
COPY_NODE_FIELD(options);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
@ -1610,6 +1610,7 @@ _equalCreateTableSpaceStmt(const CreateTableSpaceStmt *a, const CreateTableSpace
|
||||
COMPARE_STRING_FIELD(tablespacename);
|
||||
COMPARE_STRING_FIELD(owner);
|
||||
COMPARE_STRING_FIELD(location);
|
||||
COMPARE_NODE_FIELD(options);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -3588,12 +3588,13 @@ opt_procedural:
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
|
||||
CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions
|
||||
{
|
||||
CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
|
||||
n->tablespacename = $3;
|
||||
n->owner = $4;
|
||||
n->location = $6;
|
||||
n->options = $7;
|
||||
$$ = (Node *) n;
|
||||
}
|
||||
;
|
||||
|
@ -1669,6 +1669,7 @@ typedef struct CreateTableSpaceStmt
|
||||
char *tablespacename;
|
||||
char *owner;
|
||||
char *location;
|
||||
List *options;
|
||||
} CreateTableSpaceStmt;
|
||||
|
||||
typedef struct DropTableSpaceStmt
|
||||
|
@ -1,3 +1,13 @@
|
||||
-- create a tablespace using WITH clause
|
||||
CREATE TABLESPACE testspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail
|
||||
CREATE TABLESPACE testspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok
|
||||
|
||||
-- check to see the parameter was used
|
||||
SELECT spcoptions FROM pg_tablespace WHERE spcname = 'testspacewith';
|
||||
|
||||
-- drop the tablespace so we can re-use the location
|
||||
DROP TABLESPACE testspacewith;
|
||||
|
||||
-- create a tablespace we can use
|
||||
CREATE TABLESPACE testspace LOCATION '@testtablespace@';
|
||||
|
||||
|
@ -1,3 +1,16 @@
|
||||
-- create a tablespace using WITH clause
|
||||
CREATE TABLESPACE testspacewith LOCATION '@testtablespace@' WITH (some_nonexistent_parameter = true); -- fail
|
||||
ERROR: unrecognized parameter "some_nonexistent_parameter"
|
||||
CREATE TABLESPACE testspacewith LOCATION '@testtablespace@' WITH (random_page_cost = 3.0); -- ok
|
||||
-- check to see the parameter was used
|
||||
SELECT spcoptions FROM pg_tablespace WHERE spcname = 'testspacewith';
|
||||
spcoptions
|
||||
------------------------
|
||||
{random_page_cost=3.0}
|
||||
(1 row)
|
||||
|
||||
-- drop the tablespace so we can re-use the location
|
||||
DROP TABLESPACE testspacewith;
|
||||
-- create a tablespace we can use
|
||||
CREATE TABLESPACE testspace LOCATION '@testtablespace@';
|
||||
-- try setting and resetting some properties for the new tablespace
|
||||
|
Loading…
Reference in New Issue
Block a user