OSDN Git Service

Update copyright to 2004.
[pg-rex/syncrep.git] / src / include / access / heapam.h
index 9681bc7..103a9c6 100644 (file)
@@ -4,91 +4,39 @@
  *       POSTGRES heap access method definitions.
  *
  *
- * Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: heapam.h,v 1.42 1999/05/25 16:13:28 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.91 2004/08/29 04:13:03 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef HEAPAM_H
 #define HEAPAM_H
 
-#include <access/tupmacs.h>
-#include <access/htup.h>
-#include <access/relscan.h>
-#include <storage/block.h>
-#include <utils/rel.h>
-#include <utils/tqual.h>
-
-/* ----------------------------------------------------------------
- *                             heap access method statistics
- * ----------------------------------------------------------------
- */
-
-typedef struct HeapAccessStatisticsData
-{
-       time_t          init_global_timestamp;  /* time global statistics started */
-       time_t          local_reset_timestamp;  /* last time local reset was done */
-       time_t          last_request_timestamp; /* last time stats were requested */
-
-       int                     global_open;
-       int                     global_openr;
-       int                     global_close;
-       int                     global_beginscan;
-       int                     global_rescan;
-       int                     global_endscan;
-       int                     global_getnext;
-       int                     global_fetch;
-       int                     global_insert;
-       int                     global_delete;
-       int                     global_replace;
-       int                     global_mark4update;
-       int                     global_markpos;
-       int                     global_restrpos;
-       int                     global_BufferGetRelation;
-       int                     global_RelationIdGetRelation;
-       int                     global_RelationIdGetRelation_Buf;
-       int                     global_RelationNameGetRelation;
-       int                     global_getreldesc;
-       int                     global_heapgettup;
-       int                     global_RelationPutHeapTuple;
-       int                     global_RelationPutLongHeapTuple;
-
-       int                     local_open;
-       int                     local_openr;
-       int                     local_close;
-       int                     local_beginscan;
-       int                     local_rescan;
-       int                     local_endscan;
-       int                     local_getnext;
-       int                     local_fetch;
-       int                     local_insert;
-       int                     local_delete;
-       int                     local_replace;
-       int                     local_mark4update;
-       int                     local_markpos;
-       int                     local_restrpos;
-       int                     local_BufferGetRelation;
-       int                     local_RelationIdGetRelation;
-       int                     local_RelationIdGetRelation_Buf;
-       int                     local_RelationNameGetRelation;
-       int                     local_getreldesc;
-       int                     local_heapgettup;
-       int                     local_RelationPutHeapTuple;
-       int                     local_RelationPutLongHeapTuple;
-} HeapAccessStatisticsData;
-
-typedef HeapAccessStatisticsData *HeapAccessStatistics;
-
-#define IncrHeapAccessStat(x) \
-       (heap_access_stats == NULL ? 0 : (heap_access_stats->x)++)
+#include "access/htup.h"
+#include "access/relscan.h"
+#include "access/sdir.h"
+#include "access/tupmacs.h"
+#include "access/xlogutils.h"
+#include "nodes/primnodes.h"
+#include "storage/block.h"
+#include "storage/lmgr.h"
+#include "utils/rel.h"
+#include "utils/tqual.h"
 
 /* ----------------
  *             fastgetattr
  *
- *             This gets called many times, so we macro the cacheable and NULL
- *             lookups, and call noncachegetattr() for the rest.
+ *             Fetch a user attribute's value as a Datum (might be either a
+ *             value, or a pointer into the data area of the tuple).
+ *
+ *             This must not be used when a system attribute might be requested.
+ *             Furthermore, the passed attnum MUST be valid.  Use heap_getattr()
+ *             instead, if in doubt.
  *
+ *             This gets called many times, so we macro the cacheable and NULL
+ *             lookups, and call nocachegetattr() for the rest.
  * ----------------
  */
 
