From 2cc5f93c7052591c2372e4ef05e9a66c9960187d Mon Sep 17 00:00:00 2001 From: John Naylor Date: Wed, 28 Oct 2020 11:41:56 -0400 Subject: [PATCH v2] Use the standard symbol for the builtin function heap_tableam_handler() It's long been convention that OIDs of builtin functions are referenced via the automatically generated symbols in fmgroids.h. heap_tableam_handler() was able to receive a custom symbol because we had no enforcement otherwise. Change references to this function to use F_HEAP_TABLEAM_HANDLER instead, and forbid future pg_proc entries from specifying custom symbols. --- src/backend/catalog/genbki.pl | 7 +++++++ src/backend/utils/cache/relcache.c | 4 ++-- src/include/catalog/pg_proc.dat | 3 +-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index ef3105af44..4653a4d0cb 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -602,6 +602,13 @@ EOM # Emit OID symbol if (defined $bki_values{oid_symbol}) { + # OID symbols for builtin functions are handled automatically + # by utils/Gen_fmgrtab.pl + die sprintf + "custom OID symbols for pg_proc entries are not allowed: '%s'", + $bki_values{oid_symbol} + if $catname eq 'pg_proc'; + printf $def "#define %s %s\n", $bki_values{oid_symbol}, $bki_values{oid}; } diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 9061af81a3..9224e2ffed 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -1761,7 +1761,7 @@ RelationInitTableAccessMethod(Relation relation) * seem prudent to show that in the catalog. So just overwrite it * here. */ - relation->rd_amhandler = HEAP_TABLE_AM_HANDLER_OID; + relation->rd_amhandler = F_HEAP_TABLEAM_HANDLER; } else if (IsCatalogRelation(relation)) { @@ -1769,7 +1769,7 @@ RelationInitTableAccessMethod(Relation relation) * Avoid doing a syscache lookup for catalog tables. */ Assert(relation->rd_rel->relam == HEAP_TABLE_AM_OID); - relation->rd_amhandler = HEAP_TABLE_AM_HANDLER_OID; + relation->rd_amhandler = F_HEAP_TABLEAM_HANDLER; } else { diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index bbcac69d48..5045b493d3 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -901,8 +901,7 @@ prosrc => 'ftoi4' }, # Table access method handlers -{ oid => '3', oid_symbol => 'HEAP_TABLE_AM_HANDLER_OID', - descr => 'row-oriented heap table access method handler', +{ oid => '3', descr => 'row-oriented heap table access method handler', proname => 'heap_tableam_handler', provolatile => 'v', prorettype => 'table_am_handler', proargtypes => 'internal', prosrc => 'heap_tableam_handler' }, -- 2.22.0