expression eval: Don't redundantly keep track of AggState.
authorAndres Freund <andres@anarazel.de>
Fri, 7 Feb 2020 03:06:16 +0000 (19:06 -0800)
committerAndres Freund <andres@anarazel.de>
Fri, 7 Feb 2020 03:54:43 +0000 (19:54 -0800)
It's already tracked via ExprState->parent, so we don't need to also
include it in ExprEvalStep. When that code originally was written
ExprState->parent didn't exist, but it since has been introduced in
6719b238e8f.

Author: Andres Freund
Discussion: https://postgr.es/m/20191023163849.sosqbfs5yenocez3@alap3.anarazel.de

src/backend/executor/execExpr.c
src/backend/executor/execExprInterp.c
src/backend/jit/llvm/llvmjit_expr.c
src/include/executor/execExpr.h
src/include/nodes/execnodes.h

index af97f8100673acf0777a139dbb0ac2b5bc2dff28..121eff97a0c6869857e18c0d866cf2557062d1b2 100644 (file)
@@ -810,7 +810,6 @@ ExecInitExprRec(Expr *node, ExprState *state,
                                        elog(ERROR, "GroupingFunc found in non-Agg plan node");
 
                                scratch.opcode = EEOP_GROUPING_FUNC;
-                               scratch.d.grouping_func.parent = (AggState *) state->parent;
 
                                agg = (Agg *) (state->parent->plan);
 
@@ -3050,7 +3049,6 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase,
                                else
                                        scratch.opcode = EEOP_AGG_DESERIALIZE;
 
-                               scratch.d.agg_deserialize.aggstate = aggstate;
                                scratch.d.agg_deserialize.fcinfo_data = ds_fcinfo;
                                scratch.d.agg_deserialize.jumpnull = -1;        /* adjust later */
                                scratch.resvalue = &trans_fcinfo->args[argno + 1].value;
@@ -3252,7 +3250,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
                pertrans->initValueIsNull)
        {
                scratch->opcode = EEOP_AGG_INIT_TRANS;
-               scratch->d.agg_init_trans.aggstate = aggstate;
                scratch->d.agg_init_trans.pertrans = pertrans;
                scratch->d.agg_init_trans.setno = setno;
                scratch->d.agg_init_trans.setoff = setoff;
@@ -3269,7 +3266,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
                fcinfo->flinfo->fn_strict)
        {
                scratch->opcode = EEOP_AGG_STRICT_TRANS_CHECK;
-               scratch->d.agg_strict_trans_check.aggstate = aggstate;
                scratch->d.agg_strict_trans_check.setno = setno;
                scratch->d.agg_strict_trans_check.setoff = setoff;
                scratch->d.agg_strict_trans_check.transno = transno;
@@ -3294,7 +3290,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
        else
                scratch->opcode = EEOP_AGG_ORDERED_TRANS_TUPLE;
 
-       scratch->d.agg_trans.aggstate = aggstate;
        scratch->d.agg_trans.pertrans = pertrans;
        scratch->d.agg_trans.setno = setno;
        scratch->d.agg_trans.setoff = setoff;
index 19c117436aa6cf748a505bab7d050bc0cdb91e1f..35eb8b99f6937ea4b2748df69e022b5904cfbb35 100644 (file)
@@ -1544,7 +1544,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                EEO_CASE(EEOP_AGG_DESERIALIZE)
                {
                        FunctionCallInfo fcinfo = op->d.agg_deserialize.fcinfo_data;
-                       AggState   *aggstate = op->d.agg_deserialize.aggstate;
+                       AggState   *aggstate = castNode(AggState, state->parent);
                        MemoryContext oldContext;
 
                        /*
@@ -1596,10 +1596,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                 */
                EEO_CASE(EEOP_AGG_INIT_TRANS)
                {
-                       AggState   *aggstate;
+                       AggState   *aggstate = castNode(AggState, state->parent);
                        AggStatePerGroup pergroup;
 
-                       aggstate = op->d.agg_init_trans.aggstate;
                        pergroup = &aggstate->all_pergroups
                                [op->d.agg_init_trans.setoff]
                                [op->d.agg_init_trans.transno];
@@ -1624,10 +1623,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                /* check that a strict aggregate's input isn't NULL */
                EEO_CASE(EEOP_AGG_STRICT_TRANS_CHECK)
                {
-                       AggState   *aggstate;
+                       AggState   *aggstate = castNode(AggState, state->parent);
                        AggStatePerGroup pergroup;
 
-                       aggstate = op->d.agg_strict_trans_check.aggstate;
                        pergroup = &aggstate->all_pergroups
                                [op->d.agg_strict_trans_check.setoff]
                                [op->d.agg_strict_trans_check.transno];
@@ -1645,14 +1643,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                 */
                EEO_CASE(EEOP_AGG_PLAIN_TRANS_BYVAL)
                {
-                       AggState   *aggstate;
+                       AggState   *aggstate = castNode(AggState, state->parent);
                        AggStatePerTrans pertrans;
                        AggStatePerGroup pergroup;
                        FunctionCallInfo fcinfo;
                        MemoryContext oldContext;
                        Datum           newVal;
 
-                       aggstate = op->d.agg_trans.aggstate;
                        pertrans = op->d.agg_trans.pertrans;
 
                        pergroup = &aggstate->all_pergroups
@@ -1696,14 +1693,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
                 */
                EEO_CASE(EEOP_AGG_PLAIN_TRANS)
                {
-                       AggState   *aggstate;
+                       AggState   *aggstate = castNode(AggState, state->parent);
                        AggStatePerTrans pertrans;
                        AggStatePerGroup pergroup;
                        FunctionCallInfo fcinfo;
                        MemoryContext oldContext;
                        Datum           newVal;
 
-                       aggstate = op->d.agg_trans.aggstate;
                        pertrans = op->d.agg_trans.pertrans;
 
                        pergroup = &aggstate->all_pergroups
@@ -3846,8 +3842,9 @@ ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op)
 void
 ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op)
 {
+       AggState   *aggstate = castNode(AggState, state->parent);
        int                     result = 0;
-       Bitmapset  *grouped_cols = op->d.grouping_func.parent->grouped_cols;
+       Bitmapset  *grouped_cols = aggstate->grouped_cols;
        ListCell   *lc;
 
        foreach(lc, op->d.grouping_func.clauses)
index a2302b4d4d6df6ed8c207e1948974d4b32d18325..521d9337e7c4b738642d85a3c84f9413e82ec371 100644 (file)
@@ -85,6 +85,7 @@ llvm_compile_expr(ExprState *state)
        /* state itself */
        LLVMValueRef v_state;
        LLVMValueRef v_econtext;
+       LLVMValueRef v_parent;
 
        /* returnvalue */
        LLVMValueRef v_isnullp;
@@ -173,6 +174,9 @@ llvm_compile_expr(ExprState *state)
        v_tmpisnullp = LLVMBuildStructGEP(b, v_state,
                                                                          FIELDNO_EXPRSTATE_RESNULL,
                                                                          "v.state.resnull");
+       v_parent = l_load_struct_gep(b, v_state,
+                                                                FIELDNO_EXPRSTATE_PARENT,
+                                                                "v.state.parent");
 
        /* build global slots */
        v_scanslot = l_load_struct_gep(b, v_econtext,
@@ -1989,7 +1993,7 @@ llvm_compile_expr(ExprState *state)
                                        LLVMValueRef v_tmpcontext;
                                        LLVMValueRef v_oldcontext;
 
-                                       aggstate = op->d.agg_deserialize.aggstate;
+                                       aggstate = castNode(AggState, state->parent);
                                        fcinfo = op->d.agg_deserialize.fcinfo_data;
 
                                        v_tmpcontext =
@@ -2078,7 +2082,6 @@ llvm_compile_expr(ExprState *state)
 
                        case EEOP_AGG_INIT_TRANS:
                                {
-                                       AggState   *aggstate;
                                        AggStatePerTrans pertrans;
 
                                        LLVMValueRef v_aggstatep;
@@ -2095,11 +2098,10 @@ llvm_compile_expr(ExprState *state)
 
                                        LLVMBasicBlockRef b_init;
 
-                                       aggstate = op->d.agg_init_trans.aggstate;
                                        pertrans = op->d.agg_init_trans.pertrans;
 
-                                       v_aggstatep = l_ptr_const(aggstate,
-                                                                                         l_ptr(StructAggState));
+                                       v_aggstatep =
+                                               LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
                                        v_pertransp = l_ptr_const(pertrans,
                                                                                          l_ptr(StructAggStatePerTransData));
 
@@ -2176,7 +2178,6 @@ llvm_compile_expr(ExprState *state)
 
                        case EEOP_AGG_STRICT_TRANS_CHECK:
                                {
-                                       AggState   *aggstate;
                                        LLVMValueRef v_setoff,
                                                                v_transno;
 
@@ -2188,8 +2189,8 @@ llvm_compile_expr(ExprState *state)
 
                                        int                     jumpnull = op->d.agg_strict_trans_check.jumpnull;
 
-                                       aggstate = op->d.agg_strict_trans_check.aggstate;
-                                       v_aggstatep = l_ptr_const(aggstate, l_ptr(StructAggState));
+                                       v_aggstatep =
+                                               LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
 
                                        /*
                                         * pergroup = &aggstate->all_pergroups
@@ -2256,13 +2257,13 @@ llvm_compile_expr(ExprState *state)
                                        LLVMValueRef v_tmpcontext;
                                        LLVMValueRef v_oldcontext;
 
-                                       aggstate = op->d.agg_trans.aggstate;
+                                       aggstate = castNode(AggState, state->parent);
                                        pertrans = op->d.agg_trans.pertrans;
 
                                        fcinfo = pertrans->transfn_fcinfo;
 
-                                       v_aggstatep = l_ptr_const(aggstate,
-                                                                                         l_ptr(StructAggState));
+                                       v_aggstatep =
+                                               LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
                                        v_pertransp = l_ptr_const(pertrans,
                                                                                          l_ptr(StructAggStatePerTransData));
 
index 7112558363fca9e2fb7de491b49711f583af247c..73a2ca8c6ddcd124a2cc1b38fc7404a5b9927fe1 100644 (file)
@@ -569,7 +569,6 @@ typedef struct ExprEvalStep
                /* for EEOP_GROUPING_FUNC */
                struct
                {
-                       AggState   *parent; /* parent Agg */
                        List       *clauses;    /* integer list of column numbers */
                }                       grouping_func;
 
@@ -597,7 +596,6 @@ typedef struct ExprEvalStep
                /* for EEOP_AGG_*DESERIALIZE */
                struct
                {
-                       AggState   *aggstate;
                        FunctionCallInfo fcinfo_data;
                        int                     jumpnull;
                }                       agg_deserialize;
@@ -625,7 +623,6 @@ typedef struct ExprEvalStep
                /* for EEOP_AGG_INIT_TRANS */
                struct
                {
-                       AggState   *aggstate;
                        AggStatePerTrans pertrans;
                        ExprContext *aggcontext;
                        int                     setno;
@@ -637,7 +634,6 @@ typedef struct ExprEvalStep
                /* for EEOP_AGG_STRICT_TRANS_CHECK */
                struct
                {
-                       AggState   *aggstate;
                        int                     setno;
                        int                     transno;
                        int                     setoff;
@@ -647,7 +643,6 @@ typedef struct ExprEvalStep
                /* for EEOP_AGG_{PLAIN,ORDERED}_TRANS* */
                struct
                {
-                       AggState   *aggstate;
                        AggStatePerTrans pertrans;
                        ExprContext *aggcontext;
                        int                     setno;
index 1f6f5bbc20759115052f16db81cf0af59fee813b..5d5b38b8799a635e9dc3a31bbeeb58edf12ba93b 100644 (file)
@@ -104,6 +104,7 @@ typedef struct ExprState
        int                     steps_len;              /* number of steps currently */
        int                     steps_alloc;    /* allocated length of steps array */
 
+#define FIELDNO_EXPRSTATE_PARENT 11
        struct PlanState *parent;       /* parent PlanState node, if any */
        ParamListInfo ext_params;       /* for compiling PARAM_EXTERN nodes */