@@ -97,191 +45,164 @@ extern Datum nocachegetattr(HeapTuple tup, int attnum,
 
 #if !defined(DISABLE_COMPLEX_MACRO)
 
-#define fastgetattr(tup, attnum, tupleDesc, isnull) \
-( \
-       AssertMacro((attnum) > 0), \
-       ((isnull) ? (*(isnull) = false) : (dummyret)NULL), \
-       HeapTupleNoNulls(tup) ? \
-       ( \
-               ((tupleDesc)->attrs[(attnum)-1]->attcacheoff != -1 || \
-                (attnum) == 1) ? \
-               ( \
-                       (Datum)fetchatt(&((tupleDesc)->attrs[(attnum)-1]), \
-                               (char *) (tup)->t_data + (tup)->t_data->t_hoff + \
-                               ( \
-                                       ((attnum) != 1) ? \
-                                               (tupleDesc)->attrs[(attnum)-1]->attcacheoff \
-                                       : \
-                                               0 \
-                               ) \
-                       ) \
-               ) \
-               : \
-                       nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \
-       ) \
-       : \
-       ( \
-               att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \
-               ( \
-                       ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
-                       (Datum)NULL \
-               ) \
-               : \
-               ( \
-                       nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) \
-               ) \
-       ) \
+#define fastgetattr(tup, attnum, tupleDesc, isnull)                                    \
+(                                                                                                                                      \
+       AssertMacro((attnum) > 0),                                                                              \
+       ((isnull) ? (*(isnull) = false) : (dummyret)NULL),                              \
+       HeapTupleNoNulls(tup) ?                                                                                 \
+       (                                                                                                                               \
+               (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ?                      \
+               (                                                                                                                       \
+                       fetchatt((tupleDesc)->attrs[(attnum)-1],                                \
+                               (char *) (tup)->t_data + (tup)->t_data->t_hoff +        \
+                                       (tupleDesc)->attrs[(attnum)-1]->attcacheoff)    \
+               )                                                                                                                       \
+               :                                                                                                                       \
+                       nocachegetattr((tup), (attnum), (tupleDesc), (isnull))  \
+       )                                                                                                                               \
+       :                                                                                                                               \
+       (                                                                                                                               \
+               att_isnull((attnum)-1, (tup)->t_data->t_bits) ?                         \
+               (                                                                                                                       \
+                       ((isnull) ? (*(isnull) = true) : (dummyret)NULL),               \
+                       (Datum)NULL                                                                                             \
+               )                                                                                                                       \
+               :                                                                                                                       \
+               (                                                                                                                       \
+                       nocachegetattr((tup), (attnum), (tupleDesc), (isnull))  \
+               )                                                                                                                       \
+       )                                                                                                                               \
 )
 
-#else                                                  /* !defined(DISABLE_COMPLEX_MACRO) */
+#else                                                  /* defined(DISABLE_COMPLEX_MACRO) */
 
-static Datum
-fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
-                       bool *isnull)
-{
-       return (
-                       (attnum) > 0 ?
-                       (
-                        ((isnull) ? (*(isnull) = false) : (dummyret) NULL),
-                        HeapTupleNoNulls(tup) ?
-                        (
-                         ((tupleDesc)->attrs[(attnum) - 1]->attcacheoff != -1 ||
-                          (attnum) == 1) ?
-                         (
-                          (Datum) fetchatt(&((tupleDesc)->attrs[(attnum) - 1]),
-                                                (char *) (tup)->t_data + (tup)->t_data->t_hoff +
-                                                               (
-                                                                ((attnum) != 1) ?
-                                                       (tupleDesc)->attrs[(attnum) - 1]->attcacheoff
-                                                                :
-                                                                0
-                                                                )
-                                                               )
-                          )
-                         :
-                         nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
-                         )
-                        :
-                        (
-                         att_isnull((attnum) - 1, (tup)->t_data->t_bits) ?
-                         (
-                          ((isnull) ? (*(isnull) = true) : (dummyret) NULL),
-                          (Datum) NULL
-                          )
-                         :
-                         (
-                          nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
-                          )
-                         )
-                        )
-                       :
-                       (
-                        (Datum) NULL
-                        )
-       );
-}
+extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
+                       bool *isnull);
+#endif   /* defined(DISABLE_COMPLEX_MACRO) */
 
