Commit 1fdb7f97 authored by Andres Freund's avatar Andres Freund

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
6719b238.

Author: Andres Freund
Discussion: https://postgr.es/m/20191023163849.sosqbfs5yenocez3@alap3.anarazel.de
parent 1ec7679f
...@@ -810,7 +810,6 @@ ExecInitExprRec(Expr *node, ExprState *state, ...@@ -810,7 +810,6 @@ ExecInitExprRec(Expr *node, ExprState *state,
elog(ERROR, "GroupingFunc found in non-Agg plan node"); elog(ERROR, "GroupingFunc found in non-Agg plan node");
scratch.opcode = EEOP_GROUPING_FUNC; scratch.opcode = EEOP_GROUPING_FUNC;
scratch.d.grouping_func.parent = (AggState *) state->parent;
agg = (Agg *) (state->parent->plan); agg = (Agg *) (state->parent->plan);
...@@ -3050,7 +3049,6 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase, ...@@ -3050,7 +3049,6 @@ ExecBuildAggTrans(AggState *aggstate, AggStatePerPhase phase,
else else
scratch.opcode = EEOP_AGG_DESERIALIZE; scratch.opcode = EEOP_AGG_DESERIALIZE;
scratch.d.agg_deserialize.aggstate = aggstate;
scratch.d.agg_deserialize.fcinfo_data = ds_fcinfo; scratch.d.agg_deserialize.fcinfo_data = ds_fcinfo;
scratch.d.agg_deserialize.jumpnull = -1; /* adjust later */ scratch.d.agg_deserialize.jumpnull = -1; /* adjust later */
scratch.resvalue = &trans_fcinfo->args[argno + 1].value; scratch.resvalue = &trans_fcinfo->args[argno + 1].value;
...@@ -3252,7 +3250,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate, ...@@ -3252,7 +3250,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
pertrans->initValueIsNull) pertrans->initValueIsNull)
{ {
scratch->opcode = EEOP_AGG_INIT_TRANS; 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.pertrans = pertrans;
scratch->d.agg_init_trans.setno = setno; scratch->d.agg_init_trans.setno = setno;
scratch->d.agg_init_trans.setoff = setoff; scratch->d.agg_init_trans.setoff = setoff;
...@@ -3269,7 +3266,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate, ...@@ -3269,7 +3266,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
fcinfo->flinfo->fn_strict) fcinfo->flinfo->fn_strict)
{ {
scratch->opcode = EEOP_AGG_STRICT_TRANS_CHECK; 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.setno = setno;
scratch->d.agg_strict_trans_check.setoff = setoff; scratch->d.agg_strict_trans_check.setoff = setoff;
scratch->d.agg_strict_trans_check.transno = transno; scratch->d.agg_strict_trans_check.transno = transno;
...@@ -3294,7 +3290,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate, ...@@ -3294,7 +3290,6 @@ ExecBuildAggTransCall(ExprState *state, AggState *aggstate,
else else
scratch->opcode = EEOP_AGG_ORDERED_TRANS_TUPLE; scratch->opcode = EEOP_AGG_ORDERED_TRANS_TUPLE;
scratch->d.agg_trans.aggstate = aggstate;
scratch->d.agg_trans.pertrans = pertrans; scratch->d.agg_trans.pertrans = pertrans;
scratch->d.agg_trans.setno = setno; scratch->d.agg_trans.setno = setno;
scratch->d.agg_trans.setoff = setoff; scratch->d.agg_trans.setoff = setoff;
......
...@@ -1544,7 +1544,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -1544,7 +1544,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
EEO_CASE(EEOP_AGG_DESERIALIZE) EEO_CASE(EEOP_AGG_DESERIALIZE)
{ {
FunctionCallInfo fcinfo = op->d.agg_deserialize.fcinfo_data; FunctionCallInfo fcinfo = op->d.agg_deserialize.fcinfo_data;
AggState *aggstate = op->d.agg_deserialize.aggstate; AggState *aggstate = castNode(AggState, state->parent);
MemoryContext oldContext; MemoryContext oldContext;
/* /*
...@@ -1596,10 +1596,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -1596,10 +1596,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
*/ */
EEO_CASE(EEOP_AGG_INIT_TRANS) EEO_CASE(EEOP_AGG_INIT_TRANS)
{ {
AggState *aggstate; AggState *aggstate = castNode(AggState, state->parent);
AggStatePerGroup pergroup; AggStatePerGroup pergroup;
aggstate = op->d.agg_init_trans.aggstate;
pergroup = &aggstate->all_pergroups pergroup = &aggstate->all_pergroups
[op->d.agg_init_trans.setoff] [op->d.agg_init_trans.setoff]
[op->d.agg_init_trans.transno]; [op->d.agg_init_trans.transno];
...@@ -1624,10 +1623,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -1624,10 +1623,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
/* check that a strict aggregate's input isn't NULL */ /* check that a strict aggregate's input isn't NULL */
EEO_CASE(EEOP_AGG_STRICT_TRANS_CHECK) EEO_CASE(EEOP_AGG_STRICT_TRANS_CHECK)
{ {
AggState *aggstate; AggState *aggstate = castNode(AggState, state->parent);
AggStatePerGroup pergroup; AggStatePerGroup pergroup;
aggstate = op->d.agg_strict_trans_check.aggstate;
pergroup = &aggstate->all_pergroups pergroup = &aggstate->all_pergroups
[op->d.agg_strict_trans_check.setoff] [op->d.agg_strict_trans_check.setoff]
[op->d.agg_strict_trans_check.transno]; [op->d.agg_strict_trans_check.transno];
...@@ -1645,14 +1643,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -1645,14 +1643,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
*/ */
EEO_CASE(EEOP_AGG_PLAIN_TRANS_BYVAL) EEO_CASE(EEOP_AGG_PLAIN_TRANS_BYVAL)
{ {
AggState *aggstate; AggState *aggstate = castNode(AggState, state->parent);
AggStatePerTrans pertrans; AggStatePerTrans pertrans;
AggStatePerGroup pergroup; AggStatePerGroup pergroup;
FunctionCallInfo fcinfo; FunctionCallInfo fcinfo;
MemoryContext oldContext; MemoryContext oldContext;
Datum newVal; Datum newVal;
aggstate = op->d.agg_trans.aggstate;
pertrans = op->d.agg_trans.pertrans; pertrans = op->d.agg_trans.pertrans;
pergroup = &aggstate->all_pergroups pergroup = &aggstate->all_pergroups
...@@ -1696,14 +1693,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) ...@@ -1696,14 +1693,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
*/ */
EEO_CASE(EEOP_AGG_PLAIN_TRANS) EEO_CASE(EEOP_AGG_PLAIN_TRANS)
{ {
AggState *aggstate; AggState *aggstate = castNode(AggState, state->parent);
AggStatePerTrans pertrans; AggStatePerTrans pertrans;
AggStatePerGroup pergroup; AggStatePerGroup pergroup;
FunctionCallInfo fcinfo; FunctionCallInfo fcinfo;
MemoryContext oldContext; MemoryContext oldContext;
Datum newVal; Datum newVal;
aggstate = op->d.agg_trans.aggstate;
pertrans = op->d.agg_trans.pertrans; pertrans = op->d.agg_trans.pertrans;
pergroup = &aggstate->all_pergroups pergroup = &aggstate->all_pergroups
...@@ -3846,8 +3842,9 @@ ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op) ...@@ -3846,8 +3842,9 @@ ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op)
void void
ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op) ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op)
{ {
AggState *aggstate = castNode(AggState, state->parent);
int result = 0; int result = 0;
Bitmapset *grouped_cols = op->d.grouping_func.parent->grouped_cols; Bitmapset *grouped_cols = aggstate->grouped_cols;
ListCell *lc; ListCell *lc;
foreach(lc, op->d.grouping_func.clauses) foreach(lc, op->d.grouping_func.clauses)
......
...@@ -85,6 +85,7 @@ llvm_compile_expr(ExprState *state) ...@@ -85,6 +85,7 @@ llvm_compile_expr(ExprState *state)
/* state itself */ /* state itself */
LLVMValueRef v_state; LLVMValueRef v_state;
LLVMValueRef v_econtext; LLVMValueRef v_econtext;
LLVMValueRef v_parent;
/* returnvalue */ /* returnvalue */
LLVMValueRef v_isnullp; LLVMValueRef v_isnullp;
...@@ -173,6 +174,9 @@ llvm_compile_expr(ExprState *state) ...@@ -173,6 +174,9 @@ llvm_compile_expr(ExprState *state)
v_tmpisnullp = LLVMBuildStructGEP(b, v_state, v_tmpisnullp = LLVMBuildStructGEP(b, v_state,
FIELDNO_EXPRSTATE_RESNULL, FIELDNO_EXPRSTATE_RESNULL,
"v.state.resnull"); "v.state.resnull");
v_parent = l_load_struct_gep(b, v_state,
FIELDNO_EXPRSTATE_PARENT,
"v.state.parent");
/* build global slots */ /* build global slots */
v_scanslot = l_load_struct_gep(b, v_econtext, v_scanslot = l_load_struct_gep(b, v_econtext,
...@@ -1989,7 +1993,7 @@ llvm_compile_expr(ExprState *state) ...@@ -1989,7 +1993,7 @@ llvm_compile_expr(ExprState *state)
LLVMValueRef v_tmpcontext; LLVMValueRef v_tmpcontext;
LLVMValueRef v_oldcontext; LLVMValueRef v_oldcontext;
aggstate = op->d.agg_deserialize.aggstate; aggstate = castNode(AggState, state->parent);
fcinfo = op->d.agg_deserialize.fcinfo_data; fcinfo = op->d.agg_deserialize.fcinfo_data;
v_tmpcontext = v_tmpcontext =
...@@ -2078,7 +2082,6 @@ llvm_compile_expr(ExprState *state) ...@@ -2078,7 +2082,6 @@ llvm_compile_expr(ExprState *state)
case EEOP_AGG_INIT_TRANS: case EEOP_AGG_INIT_TRANS:
{ {
AggState *aggstate;
AggStatePerTrans pertrans; AggStatePerTrans pertrans;
LLVMValueRef v_aggstatep; LLVMValueRef v_aggstatep;
...@@ -2095,11 +2098,10 @@ llvm_compile_expr(ExprState *state) ...@@ -2095,11 +2098,10 @@ llvm_compile_expr(ExprState *state)
LLVMBasicBlockRef b_init; LLVMBasicBlockRef b_init;
aggstate = op->d.agg_init_trans.aggstate;
pertrans = op->d.agg_init_trans.pertrans; pertrans = op->d.agg_init_trans.pertrans;
v_aggstatep = l_ptr_const(aggstate, v_aggstatep =
l_ptr(StructAggState)); LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
v_pertransp = l_ptr_const(pertrans, v_pertransp = l_ptr_const(pertrans,
l_ptr(StructAggStatePerTransData)); l_ptr(StructAggStatePerTransData));
...@@ -2176,7 +2178,6 @@ llvm_compile_expr(ExprState *state) ...@@ -2176,7 +2178,6 @@ llvm_compile_expr(ExprState *state)
case EEOP_AGG_STRICT_TRANS_CHECK: case EEOP_AGG_STRICT_TRANS_CHECK:
{ {
AggState *aggstate;
LLVMValueRef v_setoff, LLVMValueRef v_setoff,
v_transno; v_transno;
...@@ -2188,8 +2189,8 @@ llvm_compile_expr(ExprState *state) ...@@ -2188,8 +2189,8 @@ llvm_compile_expr(ExprState *state)
int jumpnull = op->d.agg_strict_trans_check.jumpnull; int jumpnull = op->d.agg_strict_trans_check.jumpnull;
aggstate = op->d.agg_strict_trans_check.aggstate; v_aggstatep =
v_aggstatep = l_ptr_const(aggstate, l_ptr(StructAggState)); LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
/* /*
* pergroup = &aggstate->all_pergroups * pergroup = &aggstate->all_pergroups
...@@ -2256,13 +2257,13 @@ llvm_compile_expr(ExprState *state) ...@@ -2256,13 +2257,13 @@ llvm_compile_expr(ExprState *state)
LLVMValueRef v_tmpcontext; LLVMValueRef v_tmpcontext;
LLVMValueRef v_oldcontext; LLVMValueRef v_oldcontext;
aggstate = op->d.agg_trans.aggstate; aggstate = castNode(AggState, state->parent);
pertrans = op->d.agg_trans.pertrans; pertrans = op->d.agg_trans.pertrans;
fcinfo = pertrans->transfn_fcinfo; fcinfo = pertrans->transfn_fcinfo;
v_aggstatep = l_ptr_const(aggstate, v_aggstatep =
l_ptr(StructAggState)); LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), "");
v_pertransp = l_ptr_const(pertrans, v_pertransp = l_ptr_const(pertrans,
l_ptr(StructAggStatePerTransData)); l_ptr(StructAggStatePerTransData));
......
...@@ -569,7 +569,6 @@ typedef struct ExprEvalStep ...@@ -569,7 +569,6 @@ typedef struct ExprEvalStep
/* for EEOP_GROUPING_FUNC */ /* for EEOP_GROUPING_FUNC */
struct struct
{ {
AggState *parent; /* parent Agg */
List *clauses; /* integer list of column numbers */ List *clauses; /* integer list of column numbers */
} grouping_func; } grouping_func;
...@@ -597,7 +596,6 @@ typedef struct ExprEvalStep ...@@ -597,7 +596,6 @@ typedef struct ExprEvalStep
/* for EEOP_AGG_*DESERIALIZE */ /* for EEOP_AGG_*DESERIALIZE */
struct struct
{ {
AggState *aggstate;
FunctionCallInfo fcinfo_data; FunctionCallInfo fcinfo_data;
int jumpnull; int jumpnull;
} agg_deserialize; } agg_deserialize;
...@@ -625,7 +623,6 @@ typedef struct ExprEvalStep ...@@ -625,7 +623,6 @@ typedef struct ExprEvalStep
/* for EEOP_AGG_INIT_TRANS */ /* for EEOP_AGG_INIT_TRANS */
struct struct
{ {
AggState *aggstate;
AggStatePerTrans pertrans; AggStatePerTrans pertrans;
ExprContext *aggcontext; ExprContext *aggcontext;
int setno; int setno;
...@@ -637,7 +634,6 @@ typedef struct ExprEvalStep ...@@ -637,7 +634,6 @@ typedef struct ExprEvalStep
/* for EEOP_AGG_STRICT_TRANS_CHECK */ /* for EEOP_AGG_STRICT_TRANS_CHECK */
struct struct
{ {
AggState *aggstate;
int setno; int setno;
int transno; int transno;
int setoff; int setoff;
...@@ -647,7 +643,6 @@ typedef struct ExprEvalStep ...@@ -647,7 +643,6 @@ typedef struct ExprEvalStep
/* for EEOP_AGG_{PLAIN,ORDERED}_TRANS* */ /* for EEOP_AGG_{PLAIN,ORDERED}_TRANS* */
struct struct
{ {
AggState *aggstate;
AggStatePerTrans pertrans; AggStatePerTrans pertrans;
ExprContext *aggcontext; ExprContext *aggcontext;
int setno; int setno;
......
...@@ -104,6 +104,7 @@ typedef struct ExprState ...@@ -104,6 +104,7 @@ typedef struct ExprState
int steps_len; /* number of steps currently */ int steps_len; /* number of steps currently */
int steps_alloc; /* allocated length of steps array */ int steps_alloc; /* allocated length of steps array */
#define FIELDNO_EXPRSTATE_PARENT 11
struct PlanState *parent; /* parent PlanState node, if any */ struct PlanState *parent; /* parent PlanState node, if any */
ParamListInfo ext_params; /* for compiling PARAM_EXTERN nodes */ ParamListInfo ext_params; /* for compiling PARAM_EXTERN nodes */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment