Reduce code duplication for ExecJust*Var operations.

This is mainly in preparation for adding further fastpath evaluation
routines.

Also reorder ExecJust*Var functions to be consistent with the order in
which they're used.

Author: Andres Freund
Discussion: https://postgr.es/m/CAE-ML+9OKSN71+mHtfMD-L24oDp8dGTfaVjDU6U+j+FNAW5kRQ@mail.gmail.com
This commit is contained in:
Andres Freund 2019-09-30 15:00:21 -07:00
parent d52eaa0948
commit 34c9c53bb0
1 changed files with 35 additions and 59 deletions

View File

@ -155,11 +155,11 @@ static void ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
static Datum ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull); static Datum ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull);
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
/* /*
@ -1966,13 +1966,12 @@ ShutdownTupleDescRef(Datum arg)
* Fast-path functions, for very simple expressions * Fast-path functions, for very simple expressions
*/ */
/* Simple reference to inner Var */ /* implementation of ExecJust(Inner|Outer|Scan)Var */
static Datum static pg_attribute_always_inline Datum
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; ExprEvalStep *op = &state->steps[1];
int attnum = op->d.var.attnum + 1; int attnum = op->d.var.attnum + 1;
TupleTableSlot *slot = econtext->ecxt_innertuple;
CheckOpSlotCompatibility(&state->steps[0], slot); CheckOpSlotCompatibility(&state->steps[0], slot);
@ -1984,52 +1983,34 @@ ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
return slot_getattr(slot, attnum, isnull); return slot_getattr(slot, attnum, isnull);
} }
/* Simple reference to inner Var */
static Datum
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
{
return ExecJustVarImpl(state, econtext->ecxt_innertuple, isnull);
}
/* Simple reference to outer Var */ /* Simple reference to outer Var */
static Datum static Datum
ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; return ExecJustVarImpl(state, econtext->ecxt_outertuple, isnull);
int attnum = op->d.var.attnum + 1;
TupleTableSlot *slot = econtext->ecxt_outertuple;
CheckOpSlotCompatibility(&state->steps[0], slot);
/* See comments in ExecJustInnerVar */
return slot_getattr(slot, attnum, isnull);
} }
/* Simple reference to scan Var */ /* Simple reference to scan Var */
static Datum static Datum
ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; return ExecJustVarImpl(state, econtext->ecxt_scantuple, isnull);
int attnum = op->d.var.attnum + 1;
TupleTableSlot *slot = econtext->ecxt_scantuple;
CheckOpSlotCompatibility(&state->steps[0], slot);
/* See comments in ExecJustInnerVar */
return slot_getattr(slot, attnum, isnull);
} }
/* Simple Const expression */ /* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
static Datum static pg_attribute_always_inline Datum
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
{
ExprEvalStep *op = &state->steps[0];
*isnull = op->d.constval.isnull;
return op->d.constval.value;
}
/* Evaluate inner Var and assign to appropriate column of result tuple */
static Datum
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; ExprEvalStep *op = &state->steps[1];
int attnum = op->d.assign_var.attnum + 1; int attnum = op->d.assign_var.attnum + 1;
int resultnum = op->d.assign_var.resultnum; int resultnum = op->d.assign_var.resultnum;
TupleTableSlot *inslot = econtext->ecxt_innertuple;
TupleTableSlot *outslot = state->resultslot; TupleTableSlot *outslot = state->resultslot;
CheckOpSlotCompatibility(&state->steps[0], inslot); CheckOpSlotCompatibility(&state->steps[0], inslot);
@ -2047,40 +2028,25 @@ ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
return 0; return 0;
} }
/* Evaluate inner Var and assign to appropriate column of result tuple */
static Datum
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
{
return ExecJustAssignVarImpl(state, econtext->ecxt_innertuple, isnull);
}
/* Evaluate outer Var and assign to appropriate column of result tuple */ /* Evaluate outer Var and assign to appropriate column of result tuple */
static Datum static Datum
ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; return ExecJustAssignVarImpl(state, econtext->ecxt_outertuple, isnull);
int attnum = op->d.assign_var.attnum + 1;
int resultnum = op->d.assign_var.resultnum;
TupleTableSlot *inslot = econtext->ecxt_outertuple;
TupleTableSlot *outslot = state->resultslot;
CheckOpSlotCompatibility(&state->steps[0], inslot);
/* See comments in ExecJustAssignInnerVar */
outslot->tts_values[resultnum] =
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
return 0;
} }
/* Evaluate scan Var and assign to appropriate column of result tuple */ /* Evaluate scan Var and assign to appropriate column of result tuple */
static Datum static Datum
ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull) ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
{ {
ExprEvalStep *op = &state->steps[1]; return ExecJustAssignVarImpl(state, econtext->ecxt_scantuple, isnull);
int attnum = op->d.assign_var.attnum + 1;
int resultnum = op->d.assign_var.resultnum;
TupleTableSlot *inslot = econtext->ecxt_scantuple;
TupleTableSlot *outslot = state->resultslot;
CheckOpSlotCompatibility(&state->steps[0], inslot);
/* See comments in ExecJustAssignInnerVar */
outslot->tts_values[resultnum] =
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
return 0;
} }
/* Evaluate CASE_TESTVAL and apply a strict function to it */ /* Evaluate CASE_TESTVAL and apply a strict function to it */
@ -2120,6 +2086,16 @@ ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull)
return d; return d;
} }
/* Simple Const expression */
static Datum
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
{
ExprEvalStep *op = &state->steps[0];
*isnull = op->d.constval.isnull;
return op->d.constval.value;
}
#if defined(EEO_USE_COMPUTED_GOTO) #if defined(EEO_USE_COMPUTED_GOTO)
/* /*
* Comparator used when building address->opcode lookup table for * Comparator used when building address->opcode lookup table for