On Thu, Jan 16, 2014 at 9:03 AM, Vik Fearing <vik.fear...@dalibo.com> wrote: > New patch attached, with regression tests.
Thanks for the new version, I have spent some time looking at it: - Patch compiles without warnings. - Done some manual testing with CREATE/ALTER TABLESPACE WITH and checked pg_tablespace, it worked fine. - However, regression tests are failing because src/test/regress/output/tablespace.source has an incorrect output, it is necessary to replace that: /home/vik/postgresql/9.4/git/src/test/regress/testtablespace by that: @testtablespace@ This is something I have actually fixed that in the attached patch. So, except for the regression output problem, I think that the code is clean so marking it as "Ready for committer" on the commit fest app. Thanks, -- Michael
diff --git a/doc/src/sgml/ref/create_tablespace.sgml b/doc/src/sgml/ref/create_tablespace.sgml index 89c8907..04c5fb8 100644 --- a/doc/src/sgml/ref/create_tablespace.sgml +++ b/doc/src/sgml/ref/create_tablespace.sgml @@ -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> diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 07f5221..c7aedc0 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -234,6 +234,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt) Oid tablespaceoid; char *location; Oid ownerId; + Datum newOptions; /* Must be super user */ if (!superuser()) @@ -317,7 +318,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); diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index fb4ce2c..506ceb8 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -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; } diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index ccf7267..ae68b86 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -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; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index f0b9507..9b76ac9 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -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; } ; diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 9a3a5d7..6e721c2 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -1669,6 +1669,7 @@ typedef struct CreateTableSpaceStmt char *tablespacename; char *owner; char *location; + List *options; } CreateTableSpaceStmt; typedef struct DropTableSpaceStmt diff --git a/src/test/regress/input/tablespace.source b/src/test/regress/input/tablespace.source index 4f17b09..c25b838 100644 --- a/src/test/regress/input/tablespace.source +++ b/src/test/regress/input/tablespace.source @@ -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@'; diff --git a/src/test/regress/output/tablespace.source b/src/test/regress/output/tablespace.source index 2868169..cc5648e 100644 --- a/src/test/regress/output/tablespace.source +++ b/src/test/regress/output/tablespace.source @@ -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
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers