From c14b13578070a9d1a6e617541bb05334ea62e0a3 Mon Sep 17 00:00:00 2001 From: Onur Tirtir Date: Wed, 12 Nov 2025 15:44:09 +0300 Subject: [PATCH] allow "alter table set schema" from any node for Postgres tables - postgres tables --- src/backend/distributed/commands/table.c | 43 ++++++++++++++---------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 23e729f0b..5f5e152aa 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -4330,11 +4330,6 @@ ConvertToTenantTableIfNecessary(AlterObjectSchemaStmt *stmt) { Assert(stmt->objectType == OBJECT_TABLE || stmt->objectType == OBJECT_FOREIGN_TABLE); - if (!IsCoordinator()) - { - return; - } - /* * We will let Postgres deal with missing_ok */ @@ -4345,16 +4340,24 @@ ConvertToTenantTableIfNecessary(AlterObjectSchemaStmt *stmt) /* We have already asserted that we have exactly 1 address in the addresses. */ ObjectAddress *tableAddress = linitial(tableAddresses); - char relKind = get_rel_relkind(tableAddress->objectId); + + Oid relationId = tableAddress->objectId; + if (!OidIsValid(relationId)) + { + Assert(stmt->missing_ok); + return; + } + + char relKind = get_rel_relkind(relationId); if (relKind == RELKIND_SEQUENCE || relKind == RELKIND_VIEW) { return; } - Oid relationId = tableAddress->objectId; Oid schemaId = get_namespace_oid(stmt->newschema, stmt->missing_ok); if (!OidIsValid(schemaId)) { + Assert(stmt->missing_ok); return; } @@ -4364,16 +4367,22 @@ ConvertToTenantTableIfNecessary(AlterObjectSchemaStmt *stmt) * that by seeing the table is still a single shard table. (i.e. not undistributed * at `preprocess` step) */ - if (!IsCitusTableType(relationId, SINGLE_SHARD_DISTRIBUTED) && - IsTenantSchema(schemaId)) + if (IsCitusTableType(relationId, SINGLE_SHARD_DISTRIBUTED)) { - EnsureTenantTable(relationId, "ALTER TABLE SET SCHEMA"); - - char *schemaName = get_namespace_name(schemaId); - char *tableName = stmt->relation->relname; - ereport(NOTICE, (errmsg("Moving %s into distributed schema %s", - tableName, schemaName))); - - CreateTenantSchemaTable(relationId); + return; } + + if (!ShouldCreateTenantSchemaTable(relationId)) + { + return; + } + + EnsureTenantTable(relationId, "ALTER TABLE SET SCHEMA"); + + char *schemaName = get_namespace_name(schemaId); + char *tableName = stmt->relation->relname; + ereport(NOTICE, (errmsg("Moving %s into distributed schema %s", + tableName, schemaName))); + + CreateTenantSchemaTable(relationId); }