diff options
author | Andres Freund <andres@anarazel.de> | 2020-02-06 19:06:16 -0800 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2020-02-06 19:54:43 -0800 |
commit | 1fdb7f9789c4550204cd62d1746a7deed1dc4c29 (patch) | |
tree | 877c68ff731bf42a811be492dca9c79db71494be | |
parent | 1ec7679f1b67e84be688a311dce234eeaa1d5de8 (diff) | |
download | postgresql-1fdb7f9789c4550204cd62d1746a7deed1dc4c29.tar.gz postgresql-1fdb7f9789c4550204cd62d1746a7deed1dc4c29.zip |
expression eval: Don't redundantly keep track of AggState.
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
-rw-r--r-- | src/backend/executor/execExpr.c | 5 | ||||
-rw-r--r-- | src/backend/executor/execExprInterp.c | 17 | ||||
-rw-r--r-- | src/backend/jit/llvm/llvmjit_expr.c | 23 | ||||
-rw-r--r-- | src/include/executor/execExpr.h | 5 | ||||
-rw-r--r-- | src/include/nodes/execnodes.h | 1 |
5 files changed, 20 insertions, 31 deletions
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index af97f810067..121eff97a0c 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -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; diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 19c117436aa..35eb8b99f69 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -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) diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index a2302b4d4d6..521d9337e7c 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -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)); diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 7112558363f..73a2ca8c6dd 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -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; diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 1f6f5bbc207..5d5b38b8799 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -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 */ |