From 2c5a4e40d405f07dff29c7cf07a93491d1bb2f41 Mon Sep 17 00:00:00 2001
From: Tender Wang <tndrwang@gmail.com>
Date: Thu, 16 Oct 2025 20:10:18 +0800
Subject: [PATCH] Use enum to define the state machine for HashJoin and
 MergeJoin.

---
 src/backend/executor/nodeHashjoin.c  | 11 +--------
 src/backend/executor/nodeMergejoin.c | 16 +------------
 src/include/nodes/execnodes.h        | 34 ++++++++++++++++++++++++++--
 src/tools/pgindent/typedefs.list     |  2 ++
 4 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 5661ad76830..a5908892381 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -174,15 +174,6 @@
 #include "utils/wait_event.h"
 
 
-/*
- * States of the ExecHashJoin state machine
- */
-#define HJ_BUILD_HASHTABLE		1
-#define HJ_NEED_NEW_OUTER		2
-#define HJ_SCAN_BUCKET			3
-#define HJ_FILL_OUTER_TUPLE		4
-#define HJ_FILL_INNER_TUPLES	5
-#define HJ_NEED_NEW_BATCH		6
 
 /* Returns true if doing null-fill on outer relation */
 #define HJ_FILL_OUTER(hjstate)	((hjstate)->hj_NullInnerTupleSlot != NULL)
@@ -669,7 +660,7 @@ ExecHashJoinImpl(PlanState *pstate, bool parallel)
 
 			default:
 				elog(ERROR, "unrecognized hashjoin state: %d",
-					 (int) node->hj_JoinState);
+					 node->hj_JoinState);
 		}
 	}
 }
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c
index a233313128a..2aee0502758 100644
--- a/src/backend/executor/nodeMergejoin.c
+++ b/src/backend/executor/nodeMergejoin.c
@@ -99,20 +99,6 @@
 #include "utils/lsyscache.h"
 
 
-/*
- * States of the ExecMergeJoin state machine
- */
-#define EXEC_MJ_INITIALIZE_OUTER		1
-#define EXEC_MJ_INITIALIZE_INNER		2
-#define EXEC_MJ_JOINTUPLES				3
-#define EXEC_MJ_NEXTOUTER				4
-#define EXEC_MJ_TESTOUTER				5
-#define EXEC_MJ_NEXTINNER				6
-#define EXEC_MJ_SKIP_TEST				7
-#define EXEC_MJ_SKIPOUTER_ADVANCE		8
-#define EXEC_MJ_SKIPINNER_ADVANCE		9
-#define EXEC_MJ_ENDOUTER				10
-#define EXEC_MJ_ENDINNER				11
 
 /*
  * Runtime data for each mergejoin clause
@@ -1426,7 +1412,7 @@ ExecMergeJoin(PlanState *pstate)
 				 */
 			default:
 				elog(ERROR, "unrecognized mergejoin state: %d",
-					 (int) node->mj_JoinState);
+					 node->mj_JoinState);
 		}
 	}
 }
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index a36653c37f9..679b59cdfc0 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2195,6 +2195,24 @@ typedef struct NestLoopState
  *		InnerEContext	   workspace for computing inner tuple's join values
  * ----------------
  */
+
+/*
+ * States of the ExecMergeJoin state machine
+ */
+typedef enum MJ_ExecState {
+	EXEC_MJ_INITIALIZE_OUTER = 1,
+	EXEC_MJ_INITIALIZE_INNER,
+	EXEC_MJ_JOINTUPLES,
+	EXEC_MJ_NEXTOUTER,
+	EXEC_MJ_TESTOUTER,
+	EXEC_MJ_NEXTINNER,
+	EXEC_MJ_SKIP_TEST,
+	EXEC_MJ_SKIPOUTER_ADVANCE,
+	EXEC_MJ_SKIPINNER_ADVANCE,
+	EXEC_MJ_ENDOUTER,
+	EXEC_MJ_ENDINNER
+} MJ_ExecState;
+
 /* private in nodeMergejoin.c: */
 typedef struct MergeJoinClauseData *MergeJoinClause;
 
@@ -2203,7 +2221,7 @@ typedef struct MergeJoinState
 	JoinState	js;				/* its first field is NodeTag */
 	int			mj_NumClauses;
 	MergeJoinClause mj_Clauses; /* array of length mj_NumClauses */
-	int			mj_JoinState;
+	MJ_ExecState	mj_JoinState;
 	bool		mj_SkipMarkRestore;
 	bool		mj_ExtraMarks;
 	bool		mj_ConstFalseJoin;
@@ -2246,6 +2264,18 @@ typedef struct MergeJoinState
  * ----------------
  */
 
+/*
+ * States of the ExecHashJoin state machine
+ */
+typedef enum HJ_ExecState {
+	HJ_BUILD_HASHTABLE = 1,
+	HJ_NEED_NEW_OUTER,
+	HJ_SCAN_BUCKET,
+	HJ_FILL_OUTER_TUPLE,
+	HJ_FILL_INNER_TUPLES,
+	HJ_NEED_NEW_BATCH
+} HJ_ExecState;
+
 /* these structs are defined in executor/hashjoin.h: */
 typedef struct HashJoinTupleData *HashJoinTuple;
 typedef struct HashJoinTableData *HashJoinTable;
@@ -2265,7 +2295,7 @@ typedef struct HashJoinState
 	TupleTableSlot *hj_NullOuterTupleSlot;
 	TupleTableSlot *hj_NullInnerTupleSlot;
 	TupleTableSlot *hj_FirstOuterTupleSlot;
-	int			hj_JoinState;
+	HJ_ExecState	hj_JoinState;
 	bool		hj_MatchedOuter;
 	bool		hj_OuterNotEmpty;
 } HashJoinState;
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 377a7946585..fcb6337f15a 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1145,6 +1145,7 @@ HASH_SEQ_STATUS
 HE
 HEntry
 HIST_ENTRY
+HJ_ExecState
 HKEY
 HLOCAL
 HMAC_CTX
@@ -1654,6 +1655,7 @@ MGVTBL
 MINIDUMPWRITEDUMP
 MINIDUMP_TYPE
 MJEvalResult
+MJ_ExecState
 MTTargetRelLookup
 MVDependencies
 MVDependency
-- 
2.34.1

