v1-0001-Fix-DESC-skip-array-preprocessing-bug.patch

application/octet-stream

Filename: v1-0001-Fix-DESC-skip-array-preprocessing-bug.patch
Type: application/octet-stream
Part: 0
Message: Re: BUG #19049: Assert failure when using skip arrays on an index key with DESC order

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v1-0001
Subject: Fix DESC skip array preprocessing bug.
File+
src/backend/access/nbtree/nbtpreprocesskeys.c 14 4
From c73094ca48c61d873f0ab4df31f69f443552275b Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Thu, 11 Sep 2025 12:41:08 -0400
Subject: [PATCH v1] Fix DESC skip array preprocessing bug.

---
 src/backend/access/nbtree/nbtpreprocesskeys.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/backend/access/nbtree/nbtpreprocesskeys.c b/src/backend/access/nbtree/nbtpreprocesskeys.c
index 0a347d272..852fcef28 100644
--- a/src/backend/access/nbtree/nbtpreprocesskeys.c
+++ b/src/backend/access/nbtree/nbtpreprocesskeys.c
@@ -1576,8 +1576,13 @@ _bt_skiparray_strat_decrement(IndexScanDesc scan, ScanKey arraysk,
 	}
 
 	/* Look up <= operator (might fail) */
-	leop = get_opfamily_member(opfamily, opcintype, opcintype,
-							   BTLessEqualStrategyNumber);
+	if (!(high_compare->sk_flags & SK_BT_DESC))
+		leop = get_opfamily_member(opfamily, opcintype, opcintype,
+								   BTLessEqualStrategyNumber);
+	else
+		leop = get_opfamily_member(opfamily, opcintype, opcintype,
+								   BTGreaterEqualStrategyNumber);
+
 	if (!OidIsValid(leop))
 		return;
 	cmp_proc = get_opcode(leop);
@@ -1628,8 +1633,13 @@ _bt_skiparray_strat_increment(IndexScanDesc scan, ScanKey arraysk,
 	}
 
 	/* Look up >= operator (might fail) */
-	geop = get_opfamily_member(opfamily, opcintype, opcintype,
-							   BTGreaterEqualStrategyNumber);
+	if (!(low_compare->sk_flags & SK_BT_DESC))
+		geop = get_opfamily_member(opfamily, opcintype, opcintype,
+								   BTGreaterEqualStrategyNumber);
+	else
+		geop = get_opfamily_member(opfamily, opcintype, opcintype,
+								   BTLessEqualStrategyNumber);
+
 	if (!OidIsValid(geop))
 		return;
 	cmp_proc = get_opcode(geop);
-- 
2.51.0