aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2008-11-06 13:07:08 +0000
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2008-11-06 13:07:08 +0000
commit5ae29525d1da3914f2f11aa5692f887ec49b864e (patch)
treeeb620602aca33e3f7099252cd8b1a954a7c285b0 /src
parent53b4e469ca4bc68431edb377bd4723c0c6756cb3 (diff)
downloadpostgresql-5ae29525d1da3914f2f11aa5692f887ec49b864e.tar.gz
postgresql-5ae29525d1da3914f2f11aa5692f887ec49b864e.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/index/genam.c44
1 files 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,