Hi, When attempting to implement a new table access method, I discovered that relation_copy_for_cluster() has the following declaration:
void (*relation_copy_for_cluster) (Relation NewTable, Relation OldTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin, TransactionId *xid_cutoff, MultiXactId *multi_cutoff, double *num_tuples, double *tups_vacuumed, double *tups_recently_dead); It claims that the first parameter is a new table, and the second one is an old table. However, the table_relation_copy_for_cluster() uses the first parameter as the old table, and the second as a new table, see below: static inline void table_relation_copy_for_cluster(Relation OldTable, Relation NewTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin, TransactionId *xid_cutoff, MultiXactId *multi_cutoff, double *num_tuples, double *tups_vacuumed, double *tups_recently_dead) { OldTable->rd_tableam->relation_copy_for_cluster(OldTable, NewTable, OldIndex, use_sort, OldestXmin, xid_cutoff, multi_cutoff, num_tuples, tups_vacuumed, tups_recently_dead); } It's a bit confusing, so attach a patch to fix this. -- Regards, Japin Li
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index cf76fc29d4..0b79566758 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -631,8 +631,8 @@ typedef struct TableAmRoutine const RelFileLocator *newrlocator); /* See table_relation_copy_for_cluster() */ - void (*relation_copy_for_cluster) (Relation NewTable, - Relation OldTable, + void (*relation_copy_for_cluster) (Relation OldTable, + Relation NewTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin,