From 5ae29525d1da3914f2f11aa5692f887ec49b864e Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Thu, 6 Nov 2008 13:07:08 +0000
Subject: [PATCH] The logic in systable_beginscan to translate heap attribute
 numbers to index column numbers needs to handle the case where you have more
 than one scankey on the same index column. toast_fetch_datum_slice() needs
 it.

---
 src/backend/access/index/genam.c | 44 ++++++++++++++++++++------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c
index 3a057777503..b4040bd49d8 100644
--- a/src/backend/access/index/genam.c
+++ b/src/backend/access/index/genam.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.71 2008/06/19 00:46:03 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/index/genam.c,v 1.72 2008/11/06 13:07:08 heikki Exp $
  *
  * NOTES
  *	  many of the old access method routines have been turned into
@@ -194,16 +194,21 @@ systable_beginscan(Relation heapRelation,
 	{
 		int			i;
 
-		/*
-		 * Change attribute numbers to be index column numbers.
-		 *
-		 * This code could be generalized to search for the index key numbers
-		 * to substitute, but for now there's no need.
-		 */
+		/* Change attribute numbers to be index column numbers. */
 		for (i = 0; i < nkeys; i++)
 		{
-			Assert(key[i].sk_attno == irel->rd_index->indkey.values[i]);
-			key[i].sk_attno = i + 1;
+			int j;
+
+			for (j = 0; j < irel->rd_index->indnatts; j++)
+			{
+				if (key[i].sk_attno == irel->rd_index->indkey.values[j])
+				{
+					key[i].sk_attno = j + 1;
+					break;
+				}
+			}
+			if (j == irel->rd_index->indnatts)
+				elog(ERROR, "column is not in index");
 		}
 
 		sysscan->iscan = index_beginscan(heapRelation, irel,
@@ -352,16 +357,21 @@ systable_beginscan_ordered(Relation heapRelation,
 	sysscan->heap_rel = heapRelation;
 	sysscan->irel = indexRelation;
 
-	/*
-	 * Change attribute numbers to be index column numbers.
-	 *
-	 * This code could be generalized to search for the index key numbers
-	 * to substitute, but for now there's no need.
-	 */
+	/* Change attribute numbers to be index column numbers. */
 	for (i = 0; i < nkeys; i++)
 	{
-		Assert(key[i].sk_attno == indexRelation->rd_index->indkey.values[i]);
-		key[i].sk_attno = i + 1;
+		int j;
+
+		for (j = 0; j < indexRelation->rd_index->indnatts; j++)
+		{
+			if (key[i].sk_attno == indexRelation->rd_index->indkey.values[j])
+			{
+				key[i].sk_attno = j + 1;
+				break;
+			}
+		}
+		if (j == indexRelation->rd_index->indnatts)
+			elog(ERROR, "column is not in index");
 	}
 
 	sysscan->iscan = index_beginscan(heapRelation, indexRelation,
-- 
GitLab