Re: SPLIT/MERGE use of is_internal=true

Alexander Korotkov <aekorotkov@gmail.com>

From: Alexander Korotkov <aekorotkov@gmail.com>
To: Noah Misch <noah@leadboat.com>
Cc: d.koval@postgrespro.ru, pgsql-hackers@postgresql.org
Date: 2026-07-07T23:49:45Z
Lists: pgsql-hackers

Attachments

On Tue, Jul 7, 2026 at 9:57 PM Noah Misch <noah@leadboat.com> wrote:
>
> commit f2e4cc4 wrote:
> > +/*
> > + * createPartitionTable:
> > + *
> > + * Create a new partition (newPartName) for the partitioned table (parent_rel).
> > + * ownerId is determined by the partition on which the operation is performed,
> > + * so it is passed separately.  The new partition will inherit the access method
> > + * and persistence type from the parent table.
> > + *
> > + * Returns the created relation (locked in AccessExclusiveLock mode).
> > + */
> > +static Relation
> > +createPartitionTable(List **wqueue, RangeVar *newPartName,
> > +                                      Relation parent_rel, Oid ownerId)
> > +{
> ...
> > +     /* Create the relation. */
> > +     newRelId = heap_create_with_catalog(newPartName->relname,
> > +                                                                             namespaceId,
> > +                                                                             parent_relform->reltablespace,
> > +                                                                             InvalidOid,
> > +                                                                             InvalidOid,
> > +                                                                             InvalidOid,
> > +                                                                             ownerId,
> > +                                                                             relamId,
> > +                                                                             descriptor,
> > +                                                                             NIL,
> > +                                                                             RELKIND_RELATION,
> > +                                                                             newPartName->relpersistence,
> > +                                                                             false,
> > +                                                                             false,
> > +                                                                             ONCOMMIT_NOOP,
> > +                                                                             (Datum) 0,
> > +                                                                             true,
> > +                                                                             allowSystemTableMods,
> > +                                                                             true,
> > +                                                                             InvalidOid,
> > +                                                                             NULL);
>
> This and other places in the SPLIT/MERGE patches pass is_internal=true, which
> ultimately flows to hooks with the following meaning:
>
>         /*
>          * If this flag is set, the user hasn't requested that the object be
>          * altered, but we're doing it anyway for some internal reason.
>          * Permissions-checking hooks may want to skip checks if, say, we're alter
>          * the constraints of a temporary heap during CLUSTER.
>          */
>         bool            is_internal;
>
> SPLIT/MERGE constitute user requests to create and/or drop tables, so they're
> not like a CLUSTER temporary heap.  They should pass is_internal=false, like
> when the user runs CREATE/DROP directly.

Thank you for catching this.  For sure, we shouldn't pass
is_internal=true here.  Attached patch fixes this.  I'm going to push
it if no objections.

------
Regards,
Alexander Korotkov
Supabase

Commits

  1. Implement ALTER TABLE ... MERGE PARTITIONS ... command