0009-Let-table-AM-override-reloptions-for-indexes-buil-v2.patch
application/octet-stream
Filename: 0009-Let-table-AM-override-reloptions-for-indexes-buil-v2.patch
Type: application/octet-stream
Part: 5
Message:
Re: Table AM Interface Enhancements
Patch
Format: format-patch
Series: patch v2-0009
Subject: Let table AM override reloptions for indexes built on its tables
| File | + | − |
|---|---|---|
| src/backend/access/common/reloptions.c | 2 | 1 |
| src/backend/access/heap/heapam_handler.c | 8 | 0 |
| src/backend/commands/indexcmds.c | 2 | 1 |
| src/backend/commands/tablecmds.c | 8 | 1 |
| src/backend/utils/cache/relcache.c | 22 | 2 |
| src/include/access/tableam.h | 23 | 0 |
From e1f49d3499f2dcef0487881df245f760be89a2f2 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu, 14 Mar 2024 00:53:05 +0200
Subject: [PATCH 09/13] Let table AM override reloptions for indexes built on
its tables
---
src/backend/access/common/reloptions.c | 3 ++-
src/backend/access/heap/heapam_handler.c | 8 ++++++++
src/backend/commands/indexcmds.c | 3 ++-
src/backend/commands/tablecmds.c | 9 ++++++++-
src/backend/utils/cache/relcache.c | 24 ++++++++++++++++++++++--
src/include/access/tableam.h | 23 +++++++++++++++++++++++
6 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 963995388bb..00088240cdd 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -1411,7 +1411,8 @@ extractRelOptions(HeapTuple tuple, TupleDesc tupdesc,
break;
case RELKIND_INDEX:
case RELKIND_PARTITIONED_INDEX:
- options = index_reloptions(amoptions, datum, false);
+ options = tableam_indexoptions(tableam, amoptions, classForm->relkind,
+ datum, false);
break;
case RELKIND_FOREIGN_TABLE:
options = NULL;
diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c
index 781385270b0..422898a609d 100644
--- a/src/backend/access/heap/heapam_handler.c
+++ b/src/backend/access/heap/heapam_handler.c
@@ -2714,6 +2714,13 @@ heapam_reloptions(char relkind, Datum reloptions, bool validate)
return NULL;
}
+static bytea *
+heapam_indexoptions(amoptions_function amoptions, char relkind,
+ Datum reloptions, bool validate)
+{
+ return index_reloptions(amoptions, reloptions, validate);
+}
+
/* ------------------------------------------------------------------------
* Planner related callbacks for the heap AM
@@ -3219,6 +3226,7 @@ static const TableAmRoutine heapam_methods = {
.relation_toast_am = heapam_relation_toast_am,
.relation_fetch_toast_slice = heap_fetch_toast_slice,
.reloptions = heapam_reloptions,
+ .indexoptions = heapam_indexoptions,
.relation_estimate_size = heapam_estimate_rel_size,
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index 7b20d103c86..7299ebbe9f3 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -899,7 +899,8 @@ DefineIndex(Oid tableId,
reloptions = transformRelOptions((Datum) 0, stmt->options,
NULL, NULL, false, false);
- (void) index_reloptions(amoptions, reloptions, true);
+ (void) tableam_indexoptions(rel->rd_tableam, amoptions, RELKIND_INDEX,
+ reloptions, true);
/*
* Prepare arguments for index_create, primarily an IndexInfo structure.
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index d2ef8a0c383..fa8eb55b189 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -15328,7 +15328,14 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation,
break;
case RELKIND_INDEX:
case RELKIND_PARTITIONED_INDEX:
- (void) index_reloptions(rel->rd_indam->amoptions, newOptions, true);
+ {
+ Relation tbl = relation_open(rel->rd_index->indrelid,
+ AccessShareLock);
+
+ tableam_indexoptions(tbl->rd_tableam, rel->rd_indam->amoptions,
+ rel->rd_rel->relkind, newOptions, true);
+ relation_close(tbl, AccessShareLock);
+ }
break;
default:
ereport(ERROR,
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 3babfc804a7..b1a4b36aa14 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -478,15 +478,35 @@ RelationParseRelOptions(Relation relation, HeapTuple tuple)
{
case RELKIND_RELATION:
case RELKIND_TOASTVALUE:
- case RELKIND_VIEW:
case RELKIND_MATVIEW:
+ case RELKIND_VIEW:
case RELKIND_PARTITIONED_TABLE:
tableam = relation->rd_tableam;
amoptsfn = NULL;
break;
case RELKIND_INDEX:
case RELKIND_PARTITIONED_INDEX:
- amoptsfn = relation->rd_indam->amoptions;
+ {
+ Form_pg_class classForm;
+ HeapTuple classTup;
+
+ /* fetch the relation's relcache entry */
+ if (relation->rd_index->indrelid >= FirstNormalObjectId)
+ {
+ classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relation->rd_index->indrelid));
+ classForm = (Form_pg_class) GETSTRUCT(classTup);
+ if (classForm->relam >= FirstNormalObjectId)
+ tableam = GetTableAmRoutineByAmOid(classForm->relam);
+ else
+ tableam = GetHeapamTableAmRoutine();
+ heap_freetuple(classTup);
+ }
+ else
+ {
+ tableam = GetHeapamTableAmRoutine();
+ }
+ amoptsfn = relation->rd_indam->amoptions;
+ }
break;
default:
return;
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index 2a496e81610..1bfae380637 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -17,6 +17,7 @@
#ifndef TABLEAM_H
#define TABLEAM_H
+#include "access/amapi.h"
#include "access/relscan.h"
#include "access/sdir.h"
#include "access/xact.h"
@@ -738,6 +739,13 @@ typedef struct TableAmRoutine
*/
bytea *(*reloptions) (char relkind, Datum reloptions, bool validate);
+ /*
+ * Parse table AM-specific index options. Useful for table AM to define
+ * new index options or override existing index options.
+ */
+ bytea *(*indexoptions) (amoptions_function amoptions, char relkind,
+ Datum reloptions, bool validate);
+
/* ------------------------------------------------------------------------
* Planner related functions.
@@ -1963,6 +1971,21 @@ tableam_reloptions(const TableAmRoutine *tableam, char relkind,
extern bytea *index_reloptions(amoptions_function amoptions, Datum reloptions,
bool validate);
+/*
+ * Parse index options. Gives table AM a chance to override index-specific
+ * options defined in 'amoptions'.
+ */
+static inline bytea *
+tableam_indexoptions(const TableAmRoutine *tableam,
+ amoptions_function amoptions, char relkind,
+ Datum reloptions, bool validate)
+{
+ if (tableam)
+ return tableam->indexoptions(amoptions, relkind, reloptions, validate);
+ else
+ return index_reloptions(amoptions, reloptions, validate);
+}
+
/* ----------------------------------------------------------------------------
* Planner related functionality
--
2.39.3 (Apple Git-145)