OSDN Git Service

Fix for vacuum updating problem.
authorBruce Momjian <bruce@momjian.us>
Wed, 19 Aug 1998 15:47:36 +0000 (15:47 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 19 Aug 1998 15:47:36 +0000 (15:47 +0000)
src/backend/commands/vacuum.c
src/backend/executor/nodeIndexscan.c

index bf2752d..7b922e0 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.70 1998/08/19 02:01:56 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.71 1998/08/19 15:47:35 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,6 +39,7 @@
 #include "storage/bufpage.h"
 #include "storage/shmem.h"
 #include "storage/smgr.h"
+#include "storage/itemptr.h"
 #include "storage/lmgr.h"
 #include "utils/builtins.h"
 #include "utils/inval.h"
@@ -1883,13 +1884,11 @@ vc_updstats(Oid relid, int npages, int ntups, bool hasindex, VRelStats *vacrelst
        }
 
        /* XXX -- after write, should invalidate relcache in other backends */
-#ifdef NOT_USED
-       WriteNoReleaseBuffer(&rtup->t_ctid); /* heap_endscan release scan' buffers ? */
-#endif
+       WriteNoReleaseBuffer(ItemPointerGetBlockNumber(&rtup->t_ctid));
 
        /*
         * invalidating system relations confuses the function cache of
-        * pg_operator and pg_opclass
+        * pg_operator and pg_opclass, bjm
         */
        if (!IsSystemRelationName(pgcform->relname.data))
                RelationInvalidateHeapTuple(rd, rtup);
index cdc15c7..e4ebd01 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.24 1998/08/19 02:02:02 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.25 1998/08/19 15:47:36 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -129,7 +129,7 @@ IndexNext(IndexScan *node)
                        {
                                bool            prev_matches = false;
                                int                     prev_index;
-
+               
                                /* ----------------
                                 *      store the scanned tuple in the scan tuple slot of
                                 *      the scan state.  Eventually we will only do this and not
@@ -142,10 +142,17 @@ IndexNext(IndexScan *node)
                                                                slot,           /* slot to store in */
                                                                buffer,         /* buffer associated with tuple  */
                                                                false);         /* don't pfree */
+
+                               /*
+                                *      We must check to see if the current tuple would have been
+                                *      matched by an earlier index, so we don't double report it.
+                                *      We do this by passing the tuple through ExecQual and look
+                                *      for failure with all previous qualifications.
+                                */
                                for (prev_index = 0; prev_index < indexstate->iss_IndexPtr;
                                                                                                                                prev_index++)
                                {
+                                       scanstate->cstate.cs_ExprContext->ecxt_scantuple = slot;
                                        if (ExecQual(nth(prev_index, node->indxqual),
                                                scanstate->cstate.cs_ExprContext))
                                        {