From 7e6091ee0163e0c49abcf99952c493c05baaaab7 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sun, 14 Mar 2021 15:11:22 +1300
Subject: [PATCH 4/9] Supply specialized sort/search routines for ItemPtrData.

---
 src/backend/utils/sort/Makefile      |  1 +
 src/backend/utils/sort/sortitemptr.c | 12 ++++++++++++
 src/include/utils/sortitemptr.h      | 19 +++++++++++++++++++
 3 files changed, 32 insertions(+)
 create mode 100644 src/backend/utils/sort/sortitemptr.c
 create mode 100644 src/include/utils/sortitemptr.h

diff --git a/src/backend/utils/sort/Makefile b/src/backend/utils/sort/Makefile
index b4dce08614..32acbb7f20 100644
--- a/src/backend/utils/sort/Makefile
+++ b/src/backend/utils/sort/Makefile
@@ -17,6 +17,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
 OBJS = \
 	logtape.o \
 	sharedtuplestore.o \
+	sortitemptr.o \
 	sortscalar.o \
 	sortsupport.o \
 	tuplesort.o \
diff --git a/src/backend/utils/sort/sortitemptr.c b/src/backend/utils/sort/sortitemptr.c
new file mode 100644
index 0000000000..a0db6d6d0d
--- /dev/null
+++ b/src/backend/utils/sort/sortitemptr.c
@@ -0,0 +1,12 @@
+#include "postgres.h"
+
+#include "catalog/index.h"
+#include "utils/sortitemptr.h"
+
+#define ST_SORT qsort_itemptr
+#define ST_SCOPE
+#define ST_ELEMENT_TYPE ItemPointerData
+#define ST_COMPARE(a, b) (itemptr_encode(a) - itemptr_encode(b))
+#define ST_COMPARE_TYPE int64
+#define ST_DEFINE
+#include "lib/sort_template.h"
diff --git a/src/include/utils/sortitemptr.h b/src/include/utils/sortitemptr.h
new file mode 100644
index 0000000000..eb3df25eec
--- /dev/null
+++ b/src/include/utils/sortitemptr.h
@@ -0,0 +1,19 @@
+#ifndef SORTITEMPTR_H
+#define SORTITEMPTR_H
+
+#include "catalog/index.h"
+
+/* Declare sort function, from .c file. */
+extern void qsort_itemptr(ItemPointerData *tids, size_t n);
+
+/* Search and unique functions inline in header. */
+#define ST_SEARCH bsearch_itemptr
+#define ST_UNIQUE unique_itemptr
+#define ST_ELEMENT_TYPE ItemPointerData
+#define ST_COMPARE(a, b) (itemptr_encode(a) - itemptr_encode(b))
+#define ST_COMPARE_TYPE int64
+#define ST_SCOPE static inline
+#define ST_DEFINE
+#include "lib/sort_template.h"
+
+#endif
-- 
2.30.1

