From a504f6bc05fbb867330e5c1fdb821e03bd38e20d Mon Sep 17 00:00:00 2001 From: Andreas Karlsson Date: Thu, 27 Feb 2025 12:27:45 +0100 Subject: [PATCH] Simplify check for if heap AM related extensions can be used Instead of checking for the oid of the AM we check for if the access method of the relation uses the routine struct as the heap does. This allows the tools to be support all access methods which are simple copies of heap. I am uncertain if this is something which the project would be interested in but it decreases the size of our diff against upstream. --- contrib/amcheck/verify_heapam.c | 2 +- contrib/pageinspect/heapfuncs.c | 2 +- contrib/pg_surgery/heap_surgery.c | 2 +- contrib/pg_tde/src/include/common/pg_tde_utils.h | 1 - contrib/pg_tde/src/pg_tde_event_capture.c | 8 ++++++++ contrib/pgrowlocks/pgrowlocks.c | 2 +- contrib/pgstattuple/pgstatapprox.c | 2 +- contrib/pgstattuple/pgstattuple.c | 2 +- src/backend/access/table/tableam.c | 7 ------- src/include/access/tableam.h | 2 -- 10 files changed, 14 insertions(+), 16 deletions(-) diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index 4d5180c10ef..9ed245e2db7 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -305,7 +305,7 @@ verify_heapam(PG_FUNCTION_ARGS) * Other relkinds might be using a different AM, so check. */ if (ctx.rel->rd_rel->relkind != RELKIND_SEQUENCE && - ctx.rel->rd_rel->relam != HEAP_TABLE_AM_OID && ctx.rel->rd_rel->relam != get_tde_table_am_oid()) + ctx.rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 6bbfe5f789f..27225150a5a 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -325,7 +325,7 @@ tuple_data_split_internal(Oid relid, char *tupdata, * Sequences always use heap AM, but they don't show that in the catalogs. */ if (rel->rd_rel->relkind != RELKIND_SEQUENCE && - rel->rd_rel->relam != HEAP_TABLE_AM_OID && rel->rd_rel->relam != get_tde_table_am_oid()) + rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pg_surgery/heap_surgery.c b/contrib/pg_surgery/heap_surgery.c index 4d405f79db5..6aaca45598b 100644 --- a/contrib/pg_surgery/heap_surgery.c +++ b/contrib/pg_surgery/heap_surgery.c @@ -112,7 +112,7 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) RelationGetRelationName(rel)), errdetail_relkind_not_supported(rel->rd_rel->relkind))); - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID && rel->rd_rel->relam != get_tde_table_am_oid()) + if (rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pg_tde/src/include/common/pg_tde_utils.h b/contrib/pg_tde/src/include/common/pg_tde_utils.h index 64a21de5231..484d3013b37 100644 --- a/contrib/pg_tde/src/include/common/pg_tde_utils.h +++ b/contrib/pg_tde/src/include/common/pg_tde_utils.h @@ -14,7 +14,6 @@ #include "nodes/pg_list.h" extern Oid get_tde_basic_table_am_oid(void); -extern Oid get_tde_table_am_oid(void); extern List *get_all_tde_tables(void); extern int get_tde_tables_count(void); #endif /* !FRONTEND */ diff --git a/contrib/pg_tde/src/pg_tde_event_capture.c b/contrib/pg_tde/src/pg_tde_event_capture.c index d9b91d56746..3a03eba5b68 100644 --- a/contrib/pg_tde/src/pg_tde_event_capture.c +++ b/contrib/pg_tde/src/pg_tde_event_capture.c @@ -15,6 +15,7 @@ #include "utils/rel.h" #include "utils/builtins.h" #include "catalog/pg_class.h" +#include "commands/defrem.h" #include "access/table.h" #include "access/relation.h" #include "catalog/pg_event_trigger.h" @@ -38,6 +39,7 @@ int event_trigger_level = 0; static void reset_current_tde_create_event(void); +static Oid get_tde_table_am_oid(void); PG_FUNCTION_INFO_V1(pg_tde_ddl_command_start_capture); PG_FUNCTION_INFO_V1(pg_tde_ddl_command_end_capture); @@ -294,3 +296,9 @@ reset_current_tde_create_event(void) tdeCurrentCreateEvent.relation = NULL; alterSetAccessMethod = false; } + +static Oid +get_tde_table_am_oid(void) +{ + return get_table_am_oid("tde_heap", false); +} diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index 71af3d0d021..6491c7144fe 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -92,7 +92,7 @@ pgrowlocks(PG_FUNCTION_ARGS) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is not a table", RelationGetRelationName(rel)))); - else if (rel->rd_rel->relam != HEAP_TABLE_AM_OID && rel->rd_rel->relam != get_tde_table_am_oid()) + else if (rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pgstattuple/pgstatapprox.c b/contrib/pgstattuple/pgstatapprox.c index 9b3946cc878..73cfe226b9e 100644 --- a/contrib/pgstattuple/pgstatapprox.c +++ b/contrib/pgstattuple/pgstatapprox.c @@ -293,7 +293,7 @@ pgstattuple_approx_internal(Oid relid, FunctionCallInfo fcinfo) RelationGetRelationName(rel)), errdetail_relkind_not_supported(rel->rd_rel->relkind))); - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID && rel->rd_rel->relam != get_tde_table_am_oid()) + if (rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index be1be00404c..16b7fe4f555 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -327,7 +327,7 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo) * Sequences always use heap AM, but they don't show that in the catalogs. */ if (rel->rd_rel->relkind != RELKIND_SEQUENCE && - rel->rd_rel->relam != HEAP_TABLE_AM_OID && rel->rd_rel->relam != get_tde_table_am_oid()) + rel->rd_tableam != GetHeapamTableAmRoutine()) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 00c22301154..9e0fae5194a 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -757,10 +757,3 @@ table_block_relation_estimate_size(Relation rel, int32 *attr_widths, else *allvisfrac = (double) relallvisible / curpages; } - - -Oid -get_tde_table_am_oid(void) -{ - return get_table_am_oid("tde_heap", false); -} diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 016c6d503c9..7be7887b4a8 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -2107,6 +2107,4 @@ extern const TableAmRoutine *GetTableAmRoutine(Oid amhandler); extern const TableAmRoutine *GetHeapamTableAmRoutine(void); -extern Oid get_tde_table_am_oid(void); - #endif /* TABLEAM_H */