@ -160,6 +160,12 @@ static Datum ExecJustAssignOuterVar(ExprState *state, ExprContext *econtext, boo
static Datum ExecJustAssignScanVar ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustApplyFuncToCase ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustConst ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustInnerVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustOuterVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustScanVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustAssignInnerVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustAssignOuterVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
static Datum ExecJustAssignScanVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull ) ;
/*
@ -255,11 +261,45 @@ ExecReadyInterpretedExpr(ExprState *state)
return ;
}
}
else if ( state - > steps_len = = 2 & &
state - > steps [ 0 ] . opcode = = EEOP_CONST )
else if ( state - > steps_len = = 2 )
{
state - > evalfunc_private = ( void * ) ExecJustConst ;
return ;
ExprEvalOp step0 = state - > steps [ 0 ] . opcode ;
if ( step0 = = EEOP_CONST )
{
state - > evalfunc_private = ( void * ) ExecJustConst ;
return ;
}
else if ( step0 = = EEOP_INNER_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustInnerVarVirt ;
return ;
}
else if ( step0 = = EEOP_OUTER_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustOuterVarVirt ;
return ;
}
else if ( step0 = = EEOP_SCAN_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustScanVarVirt ;
return ;
}
else if ( step0 = = EEOP_ASSIGN_INNER_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustAssignInnerVarVirt ;
return ;
}
else if ( step0 = = EEOP_ASSIGN_OUTER_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustAssignOuterVarVirt ;
return ;
}
else if ( step0 = = EEOP_ASSIGN_SCAN_VAR )
{
state - > evalfunc_private = ( void * ) ExecJustAssignScanVarVirt ;
return ;
}
}
# if defined(EEO_USE_COMPUTED_GOTO)
@ -2096,6 +2136,91 @@ ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull)
return op - > d . constval . value ;
}
/* implementation of ExecJust(Inner|Outer|Scan)VarVirt */
static pg_attribute_always_inline Datum
ExecJustVarVirtImpl ( ExprState * state , TupleTableSlot * slot , bool * isnull )
{
ExprEvalStep * op = & state - > steps [ 0 ] ;
int attnum = op - > d . var . attnum ;
/*
* As it is guaranteed that a virtual slot is used , there never is a need
* to perform tuple deforming ( nor would it be possible ) . Therefore
* execExpr . c has not emitted an EEOP_ * _FETCHSOME step . Verify , as much as
* possible , that that determination was accurate .
*/
Assert ( TTS_IS_VIRTUAL ( slot ) ) ;
Assert ( TTS_FIXED ( slot ) ) ;
Assert ( attnum > = 0 & & attnum < slot - > tts_nvalid ) ;
* isnull = slot - > tts_isnull [ attnum ] ;
return slot - > tts_values [ attnum ] ;
}
/* Like ExecJustInnerVar, optimized for virtual slots */
static Datum
ExecJustInnerVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustVarVirtImpl ( state , econtext - > ecxt_innertuple , isnull ) ;
}
/* Like ExecJustOuterVar, optimized for virtual slots */
static Datum
ExecJustOuterVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustVarVirtImpl ( state , econtext - > ecxt_outertuple , isnull ) ;
}
/* Like ExecJustScanVar, optimized for virtual slots */
static Datum
ExecJustScanVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustVarVirtImpl ( state , econtext - > ecxt_scantuple , isnull ) ;
}
/* implementation of ExecJustAssign(Inner|Outer|Scan)VarVirt */
static pg_attribute_always_inline Datum
ExecJustAssignVarVirtImpl ( ExprState * state , TupleTableSlot * inslot , bool * isnull )
{
ExprEvalStep * op = & state - > steps [ 0 ] ;
int attnum = op - > d . assign_var . attnum ;
int resultnum = op - > d . assign_var . resultnum ;
TupleTableSlot * outslot = state - > resultslot ;
/* see ExecJustVarVirtImpl for comments */
Assert ( TTS_IS_VIRTUAL ( inslot ) ) ;
Assert ( TTS_FIXED ( inslot ) ) ;
Assert ( attnum > = 0 & & attnum < inslot - > tts_nvalid ) ;
outslot - > tts_values [ resultnum ] = inslot - > tts_values [ attnum ] ;
outslot - > tts_isnull [ resultnum ] = inslot - > tts_isnull [ attnum ] ;
return 0 ;
}
/* Like ExecJustAssignInnerVar, optimized for virtual slots */
static Datum
ExecJustAssignInnerVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustAssignVarVirtImpl ( state , econtext - > ecxt_innertuple , isnull ) ;
}
/* Like ExecJustAssignOuterVar, optimized for virtual slots */
static Datum
ExecJustAssignOuterVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustAssignVarVirtImpl ( state , econtext - > ecxt_outertuple , isnull ) ;
}
/* Like ExecJustAssignScanVar, optimized for virtual slots */
static Datum
ExecJustAssignScanVarVirt ( ExprState * state , ExprContext * econtext , bool * isnull )
{
return ExecJustAssignVarVirtImpl ( state , econtext - > ecxt_scantuple , isnull ) ;
}
# if defined(EEO_USE_COMPUTED_GOTO)
/*
* Comparator used when building address - > opcode lookup table for