Gregory Stark <[EMAIL PROTECTED]> writes:
> Uhm. Is it possible we're mistakenly doing a HOT update because we're lying
> about what indexes exist?

Yup, exactly.  Here's my proposed fix...

                        regards, tom lane

Index: src/backend/catalog/index.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/catalog/index.c,v
retrieving revision 1.300
diff -c -r1.300 index.c
*** src/backend/catalog/index.c 19 Jun 2008 00:46:04 -0000      1.300
--- src/backend/catalog/index.c 10 Aug 2008 18:49:08 -0000
***************
*** 2380,2388 ****
         * problem.
         */
        is_pg_class = (RelationGetRelid(rel) == RelationRelationId);
!       doneIndexes = NIL;
  
        /* Reindex all the indexes. */
        foreach(indexId, indexIds)
        {
                Oid                     indexOid = lfirst_oid(indexId);
--- 2380,2392 ----
         * problem.
         */
        is_pg_class = (RelationGetRelid(rel) == RelationRelationId);
! 
!       /* Ensure rd_indexattr is valid; see comments for RelationSetIndexList 
*/
!       if (is_pg_class)
!               (void) RelationGetIndexAttrBitmap(rel);
  
        /* Reindex all the indexes. */
+       doneIndexes = NIL;
        foreach(indexId, indexIds)
        {
                Oid                     indexOid = lfirst_oid(indexId);
Index: src/backend/utils/cache/relcache.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v
retrieving revision 1.272
diff -c -r1.272 relcache.c
*** src/backend/utils/cache/relcache.c  12 May 2008 00:00:52 -0000      1.272
--- src/backend/utils/cache/relcache.c  10 Aug 2008 18:49:08 -0000
***************
*** 2986,2991 ****
--- 2986,2998 ----
   * messages.  In practice it is only used on pg_class (see REINDEX).
   *
   * It is up to the caller to make sure the given list is correctly ordered.
+  *
+  * We deliberately do not change rd_indexattr here: even when operating
+  * with a temporary partial index list, HOT-update decisions must be made
+  * correctly with respect to the full index set.  It is up to the caller
+  * to ensure that a correct rd_indexattr set has been cached before first
+  * calling RelationSetIndexList; else a subsequent inquiry might cause a
+  * wrong rd_indexattr set to get computed and cached.
   */
  void
  RelationSetIndexList(Relation relation, List *indexIds, Oid oidIndex)
***************
*** 3004,3010 ****
        relation->rd_indexvalid = 2;    /* mark list as forced */
        /* must flag that we have a forced index list */
        need_eoxact_work = true;
-       /* we deliberately do not change rd_indexattr */
  }
  
  /*
--- 3011,3016 ----

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to