]> granicus.if.org Git - postgresql/blobdiff - src/include/access/relscan.h
Update copyright to 2004.
[postgresql] / src / include / access / relscan.h
index 87e1b36c3fb5df3e57fdb5d18a29ce6afb4c0aff..057773642e1e9a6e78eab336182d4585a805cff1 100644 (file)
@@ -1,60 +1,91 @@
 /*-------------------------------------------------------------------------
  *
  * relscan.h
- *       POSTGRES internal relation scan descriptor definitions.
+ *       POSTGRES relation scan descriptor definitions.
  *
  *
- * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: relscan.h,v 1.23 2001/10/25 05:49:55 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/access/relscan.h,v 1.36 2004/08/29 04:13:03 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef RELSCAN_H
 #define RELSCAN_H
 
+#include "access/skey.h"
 #include "utils/tqual.h"
 
 
 typedef struct HeapScanDescData
 {
-       Relation        rs_rd;                  /* pointer to relation descriptor */
+       /* scan parameters */
+       Relation        rs_rd;                  /* heap relation descriptor */
+       Snapshot        rs_snapshot;    /* snapshot to see */
+       int                     rs_nkeys;               /* number of scan keys */
+       ScanKey         rs_key;                 /* array of scan key descriptors */
+       BlockNumber rs_nblocks;         /* number of blocks to scan */
+
+       /* scan current state */
        HeapTupleData rs_ctup;          /* current tuple in scan, if any */
        Buffer          rs_cbuf;                /* current buffer in scan, if any */
        /* NB: if rs_cbuf is not InvalidBuffer, we hold a pin on that buffer */
-       ItemPointerData rs_mctid;       /* marked tid, if any */
-       Snapshot        rs_snapshot;    /* snapshot to see */
-       uint16          rs_nkeys;               /* number of scan keys to select tuples */
-       ScanKey         rs_key;                 /* key descriptors */
+       ItemPointerData rs_mctid;       /* marked scan position, if any */
 
        PgStat_Info rs_pgstat_info; /* statistics collector hook */
 } HeapScanDescData;
 
 typedef HeapScanDescData *HeapScanDesc;
 
+
 typedef struct IndexScanDescData
 {
-       Relation        relation;               /* relation descriptor */
+       /* scan parameters */
+       Relation        heapRelation;   /* heap relation descriptor, or NULL */
+       Relation        indexRelation;  /* index relation descriptor */
+       Snapshot        xs_snapshot;    /* snapshot to see */
+       int                     numberOfKeys;   /* number of scan keys */
+       ScanKey         keyData;                /* array of scan key descriptors */
+
+       /* signaling to index AM about killing index tuples */
+       bool            kill_prior_tuple;               /* last-returned tuple is dead */
+       bool            ignore_killed_tuples;   /* do not return killed entries */
+
+       /* set by index AM if scan keys satisfy index's uniqueness constraint */
+       bool            keys_are_unique;
+
+       /* scan current state */
+       bool            got_tuple;              /* true after successful index_getnext */
        void       *opaque;                     /* access-method-specific info */
        ItemPointerData currentItemData;        /* current index pointer */
-       ItemPointerData currentMarkData;        /* marked current pointer */
-       uint8           flags;                  /* scan position flags */
-       bool            scanFromEnd;    /* restart scan at end? */
-       uint16          numberOfKeys;   /* number of scan keys to select tuples */
-       ScanKey         keyData;                /* key descriptors */
-       FmgrInfo        fn_getnext;             /* cached lookup info for am's getnext fn */
+       ItemPointerData currentMarkData;        /* marked position, if any */
+
+       /*
+        * xs_ctup/xs_cbuf are valid after a successful index_getnext. After
+        * index_getnext_indexitem, xs_ctup.t_self contains the heap tuple TID
+        * from the index entry, but its other fields are not valid.
+        */
+       HeapTupleData xs_ctup;          /* current heap tuple, if any */
+       Buffer          xs_cbuf;                /* current heap buffer in scan, if any */
+       /* NB: if xs_cbuf is not InvalidBuffer, we hold a pin on that buffer */
+
+       FmgrInfo        fn_getnext;             /* cached lookup info for AM's getnext fn */
+
+       /*
+        * If keys_are_unique and got_tuple are both true, we stop calling the
+        * index AM; it is then necessary for index_getnext to keep track of
+        * the logical scan position for itself.  It does that using
+        * unique_tuple_pos: -1 = before row, 0 = on row, +1 = after row.
+        */
+       int                     unique_tuple_pos;               /* logical position */
+       int                     unique_tuple_mark;              /* logical marked position */
 
        PgStat_Info xs_pgstat_info; /* statistics collector hook */
 } IndexScanDescData;
 
 typedef IndexScanDescData *IndexScanDesc;
 
-/* IndexScanDesc flag bits (none of these are actually used currently) */
-#define ScanUnmarked                   0x01
-#define ScanUncheckedPrevious  0x02
-#define ScanUncheckedNext              0x04
-
 
 /* ----------------
  *             IndexScanDescPtr is used in the executor where we have to
@@ -75,4 +106,5 @@ typedef IndexScanDesc *IndexScanDescPtr;
  *             True iff the index scan is valid.
  */
 #define IndexScanIsValid(scan) PointerIsValid(scan)
-#endif  /* RELSCAN_H */
+
+#endif   /* RELSCAN_H */