On 2024-Mar-26, Alexander Lakhin wrote: > Hello Alvaro, > > 21.03.2024 15:07, Alvaro Herrera wrote: > > Given that Michaël is temporarily gone, I propose to push the attached > > tomorrow. > > Please look at a new anomaly introduced with 374c7a229. > Starting from that commit, the following erroneous query: > CREATE FOREIGN TABLE fp PARTITION OF pg_am DEFAULT SERVER x; > > triggers an assertion failure: > TRAP: failed Assert("relation->rd_rel->relam == InvalidOid"), File: > "relcache.c", Line: 1219, PID: 3706301
Hmm, yeah, we're setting relam for relations that shouldn't have it. I propose the attached. -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/
>From 8b68591cea43fdc50fe53f11b077fcd42d501946 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera <alvhe...@alvh.no-ip.org> Date: Tue, 26 Mar 2024 11:58:53 +0100 Subject: [PATCH] relam fixes --- src/backend/commands/tablecmds.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 635d54645d..315d355238 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -714,7 +714,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, Oid ofTypeId; ObjectAddress address; LOCKMODE parentLockmode; - Oid accessMethodId = InvalidOid; + Oid accessMethodId; /* * Truncate relname to appropriate length (probably a waste of time, as @@ -958,15 +958,21 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, } /* - * Select access method to use: an explicitly indicated one, or (in the - * case of a partitioned table) the parent's, if it has one. + * For relations with table AM and partitioned tables, select access method + * to use: an explicitly indicated one, or (in the case of a partitioned + * table) the parent's, if it has one. */ - if (stmt->accessMethod != NULL) - accessMethodId = get_table_am_oid(stmt->accessMethod, false); - else if (stmt->partbound) + if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE) { - Assert(list_length(inheritOids) == 1); - accessMethodId = get_rel_relam(linitial_oid(inheritOids)); + if (stmt->accessMethod != NULL) + accessMethodId = get_table_am_oid(stmt->accessMethod, false); + else if (stmt->partbound) + { + Assert(list_length(inheritOids) == 1); + accessMethodId = get_rel_relam(linitial_oid(inheritOids)); + } + else + accessMethodId = InvalidOid; } else accessMethodId = InvalidOid; -- 2.39.2