v1-0001-Stop-heap-allocating-IndexAmRoutine-for-every-ind.patch
application/octet-stream
Filename: v1-0001-Stop-heap-allocating-IndexAmRoutine-for-every-ind.patch
Type: application/octet-stream
Part: 1
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v1-0001
Subject: Stop heap-allocating IndexAmRoutine for every index
| File | + | − |
|---|---|---|
| contrib/bloom/blutils.c | 56 | 55 |
| src/backend/access/brin/brin.c | 57 | 56 |
| src/backend/access/gin/ginutil.c | 55 | 54 |
| src/backend/access/gist/gist.c | 57 | 56 |
| src/backend/access/hash/hash.c | 57 | 56 |
| src/backend/access/index/amapi.c | 5 | 7 |
| src/backend/access/nbtree/nbtree.c | 57 | 56 |
| src/backend/access/spgist/spgutils.c | 57 | 56 |
| src/backend/catalog/index.c | 1 | 3 |
| src/backend/commands/indexcmds.c | 2 | 3 |
| src/backend/commands/opclasscmds.c | 4 | 4 |
| src/backend/executor/execAmi.c | 1 | 2 |
| src/backend/optimizer/util/plancat.c | 1 | 1 |
| src/backend/utils/adt/amutils.c | 2 | 2 |
| src/backend/utils/adt/ruleutils.c | 1 | 1 |
| src/backend/utils/cache/lsyscache.c | 4 | 5 |
| src/backend/utils/cache/relcache.c | 1 | 16 |
| src/include/access/amapi.h | 2 | 2 |
| src/include/utils/rel.h | 1 | 1 |
| src/test/modules/dummy_index_am/dummy_index_am.c | 51 | 50 |
From 206d5c0da8acfa749744ecc8f12cd83bf940dd82 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Sat, 10 May 2025 12:38:46 +0200
Subject: [PATCH v1 1/2] Stop heap-allocating IndexAmRoutine for every index
By making every IndexAmRoutine a static const*, we save a lot of memory.
---
contrib/bloom/blutils.c | 111 ++++++++---------
src/backend/access/brin/brin.c | 113 +++++++++---------
src/backend/access/gin/ginutil.c | 109 ++++++++---------
src/backend/access/gist/gist.c | 113 +++++++++---------
src/backend/access/hash/hash.c | 113 +++++++++---------
src/backend/access/index/amapi.c | 12 +-
src/backend/access/nbtree/nbtree.c | 113 +++++++++---------
src/backend/access/spgist/spgutils.c | 113 +++++++++---------
src/backend/catalog/index.c | 4 +-
src/backend/commands/indexcmds.c | 5 +-
src/backend/commands/opclasscmds.c | 8 +-
src/backend/executor/execAmi.c | 3 +-
src/backend/optimizer/util/plancat.c | 2 +-
src/backend/utils/adt/amutils.c | 4 +-
src/backend/utils/adt/ruleutils.c | 2 +-
src/backend/utils/cache/lsyscache.c | 9 +-
src/backend/utils/cache/relcache.c | 17 +--
src/include/access/amapi.h | 4 +-
src/include/utils/rel.h | 2 +-
.../modules/dummy_index_am/dummy_index_am.c | 101 ++++++++--------
20 files changed, 472 insertions(+), 486 deletions(-)
diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c
index 2c0e71eedc6..7b45993e096 100644
--- a/contrib/bloom/blutils.c
+++ b/contrib/bloom/blutils.c
@@ -102,61 +102,62 @@ makeDefaultBloomOptions(void)
Datum
blhandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = BLOOM_NSTRATEGIES;
- amroutine->amsupport = BLOOM_NPROC;
- amroutine->amoptsprocnum = BLOOM_OPTIONS_PROC;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = true;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = false;
- amroutine->amstorage = false;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = false;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = false;
- amroutine->amcaninclude = false;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = blbuild;
- amroutine->ambuildempty = blbuildempty;
- amroutine->aminsert = blinsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = blbulkdelete;
- amroutine->amvacuumcleanup = blvacuumcleanup;
- amroutine->amcanreturn = NULL;
- amroutine->amcostestimate = blcostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = bloptions;
- amroutine->amproperty = NULL;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = blvalidate;
- amroutine->amadjustmembers = NULL;
- amroutine->ambeginscan = blbeginscan;
- amroutine->amrescan = blrescan;
- amroutine->amgettuple = NULL;
- amroutine->amgetbitmap = blgetbitmap;
- amroutine->amendscan = blendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
- amroutine->amtranslatestrategy = NULL;
- amroutine->amtranslatecmptype = NULL;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = BLOOM_NSTRATEGIES,
+ .amsupport = BLOOM_NPROC,
+ .amoptsprocnum = BLOOM_OPTIONS_PROC,
+ .amcanorder = false,
+ .amcanorderbyop = false,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = true,
+ .amoptionalkey = true,
+ .amsearcharray = false,
+ .amsearchnulls = false,
+ .amstorage = false,
+ .amclusterable = false,
+ .ampredlocks = false,
+ .amcanparallel = false,
+ .amcanbuildparallel = false,
+ .amcaninclude = false,
+ .amusemaintenanceworkmem = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = blbuild,
+ .ambuildempty = blbuildempty,
+ .aminsert = blinsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = blbulkdelete,
+ .amvacuumcleanup = blvacuumcleanup,
+ .amcanreturn = NULL,
+ .amcostestimate = blcostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = bloptions,
+ .amproperty = NULL,
+ .ambuildphasename = NULL,
+ .amvalidate = blvalidate,
+ .amadjustmembers = NULL,
+ .ambeginscan = blbeginscan,
+ .amrescan = blrescan,
+ .amgettuple = NULL,
+ .amgetbitmap = blgetbitmap,
+ .amendscan = blendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ .amtranslatestrategy = NULL,
+ .amtranslatecmptype = NULL,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c
index 01e1db7f856..22a24db49a7 100644
--- a/src/backend/access/brin/brin.c
+++ b/src/backend/access/brin/brin.c
@@ -249,62 +249,63 @@ static void _brin_parallel_scan_and_build(BrinBuildState *state,
Datum
brinhandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = 0;
- amroutine->amsupport = BRIN_LAST_OPTIONAL_PROCNUM;
- amroutine->amoptsprocnum = BRIN_PROCNUM_OPTIONS;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = true;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = true;
- amroutine->amstorage = true;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = false;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = true;
- amroutine->amcaninclude = false;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = true;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = brinbuild;
- amroutine->ambuildempty = brinbuildempty;
- amroutine->aminsert = brininsert;
- amroutine->aminsertcleanup = brininsertcleanup;
- amroutine->ambulkdelete = brinbulkdelete;
- amroutine->amvacuumcleanup = brinvacuumcleanup;
- amroutine->amcanreturn = NULL;
- amroutine->amcostestimate = brincostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = brinoptions;
- amroutine->amproperty = NULL;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = brinvalidate;
- amroutine->amadjustmembers = NULL;
- amroutine->ambeginscan = brinbeginscan;
- amroutine->amrescan = brinrescan;
- amroutine->amgettuple = NULL;
- amroutine->amgetbitmap = bringetbitmap;
- amroutine->amendscan = brinendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
- amroutine->amtranslatestrategy = NULL;
- amroutine->amtranslatecmptype = NULL;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = 0,
+ .amsupport = BRIN_LAST_OPTIONAL_PROCNUM,
+ .amoptsprocnum = BRIN_PROCNUM_OPTIONS,
+ .amcanorder = false,
+ .amcanorderbyop = false,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = true,
+ .amoptionalkey = true,
+ .amsearcharray = false,
+ .amsearchnulls = true,
+ .amstorage = true,
+ .amclusterable = false,
+ .ampredlocks = false,
+ .amcanparallel = false,
+ .amcanbuildparallel = true,
+ .amcaninclude = false,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = true,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = brinbuild,
+ .ambuildempty = brinbuildempty,
+ .aminsert = brininsert,
+ .aminsertcleanup = brininsertcleanup,
+ .ambulkdelete = brinbulkdelete,
+ .amvacuumcleanup = brinvacuumcleanup,
+ .amcanreturn = NULL,
+ .amcostestimate = brincostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = brinoptions,
+ .amproperty = NULL,
+ .ambuildphasename = NULL,
+ .amvalidate = brinvalidate,
+ .amadjustmembers = NULL,
+ .ambeginscan = brinbeginscan,
+ .amrescan = brinrescan,
+ .amgettuple = NULL,
+ .amgetbitmap = bringetbitmap,
+ .amendscan = brinendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ .amtranslatestrategy = NULL,
+ .amtranslatecmptype = NULL,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c
index 78f7b7a2495..5b086faf465 100644
--- a/src/backend/access/gin/ginutil.c
+++ b/src/backend/access/gin/ginutil.c
@@ -37,60 +37,61 @@
Datum
ginhandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = 0;
- amroutine->amsupport = GINNProcs;
- amroutine->amoptsprocnum = GIN_OPTIONS_PROC;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = true;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = false;
- amroutine->amstorage = true;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = true;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = true;
- amroutine->amcaninclude = false;
- amroutine->amusemaintenanceworkmem = true;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = ginbuild;
- amroutine->ambuildempty = ginbuildempty;
- amroutine->aminsert = gininsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = ginbulkdelete;
- amroutine->amvacuumcleanup = ginvacuumcleanup;
- amroutine->amcanreturn = NULL;
- amroutine->amcostestimate = gincostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = ginoptions;
- amroutine->amproperty = NULL;
- amroutine->ambuildphasename = ginbuildphasename;
- amroutine->amvalidate = ginvalidate;
- amroutine->amadjustmembers = ginadjustmembers;
- amroutine->ambeginscan = ginbeginscan;
- amroutine->amrescan = ginrescan;
- amroutine->amgettuple = NULL;
- amroutine->amgetbitmap = gingetbitmap;
- amroutine->amendscan = ginendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = 0,
+ .amsupport = GINNProcs,
+ .amoptsprocnum = GIN_OPTIONS_PROC,
+ .amcanorder = false,
+ .amcanorderbyop = false,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = true,
+ .amoptionalkey = true,
+ .amsearcharray = false,
+ .amsearchnulls = false,
+ .amstorage = true,
+ .amclusterable = false,
+ .ampredlocks = true,
+ .amcanparallel = false,
+ .amcanbuildparallel = true,
+ .amcaninclude = false,
+ .amusemaintenanceworkmem = true,
+ .amsummarizing = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = ginbuild,
+ .ambuildempty = ginbuildempty,
+ .aminsert = gininsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = ginbulkdelete,
+ .amvacuumcleanup = ginvacuumcleanup,
+ .amcanreturn = NULL,
+ .amcostestimate = gincostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = ginoptions,
+ .amproperty = NULL,
+ .ambuildphasename = ginbuildphasename,
+ .amvalidate = ginvalidate,
+ .amadjustmembers = ginadjustmembers,
+ .ambeginscan = ginbeginscan,
+ .amrescan = ginrescan,
+ .amgettuple = NULL,
+ .amgetbitmap = gingetbitmap,
+ .amendscan = ginendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c
index 7b24380c978..3641b41f7cf 100644
--- a/src/backend/access/gist/gist.c
+++ b/src/backend/access/gist/gist.c
@@ -58,62 +58,63 @@ static void gistprunepage(Relation rel, Page page, Buffer buffer,
Datum
gisthandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = 0;
- amroutine->amsupport = GISTNProcs;
- amroutine->amoptsprocnum = GIST_OPTIONS_PROC;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = true;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = true;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = true;
- amroutine->amstorage = true;
- amroutine->amclusterable = true;
- amroutine->ampredlocks = true;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = false;
- amroutine->amcaninclude = true;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = gistbuild;
- amroutine->ambuildempty = gistbuildempty;
- amroutine->aminsert = gistinsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = gistbulkdelete;
- amroutine->amvacuumcleanup = gistvacuumcleanup;
- amroutine->amcanreturn = gistcanreturn;
- amroutine->amcostestimate = gistcostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = gistoptions;
- amroutine->amproperty = gistproperty;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = gistvalidate;
- amroutine->amadjustmembers = gistadjustmembers;
- amroutine->ambeginscan = gistbeginscan;
- amroutine->amrescan = gistrescan;
- amroutine->amgettuple = gistgettuple;
- amroutine->amgetbitmap = gistgetbitmap;
- amroutine->amendscan = gistendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
- amroutine->amtranslatestrategy = NULL;
- amroutine->amtranslatecmptype = gisttranslatecmptype;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = 0,
+ .amsupport = GISTNProcs,
+ .amoptsprocnum = GIST_OPTIONS_PROC,
+ .amcanorder = false,
+ .amcanorderbyop = true,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = true,
+ .amoptionalkey = true,
+ .amsearcharray = false,
+ .amsearchnulls = true,
+ .amstorage = true,
+ .amclusterable = true,
+ .ampredlocks = true,
+ .amcanparallel = false,
+ .amcanbuildparallel = false,
+ .amcaninclude = true,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = gistbuild,
+ .ambuildempty = gistbuildempty,
+ .aminsert = gistinsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = gistbulkdelete,
+ .amvacuumcleanup = gistvacuumcleanup,
+ .amcanreturn = gistcanreturn,
+ .amcostestimate = gistcostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = gistoptions,
+ .amproperty = gistproperty,
+ .ambuildphasename = NULL,
+ .amvalidate = gistvalidate,
+ .amadjustmembers = gistadjustmembers,
+ .ambeginscan = gistbeginscan,
+ .amrescan = gistrescan,
+ .amgettuple = gistgettuple,
+ .amgetbitmap = gistgetbitmap,
+ .amendscan = gistendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ .amtranslatestrategy = NULL,
+ .amtranslatecmptype = gisttranslatecmptype,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c
index 53061c819fb..353fc03b989 100644
--- a/src/backend/access/hash/hash.c
+++ b/src/backend/access/hash/hash.c
@@ -57,62 +57,63 @@ static void hashbuildCallback(Relation index,
Datum
hashhandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = HTMaxStrategyNumber;
- amroutine->amsupport = HASHNProcs;
- amroutine->amoptsprocnum = HASHOPTIONS_PROC;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = true;
- amroutine->amconsistentequality = true;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = true;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = false;
- amroutine->amoptionalkey = false;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = false;
- amroutine->amstorage = false;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = true;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = false;
- amroutine->amcaninclude = false;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL;
- amroutine->amkeytype = INT4OID;
-
- amroutine->ambuild = hashbuild;
- amroutine->ambuildempty = hashbuildempty;
- amroutine->aminsert = hashinsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = hashbulkdelete;
- amroutine->amvacuumcleanup = hashvacuumcleanup;
- amroutine->amcanreturn = NULL;
- amroutine->amcostestimate = hashcostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = hashoptions;
- amroutine->amproperty = NULL;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = hashvalidate;
- amroutine->amadjustmembers = hashadjustmembers;
- amroutine->ambeginscan = hashbeginscan;
- amroutine->amrescan = hashrescan;
- amroutine->amgettuple = hashgettuple;
- amroutine->amgetbitmap = hashgetbitmap;
- amroutine->amendscan = hashendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
- amroutine->amtranslatestrategy = hashtranslatestrategy;
- amroutine->amtranslatecmptype = hashtranslatecmptype;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = HTMaxStrategyNumber,
+ .amsupport = HASHNProcs,
+ .amoptsprocnum = HASHOPTIONS_PROC,
+ .amcanorder = false,
+ .amcanorderbyop = false,
+ .amcanhash = true,
+ .amconsistentequality = true,
+ .amconsistentordering = false,
+ .amcanbackward = true,
+ .amcanunique = false,
+ .amcanmulticol = false,
+ .amoptionalkey = false,
+ .amsearcharray = false,
+ .amsearchnulls = false,
+ .amstorage = false,
+ .amclusterable = false,
+ .ampredlocks = true,
+ .amcanparallel = false,
+ .amcanbuildparallel = false,
+ .amcaninclude = false,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL,
+ .amkeytype = INT4OID,
+
+ .ambuild = hashbuild,
+ .ambuildempty = hashbuildempty,
+ .aminsert = hashinsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = hashbulkdelete,
+ .amvacuumcleanup = hashvacuumcleanup,
+ .amcanreturn = NULL,
+ .amcostestimate = hashcostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = hashoptions,
+ .amproperty = NULL,
+ .ambuildphasename = NULL,
+ .amvalidate = hashvalidate,
+ .amadjustmembers = hashadjustmembers,
+ .ambeginscan = hashbeginscan,
+ .amrescan = hashrescan,
+ .amgettuple = hashgettuple,
+ .amgetbitmap = hashgetbitmap,
+ .amendscan = hashendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ .amtranslatestrategy = hashtranslatestrategy,
+ .amtranslatecmptype = hashtranslatecmptype,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/index/amapi.c b/src/backend/access/index/amapi.c
index f0f4f974bce..40e8c88924a 100644
--- a/src/backend/access/index/amapi.c
+++ b/src/backend/access/index/amapi.c
@@ -29,7 +29,7 @@
* any catalog access. It's therefore safe to use this while bootstrapping
* indexes for the system catalogs. relcache.c relies on that.
*/
-IndexAmRoutine *
+const IndexAmRoutine *
GetIndexAmRoutine(Oid amhandler)
{
Datum datum;
@@ -52,7 +52,7 @@ GetIndexAmRoutine(Oid amhandler)
* If the given OID isn't a valid index access method, returns NULL if
* noerror is true, else throws error.
*/
-IndexAmRoutine *
+const IndexAmRoutine *
GetIndexAmRoutineByAmId(Oid amoid, bool noerror)
{
HeapTuple tuple;
@@ -118,7 +118,7 @@ CompareType
IndexAmTranslateStrategy(StrategyNumber strategy, Oid amoid, Oid opfamily, bool missing_ok)
{
CompareType result;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
/* shortcut for common case */
if (amoid == BTREE_AM_OID &&
@@ -148,7 +148,7 @@ StrategyNumber
IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, bool missing_ok)
{
StrategyNumber result;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
/* shortcut for common case */
if (amoid == BTREE_AM_OID &&
@@ -178,7 +178,7 @@ amvalidate(PG_FUNCTION_ARGS)
HeapTuple classtup;
Form_pg_opclass classform;
Oid amoid;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
classtup = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclassoid));
if (!HeapTupleIsValid(classtup))
@@ -197,7 +197,5 @@ amvalidate(PG_FUNCTION_ARGS)
result = amroutine->amvalidate(opclassoid);
- pfree(amroutine);
-
PG_RETURN_BOOL(result);
}
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 765659887af..f89067c90bd 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -114,62 +114,63 @@ static BTVacuumPosting btreevacuumposting(BTVacState *vstate,
Datum
bthandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = BTMaxStrategyNumber;
- amroutine->amsupport = BTNProcs;
- amroutine->amoptsprocnum = BTOPTIONS_PROC;
- amroutine->amcanorder = true;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = true;
- amroutine->amconsistentordering = true;
- amroutine->amcanbackward = true;
- amroutine->amcanunique = true;
- amroutine->amcanmulticol = true;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = true;
- amroutine->amsearchnulls = true;
- amroutine->amstorage = false;
- amroutine->amclusterable = true;
- amroutine->ampredlocks = true;
- amroutine->amcanparallel = true;
- amroutine->amcanbuildparallel = true;
- amroutine->amcaninclude = true;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = btbuild;
- amroutine->ambuildempty = btbuildempty;
- amroutine->aminsert = btinsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = btbulkdelete;
- amroutine->amvacuumcleanup = btvacuumcleanup;
- amroutine->amcanreturn = btcanreturn;
- amroutine->amcostestimate = btcostestimate;
- amroutine->amgettreeheight = btgettreeheight;
- amroutine->amoptions = btoptions;
- amroutine->amproperty = btproperty;
- amroutine->ambuildphasename = btbuildphasename;
- amroutine->amvalidate = btvalidate;
- amroutine->amadjustmembers = btadjustmembers;
- amroutine->ambeginscan = btbeginscan;
- amroutine->amrescan = btrescan;
- amroutine->amgettuple = btgettuple;
- amroutine->amgetbitmap = btgetbitmap;
- amroutine->amendscan = btendscan;
- amroutine->ammarkpos = btmarkpos;
- amroutine->amrestrpos = btrestrpos;
- amroutine->amestimateparallelscan = btestimateparallelscan;
- amroutine->aminitparallelscan = btinitparallelscan;
- amroutine->amparallelrescan = btparallelrescan;
- amroutine->amtranslatestrategy = bttranslatestrategy;
- amroutine->amtranslatecmptype = bttranslatecmptype;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = BTMaxStrategyNumber,
+ .amsupport = BTNProcs,
+ .amoptsprocnum = BTOPTIONS_PROC,
+ .amcanorder = true,
+ .amcanorderbyop = false,
+ .amcanhash = false,
+ .amconsistentequality = true,
+ .amconsistentordering = true,
+ .amcanbackward = true,
+ .amcanunique = true,
+ .amcanmulticol = true,
+ .amoptionalkey = true,
+ .amsearcharray = true,
+ .amsearchnulls = true,
+ .amstorage = false,
+ .amclusterable = true,
+ .ampredlocks = true,
+ .amcanparallel = true,
+ .amcanbuildparallel = true,
+ .amcaninclude = true,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = btbuild,
+ .ambuildempty = btbuildempty,
+ .aminsert = btinsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = btbulkdelete,
+ .amvacuumcleanup = btvacuumcleanup,
+ .amcanreturn = btcanreturn,
+ .amcostestimate = btcostestimate,
+ .amgettreeheight = btgettreeheight,
+ .amoptions = btoptions,
+ .amproperty = btproperty,
+ .ambuildphasename = btbuildphasename,
+ .amvalidate = btvalidate,
+ .amadjustmembers = btadjustmembers,
+ .ambeginscan = btbeginscan,
+ .amrescan = btrescan,
+ .amgettuple = btgettuple,
+ .amgetbitmap = btgetbitmap,
+ .amendscan = btendscan,
+ .ammarkpos = btmarkpos,
+ .amrestrpos = btrestrpos,
+ .amestimateparallelscan = btestimateparallelscan,
+ .aminitparallelscan = btinitparallelscan,
+ .amparallelrescan = btparallelrescan,
+ .amtranslatestrategy = bttranslatestrategy,
+ .amtranslatecmptype = bttranslatecmptype,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c
index 95fea74e296..935d7afbbde 100644
--- a/src/backend/access/spgist/spgutils.c
+++ b/src/backend/access/spgist/spgutils.c
@@ -43,62 +43,63 @@
Datum
spghandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = 0;
- amroutine->amsupport = SPGISTNProc;
- amroutine->amoptsprocnum = SPGIST_OPTIONS_PROC;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = true;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = false;
- amroutine->amoptionalkey = true;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = true;
- amroutine->amstorage = true;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = false;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = false;
- amroutine->amcaninclude = true;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions =
- VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = spgbuild;
- amroutine->ambuildempty = spgbuildempty;
- amroutine->aminsert = spginsert;
- amroutine->aminsertcleanup = NULL;
- amroutine->ambulkdelete = spgbulkdelete;
- amroutine->amvacuumcleanup = spgvacuumcleanup;
- amroutine->amcanreturn = spgcanreturn;
- amroutine->amcostestimate = spgcostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = spgoptions;
- amroutine->amproperty = spgproperty;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = spgvalidate;
- amroutine->amadjustmembers = spgadjustmembers;
- amroutine->ambeginscan = spgbeginscan;
- amroutine->amrescan = spgrescan;
- amroutine->amgettuple = spggettuple;
- amroutine->amgetbitmap = spggetbitmap;
- amroutine->amendscan = spgendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
- amroutine->amtranslatestrategy = NULL;
- amroutine->amtranslatecmptype = NULL;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = 0,
+ .amsupport = SPGISTNProc,
+ .amoptsprocnum = SPGIST_OPTIONS_PROC,
+ .amcanorder = false,
+ .amcanorderbyop = true,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = false,
+ .amoptionalkey = true,
+ .amsearcharray = false,
+ .amsearchnulls = true,
+ .amstorage = true,
+ .amclusterable = false,
+ .ampredlocks = false,
+ .amcanparallel = false,
+ .amcanbuildparallel = false,
+ .amcaninclude = true,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = false,
+ .amparallelvacuumoptions =
+ VACUUM_OPTION_PARALLEL_BULKDEL | VACUUM_OPTION_PARALLEL_COND_CLEANUP,
+ .amkeytype = InvalidOid,
+
+ .ambuild = spgbuild,
+ .ambuildempty = spgbuildempty,
+ .aminsert = spginsert,
+ .aminsertcleanup = NULL,
+ .ambulkdelete = spgbulkdelete,
+ .amvacuumcleanup = spgvacuumcleanup,
+ .amcanreturn = spgcanreturn,
+ .amcostestimate = spgcostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = spgoptions,
+ .amproperty = spgproperty,
+ .ambuildphasename = NULL,
+ .amvalidate = spgvalidate,
+ .amadjustmembers = spgadjustmembers,
+ .ambeginscan = spgbeginscan,
+ .amrescan = spgrescan,
+ .amgettuple = spggettuple,
+ .amgetbitmap = spggetbitmap,
+ .amendscan = spgendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ .amtranslatestrategy = NULL,
+ .amtranslatecmptype = NULL,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
/*
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 739a92bdcc1..8253d9a8ddb 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -289,7 +289,7 @@ ConstructTupleDescriptor(Relation heapRelation,
int numkeyatts = indexInfo->ii_NumIndexKeyAttrs;
ListCell *colnames_item = list_head(indexColNames);
ListCell *indexpr_item = list_head(indexInfo->ii_Expressions);
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
TupleDesc heapTupDesc;
TupleDesc indexTupDesc;
int natts; /* #atts in heap rel --- for error checks */
@@ -481,8 +481,6 @@ ConstructTupleDescriptor(Relation heapRelation,
populate_compact_attribute(indexTupDesc, i);
}
- pfree(amroutine);
-
return indexTupDesc;
}
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 33c2106c17c..e4caeac0147 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -191,7 +191,7 @@ CheckIndexCompatible(Oid oldId,
HeapTuple tuple;
Form_pg_index indexForm;
Form_pg_am accessMethodForm;
- IndexAmRoutine *amRoutine;
+ const IndexAmRoutine *amRoutine;
bool amcanorder;
bool amsummarizing;
int16 *coloptions;
@@ -567,7 +567,7 @@ DefineIndex(Oid tableId,
Relation rel;
HeapTuple tuple;
Form_pg_am accessMethodForm;
- IndexAmRoutine *amRoutine;
+ const IndexAmRoutine *amRoutine;
bool amcanorder;
bool amissummarizing;
amoptions_function amoptions;
@@ -896,7 +896,6 @@ DefineIndex(Oid tableId,
amoptions = amRoutine->amoptions;
amissummarizing = amRoutine->amsummarizing;
- pfree(amRoutine);
ReleaseSysCache(tuple);
/*
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index a6dd8eab518..7c85eb5fcc1 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -349,7 +349,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
Relation rel;
HeapTuple tup;
Form_pg_am amform;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
Datum values[Natts_pg_opclass];
bool nulls[Natts_pg_opclass];
AclResult aclresult;
@@ -823,7 +823,7 @@ AlterOpFamily(AlterOpFamilyStmt *stmt)
maxProcNumber; /* amsupport value */
HeapTuple tup;
Form_pg_am amform;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
/* Get necessary info about access method */
tup = SearchSysCache1(AMNAME, CStringGetDatum(stmt->amname));
@@ -882,7 +882,7 @@ AlterOpFamilyAdd(AlterOpFamilyStmt *stmt, Oid amoid, Oid opfamilyoid,
int maxOpNumber, int maxProcNumber, int optsProcNumber,
List *items)
{
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
List *operators; /* OpFamilyMember list for operators */
List *procedures; /* OpFamilyMember list for support procs */
ListCell *l;
@@ -1165,7 +1165,7 @@ assignOperTypes(OpFamilyMember *member, Oid amoid, Oid typeoid)
* the family has been created but not yet populated with the required
* operators.)
*/
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
if (!amroutine->amcanorderbyop)
ereport(ERROR,
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index 1d0e8ad57b4..4893ea3ce91 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -605,7 +605,7 @@ IndexSupportsBackwardScan(Oid indexid)
bool result;
HeapTuple ht_idxrel;
Form_pg_class idxrelrec;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
/* Fetch the pg_class tuple of the index relation */
ht_idxrel = SearchSysCache1(RELOID, ObjectIdGetDatum(indexid));
@@ -618,7 +618,6 @@ IndexSupportsBackwardScan(Oid indexid)
result = amroutine->amcanbackward;
- pfree(amroutine);
ReleaseSysCache(ht_idxrel);
return result;
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 59233b64730..8180a5e418c 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -243,7 +243,7 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent,
Oid indexoid = lfirst_oid(l);
Relation indexRelation;
Form_pg_index index;
- IndexAmRoutine *amroutine = NULL;
+ const IndexAmRoutine *amroutine = NULL;
IndexOptInfo *info;
int ncolumns,
nkeycolumns;
diff --git a/src/backend/utils/adt/amutils.c b/src/backend/utils/adt/amutils.c
index 0af26d6acfa..59c0112c696 100644
--- a/src/backend/utils/adt/amutils.c
+++ b/src/backend/utils/adt/amutils.c
@@ -156,7 +156,7 @@ indexam_property(FunctionCallInfo fcinfo,
bool isnull = false;
int natts = 0;
IndexAMProperty prop;
- IndexAmRoutine *routine;
+ const IndexAmRoutine *routine;
/* Try to convert property name to enum (no error if not known) */
prop = lookup_prop_name(propname);
@@ -452,7 +452,7 @@ pg_indexam_progress_phasename(PG_FUNCTION_ARGS)
{
Oid amoid = PG_GETARG_OID(0);
int32 phasenum = PG_GETARG_INT32(1);
- IndexAmRoutine *routine;
+ const IndexAmRoutine *routine;
char *name;
routine = GetIndexAmRoutineByAmId(amoid, true);
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 467b08198b8..a9a2184e90b 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -1281,7 +1281,7 @@ pg_get_indexdef_worker(Oid indexrelid, int colno,
Form_pg_index idxrec;
Form_pg_class idxrelrec;
Form_pg_am amrec;
- IndexAmRoutine *amroutine;
+ const IndexAmRoutine *amroutine;
List *indexprs;
ListCell *indexpr_item;
List *context;
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index c460a72b75d..c927bef1224 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -232,10 +232,9 @@ get_opmethod_canorder(Oid amoid)
default:
{
bool result;
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(amoid, false);
result = amroutine->amcanorder;
- pfree(amroutine);
return result;
}
}
@@ -729,7 +728,7 @@ get_op_index_interpretation(Oid opno)
{
HeapTuple op_tuple = &catlist->members[i]->tuple;
Form_pg_amop op_form = (Form_pg_amop) GETSTRUCT(op_tuple);
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
CompareType cmptype;
/* must be ordering index */
@@ -803,7 +802,7 @@ equality_ops_are_compatible(Oid opno1, Oid opno2)
*/
if (op_in_opfamily(opno2, op_form->amopfamily))
{
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
if (amroutine->amconsistentequality)
{
@@ -859,7 +858,7 @@ comparison_ops_are_compatible(Oid opno1, Oid opno2)
*/
if (op_in_opfamily(opno2, op_form->amopfamily))
{
- IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
+ const IndexAmRoutine *amroutine = GetIndexAmRoutineByAmId(op_form->amopmethod, false);
if (amroutine->amconsistentordering)
{
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 68ff67de549..efeb65115ed 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -1420,22 +1420,7 @@ RelationInitPhysicalAddr(Relation relation)
static void
InitIndexAmRoutine(Relation relation)
{
- IndexAmRoutine *cached,
- *tmp;
-
- /*
- * Call the amhandler in current, short-lived memory context, just in case
- * it leaks anything (it probably won't, but let's be paranoid).
- */
- tmp = GetIndexAmRoutine(relation->rd_amhandler);
-
- /* OK, now transfer the data into relation's rd_indexcxt. */
- cached = (IndexAmRoutine *) MemoryContextAlloc(relation->rd_indexcxt,
- sizeof(IndexAmRoutine));
- memcpy(cached, tmp, sizeof(IndexAmRoutine));
- relation->rd_indam = cached;
-
- pfree(tmp);
+ relation->rd_indam = GetIndexAmRoutine(relation->rd_amhandler);
}
/*
diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h
index 52916bab7a3..de934396fa2 100644
--- a/src/include/access/amapi.h
+++ b/src/include/access/amapi.h
@@ -324,8 +324,8 @@ typedef struct IndexAmRoutine
/* Functions in access/index/amapi.c */
-extern IndexAmRoutine *GetIndexAmRoutine(Oid amhandler);
-extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror);
+extern const IndexAmRoutine *GetIndexAmRoutine(Oid amhandler);
+extern const IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror);
extern CompareType IndexAmTranslateStrategy(StrategyNumber strategy, Oid amoid, Oid opfamily, bool missing_ok);
extern StrategyNumber IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, bool missing_ok);
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index b552359915f..87b776c98fe 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -203,7 +203,7 @@ typedef struct RelationData
*/
MemoryContext rd_indexcxt; /* private memory cxt for this stuff */
/* use "struct" here to avoid needing to include amapi.h: */
- struct IndexAmRoutine *rd_indam; /* index AM's API struct */
+ const struct IndexAmRoutine *rd_indam; /* index AM's API struct */
Oid *rd_opfamily; /* OIDs of op families for each index col */
Oid *rd_opcintype; /* OIDs of opclass declared input data types */
RegProcedure *rd_support; /* OIDs of support procedures */
diff --git a/src/test/modules/dummy_index_am/dummy_index_am.c b/src/test/modules/dummy_index_am/dummy_index_am.c
index 94ef639b6fc..98a603892f4 100644
--- a/src/test/modules/dummy_index_am/dummy_index_am.c
+++ b/src/test/modules/dummy_index_am/dummy_index_am.c
@@ -276,56 +276,57 @@ diendscan(IndexScanDesc scan)
Datum
dihandler(PG_FUNCTION_ARGS)
{
- IndexAmRoutine *amroutine = makeNode(IndexAmRoutine);
-
- amroutine->amstrategies = 0;
- amroutine->amsupport = 1;
- amroutine->amcanorder = false;
- amroutine->amcanorderbyop = false;
- amroutine->amcanhash = false;
- amroutine->amconsistentequality = false;
- amroutine->amconsistentordering = false;
- amroutine->amcanbackward = false;
- amroutine->amcanunique = false;
- amroutine->amcanmulticol = false;
- amroutine->amoptionalkey = false;
- amroutine->amsearcharray = false;
- amroutine->amsearchnulls = false;
- amroutine->amstorage = false;
- amroutine->amclusterable = false;
- amroutine->ampredlocks = false;
- amroutine->amcanparallel = false;
- amroutine->amcanbuildparallel = false;
- amroutine->amcaninclude = false;
- amroutine->amusemaintenanceworkmem = false;
- amroutine->amsummarizing = false;
- amroutine->amparallelvacuumoptions = VACUUM_OPTION_NO_PARALLEL;
- amroutine->amkeytype = InvalidOid;
-
- amroutine->ambuild = dibuild;
- amroutine->ambuildempty = dibuildempty;
- amroutine->aminsert = diinsert;
- amroutine->ambulkdelete = dibulkdelete;
- amroutine->amvacuumcleanup = divacuumcleanup;
- amroutine->amcanreturn = NULL;
- amroutine->amcostestimate = dicostestimate;
- amroutine->amgettreeheight = NULL;
- amroutine->amoptions = dioptions;
- amroutine->amproperty = NULL;
- amroutine->ambuildphasename = NULL;
- amroutine->amvalidate = divalidate;
- amroutine->ambeginscan = dibeginscan;
- amroutine->amrescan = direscan;
- amroutine->amgettuple = NULL;
- amroutine->amgetbitmap = NULL;
- amroutine->amendscan = diendscan;
- amroutine->ammarkpos = NULL;
- amroutine->amrestrpos = NULL;
- amroutine->amestimateparallelscan = NULL;
- amroutine->aminitparallelscan = NULL;
- amroutine->amparallelrescan = NULL;
-
- PG_RETURN_POINTER(amroutine);
+ static const IndexAmRoutine amroutine = {
+ .type = T_IndexAmRoutine,
+ .amstrategies = 0,
+ .amsupport = 1,
+ .amcanorder = false,
+ .amcanorderbyop = false,
+ .amcanhash = false,
+ .amconsistentequality = false,
+ .amconsistentordering = false,
+ .amcanbackward = false,
+ .amcanunique = false,
+ .amcanmulticol = false,
+ .amoptionalkey = false,
+ .amsearcharray = false,
+ .amsearchnulls = false,
+ .amstorage = false,
+ .amclusterable = false,
+ .ampredlocks = false,
+ .amcanparallel = false,
+ .amcanbuildparallel = false,
+ .amcaninclude = false,
+ .amusemaintenanceworkmem = false,
+ .amsummarizing = false,
+ .amparallelvacuumoptions = VACUUM_OPTION_NO_PARALLEL,
+ .amkeytype = InvalidOid,
+
+ .ambuild = dibuild,
+ .ambuildempty = dibuildempty,
+ .aminsert = diinsert,
+ .ambulkdelete = dibulkdelete,
+ .amvacuumcleanup = divacuumcleanup,
+ .amcanreturn = NULL,
+ .amcostestimate = dicostestimate,
+ .amgettreeheight = NULL,
+ .amoptions = dioptions,
+ .amproperty = NULL,
+ .ambuildphasename = NULL,
+ .amvalidate = divalidate,
+ .ambeginscan = dibeginscan,
+ .amrescan = direscan,
+ .amgettuple = NULL,
+ .amgetbitmap = NULL,
+ .amendscan = diendscan,
+ .ammarkpos = NULL,
+ .amrestrpos = NULL,
+ .amestimateparallelscan = NULL,
+ .aminitparallelscan = NULL,
+ .amparallelrescan = NULL,
+ };
+
+ PG_RETURN_POINTER(&amroutine);
}
void
--
2.48.1