-#endif
 
 /* ----------------
  *             heap_getattr
  *
- *             Find a particular field in a row represented as a heap tuple.
- *             We return a pointer into that heap tuple, which points to the
- *             first byte of the value of the field in question.
+ *             Extract an attribute of a heap tuple and return it as a Datum.
+ *             This works for either system or user attributes.  The given attnum
+ *             is properly range-checked.
  *
- *             If the field in question has a NULL value, we return a null
- *             pointer and return <*isnull> == true.  Otherwise, we return
- *             <*isnull> == false.
+ *             If the field in question has a NULL value, we return a zero Datum
+ *             and set *isnull == true.  Otherwise, we set *isnull == false.
  *
  *             <tup> is the pointer to the heap tuple.  <attnum> is the attribute
  *             number of the column (field) caller wants.      <tupleDesc> is a
  *             pointer to the structure describing the row and all its fields.
- *
- *             Because this macro is often called with constants, it generates
- *             compiler warnings about 'left-hand comma expression has no effect.
- *
  * ----------------
  */
 #define heap_getattr(tup, attnum, tupleDesc, isnull) \
 ( \
-       AssertMacro((tup) != NULL && \
-               (attnum) > FirstLowInvalidHeapAttributeNumber && \
-               (attnum) != 0), \
-       ((attnum) > (int) (tup)->t_data->t_natts) ? \
-       ( \
-               ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
-               (Datum)NULL \
-       ) \
-       : \
+       AssertMacro((tup) != NULL), \
        ( \
                ((attnum) > 0) ? \
                ( \
-                       fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
-               ) \
-               : \
-               ( \
-                       ((isnull) ? (*(isnull) = false) : (dummyret)NULL), \
-                       ((attnum) == SelfItemPointerAttributeNumber) ? \
+                       ((attnum) > (int) (tup)->t_data->t_natts) ? \
                        ( \
-                               (Datum)((char *)&((tup)->t_self)) \
+                               ((isnull) ? (*(isnull) = true) : (dummyret)NULL), \
+                               (Datum)NULL \
                        ) \
                        : \
-                       ( \
-                               (Datum)*(unsigned int *) \
-                                       ((char *)(tup)->t_data + heap_sysoffset[-(attnum)-1]) \
-                       ) \
+                               fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
                ) \
+               : \
+                       heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \
        ) \
 )
 
-extern HeapAccessStatistics heap_access_stats; /* in stats.c */
+extern Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
+                                                        bool *isnull);
+
 
 /* ----------------
  *             function prototypes for heap access method
+ *
+ * heap_create, heap_create_with_catalog, and heap_drop_with_catalog
+ * are declared in catalog/heap.h
  * ----------------
  */
-/* heap_create, heap_creatr, and heap_destroy are declared in catalog/heap.h */
 
 /* heapam.c */
 
-extern Relation heap_open(Oid relationId);
-extern Relation heap_openr(char *relationName);
-extern void heap_close(Relation relation);
-extern HeapScanDesc heap_beginscan(Relation relation, int atend,
-                          Snapshot snapshot, unsigned nkeys, ScanKey key);
-extern void heap_rescan(HeapScanDesc scan, bool scanFromEnd, ScanKey key);
+extern Relation relation_open(Oid relationId, LOCKMODE lockmode);
+extern Relation conditional_relation_open(Oid relationId, LOCKMODE lockmode, bool nowait);
+extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode);
+extern Relation relation_openr(const char *sysRelationName, LOCKMODE lockmode);
+extern void relation_close(Relation relation, LOCKMODE lockmode);
+
+extern Relation heap_open(Oid relationId, LOCKMODE lockmode);
+extern Relation heap_openrv(const RangeVar *relation, LOCKMODE lockmode);
+extern Relation heap_openr(const char *sysRelationName, LOCKMODE lockmode);
+
+#define heap_close(r,l)  relation_close(r,l)
+
+extern HeapScanDesc heap_beginscan(Relation relation, Snapshot snapshot,
+                          int nkeys, ScanKey key);
+extern void heap_rescan(HeapScanDesc scan, ScanKey key);
 extern void heap_endscan(HeapScanDesc scan);
