]> granicus.if.org Git - postgresql/commitdiff
The logic in systable_beginscan to translate heap attribute numbers to
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 6 Nov 2008 13:07:08 +0000 (13:07 +0000)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 6 Nov 2008 13:07:08 +0000 (13:07 +0000)
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

index 3a0577775039be9913ab33b33bbb65ec4fcaf90f..b4040bd49d84449d494e540960d4bd9e705a05fc 100644 (file)
@@ -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,