From 4cbfeef91291f4a4f38aa7ee7ee9030b94457fe1 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 24 Apr 1998 14:43:33 +0000
Subject: [PATCH] Inline some small functions called for every row.

---
 src/backend/access/transam/xid.c    | 12 +-----
 src/backend/executor/execTuples.c   | 54 ++------------------------
 src/backend/executor/nodeTee.c      |  4 +-
 src/backend/storage/buffer/bufmgr.c | 56 +--------------------------
 src/backend/storage/page/bufpage.c  | 23 +----------
 src/backend/utils/time/tqual.c      | 53 +++-----------------------
 src/include/access/xact.h           | 14 ++++++-
 src/include/executor/executor.h     | 42 ++++++++++++++++++--
 src/include/storage/bufmgr.h        | 59 +++++++++++++++++++++++++++--
 src/include/storage/bufpage.h       | 18 ++++++++-
 src/include/utils/tqual.h           | 49 +++++++++++++++++++++---
 11 files changed, 179 insertions(+), 205 deletions(-)

diff --git a/src/backend/access/transam/xid.c b/src/backend/access/transam/xid.c
index 00810528c44..021c666ebf2 100644
--- a/src/backend/access/transam/xid.c
+++ b/src/backend/access/transam/xid.c
@@ -7,7 +7,7 @@
  *
  *
  * 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
@@ -53,16 +53,6 @@ xidout(TransactionId transactionId)
 
 }
 
-/* ----------------------------------------------------------------
- *		TransactionIdEquals
- * ----------------------------------------------------------------
- */
-bool
-TransactionIdEquals(TransactionId id1, TransactionId id2)
-{
-	return ((bool) (id1 == id2));
-}
-
 /* ----------------------------------------------------------------
  *		TransactionIdIsLessThan
  * ----------------------------------------------------------------
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 3d64ba0095b..cd6ac66c9f0 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -14,7 +14,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -40,10 +40,10 @@
  *		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
  *
@@ -566,59 +566,11 @@ ExecSetSlotBuffer(TupleTableSlot *slot, /* slot to change */
 
 #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
  *
diff --git a/src/backend/executor/nodeTee.c b/src/backend/executor/nodeTee.c
index 23e09682ea9..4a96dc2621e 100644
--- a/src/backend/executor/nodeTee.c
+++ b/src/backend/executor/nodeTee.c
@@ -15,7 +15,7 @@
  *		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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,7 +27,7 @@
 #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"
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 6b75bf5b755..7ab6019f999 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -7,7 +7,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -1262,25 +1262,6 @@ FlushBufferPool(int StableMainMemoryFlag)
 	}
 }
 
-/*
- * 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.
@@ -1413,24 +1394,6 @@ RelationGetNumberOfBlocks(Relation relation)
 	 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
  *
@@ -1679,25 +1642,8 @@ BlowawayRelationBuffers(Relation rdesc, BlockNumber block)
 	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.
diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c
index ae648c0fc45..13fdbf11c7f 100644
--- a/src/backend/storage/page/bufpage.c
+++ b/src/backend/storage/page/bufpage.c
@@ -7,7 +7,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -225,27 +225,6 @@ PageRestoreTempPage(Page tempPage, Page oldPage)
 	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
  * ----------------
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index bb0538eb79a..3f9bc0410d3 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -7,7 +7,7 @@
  *
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,8 +31,8 @@ extern bool PostgresIsInitialized;
  */
 #ifndef GOODAMI
 
-static TransactionId HeapSpecialTransactionId = InvalidTransactionId;
-static CommandId HeapSpecialCommandId = FirstCommandId;
+TransactionId HeapSpecialTransactionId = InvalidTransactionId;
+CommandId HeapSpecialCommandId = FirstCommandId;
 
 void
 setheapoverride(bool on)
@@ -49,54 +49,11 @@ 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."
@@ -119,7 +76,7 @@ HeapTupleSatisfiesVisibility(HeapTuple tuple, bool seeself)
  *			(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)
 {
 
@@ -215,7 +172,7 @@ 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)
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index 60bd8cab611..7abcb63e697 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -60,6 +60,17 @@ typedef TransactionStateData *TransactionState;
 #define StoreInvalidTransactionId(dest) \
 	(*((TransactionId*)dest) = NullTransactionId)
 
+
+/* ----------------------------------------------------------------
+ *		TransactionIdEquals
+ * ----------------------------------------------------------------
+ */
+#define TransactionIdEquals(id1, id2) \
+( \
+	((bool) ((id1) == (id2))) \
+)
+
+
 /* ----------------
  *		extern definitions
  * ----------------
@@ -95,7 +106,6 @@ extern TransactionId DisabledTransactionId;
 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);
 
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 0ce8dc3fc9f..17ff71c2f98 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -14,10 +14,48 @@
 #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
  */
@@ -107,8 +145,6 @@ extern TupleDesc
 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,
diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h
index fdc3abcee43..f27e9d1ed3a 100644
--- a/src/include/storage/bufmgr.h
+++ b/src/include/storage/bufmgr.h
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,6 +18,7 @@
 #include <storage/ipc.h>
 #include <storage/block.h>
 #include <storage/buf.h>
+#include <storage/buf_internals.h>
 #include <utils/rel.h>
 
 /*
@@ -72,6 +73,59 @@ extern int	ShowPinTrace;
 #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
  */
@@ -91,17 +145,14 @@ extern void ResetBufferUsage(void);
 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);
diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h
index 2be7093e4c7..c0701fc963d 100644
--- a/src/include/storage/bufpage.h
+++ b/src/include/storage/bufpage.h
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -280,6 +280,21 @@ typedef enum
  */
 #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
@@ -292,7 +307,6 @@ PageAddItem(Page page, Item item, Size size,
 			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);
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index 6ee27af2c27..ab14efb52e2 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -6,7 +6,7 @@
  *
  * 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 $
  *
  *-------------------------------------------------------------------------
  */
@@ -15,12 +15,51 @@
 
 #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 */
-- 
GitLab