Commit 5254958e authored by Stephen Frost's avatar Stephen Frost

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.
parent 115f4141
...@@ -21,7 +21,10 @@ PostgreSQL documentation ...@@ -21,7 +21,10 @@ PostgreSQL documentation
<refsynopsisdiv> <refsynopsisdiv>
<synopsis> <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> </synopsis>
</refsynopsisdiv> </refsynopsisdiv>
...@@ -87,6 +90,24 @@ CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable> [ ...@@ -87,6 +90,24 @@ CREATE TABLESPACE <replaceable class="parameter">tablespace_name</replaceable> [
</para> </para>
</listitem> </listitem>
</varlistentry> </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> </variablelist>
</refsect1> </refsect1>
......
...@@ -239,6 +239,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) ...@@ -239,6 +239,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
Oid tablespaceoid; Oid tablespaceoid;
char *location; char *location;
Oid ownerId; Oid ownerId;
Datum newOptions;
/* Must be super user */ /* Must be super user */
if (!superuser()) if (!superuser())
...@@ -322,7 +323,16 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) ...@@ -322,7 +323,16 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
values[Anum_pg_tablespace_spcowner - 1] = values[Anum_pg_tablespace_spcowner - 1] =
ObjectIdGetDatum(ownerId); ObjectIdGetDatum(ownerId);
nulls[Anum_pg_tablespace_spcacl - 1] = true; 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); tuple = heap_form_tuple(rel->rd_att, values, nulls);
......
...@@ -3370,6 +3370,7 @@ _copyCreateTableSpaceStmt(const CreateTableSpaceStmt *from) ...@@ -3370,6 +3370,7 @@ _copyCreateTableSpaceStmt(const CreateTableSpaceStmt *from)
COPY_STRING_FIELD(tablespacename); COPY_STRING_FIELD(tablespacename);
COPY_STRING_FIELD(owner); COPY_STRING_FIELD(owner);
COPY_STRING_FIELD(location); COPY_STRING_FIELD(location);
COPY_NODE_FIELD(options);
return newnode; return newnode;
} }
......
...@@ -1610,6 +1610,7 @@ _equalCreateTableSpaceStmt(const CreateTableSpaceStmt *a, const CreateTableSpace ...@@ -1610,6 +1610,7 @@ _equalCreateTableSpaceStmt(const CreateTableSpaceStmt *a, const CreateTableSpace
COMPARE_STRING_FIELD(tablespacename); COMPARE_STRING_FIELD(tablespacename);
COMPARE_STRING_FIELD(owner); COMPARE_STRING_FIELD(owner);
COMPARE_STRING_FIELD(location); COMPARE_STRING_FIELD(location);
COMPARE_NODE_FIELD(options);
return true; return true;
} }
......
...@@ -3588,12 +3588,13 @@ opt_procedural: ...@@ -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); CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
n->tablespacename = $3; n->tablespacename = $3;
n->owner = $4; n->owner = $4;
n->location = $6; n->location = $6;
n->options = $7;
$$ = (Node *) n; $$ = (Node *) n;
} }
; ;
......
...@@ -1669,6 +1669,7 @@ typedef struct CreateTableSpaceStmt ...@@ -1669,6 +1669,7 @@ typedef struct CreateTableSpaceStmt
char *tablespacename; char *tablespacename;
char *owner; char *owner;
char *location; char *location;
List *options;
} CreateTableSpaceStmt; } CreateTableSpaceStmt;
typedef struct DropTableSpaceStmt typedef struct DropTableSpaceStmt
......
-- 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 a tablespace we can use
CREATE TABLESPACE testspace LOCATION '@testtablespace@'; CREATE TABLESPACE testspace LOCATION '@testtablespace@';
......
-- 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 a tablespace we can use
CREATE TABLESPACE testspace LOCATION '@testtablespace@'; CREATE TABLESPACE testspace LOCATION '@testtablespace@';
-- try setting and resetting some properties for the new tablespace -- try setting and resetting some properties for the new tablespace
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment