On Tue, 05 Mar 2024 at 22:03, Jelte Fennema-Nio <[email protected]> wrote:
> On Tue, 5 Mar 2024 at 14:50, Japin Li <[email protected]> wrote:
>> Attach a patch to rewrite dispatch_table array using C99-designated
>> initializer syntax.
>
> Looks good. Two small things:
Thanks for the review.
>
> + [EEOP_LAST] = &&CASE_EEOP_LAST,
>
> Is EEOP_LAST actually needed in this array? It seems unused afaict. If
> indeed not needed, that would be good to remove in an additional
> commit.
There is a warning if remove it, so I keep it.
/home/japin/Codes/postgres/build/../src/backend/executor/execExprInterp.c:118:33:
warning: label ‘CASE_EEOP_LAST’ defined but not used [-Wunused-label]
118 | #define EEO_CASE(name) CASE_##name:
| ^~~~~
/home/japin/Codes/postgres/build/../src/backend/executor/execExprInterp.c:1845:17:
note: in expansion of macro ‘EEO_CASE’
1845 | EEO_CASE(EEOP_LAST)
| ^~~~~~~~
>
> - *
> - * The order of entries needs to be kept in sync with the dispatch_table[]
> - * array in execExprInterp.c:ExecInterpExpr().
>
> I think it would be good to at least keep the comment saying that this
> array should be updated (only the order doesn't need to be strictly
> kept in sync anymore).
Fixed.
>From 20a72f2a5e0b282812ecde5c6aef2ce4ab118003 Mon Sep 17 00:00:00 2001
From: Japin Li <[email protected]>
Date: Tue, 5 Mar 2024 21:32:46 +0800
Subject: [PATCH v2 1/1] Use C99-designated initializer syntax for
dispatch_table array
---
src/backend/executor/execExprInterp.c | 195 +++++++++++++-------------
src/include/executor/execExpr.h | 2 +-
2 files changed, 97 insertions(+), 100 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..00d3db7a74 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -60,7 +60,7 @@ 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[]
+ * If you add some operation don't forget to update the dispatch_table[]
* array in execExprInterp.c:ExecInterpExpr().
*/
typedef enum ExprEvalOp
--
2.34.1