mirror of
https://github.com/postgres/postgres.git
synced 2026-10-23 13:29:09 +03:00
Take into account default_tablespace during MERGE/SPLIT PARTITION(S)
createPartitionTable() passed the partitioned parent's reltablespace straight to heap_create_with_catalog(), bypassing the default_tablespace GUC fallback that DefineRelation() applies for CREATE TABLE ... PARTITION OF. When the parent had no explicit tablespace (reltablespace = 0), the new partition unconditionally landed in the database default, even if default_tablespace was set to something else; merging or splitting a set of partitions that all lived in a non-default tablespace produced a new partition in the database default. Mirror DefineRelation()'s logic: take parent's reltablespace if set, otherwise check GetDefaultTablespace() (which reads default_tablespace and normalises pg_default / MyDatabaseTableSpace to InvalidOid). Also add the CREATE ACL check on the resolved tablespace and the pg_global rejection, matching DefineRelation()'s behavior. Update the documentation for MERGE/SPLIT PARTITION to spell out the tablespace-selection rule explicitly. Reported-by: Justin Pryzby <pryzby@telsasoft.com> Reviewed-by: Pavel Borisov <pashkin.elfe@gmail.com> Discussion: https://postgr.es/m/ajQTklv8QArzTp3h%40pryzbyj2023
This commit is contained in:
@@ -1234,8 +1234,13 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
|
||||
<para>
|
||||
<command>ALTER TABLE MERGE PARTITION</command> uses the partitioned
|
||||
table itself as the template to construct the new partition.
|
||||
The new partition will inherit the same table access method, persistence
|
||||
type, and tablespace as the partitioned table.
|
||||
The new partition inherits the table access method and persistence type
|
||||
of the partitioned table. Its tablespace is selected as for a
|
||||
<command>CREATE TABLE ... PARTITION OF</command> command issued
|
||||
without a <literal>TABLESPACE</literal> clause: if the partitioned
|
||||
table has an explicit tablespace, the new partition uses it;
|
||||
otherwise the value of <xref linkend="guc-default-tablespace"/> is
|
||||
taken into account, falling back to the database's default tablespace.
|
||||
|
||||
Constraints, column defaults, column generation expressions, identity
|
||||
columns, indexes, and triggers are copied from the partitioned table to
|
||||
@@ -1332,8 +1337,13 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
|
||||
<para>
|
||||
<command>ALTER TABLE SPLIT PARTITION</command> uses the partitioned
|
||||
table itself as the template to construct new partitions.
|
||||
New partitions will inherit the same table access method, persistence
|
||||
type, and tablespace as the partitioned table.
|
||||
New partitions inherit the table access method and persistence type of
|
||||
the partitioned table. Their tablespace is selected as for a
|
||||
<command>CREATE TABLE ... PARTITION OF</command> command issued
|
||||
without a <literal>TABLESPACE</literal> clause: if the partitioned
|
||||
table has an explicit tablespace, the new partitions use it;
|
||||
otherwise the value of <xref linkend="guc-default-tablespace"/> is
|
||||
taken into account, falling back to the database's default tablespace.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
||||
Reference in New Issue
Block a user