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