diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 2d9405b1fee780b365803601a5f87d0af1bc5166..8b6e94c4f1091e22a6220ec3663fa14b24a5ba9d 100644
--- a/src/backend/storage/ipc/sinval.c
+++ b/src/backend/storage/ipc/sinval.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.55 2003/05/27 17:49:46 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.56 2003/06/12 01:42:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -305,9 +305,8 @@ GetOldestXmin(bool allDbs)
  *----------
  */
 Snapshot
-GetSnapshotData(bool serializable)
+GetSnapshotData(Snapshot snapshot, bool serializable)
 {
-	Snapshot	snapshot = (Snapshot) malloc(sizeof(SnapshotData));
 	SISeg	   *segP = shmInvalBuffer;
 	ProcState  *stateP = segP->procState;
 	TransactionId xmin;
@@ -316,18 +315,29 @@ GetSnapshotData(bool serializable)
 	int			index;
 	int			count = 0;
 
-	if (snapshot == NULL)
-		elog(ERROR, "Memory exhausted in GetSnapshotData");
+	Assert(snapshot != NULL);
 
 	/*
 	 * Allocating space for MaxBackends xids is usually overkill;
 	 * lastBackend would be sufficient.  But it seems better to do the
 	 * malloc while not holding the lock, so we can't look at lastBackend.
+	 *
+	 * if (snapshot->xip != NULL)
+	 *     no need to free and reallocate xip;
+	 *
+	 * We can reuse the old xip array, because MaxBackends does not change
+	 * at runtime.
 	 */
-	snapshot->xip = (TransactionId *)
-		malloc(MaxBackends * sizeof(TransactionId));
 	if (snapshot->xip == NULL)
-		elog(ERROR, "Memory exhausted in GetSnapshotData");
+	{
+		/*
+		 * First call for this snapshot
+		 */
+		snapshot->xip = (TransactionId *)
+			malloc(MaxBackends * sizeof(TransactionId));
+		if (snapshot->xip == NULL)
+			elog(ERROR, "Memory exhausted in GetSnapshotData");
+	}
 
 	globalxmin = xmin = GetCurrentTransactionId();
 
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index f5f0305e91ab072c387aa8aa40475c29505f76ec..098ddbaea71ec0560ff0eff52e71b5e8f7aec0df 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -16,7 +16,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.62 2003/02/23 23:20:52 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.63 2003/06/12 01:42:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,8 @@
 static SnapshotData SnapshotDirtyData;
 Snapshot	SnapshotDirty = &SnapshotDirtyData;
 
+static SnapshotData QuerySnapshotData;
+static SnapshotData SerializableSnapshotData;
 Snapshot	QuerySnapshot = NULL;
 Snapshot	SerializableSnapshot = NULL;
 
@@ -941,23 +943,16 @@ SetQuerySnapshot(void)
 	/* 1st call in xaction? */
 	if (SerializableSnapshot == NULL)
 	{
-		SerializableSnapshot = GetSnapshotData(true);
+		SerializableSnapshot = GetSnapshotData(&SerializableSnapshotData, true);
 		QuerySnapshot = SerializableSnapshot;
 		Assert(QuerySnapshot != NULL);
 		return;
 	}
 
-	if (QuerySnapshot != SerializableSnapshot)
-	{
-		free(QuerySnapshot->xip);
-		free(QuerySnapshot);
-		QuerySnapshot = NULL;
-	}
-
 	if (XactIsoLevel == XACT_SERIALIZABLE)
 		QuerySnapshot = SerializableSnapshot;
 	else
-		QuerySnapshot = GetSnapshotData(false);
+		QuerySnapshot = GetSnapshotData(&QuerySnapshotData, false);
 
 	Assert(QuerySnapshot != NULL);
 }
@@ -1003,19 +998,11 @@ CopyQuerySnapshot(void)
 void
 FreeXactSnapshot(void)
 {
-	if (QuerySnapshot != NULL && QuerySnapshot != SerializableSnapshot)
-	{
-		free(QuerySnapshot->xip);
-		free(QuerySnapshot);
-	}
-
+	/*
+	 * We do not free(QuerySnapshot->xip);
+	 *        or free(SerializableSnapshot->xip);
+	 * they will be reused soon
+	 */
 	QuerySnapshot = NULL;
-
-	if (SerializableSnapshot != NULL)
-	{
-		free(SerializableSnapshot->xip);
-		free(SerializableSnapshot);
-	}
-
 	SerializableSnapshot = NULL;
 }
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index bba4eac14ced96e410c4cda3f409c104bfc0775c..15966dc04e78086f4af96a0d6c1d44a3d795d04a 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: tqual.h,v 1.44 2003/02/23 23:20:52 tgl Exp $
+ * $Id: tqual.h,v 1.45 2003/06/12 01:42:21 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -113,7 +113,7 @@ extern int HeapTupleSatisfiesUpdate(HeapTuple tuple,
 extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTupleHeader tuple,
 						 TransactionId OldestXmin);
 
-extern Snapshot GetSnapshotData(bool serializable);
+extern Snapshot GetSnapshotData(Snapshot snapshot, bool serializable);
 extern void SetQuerySnapshot(void);
 extern Snapshot CopyQuerySnapshot(void);
 extern void FreeXactSnapshot(void);