diff --git a/src/backend/replication/logical/logicalctl.c b/src/backend/replication/logical/logicalctl.c
index a081c7a..4eaf12a 100644
--- a/src/backend/replication/logical/logicalctl.c
+++ b/src/backend/replication/logical/logicalctl.c
@@ -63,6 +63,7 @@
 
 #include "postgres.h"
 
+#include "access/xlog.h"
 #include "access/xloginsert.h"
 #include "catalog/pg_control.h"
 #include "miscadmin.h"
@@ -107,15 +108,12 @@ static LogicalDecodingCtlData *LogicalDecodingCtl = NULL;
 bool		XLogLogicalInfo = false;
 
 /*
- * A transaction local cache of XLogLogicalInfo:
- *		-1: not cached yet, need to check XLogLogicalInfo.
- *		0: cached, XLogLogicalInfo is disabled.
- *		1: cached, XLogLogicalInfo is enabled.
- * The cache is set when checking XLogLogicalInfoActive() for the first time
- * in the transaction and kept until the transaction end. Once the flag value
- * is cached, this cache is used simply by casting to a boolean.
+ * A transaction local cache of XLogLogicalInfo. The cache value is set when
+ * checking XLogLogicalInfoActive() for the first time in the transaction and
+ * kept until the transaction end.
  */
-int			XLogLogicalInfoXactCache = -1;
+XLogLogicalInfoXactCacheEnum
+	XLogLogicalInfoXactCache = CACHE_XLOGLOGICALINFO_UNASSIGNED;
 
 static void update_xlog_logical_info(void);
 static void abort_logical_decoding_activation(int code, Datum arg);
@@ -232,7 +230,7 @@ IsXLogLogicalInfoEnabled(void)
 bool
 CheckXLogLogicalInfo(void)
 {
-	Assert(XLogLogicalInfoXactCache == -1);
+	Assert(XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_UNASSIGNED);
 
 	/* Returns the current state if we're out of the transaction */
 	if (!IsTransactionState())
@@ -242,9 +240,11 @@ CheckXLogLogicalInfo(void)
 	 * Cache the current state so as to return the same result within the same
 	 * transaction.
 	 */
-	XLogLogicalInfoXactCache = (int) XLogLogicalInfo;
+	XLogLogicalInfoXactCache = XLogLogicalInfo ? 
+		CACHE_XLOGLOGICALINFO_ENABLED :
+		CACHE_XLOGLOGICALINFO_DISABLED;
 
-	return XLogLogicalInfoXactCache;
+	return XLogLogicalInfo;
 }
 
 /*
@@ -253,7 +253,7 @@ CheckXLogLogicalInfo(void)
 void
 AtEOXact_LogicalCtl(void)
 {
-	XLogLogicalInfoXactCache = -1;
+	XLogLogicalInfoXactCache = CACHE_XLOGLOGICALINFO_UNASSIGNED;
 }
 
 /*
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 957be89..4a7385b 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -96,8 +96,15 @@ typedef enum RecoveryState
 
 extern PGDLLIMPORT int wal_level;
 
+typedef enum XLogLogicalInfoXactCacheEnum
+{
+	CACHE_XLOGLOGICALINFO_UNASSIGNED,
+	CACHE_XLOGLOGICALINFO_DISABLED,
+	CACHE_XLOGLOGICALINFO_ENABLED
+} XLogLogicalInfoXactCacheEnum;
+
 extern PGDLLEXPORT bool XLogLogicalInfo;
-extern PGDLLEXPORT int XLogLogicalInfoXactCache;
+extern PGDLLEXPORT XLogLogicalInfoXactCacheEnum XLogLogicalInfoXactCache;
 
 /* Is WAL archiving enabled (always or only while server is running normally)? */
 #define XLogArchivingActive() \
@@ -139,9 +146,9 @@ extern PGDLLEXPORT int XLogLogicalInfoXactCache;
  */
 #define XLogLogicalInfoActive() \
 	(wal_level >= WAL_LEVEL_LOGICAL || \
-	 (XLogLogicalInfoXactCache < 0 ? \
+	 ((XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_UNASSIGNED) ? \
 	  CheckXLogLogicalInfo() : \
-	  (bool) XLogLogicalInfoXactCache))
+	  (XLogLogicalInfoXactCache == CACHE_XLOGLOGICALINFO_ENABLED)))
 
 #ifdef WAL_DEBUG
 extern PGDLLIMPORT bool XLOG_DEBUG;
