Commit 5ae29525 authored by Heikki Linnakangas's avatar Heikki Linnakangas

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.
parent 53b4e469
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* many of the old access method routines have been turned into * many of the old access method routines have been turned into
...@@ -194,16 +194,21 @@ systable_beginscan(Relation heapRelation, ...@@ -194,16 +194,21 @@ systable_beginscan(Relation heapRelation,
{ {
int i; int i;
/* /* Change attribute numbers to be index column numbers. */
* 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.
*/
for (i = 0; i < nkeys; i++) for (i = 0; i < nkeys; i++)
{ {
Assert(key[i].sk_attno == irel->rd_index->indkey.values[i]); int j;
key[i].sk_attno = i + 1;
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, sysscan->iscan = index_beginscan(heapRelation, irel,
...@@ -352,16 +357,21 @@ systable_beginscan_ordered(Relation heapRelation, ...@@ -352,16 +357,21 @@ systable_beginscan_ordered(Relation heapRelation,
sysscan->heap_rel = heapRelation; sysscan->heap_rel = heapRelation;
sysscan->irel = indexRelation; sysscan->irel = indexRelation;
/* /* Change attribute numbers to be index column numbers. */
* 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.
*/
for (i = 0; i < nkeys; i++) for (i = 0; i < nkeys; i++)
{ {
Assert(key[i].sk_attno == indexRelation->rd_index->indkey.values[i]); int j;
key[i].sk_attno = i + 1;
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, sysscan->iscan = index_beginscan(heapRelation, indexRelation,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment