1
0
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:
Alexander Korotkov
2026-06-26 15:25:13 +03:00
parent 30937c60cd
commit cdae794af3
6 changed files with 257 additions and 5 deletions

View File

@@ -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>