@@ -155,11 +155,11 @@ static void ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
155155static Datum ExecJustInnerVar (ExprState * state , ExprContext * econtext , bool * isnull );
156156static Datum ExecJustOuterVar (ExprState * state , ExprContext * econtext , bool * isnull );
157157static Datum ExecJustScanVar (ExprState * state , ExprContext * econtext , bool * isnull );
158- static Datum ExecJustConst (ExprState * state , ExprContext * econtext , bool * isnull );
159158static Datum ExecJustAssignInnerVar (ExprState * state , ExprContext * econtext , bool * isnull );
160159static Datum ExecJustAssignOuterVar (ExprState * state , ExprContext * econtext , bool * isnull );
161160static Datum ExecJustAssignScanVar (ExprState * state , ExprContext * econtext , bool * isnull );
162161static 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 */
19881987static 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 */
20021994static 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 */
20162001static 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 */
20512039static Datum
20522040ExecJustAssignOuterVar (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 */
20692046static Datum
20702047ExecJustAssignScanVar (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