From: Justin Pryzby Date: Sun, 7 Mar 2021 02:05:23 -0600 Subject: [PATCH v2 3/3] Implement lsyscache get_rel_relam() --- src/backend/commands/tablecmds.c | 12 +----------- src/backend/utils/cache/lsyscache.c | 22 ++++++++++++++++++++++ src/include/utils/lsyscache.h | 1 + 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 73cd6e311b..21eaeec170 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -865,22 +865,12 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, accessMethodId = get_table_am_oid(stmt->accessMethod, false); else if (stmt->partbound && relkind == RELKIND_RELATION) { - HeapTuple tup; - Oid relid; - /* * For partitioned tables, when no access method is specified, we * default to the parent table's AM. */ Assert(list_length(inheritOids) == 1); - /* XXX: should implement get_rel_relam? */ - relid = linitial_oid(inheritOids); - tup = SearchSysCache1(RELOID, ObjectIdDatumGet(relid)); - accessMethodId = ((Form_pg_class) GETSTRUCT(tup))->relam; - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for relation %u", relid); - ReleaseSysCache(tup); - + accessMethodId = get_rel_relam(linitial_oid(inheritOids)); if (!OidIsValid(accessMethodId)) accessMethodId = get_table_am_oid(default_table_access_method, false); } diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 6bba5f8ec4..703d8d06be 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -2062,6 +2062,28 @@ get_rel_persistence(Oid relid) return result; } +/* + * get_rel_relam + * + * Returns the relam associated with a given relation. + */ +Oid +get_rel_relam(Oid relid) +{ + HeapTuple tp; + Form_pg_class reltup; + Oid result; + + tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for relation %u", relid); + reltup = (Form_pg_class) GETSTRUCT(tp); + result = reltup->relam; + ReleaseSysCache(tp); + + return result; +} + /* ---------- TRANSFORM CACHE ---------- */ diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index 77871aaefc..10145570fd 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -139,6 +139,7 @@ extern char get_rel_relkind(Oid relid); extern bool get_rel_relispartition(Oid relid); extern Oid get_rel_tablespace(Oid relid); extern char get_rel_persistence(Oid relid); +extern Oid get_rel_relam(Oid relid); extern Oid get_transform_fromsql(Oid typid, Oid langid, List *trftypes); extern Oid get_transform_tosql(Oid typid, Oid langid, List *trftypes); extern bool get_typisdefined(Oid typid); -- 2.17.0 --1X+6QtwRodzgDPAC--