From 5632e6f3e03cf8ba58220b8dc9b2d0212d9dec43 Mon Sep 17 00:00:00 2001 From: Andrey Borodin 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