-extern HeapTuple heap_getnext(HeapScanDesc scandesc, int backw);
-extern void heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tup, Buffer *userbuf);
-extern Oid     heap_insert(Relation relation, HeapTuple tup);
-extern int     heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid);
-extern int heap_replace(Relation relation, ItemPointer otid, HeapTuple tup,
-                        ItemPointer ctid);
-extern int     heap_mark4update(Relation relation, HeapTuple tup, Buffer *userbuf);
+extern HeapTuple heap_getnext(HeapScanDesc scan, ScanDirection direction);
+
+extern bool heap_fetch(Relation relation, Snapshot snapshot,
+                  HeapTuple tuple, Buffer *userbuf, bool keep_buf,
+                  PgStat_Info *pgstat_info);
+extern bool heap_release_fetch(Relation relation, Snapshot snapshot,
+                  HeapTuple tuple, Buffer *userbuf, bool keep_buf,
+                  PgStat_Info *pgstat_info);
+
+extern ItemPointer heap_get_latest_tid(Relation relation, Snapshot snapshot,
+                                       ItemPointer tid);
+extern void setLastTid(const ItemPointer tid);
+
+extern Oid     heap_insert(Relation relation, HeapTuple tup, CommandId cid);
+extern int heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid,
+                       CommandId cid, Snapshot crosscheck, bool wait);
+extern int heap_update(Relation relation, ItemPointer otid, HeapTuple tup,
+                       ItemPointer ctid, CommandId cid, Snapshot crosscheck, bool wait);
+extern int heap_mark4update(Relation relation, HeapTuple tup,
+                                Buffer *userbuf, CommandId cid);
+
+extern Oid     simple_heap_insert(Relation relation, HeapTuple tup);
+extern void simple_heap_delete(Relation relation, ItemPointer tid);
+extern void simple_heap_update(Relation relation, ItemPointer otid,
+                                  HeapTuple tup);
+
 extern void heap_markpos(HeapScanDesc scan);
 extern void heap_restrpos(HeapScanDesc scan);
 
+extern void heap_redo(XLogRecPtr lsn, XLogRecord *rptr);
+extern void heap_undo(XLogRecPtr lsn, XLogRecord *rptr);
+extern void heap_desc(char *buf, uint8 xl_info, char *rec);
+extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer,
+                          OffsetNumber *unused, int uncnt);
+extern XLogRecPtr log_heap_move(Relation reln, Buffer oldbuf,
+                         ItemPointerData from,
+                         Buffer newbuf, HeapTuple newtup);
+
 /* in common/heaptuple.c */
-extern Size ComputeDataSize(TupleDesc tupleDesc, Datum *value, char *nulls);
+extern Size ComputeDataSize(TupleDesc tupleDesc, Datum *values, char *nulls);
 extern void DataFill(char *data, TupleDesc tupleDesc,
-                Datum *value, char *nulls, uint16 *infomask,
+                Datum *values, char *nulls, uint16 *infomask,
                 bits8 *bit);
 extern int     heap_attisnull(HeapTuple tup, int attnum);
-extern int     heap_sysattrlen(AttrNumber attno);
-extern bool heap_sysattrbyval(AttrNumber attno);
 extern Datum nocachegetattr(HeapTuple tup, int attnum,
                           TupleDesc att, bool *isnull);
 extern HeapTuple heap_copytuple(HeapTuple tuple);
 extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);
 extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor,
-                          Datum *value, char *nulls);
+                          Datum *values, char *nulls);
 extern HeapTuple heap_modifytuple(HeapTuple tuple,
-               Relation relation, Datum *replValue, char *replNull, char *repl);
-HeapTuple      heap_addheader(uint32 natts, int structlen, char *structure);
-
-/* in common/heap/stats.c */
-extern void PrintHeapAccessStatistics(HeapAccessStatistics stats);
-extern void initam(void);
-
-#endif  /* HEAPAM_H */
+                                                                 Relation relation,
+                                                                 Datum *replValues,
+                                                                 char *replNulls,
+                                                                 char *replActions);
+extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc,
+                                                        Datum *values, char *nulls);
+extern void heap_freetuple(HeapTuple tuple);
+extern HeapTuple heap_addheader(int natts, bool withoid, Size structlen, void *structure);
+
+#endif   /* HEAPAM_H */