*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/xid.c,v 1.14 1998/04/07 18:10:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/Attic/xid.c,v 1.15 1998/04/24 14:41:39 momjian Exp $
*
* OLD COMMENTS
* XXX WARNING
}
-/* ----------------------------------------------------------------
- * TransactionIdEquals
- * ----------------------------------------------------------------
- */
-bool
-TransactionIdEquals(TransactionId id1, TransactionId id2)
-{
- return ((bool) (id1 == id2));
-}
-
/* ----------------------------------------------------------------
* TransactionIdIsLessThan
* ----------------------------------------------------------------
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.17 1998/02/26 04:31:14 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execTuples.c,v 1.18 1998/04/24 14:41:46 momjian Exp $
*
*-------------------------------------------------------------------------
*/
* ExecSetNewSlotDescriptor - set a desc and the is-new-flag all at once
* ExecSlotBuffer - return buffer of tuple in slot
* ExecSetSlotBuffer - set the buffer for tuple in slot
- * ExecIncrSlotBufferRefcnt - bump the refcnt of the slot buffer
+ * ExecIncrSlotBufferRefcnt - bump the refcnt of the slot buffer(Macro)
*
* SLOT STATUS PREDICATES
- * TupIsNull - true when slot contains no tuple
+ * TupIsNull - true when slot contains no tuple(Macro)
* ExecSlotDescriptorIsNew - true if we're now storing a different
* type of tuple in a slot
*
#endif
-/* --------------------------------
- * ExecIncrSlotBufferRefcnt
- *
- * When we pass around buffers in the tuple table, we have to
- * be careful to increment reference counts appropriately.
- * This is used mainly in the mergejoin code.
- * --------------------------------
- */
-void
-ExecIncrSlotBufferRefcnt(TupleTableSlot *slot) /* slot to bump refcnt */
-{
-/* Buffer b = SlotBuffer((TupleTableSlot*) slot); */
- Buffer b = slot->ttc_buffer;
-
- if (BufferIsValid(b))
- IncrBufferRefCount(b);
-}
-
/* ----------------------------------------------------------------
* tuple table slot status predicates
* ----------------------------------------------------------------
*/
-/* ----------------
- * TupIsNull
- *
- * This is used mainly to detect when there are no more
- * tuples to process.
- * ----------------
- */
-bool /* return: true if tuple in slot is NULL */
-TupIsNull(TupleTableSlot *slot) /* slot to check */
-{
- HeapTuple tuple; /* contents of slot (returned) */
-
- /* ----------------
- * if the slot itself is null then we return true
- * ----------------
- */
- if (slot == NULL)
- return true;
-
- /* ----------------
- * get information from the slot and return true or
- * false depending on the contents of the slot.
- * ----------------
- */
- tuple = slot->val;
-
- return
- (tuple == NULL ? true : false);
-}
-
/* --------------------------------
* ExecSlotDescriptorIsNew
*
* ExecEndTee
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.16 1998/02/26 04:31:33 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.17 1998/04/24 14:41:55 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include "utils/palloc.h"
#include "utils/relcache.h"
#include "utils/mcxt.h"
-#include "storage/bufmgr.h" /* for IncrBufferRefCount */
+#include "storage/bufmgr.h"
#include "storage/smgr.h"
#include "optimizer/internal.h"
#include "executor/executor.h"
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.36 1998/04/05 21:04:22 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.37 1998/04/24 14:42:16 momjian Exp $
*
*-------------------------------------------------------------------------
*/
}
}
-/*
- * BufferIsValid --
- * True iff the refcnt of the local buffer is > 0
- * Note:
- * BufferIsValid(InvalidBuffer) is False.
- * BufferIsValid(UnknownBuffer) is False.
- */
-bool
-BufferIsValid(Buffer bufnum)
-{
- if (BufferIsLocal(bufnum))
- return (bufnum >= -NLocBuffer && LocalRefCount[-bufnum - 1] > 0);
-
- if (BAD_BUFFER_ID(bufnum))
- return (false);
-
- return ((bool) (PrivateRefCount[bufnum - 1] > 0));
-}
-
/*
* BufferGetBlockNumber --
* Returns the block number associated with a buffer.
smgrnblocks(DEFAULT_SMGR, relation));
}
-/*
- * BufferGetBlock --
- * Returns a reference to a disk page image associated with a buffer.
- *
- * Note:
- * Assumes buffer is valid.
- */
-Block
-BufferGetBlock(Buffer buffer)
-{
- Assert(BufferIsValid(buffer));
-
- if (BufferIsLocal(buffer))
- return ((Block) MAKE_PTR(LocalBufferDescriptors[-buffer - 1].data));
- else
- return ((Block) MAKE_PTR(BufferDescriptors[buffer - 1].data));
-}
-
/* ---------------------------------------------------------------------
* ReleaseRelationBuffers
*
return (0);
}
-#undef IncrBufferRefCount
#undef ReleaseBuffer
-void
-IncrBufferRefCount(Buffer buffer)
-{
- if (BufferIsLocal(buffer))
- {
- Assert(LocalRefCount[-buffer - 1] >= 0);
- LocalRefCount[-buffer - 1]++;
- }
- else
- {
- Assert(!BAD_BUFFER_ID(buffer));
- Assert(PrivateRefCount[buffer - 1] >= 0);
- PrivateRefCount[buffer - 1]++;
- }
-}
-
/*
* ReleaseBuffer -- remove the pin on a buffer without
* marking it dirty.
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.16 1998/04/06 02:38:17 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.17 1998/04/24 14:42:27 momjian Exp $
*
*-------------------------------------------------------------------------
*/
pfree(tempPage);
}
-/*
- * PageGetMaxOffsetNumber --
- * Returns the maximum offset number used by the given page.
- *
- * NOTE: The offset is invalid if the page is non-empty.
- * Test whether PageIsEmpty before calling this routine
- * and/or using its return value.
- */
-OffsetNumber
-PageGetMaxOffsetNumber(Page page)
-{
- LocationIndex low;
- OffsetNumber i;
-
- low = ((PageHeader) page)->pd_lower;
- i = (low - (sizeof(PageHeaderData) - sizeof(ItemIdData)))
- / sizeof(ItemIdData);
-
- return (i);
-}
-
/* ----------------
* itemid stuff for PageRepairFragmentation
* ----------------
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.14 1998/02/26 04:38:32 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.15 1998/04/24 14:42:42 momjian Exp $
*
*-------------------------------------------------------------------------
*/
*/
#ifndef GOODAMI
-static TransactionId HeapSpecialTransactionId = InvalidTransactionId;
-static CommandId HeapSpecialCommandId = FirstCommandId;
+TransactionId HeapSpecialTransactionId = InvalidTransactionId;
+CommandId HeapSpecialCommandId = FirstCommandId;
void
setheapoverride(bool on)
}
}
-/* static, but called in debug macro */
-bool
-heapisoverride()
-{
- if (!TransactionIdIsValid(HeapSpecialTransactionId))
- {
- return (false);
- }
-
- if (!TransactionIdEquals(GetCurrentTransactionId(),
- HeapSpecialTransactionId) ||
- GetCurrentCommandId() != HeapSpecialCommandId)
- {
- HeapSpecialTransactionId = InvalidTransactionId;
-
- return (false);
- }
- return (true);
-}
-
#endif /* !defined(GOODAMI) */
/*
* XXX Transaction system override hacks end here
*/
-static bool HeapTupleSatisfiesItself(HeapTuple tuple);
-static bool HeapTupleSatisfiesNow(HeapTuple tuple);
-
-/*
- * HeapTupleSatisfiesScope --
- * True iff heap tuple satsifies a time qual.
- *
- * Note:
- * Assumes heap tuple is valid.
- */
-bool
-HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself)
-{
-
- if (TransactionIdEquals(tuple->t_xmax, AmiTransactionId))
- return (false);
-
- if (seeself == true || heapisoverride())
- return (HeapTupleSatisfiesItself(tuple));
- else
- return (HeapTupleSatisfiesNow(tuple));
-}
-
/*
* HeapTupleSatisfiesItself --
* True iff heap tuple is valid for "itself."
* (Xmax != my-transaction && the row was deleted by another transaction
* Xmax is not committed))) that has not been committed
*/
-static bool
+bool
HeapTupleSatisfiesItself(HeapTuple tuple)
{
* the serializability guarantees we provide don't extend to xacts
* that do catalog accesses. this is unfortunate, but not critical.
*/
-static bool
+bool
HeapTupleSatisfiesNow(HeapTuple tuple)
{
if (AMI_OVERRIDE)
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: xact.h,v 1.12 1998/02/26 04:40:32 momjian Exp $
+ * $Id: xact.h,v 1.13 1998/04/24 14:42:55 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#define StoreInvalidTransactionId(dest) \
(*((TransactionId*)dest) = NullTransactionId)
+
+/* ----------------------------------------------------------------
+ * TransactionIdEquals
+ * ----------------------------------------------------------------
+ */
+#define TransactionIdEquals(id1, id2) \
+( \
+ ((bool) ((id1) == (id2))) \
+)
+
+
/* ----------------
* extern definitions
* ----------------
extern TransactionId xidin(char *representation);
extern char *xidout(TransactionId transactionId);
extern bool xideq(TransactionId xid1, TransactionId xid2);
-extern bool TransactionIdEquals(TransactionId id1, TransactionId id2);
extern bool TransactionIdIsLessThan(TransactionId id1, TransactionId id2);
extern void TransactionIdAdd(TransactionId *xid, int value);
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: executor.h,v 1.21 1998/02/26 04:41:19 momjian Exp $
+ * $Id: executor.h,v 1.22 1998/04/24 14:43:07 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#define EXECUTOR_H
#include <catalog/pg_index.h>
+#include <storage/bufmgr.h>
#include <access/itup.h>
#include <stdio.h>
#include <executor/execdesc.h>
+/* ----------------
+ * TupIsNull
+ *
+ * This is used mainly to detect when there are no more
+ * tuples to process.
+ * ----------------
+ */
+/* return: true if tuple in slot is NULL, slot is slot to test */
+#define TupIsNull(slot) \
+( \
+ ((slot) == NULL) ? \
+ true \
+ : \
+ ( \
+ ((slot)->val == NULL) ? \
+ true \
+ : \
+ false \
+ ) \
+)
+
+/* --------------------------------
+ * ExecIncrSlotBufferRefcnt
+ *
+ * When we pass around buffers in the tuple table, we have to
+ * be careful to increment reference counts appropriately.
+ * This is used mainly in the mergejoin code.
+ * --------------------------------
+ */
+#define ExecIncrSlotBufferRefcnt(slot) \
+( \
+ BufferIsValid((slot)->ttc_buffer) ? \
+ IncrBufferRefCount((slot)->ttc_buffer) \
+ : (void)NULL \
+)
+
+
/*
* prototypes from functions in execAmi.c
*/
ExecSetSlotDescriptor(TupleTableSlot *slot,
TupleDesc tupdesc);
extern void ExecSetSlotDescriptorIsNew(TupleTableSlot *slot, bool isNew);
-extern void ExecIncrSlotBufferRefcnt(TupleTableSlot *slot);
-extern bool TupIsNull(TupleTableSlot *slot);
extern void ExecInitResultTupleSlot(EState *estate, CommonState *commonstate);
extern void
ExecInitScanTupleSlot(EState *estate,
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: bufmgr.h,v 1.18 1998/02/26 04:43:22 momjian Exp $
+ * $Id: bufmgr.h,v 1.19 1998/04/24 14:43:18 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include <storage/ipc.h>
#include <storage/block.h>
#include <storage/buf.h>
+#include <storage/buf_internals.h>
#include <utils/rel.h>
/*
#define BUFFER_FLUSH_WRITE 0 /* immediate write */
#define BUFFER_LATE_WRITE 1 /* delayed write: mark as DIRTY */
+/*
+ * BufferIsValid --
+ * True iff the refcnt of the local buffer is > 0
+ * Note:
+ * BufferIsValid(InvalidBuffer) is False.
+ * BufferIsValid(UnknownBuffer) is False.
+ */
+#define BufferIsValid(bufnum) \
+( \
+ BufferIsLocal(bufnum) ? \
+ ((bufnum) >= -NLocBuffer && LocalRefCount[-(bufnum) - 1] > 0) \
+ : \
+ ( \
+ BAD_BUFFER_ID(bufnum) ? \
+ false \
+ : \
+ (PrivateRefCount[(bufnum) - 1] > 0) \
+ ) \
+)
+
+#define IncrBufferRefCount(buffer) \
+( \
+ BufferIsLocal(buffer) ? \
+ ( \
+ (void)AssertMacro(LocalRefCount[-(buffer) - 1] >= 0), \
+ (void)LocalRefCount[-(buffer) - 1]++ \
+ ) \
+ : \
+ ( \
+ (void)AssertMacro(!BAD_BUFFER_ID(buffer)), \
+ (void)AssertMacro(PrivateRefCount[(buffer) - 1] >= 0), \
+ (void)PrivateRefCount[(buffer) - 1]++ \
+ ) \
+)
+
+/*
+ * BufferGetBlock --
+ * Returns a reference to a disk page image associated with a buffer.
+ *
+ * Note:
+ * Assumes buffer is valid.
+ */
+#define BufferGetBlock(buffer) \
+( \
+ (void)AssertMacro(BufferIsValid(buffer)), \
+\
+ BufferIsLocal(buffer) ? \
+ ((Block) MAKE_PTR(LocalBufferDescriptors[-(buffer) - 1].data)) \
+ : \
+ ((Block) MAKE_PTR(BufferDescriptors[(buffer) - 1].data)) \
+)
+
+
/*
* prototypes for functions in bufmgr.c
*/
extern void ResetBufferPool(void);
extern int BufferPoolCheckLeak(void);
extern void FlushBufferPool(int StableMainMemoryFlag);
-extern bool BufferIsValid(Buffer bufnum);
extern BlockNumber BufferGetBlockNumber(Buffer buffer);
extern Relation BufferGetRelation(Buffer buffer);
extern BlockNumber RelationGetNumberOfBlocks(Relation relation);
-extern Block BufferGetBlock(Buffer buffer);
extern void ReleaseRelationBuffers(Relation rdesc);
extern void DropBuffers(Oid dbid);
extern void PrintBufferDescs(void);
extern void PrintPinnedBufs(void);
extern int BufferShmemSize(void);
-extern void IncrBufferRefCount(Buffer buffer);
extern int ReleaseBuffer(Buffer buffer);
extern void BufferRefCountReset(int *refcountsave);
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: bufpage.h,v 1.17 1998/02/26 04:43:24 momjian Exp $
+ * $Id: bufpage.h,v 1.18 1998/04/24 14:43:23 momjian Exp $
*
*-------------------------------------------------------------------------
*/
*/
#define BufferGetPage(buffer) ((Page)BufferGetBlock(buffer))
+/*
+ * PageGetMaxOffsetNumber --
+ * Returns the maximum offset number used by the given page.
+ *
+ * NOTE: The offset is invalid if the page is non-empty.
+ * Test whether PageIsEmpty before calling this routine
+ * and/or using its return value.
+ */
+#define PageGetMaxOffsetNumber(page) \
+( \
+ (((PageHeader) (page))->pd_lower - \
+ (sizeof(PageHeaderData) - sizeof(ItemIdData))) \
+ / sizeof(ItemIdData) \
+)
+
/* ----------------------------------------------------------------
* extern declarations
OffsetNumber offsetNumber, ItemIdFlags flags);
extern Page PageGetTempPage(Page page, Size specialSize);
extern void PageRestoreTempPage(Page tempPage, Page oldPage);
-extern OffsetNumber PageGetMaxOffsetNumber(Page page);
extern void PageRepairFragmentation(Page page);
extern Size PageGetFreeSpace(Page page);
extern void PageManagerModeSet(PageManagerMode mode);
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: tqual.h,v 1.11 1997/11/20 23:24:03 momjian Exp $
+ * $Id: tqual.h,v 1.12 1998/04/24 14:43:33 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include <access/htup.h>
-/* As above, plus updates in this command */
+extern TransactionId HeapSpecialTransactionId;
+extern CommandId HeapSpecialCommandId;
-extern void setheapoverride(bool on);
-extern bool heapisoverride(void);
+/*
+ * HeapTupleSatisfiesVisibility --
+ * True iff heap tuple satsifies a time qual.
+ *
+ * Note:
+ * Assumes heap tuple is valid.
+ */
+#define HeapTupleSatisfiesVisibility(tuple, seeself) \
+( \
+ TransactionIdEquals((tuple)->t_xmax, AmiTransactionId) ? \
+ false \
+ : \
+ ( \
+ ((seeself) == true || heapisoverride()) ? \
+ HeapTupleSatisfiesItself(tuple) \
+ : \
+ HeapTupleSatisfiesNow(tuple) \
+ ) \
+)
-extern bool HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself);
+#define heapisoverride() \
+( \
+ (!TransactionIdIsValid(HeapSpecialTransactionId)) ? \
+ false \
+ : \
+ ( \
+ (!TransactionIdEquals(GetCurrentTransactionId(), \
+ HeapSpecialTransactionId) || \
+ GetCurrentCommandId() != HeapSpecialCommandId) ? \
+ ( \
+ HeapSpecialTransactionId = InvalidTransactionId, \
+ false \
+ ) \
+ : \
+ true \
+ ) \
+)
+
+extern bool HeapTupleSatisfiesItself(HeapTuple tuple);
+extern bool HeapTupleSatisfiesNow(HeapTuple tuple);
+
+extern void setheapoverride(bool on);
#endif /* TQUAL_H */