diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 9feebf73205..d8c2d35bfaf 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -3019,6 +3019,7 @@ static const TableAmRoutine heapam_methods = { .relation_nontransactional_truncate = heapam_relation_nontransactional_truncate, .relation_copy_data = heapam_relation_copy_data, .relation_copy_for_cluster = heapam_relation_copy_for_cluster, + .relation_cluster = NULL, .relation_vacuum = heap_vacuum_rel, .scan_analyze_next_block = heapam_scan_analyze_next_block, .scan_analyze_next_tuple = heapam_scan_analyze_next_tuple, diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 78f96789b0e..2b1418aa3aa 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -474,7 +474,10 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) TransferPredicateLocksToHeapRelation(OldHeap); /* rebuild_relation does all the dirty work */ - rebuild_relation(OldHeap, indexOid, verbose); + if (OldHeap->rd_tableam && OldHeap->rd_tableam->relation_cluster) + OldHeap->rd_tableam->relation_cluster(OldHeap, verbose); + else + rebuild_relation(OldHeap, indexOid, verbose); /* NB: rebuild_relation does table_close() on OldHeap */ diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 52a8b6018df..4b892294439 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -920,6 +920,11 @@ typedef struct TableAmRoutine BlockNumber *totalpages); bytea *(*reloptions) (char relkind, Datum reloptions, bool validate); + + /* hook for relation clustering. */ + void (*relation_cluster) (Relation OldTable, + bool verbose); + } TableAmRoutine;