From 5632e6f3e03cf8ba58220b8dc9b2d0212d9dec43 Mon Sep 17 00:00:00 2001
From: Andrey Borodin <amborodin@acm.org>
Date: Fri, 7 May 2021 17:47:23 +0500
Subject: [PATCH v4 3/4] Fix varlen keys sorting

---
 contrib/btree_gist/btree_bit.c     | 6 ++++--
 contrib/btree_gist/btree_bytea.c   | 6 ++++--
 contrib/btree_gist/btree_numeric.c | 6 ++++--
 contrib/btree_gist/btree_text.c    | 6 ++++--
 4 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c
index 61b2eecfd59..947e3b63acd 100644
--- a/contrib/btree_gist/btree_bit.c
+++ b/contrib/btree_gist/btree_bit.c
@@ -214,10 +214,12 @@ gbt_bit_penalty(PG_FUNCTION_ARGS)
 static int
 gbt_bit_sort_build_cmp(Datum a, Datum b, SortSupport ssup)
 {
+	GBT_VARKEY_R ra = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(a));
+	GBT_VARKEY_R rb = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(b));
 	/* Use byteacmp(), like gbt_bitcmp() does */
 	return DatumGetInt32(DirectFunctionCall2(byteacmp,
-											 PointerGetDatum(a),
-											 PointerGetDatum(b)));
+											 PointerGetDatum(ra.lower),
+											 PointerGetDatum(rb.lower)));
 }
 
 /*
diff --git a/contrib/btree_gist/btree_bytea.c b/contrib/btree_gist/btree_bytea.c
index a2abfb7d7c2..9ffb3b9a5d8 100644
--- a/contrib/btree_gist/btree_bytea.c
+++ b/contrib/btree_gist/btree_bytea.c
@@ -173,9 +173,11 @@ gbt_bytea_penalty(PG_FUNCTION_ARGS)
 static int
 gbt_bytea_sort_build_cmp(Datum a, Datum b, SortSupport ssup)
 {
+	GBT_VARKEY_R ra = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(a));
+	GBT_VARKEY_R rb = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(b));
 	return DatumGetInt32(DirectFunctionCall2(byteacmp,
-											 PointerGetDatum(a),
-											 PointerGetDatum(b)));
+												 PointerGetDatum(ra.lower),
+												 PointerGetDatum(rb.lower)));
 }
 
 /*
diff --git a/contrib/btree_gist/btree_numeric.c b/contrib/btree_gist/btree_numeric.c
index face4e2b3af..76cd5d7380f 100644
--- a/contrib/btree_gist/btree_numeric.c
+++ b/contrib/btree_gist/btree_numeric.c
@@ -232,9 +232,11 @@ gbt_numeric_picksplit(PG_FUNCTION_ARGS)
 static int
 gbt_numeric_sort_build_cmp(Datum a, Datum b, SortSupport ssup)
 {
+	GBT_VARKEY_R ra = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(a));
+	GBT_VARKEY_R rb = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(b));
 	return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
-											 PointerGetDatum(a),
-											 PointerGetDatum(b)));
+											 PointerGetDatum(ra.lower),
+											 PointerGetDatum(rb.lower)));
 }
 
 /*
diff --git a/contrib/btree_gist/btree_text.c b/contrib/btree_gist/btree_text.c
index 01b1bda2f66..2deb8dd76fc 100644
--- a/contrib/btree_gist/btree_text.c
+++ b/contrib/btree_gist/btree_text.c
@@ -244,10 +244,12 @@ gbt_text_penalty(PG_FUNCTION_ARGS)
 static int
 gbt_text_sort_build_cmp(Datum a, Datum b, SortSupport ssup)
 {
+	GBT_VARKEY_R ra = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(a));
+	GBT_VARKEY_R rb = gbt_var_key_readable((GBT_VARKEY *) PG_DETOAST_DATUM(b));
 	return DatumGetInt32(DirectFunctionCall2Coll(bttextcmp,
 												 ssup->ssup_collation,
-												 PointerGetDatum(a),
-												 PointerGetDatum(b)));
+												 PointerGetDatum(ra.lower),
+												 PointerGetDatum(rb.lower)));
 }
 
 /*
-- 
2.33.1

