v2-0005-Alternative-Store-converted-key-in-local-variable.patch

text/plain

Filename: v2-0005-Alternative-Store-converted-key-in-local-variable.patch
Type: text/plain
Part: 4
Message: Re: Don't overwrite scan key in systable_beginscan()

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 v2-0005
Subject: Alternative: Store converted key in local variable
File+
src/backend/access/index/genam.c 6 10
From e131e182698986839c5190389bd75983c2a54e35 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 12 Aug 2024 09:30:24 +0200
Subject: [PATCH v2 5/5] Alternative: Store converted key in local variable

---
 src/backend/access/index/genam.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c
index 0f047e1fb73..087d5c1b6dd 100644
--- a/src/backend/access/index/genam.c
+++ b/src/backend/access/index/genam.c
@@ -419,17 +419,15 @@ systable_beginscan(Relation heapRelation,
 	if (irel)
 	{
 		int			i;
-		ScanKey		idxkey;
-
-		idxkey = palloc_array(ScanKeyData, nkeys);
+		ScanKeyData idxkey[INDEX_MAX_KEYS];
 
 		/* Convert attribute numbers to be index column numbers. */
+		memcpy(idxkey, key, sizeof(ScanKeyData) * nkeys);
+
 		for (i = 0; i < nkeys; i++)
 		{
 			int			j;
 
-			memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
-
 			for (j = 0; j < IndexRelationGetNumberOfAttributes(irel); j++)
 			{
 				if (key[i].sk_attno == irel->rd_index->indkey.values[j])
@@ -652,7 +650,7 @@ systable_beginscan_ordered(Relation heapRelation,
 {
 	SysScanDesc sysscan;
 	int			i;
-	ScanKey		idxkey;
+	ScanKeyData idxkey[INDEX_MAX_KEYS];
 
 	/* REINDEX can probably be a hard error here ... */
 	if (ReindexIsProcessingIndex(RelationGetRelid(indexRelation)))
@@ -684,15 +682,13 @@ systable_beginscan_ordered(Relation heapRelation,
 		sysscan->snapshot = NULL;
 	}
 
-	idxkey = palloc_array(ScanKeyData, nkeys);
-
 	/* Convert attribute numbers to be index column numbers. */
+	memcpy(idxkey, key, sizeof(ScanKeyData) * nkeys);
+
 	for (i = 0; i < nkeys; i++)
 	{
 		int			j;
 
-		memcpy(&idxkey[i], &key[i], sizeof(ScanKeyData));
-
 		for (j = 0; j < IndexRelationGetNumberOfAttributes(indexRelation); j++)
 		{
 			if (key[i].sk_attno == indexRelation->rd_index->indkey.values[j])
-- 
2.46.0