Subject: [PATCH v1 1/1] Use C99-designated initializer syntax for dispatch_table array

From: Japin Li <[email-masked]>
Date: Tue, 5 Mar 2024 21:32:46 +0800

---
 src/backend/executor/execExprInterp.c | 195 +++++++++++++-------------
 src/include/executor/execExpr.h       |   3 -
 2 files changed, 96 insertions(+), 102 deletions(-)

diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 7c1f51e2e0..e4ad522312 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -400,107 +400,104 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 	TupleTableSlot *outerslot;
 	TupleTableSlot *scanslot;
 
-	/*
-	 * This array has to be in the same order as enum ExprEvalOp.
-	 */
 #if defined(EEO_USE_COMPUTED_GOTO)
 	static const void *const dispatch_table[] = {
-		&&CASE_EEOP_DONE,
-		&&CASE_EEOP_INNER_FETCHSOME,
-		&&CASE_EEOP_OUTER_FETCHSOME,
-		&&CASE_EEOP_SCAN_FETCHSOME,
-		&&CASE_EEOP_INNER_VAR,
-		&&CASE_EEOP_OUTER_VAR,
-		&&CASE_EEOP_SCAN_VAR,
-		&&CASE_EEOP_INNER_SYSVAR,
-		&&CASE_EEOP_OUTER_SYSVAR,
-		&&CASE_EEOP_SCAN_SYSVAR,
-		&&CASE_EEOP_WHOLEROW,
-		&&CASE_EEOP_ASSIGN_INNER_VAR,
-		&&CASE_EEOP_ASSIGN_OUTER_VAR,
-		&&CASE_EEOP_ASSIGN_SCAN_VAR,
-		&&CASE_EEOP_ASSIGN_TMP,
-		&&CASE_EEOP_ASSIGN_TMP_MAKE_RO,
-		&&CASE_EEOP_CONST,
-		&&CASE_EEOP_FUNCEXPR,
-		&&CASE_EEOP_FUNCEXPR_STRICT,
-		&&CASE_EEOP_FUNCEXPR_FUSAGE,
-		&&CASE_EEOP_FUNCEXPR_STRICT_FUSAGE,
-		&&CASE_EEOP_BOOL_AND_STEP_FIRST,
-		&&CASE_EEOP_BOOL_AND_STEP,
-		&&CASE_EEOP_BOOL_AND_STEP_LAST,
-		&&CASE_EEOP_BOOL_OR_STEP_FIRST,
-		&&CASE_EEOP_BOOL_OR_STEP,
-		&&CASE_EEOP_BOOL_OR_STEP_LAST,
-		&&CASE_EEOP_BOOL_NOT_STEP,
-		&&CASE_EEOP_QUAL,
-		&&CASE_EEOP_JUMP,
-		&&CASE_EEOP_JUMP_IF_NULL,
-		&&CASE_EEOP_JUMP_IF_NOT_NULL,
-		&&CASE_EEOP_JUMP_IF_NOT_TRUE,
-		&&CASE_EEOP_NULLTEST_ISNULL,
-		&&CASE_EEOP_NULLTEST_ISNOTNULL,
-		&&CASE_EEOP_NULLTEST_ROWISNULL,
-		&&CASE_EEOP_NULLTEST_ROWISNOTNULL,
-		&&CASE_EEOP_BOOLTEST_IS_TRUE,
-		&&CASE_EEOP_BOOLTEST_IS_NOT_TRUE,
-		&&CASE_EEOP_BOOLTEST_IS_FALSE,
-		&&CASE_EEOP_BOOLTEST_IS_NOT_FALSE,
-		&&CASE_EEOP_PARAM_EXEC,
-		&&CASE_EEOP_PARAM_EXTERN,
-		&&CASE_EEOP_PARAM_CALLBACK,
-		&&CASE_EEOP_CASE_TESTVAL,
-		&&CASE_EEOP_MAKE_READONLY,
-		&&CASE_EEOP_IOCOERCE,
-		&&CASE_EEOP_IOCOERCE_SAFE,
-		&&CASE_EEOP_DISTINCT,
-		&&CASE_EEOP_NOT_DISTINCT,
-		&&CASE_EEOP_NULLIF,
-		&&CASE_EEOP_SQLVALUEFUNCTION,
-		&&CASE_EEOP_CURRENTOFEXPR,
-		&&CASE_EEOP_NEXTVALUEEXPR,
-		&&CASE_EEOP_ARRAYEXPR,
-		&&CASE_EEOP_ARRAYCOERCE,
-		&&CASE_EEOP_ROW,
-		&&CASE_EEOP_ROWCOMPARE_STEP,
-		&&CASE_EEOP_ROWCOMPARE_FINAL,
-		&&CASE_EEOP_MINMAX,
-		&&CASE_EEOP_FIELDSELECT,
-		&&CASE_EEOP_FIELDSTORE_DEFORM,
-		&&CASE_EEOP_FIELDSTORE_FORM,
-		&&CASE_EEOP_SBSREF_SUBSCRIPTS,
-		&&CASE_EEOP_SBSREF_OLD,
-		&&CASE_EEOP_SBSREF_ASSIGN,
-		&&CASE_EEOP_SBSREF_FETCH,
-		&&CASE_EEOP_DOMAIN_TESTVAL,
-		&&CASE_EEOP_DOMAIN_NOTNULL,
-		&&CASE_EEOP_DOMAIN_CHECK,
-		&&CASE_EEOP_CONVERT_ROWTYPE,
-		&&CASE_EEOP_SCALARARRAYOP,
-		&&CASE_EEOP_HASHED_SCALARARRAYOP,
-		&&CASE_EEOP_XMLEXPR,
-		&&CASE_EEOP_JSON_CONSTRUCTOR,
-		&&CASE_EEOP_IS_JSON,
-		&&CASE_EEOP_AGGREF,
-		&&CASE_EEOP_GROUPING_FUNC,
-		&&CASE_EEOP_WINDOW_FUNC,
-		&&CASE_EEOP_SUBPLAN,
-		&&CASE_EEOP_AGG_STRICT_DESERIALIZE,
-		&&CASE_EEOP_AGG_DESERIALIZE,
-		&&CASE_EEOP_AGG_STRICT_INPUT_CHECK_ARGS,
-		&&CASE_EEOP_AGG_STRICT_INPUT_CHECK_NULLS,
-		&&CASE_EEOP_AGG_PLAIN_PERGROUP_NULLCHECK,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_STRICT_BYVAL,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_BYVAL,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYREF,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_STRICT_BYREF,
-		&&CASE_EEOP_AGG_PLAIN_TRANS_BYREF,
-		&&CASE_EEOP_AGG_PRESORTED_DISTINCT_SINGLE,
-		&&CASE_EEOP_AGG_PRESORTED_DISTINCT_MULTI,
-		&&CASE_EEOP_AGG_ORDERED_TRANS_DATUM,
-		&&CASE_EEOP_AGG_ORDERED_TRANS_TUPLE,
-		&&CASE_EEOP_LAST
+		[EEOP_DONE] = &&CASE_EEOP_DONE,
+		[EEOP_INNER_FETCHSOME] = &&CASE_EEOP_INNER_FETCHSOME,
+		[EEOP_OUTER_FETCHSOME] = &&CASE_EEOP_OUTER_FETCHSOME,
+		[EEOP_SCAN_FETCHSOME] = &&CASE_EEOP_SCAN_FETCHSOME,
+		[EEOP_INNER_VAR] = &&CASE_EEOP_INNER_VAR,
+		[EEOP_OUTER_VAR] = &&CASE_EEOP_OUTER_VAR,
+		[EEOP_SCAN_VAR] = &&CASE_EEOP_SCAN_VAR,
+		[EEOP_INNER_SYSVAR] = &&CASE_EEOP_INNER_SYSVAR,
+		[EEOP_OUTER_SYSVAR] = &&CASE_EEOP_OUTER_SYSVAR,
+		[EEOP_SCAN_SYSVAR] = &&CASE_EEOP_SCAN_SYSVAR,
+		[EEOP_WHOLEROW] = &&CASE_EEOP_WHOLEROW,
+		[EEOP_ASSIGN_INNER_VAR] = &&CASE_EEOP_ASSIGN_INNER_VAR,
+		[EEOP_ASSIGN_OUTER_VAR] = &&CASE_EEOP_ASSIGN_OUTER_VAR,
+		[EEOP_ASSIGN_SCAN_VAR] = &&CASE_EEOP_ASSIGN_SCAN_VAR,
+		[EEOP_ASSIGN_TMP] = &&CASE_EEOP_ASSIGN_TMP,
+		[EEOP_ASSIGN_TMP_MAKE_RO] = &&CASE_EEOP_ASSIGN_TMP_MAKE_RO,
+		[EEOP_CONST] = &&CASE_EEOP_CONST,
+		[EEOP_FUNCEXPR] = &&CASE_EEOP_FUNCEXPR,
+		[EEOP_FUNCEXPR_STRICT] = &&CASE_EEOP_FUNCEXPR_STRICT,
+		[EEOP_FUNCEXPR_FUSAGE] = &&CASE_EEOP_FUNCEXPR_FUSAGE,
+		[EEOP_FUNCEXPR_STRICT_FUSAGE] = &&CASE_EEOP_FUNCEXPR_STRICT_FUSAGE,
+		[EEOP_BOOL_AND_STEP_FIRST] = &&CASE_EEOP_BOOL_AND_STEP_FIRST,
+		[EEOP_BOOL_AND_STEP] = &&CASE_EEOP_BOOL_AND_STEP,
+		[EEOP_BOOL_AND_STEP_LAST] = &&CASE_EEOP_BOOL_AND_STEP_LAST,
+		[EEOP_BOOL_OR_STEP_FIRST] = &&CASE_EEOP_BOOL_OR_STEP_FIRST,
+		[EEOP_BOOL_OR_STEP] = &&CASE_EEOP_BOOL_OR_STEP,
+		[EEOP_BOOL_OR_STEP_LAST] = &&CASE_EEOP_BOOL_OR_STEP_LAST,
+		[EEOP_BOOL_NOT_STEP] = &&CASE_EEOP_BOOL_NOT_STEP,
+		[EEOP_QUAL] = &&CASE_EEOP_QUAL,
+		[EEOP_JUMP] = &&CASE_EEOP_JUMP,
+		[EEOP_JUMP_IF_NULL] = &&CASE_EEOP_JUMP_IF_NULL,
+		[EEOP_JUMP_IF_NOT_NULL] = &&CASE_EEOP_JUMP_IF_NOT_NULL,
+		[EEOP_JUMP_IF_NOT_TRUE] = &&CASE_EEOP_JUMP_IF_NOT_TRUE,
+		[EEOP_NULLTEST_ISNULL] = &&CASE_EEOP_NULLTEST_ISNULL,
+		[EEOP_NULLTEST_ISNOTNULL] = &&CASE_EEOP_NULLTEST_ISNOTNULL,
+		[EEOP_NULLTEST_ROWISNULL] = &&CASE_EEOP_NULLTEST_ROWISNULL,
+		[EEOP_NULLTEST_ROWISNOTNULL] = &&CASE_EEOP_NULLTEST_ROWISNOTNULL,
+		[EEOP_BOOLTEST_IS_TRUE] = &&CASE_EEOP_BOOLTEST_IS_TRUE,
+		[EEOP_BOOLTEST_IS_NOT_TRUE] = &&CASE_EEOP_BOOLTEST_IS_NOT_TRUE,
+		[EEOP_BOOLTEST_IS_FALSE] = &&CASE_EEOP_BOOLTEST_IS_FALSE,
+		[EEOP_BOOLTEST_IS_NOT_FALSE] = &&CASE_EEOP_BOOLTEST_IS_NOT_FALSE,
+		[EEOP_PARAM_EXEC] = &&CASE_EEOP_PARAM_EXEC,
+		[EEOP_PARAM_EXTERN] = &&CASE_EEOP_PARAM_EXTERN,
+		[EEOP_PARAM_CALLBACK] = &&CASE_EEOP_PARAM_CALLBACK,
+		[EEOP_CASE_TESTVAL] = &&CASE_EEOP_CASE_TESTVAL,
+		[EEOP_MAKE_READONLY] = &&CASE_EEOP_MAKE_READONLY,
+		[EEOP_IOCOERCE] = &&CASE_EEOP_IOCOERCE,
+		[EEOP_IOCOERCE_SAFE] = &&CASE_EEOP_IOCOERCE_SAFE,
+		[EEOP_DISTINCT] = &&CASE_EEOP_DISTINCT,
+		[EEOP_NOT_DISTINCT] = &&CASE_EEOP_NOT_DISTINCT,
+		[EEOP_NULLIF] = &&CASE_EEOP_NULLIF,
+		[EEOP_SQLVALUEFUNCTION] = &&CASE_EEOP_SQLVALUEFUNCTION,
+		[EEOP_CURRENTOFEXPR] = &&CASE_EEOP_CURRENTOFEXPR,
+		[EEOP_NEXTVALUEEXPR] = &&CASE_EEOP_NEXTVALUEEXPR,
+		[EEOP_ARRAYEXPR] = &&CASE_EEOP_ARRAYEXPR,
+		[EEOP_ARRAYCOERCE] = &&CASE_EEOP_ARRAYCOERCE,
+		[EEOP_ROW] = &&CASE_EEOP_ROW,
+		[EEOP_ROWCOMPARE_STEP] = &&CASE_EEOP_ROWCOMPARE_STEP,
+		[EEOP_ROWCOMPARE_FINAL] = &&CASE_EEOP_ROWCOMPARE_FINAL,
+		[EEOP_MINMAX] = &&CASE_EEOP_MINMAX,
+		[EEOP_FIELDSELECT] = &&CASE_EEOP_FIELDSELECT,
+		[EEOP_FIELDSTORE_DEFORM] = &&CASE_EEOP_FIELDSTORE_DEFORM,
+		[EEOP_FIELDSTORE_FORM] = &&CASE_EEOP_FIELDSTORE_FORM,
+		[EEOP_SBSREF_SUBSCRIPTS] = &&CASE_EEOP_SBSREF_SUBSCRIPTS,
+		[EEOP_SBSREF_OLD] = &&CASE_EEOP_SBSREF_OLD,
+		[EEOP_SBSREF_ASSIGN] = &&CASE_EEOP_SBSREF_ASSIGN,
+		[EEOP_SBSREF_FETCH] = &&CASE_EEOP_SBSREF_FETCH,
+		[EEOP_DOMAIN_TESTVAL] = &&CASE_EEOP_DOMAIN_TESTVAL,
+		[EEOP_DOMAIN_NOTNULL] = &&CASE_EEOP_DOMAIN_NOTNULL,
+		[EEOP_DOMAIN_CHECK] = &&CASE_EEOP_DOMAIN_CHECK,
+		[EEOP_CONVERT_ROWTYPE] = &&CASE_EEOP_CONVERT_ROWTYPE,
+		[EEOP_SCALARARRAYOP] = &&CASE_EEOP_SCALARARRAYOP,
+		[EEOP_HASHED_SCALARARRAYOP] = &&CASE_EEOP_HASHED_SCALARARRAYOP,
+		[EEOP_XMLEXPR] = &&CASE_EEOP_XMLEXPR,
+		[EEOP_JSON_CONSTRUCTOR] = &&CASE_EEOP_JSON_CONSTRUCTOR,
+		[EEOP_IS_JSON] = &&CASE_EEOP_IS_JSON,
+		[EEOP_AGGREF] = &&CASE_EEOP_AGGREF,
+		[EEOP_GROUPING_FUNC] = &&CASE_EEOP_GROUPING_FUNC,
+		[EEOP_WINDOW_FUNC] = &&CASE_EEOP_WINDOW_FUNC,
+		[EEOP_SUBPLAN] = &&CASE_EEOP_SUBPLAN,
+		[EEOP_AGG_STRICT_DESERIALIZE] = &&CASE_EEOP_AGG_STRICT_DESERIALIZE,
+		[EEOP_AGG_DESERIALIZE] = &&CASE_EEOP_AGG_DESERIALIZE,
+		[EEOP_AGG_STRICT_INPUT_CHECK_ARGS] = &&CASE_EEOP_AGG_STRICT_INPUT_CHECK_ARGS,
+		[EEOP_AGG_STRICT_INPUT_CHECK_NULLS] = &&CASE_EEOP_AGG_STRICT_INPUT_CHECK_NULLS,
+		[EEOP_AGG_PLAIN_PERGROUP_NULLCHECK] = &&CASE_EEOP_AGG_PLAIN_PERGROUP_NULLCHECK,
+		[EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL] = &&CASE_EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL,
+		[EEOP_AGG_PLAIN_TRANS_STRICT_BYVAL] = &&CASE_EEOP_AGG_PLAIN_TRANS_STRICT_BYVAL,
+		[EEOP_AGG_PLAIN_TRANS_BYVAL] = &&CASE_EEOP_AGG_PLAIN_TRANS_BYVAL,
+		[EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYREF] = &&CASE_EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYREF,
+		[EEOP_AGG_PLAIN_TRANS_STRICT_BYREF] = &&CASE_EEOP_AGG_PLAIN_TRANS_STRICT_BYREF,
+		[EEOP_AGG_PLAIN_TRANS_BYREF] = &&CASE_EEOP_AGG_PLAIN_TRANS_BYREF,
+		[EEOP_AGG_PRESORTED_DISTINCT_SINGLE] = &&CASE_EEOP_AGG_PRESORTED_DISTINCT_SINGLE,
+		[EEOP_AGG_PRESORTED_DISTINCT_MULTI] = &&CASE_EEOP_AGG_PRESORTED_DISTINCT_MULTI,
+		[EEOP_AGG_ORDERED_TRANS_DATUM] = &&CASE_EEOP_AGG_ORDERED_TRANS_DATUM,
+		[EEOP_AGG_ORDERED_TRANS_TUPLE] = &&CASE_EEOP_AGG_ORDERED_TRANS_TUPLE,
+		[EEOP_LAST] = &&CASE_EEOP_LAST,
 	};
 
 	StaticAssertDecl(lengthof(dispatch_table) == EEOP_LAST + 1,
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h
index a28ddcdd77..0a2f389ed7 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -59,9 +59,6 @@ typedef struct ExprEvalRowtypeCache
  *
  * Identifies the operation to be executed and which member in the
  * ExprEvalStep->d union is valid.
- *
- * The order of entries needs to be kept in sync with the dispatch_table[]
- * array in execExprInterp.c:ExecInterpExpr().
  */
 typedef enum ExprEvalOp
 {
-- 
2.34.1

--=-=-=--