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.
