diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c
index 60a2b4e..5ecd360 100644
--- a/src/backend/access/index/genam.c
+++ b/src/backend/access/index/genam.c
@@ -79,7 +79,7 @@ RelationGetIndexScan(Relation indexRelation, int nkeys, int norderbys)
 
 	scan->heapRelation = NULL;	/* may be set later */
 	scan->indexRelation = indexRelation;
-	scan->xs_snapshot = SnapshotNow;	/* may be set later */
+	scan->xs_snapshot = SnapshotError;	/* *must* be set later */
 	scan->numberOfKeys = nkeys;
 	scan->numberOfOrderBys = norderbys;
 
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index b449e0a..2a1ac0c 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -105,7 +105,7 @@ CreateExecutorState(void)
 	 * Initialize all fields of the Executor State structure
 	 */
 	estate->es_direction = ForwardScanDirection;
-	estate->es_snapshot = SnapshotNow;
+	estate->es_snapshot = SnapshotError;
 	estate->es_crosscheck_snapshot = InvalidSnapshot;	/* no crosscheck */
 	estate->es_range_table = NIL;
 	estate->es_plannedstmt = NULL;
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index 55563ea..e8c9409 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -72,6 +72,7 @@ SnapshotData SnapshotNowData = {HeapTupleSatisfiesNow};
 SnapshotData SnapshotSelfData = {HeapTupleSatisfiesSelf};
 SnapshotData SnapshotAnyData = {HeapTupleSatisfiesAny};
 SnapshotData SnapshotToastData = {HeapTupleSatisfiesToast};
+SnapshotData SnapshotErrorData = {HeapTupleSatisfiesError};
 
 /* local functions */
 static bool XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot);
@@ -600,6 +601,21 @@ HeapTupleSatisfiesToast(HeapTupleHeader tuple, Snapshot snapshot,
 }
 
 /*
+ * HeapTupleSatisfiesError
+ *		Illegal "satisfies" method to catch programming errors.
+ *
+ * This is used as a default in various places, so that failure to
+ * install a sane value will result in an error, rather than wrong
+ * behavior or a core dump.
+ */
+bool
+HeapTupleSatisfiesError(HeapTupleHeader tuple, Snapshot snapshot,
+						Buffer buffer)
+{
+	elog(ERROR, "snapshot not initialized");
+}
+
+/*
  * HeapTupleSatisfiesUpdate
  *
  *	Same logic as HeapTupleSatisfiesNow, but returns a more detailed result
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index 465231c..9b05677 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -23,11 +23,13 @@ extern PGDLLIMPORT SnapshotData SnapshotNowData;
 extern PGDLLIMPORT SnapshotData SnapshotSelfData;
 extern PGDLLIMPORT SnapshotData SnapshotAnyData;
 extern PGDLLIMPORT SnapshotData SnapshotToastData;
+extern PGDLLIMPORT SnapshotData SnapshotErrorData;
 
 #define SnapshotNow			(&SnapshotNowData)
 #define SnapshotSelf		(&SnapshotSelfData)
 #define SnapshotAny			(&SnapshotAnyData)
 #define SnapshotToast		(&SnapshotToastData)
+#define SnapshotError		(&SnapshotErrorData)
 
 /*
  * We don't provide a static SnapshotDirty variable because it would be
@@ -77,6 +79,8 @@ extern bool HeapTupleSatisfiesToast(HeapTupleHeader tuple,
 						Snapshot snapshot, Buffer buffer);
 extern bool HeapTupleSatisfiesDirty(HeapTupleHeader tuple,
 						Snapshot snapshot, Buffer buffer);
+extern bool HeapTupleSatisfiesError(HeapTupleHeader tuple,
+						Snapshot snapshot, Buffer buffer);
 
 /* Special "satisfies" routines with different APIs */
 extern HTSU_Result HeapTupleSatisfiesUpdate(HeapTupleHeader tuple,
