Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 34c9c53

Browse files
committed
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
1 parent d52eaa0 commit 34c9c53

File tree

1 file changed

+35
-59
lines changed

1 file changed

+35
-59
lines changed

src/backend/executor/execExprInterp.c

+35-59
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ static void ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
155155
static Datum ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
156156
static Datum ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
157157
static Datum ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
158-
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
159158
static Datum ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
160159
static Datum ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
161160
static Datum ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
162161
static Datum ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull);
162+
static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
163163

164164

165165
/*
@@ -1966,13 +1966,12 @@ ShutdownTupleDescRef(Datum arg)
19661966
* Fast-path functions, for very simple expressions
19671967
*/
19681968

1969-
/* Simple reference to inner Var */
1970-
static Datum
1971-
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
1969+
/* implementation of ExecJust(Inner|Outer|Scan)Var */
1970+
static pg_attribute_always_inline Datum
1971+
ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull)
19721972
{
19731973
ExprEvalStep *op = &state->steps[1];
19741974
int attnum = op->d.var.attnum + 1;
1975-
TupleTableSlot *slot = econtext->ecxt_innertuple;
19761975

19771976
CheckOpSlotCompatibility(&state->steps[0], slot);
19781977

@@ -1984,52 +1983,34 @@ ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
19841983
return slot_getattr(slot, attnum, isnull);
19851984
}
19861985

1987-
/* Simple reference to outer Var */
1986+
/* Simple reference to inner Var */
19881987
static Datum
1989-
ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
1988+
ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
19901989
{
1991-
ExprEvalStep *op = &state->steps[1];
1992-
int attnum = op->d.var.attnum + 1;
1993-
TupleTableSlot *slot = econtext->ecxt_outertuple;
1994-
1995-
CheckOpSlotCompatibility(&state->steps[0], slot);
1996-
1997-
/* See comments in ExecJustInnerVar */
1998-
return slot_getattr(slot, attnum, isnull);
1990+
return ExecJustVarImpl(state, econtext->ecxt_innertuple, isnull);
19991991
}
20001992

2001-
/* Simple reference to scan Var */
1993+
/* Simple reference to outer Var */
20021994
static Datum
2003-
ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
1995+
ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
20041996
{
2005-
ExprEvalStep *op = &state->steps[1];
2006-
int attnum = op->d.var.attnum + 1;
2007-
TupleTableSlot *slot = econtext->ecxt_scantuple;
2008-
2009-
CheckOpSlotCompatibility(&state->steps[0], slot);
2010-
2011-
/* See comments in ExecJustInnerVar */
2012-
return slot_getattr(slot, attnum, isnull);
1997+
return ExecJustVarImpl(state, econtext->ecxt_outertuple, isnull);
20131998
}
20141999

2015-
/* Simple Const expression */
2000+
/* Simple reference to scan Var */
20162001
static Datum
2017-
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
2002+
ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
20182003
{
2019-
ExprEvalStep *op = &state->steps[0];
2020-
2021-
*isnull = op->d.constval.isnull;
2022-
return op->d.constval.value;
2004+
return ExecJustVarImpl(state, econtext->ecxt_scantuple, isnull);
20232005
}
20242006

2025-
/* Evaluate inner Var and assign to appropriate column of result tuple */
2026-
static Datum
2027-
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
2007+
/* implementation of ExecJustAssign(Inner|Outer|Scan)Var */
2008+
static pg_attribute_always_inline Datum
2009+
ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull)
20282010
{
20292011
ExprEvalStep *op = &state->steps[1];
20302012
int attnum = op->d.assign_var.attnum + 1;
20312013
int resultnum = op->d.assign_var.resultnum;
2032-
TupleTableSlot *inslot = econtext->ecxt_innertuple;
20332014
TupleTableSlot *outslot = state->resultslot;
20342015

20352016
CheckOpSlotCompatibility(&state->steps[0], inslot);
@@ -2047,40 +2028,25 @@ ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
20472028
return 0;
20482029
}
20492030

2031+
/* Evaluate inner Var and assign to appropriate column of result tuple */
2032+
static Datum
2033+
ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
2034+
{
2035+
return ExecJustAssignVarImpl(state, econtext->ecxt_innertuple, isnull);
2036+
}
2037+
20502038
/* Evaluate outer Var and assign to appropriate column of result tuple */
20512039
static Datum
20522040
ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
20532041
{
2054-
ExprEvalStep *op = &state->steps[1];
2055-
int attnum = op->d.assign_var.attnum + 1;
2056-
int resultnum = op->d.assign_var.resultnum;
2057-
TupleTableSlot *inslot = econtext->ecxt_outertuple;
2058-
TupleTableSlot *outslot = state->resultslot;
2059-
2060-
CheckOpSlotCompatibility(&state->steps[0], inslot);
2061-
2062-
/* See comments in ExecJustAssignInnerVar */
2063-
outslot->tts_values[resultnum] =
2064-
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
2065-
return 0;
2042+
return ExecJustAssignVarImpl(state, econtext->ecxt_outertuple, isnull);
20662043
}
20672044

20682045
/* Evaluate scan Var and assign to appropriate column of result tuple */
20692046
static Datum
20702047
ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
20712048
{
2072-
ExprEvalStep *op = &state->steps[1];
2073-
int attnum = op->d.assign_var.attnum + 1;
2074-
int resultnum = op->d.assign_var.resultnum;
2075-
TupleTableSlot *inslot = econtext->ecxt_scantuple;
2076-
TupleTableSlot *outslot = state->resultslot;
2077-
2078-
CheckOpSlotCompatibility(&state->steps[0], inslot);
2079-
2080-
/* See comments in ExecJustAssignInnerVar */
2081-
outslot->tts_values[resultnum] =
2082-
slot_getattr(inslot, attnum, &outslot->tts_isnull[resultnum]);
2083-
return 0;
2049+
return ExecJustAssignVarImpl(state, econtext->ecxt_scantuple, isnull);
20842050
}
20852051

20862052
/* Evaluate CASE_TESTVAL and apply a strict function to it */
@@ -2120,6 +2086,16 @@ ExecJustApplyFuncToCase(ExprState *state, ExprContext *econtext, bool *isnull)
21202086
return d;
21212087
}
21222088

2089+
/* Simple Const expression */
2090+
static Datum
2091+
ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
2092+
{
2093+
ExprEvalStep *op = &state->steps[0];
2094+
2095+
*isnull = op->d.constval.isnull;
2096+
return op->d.constval.value;
2097+
}
2098+
21232099
#if defined(EEO_USE_COMPUTED_GOTO)
21242100
/*
21252101
* Comparator used when building address->opcode lookup table for

0 commit comments

Comments
 (0)