@@ -659,39 +659,54 @@ exec_append_common(CustomScanState *node,
659659void (* fetch_next_tuple ) (CustomScanState * node ))
660660{
661661RuntimeAppendState * scan_state = (RuntimeAppendState * )node ;
662+ TupleTableSlot * result ;
662663
663664/* ReScan if no plans are selected */
664665if (scan_state -> ncur_plans == 0 )
665666ExecReScan (& node -> ss .ps );
666667
668+ #if PG_VERSION_NUM >=100000
669+ fetch_next_tuple (node );/* use specific callback */
670+
671+ if (TupIsNull (scan_state -> slot ))
672+ return NULL ;
673+
674+ if (!node -> ss .ps .ps_ProjInfo )
675+ return scan_state -> slot ;
676+
677+ /*
678+ * Assuming that current projection doesn't involve SRF
679+ *
680+ * Any SFR functions are evaluated in the specialized parent node ProjectSet
681+ */
682+ ResetExprContext (node -> ss .ps .ps_ExprContext );
683+ node -> ss .ps .ps_ProjInfo -> pi_exprContext -> ecxt_scantuple =
684+ scan_state -> slot ;
685+ result = ExecProject (node -> ss .ps .ps_ProjInfo );
686+
687+ return result ;
688+ #elif PG_VERSION_NUM >=90500
667689for (;;)
668690{
669691/* Fetch next tuple if we're done with Projections */
670- #if PG_VERSION_NUM < 100000
671692if (!node -> ss .ps .ps_TupFromTlist )
672693{
673694fetch_next_tuple (node );/* use specific callback */
674695
675696if (TupIsNull (scan_state -> slot ))
676697return NULL ;
677698}
678- #endif
679699
680700if (node -> ss .ps .ps_ProjInfo )
681701{
682702ExprDoneCond isDone ;
683- TupleTableSlot * result ;
684703
685704ResetExprContext (node -> ss .ps .ps_ExprContext );
686705
687- node -> ss .ps .ps_ProjInfo -> pi_exprContext -> ecxt_scantuple = scan_state -> slot ;
688- #if PG_VERSION_NUM >=100000
689- result = ExecProject (node -> ss .ps .ps_ProjInfo );
690- #else
706+ node -> ss .ps .ps_ProjInfo -> pi_exprContext -> ecxt_scantuple =
707+ scan_state -> slot ;
691708result = ExecProject (node -> ss .ps .ps_ProjInfo ,& isDone );
692- #endif
693709
694- #if PG_VERSION_NUM < 100000
695710if (isDone != ExprEndResult )
696711{
697712node -> ss .ps .ps_TupFromTlist = (isDone == ExprMultipleResult );
@@ -700,14 +715,11 @@ exec_append_common(CustomScanState *node,
700715}
701716else
702717node -> ss .ps .ps_TupFromTlist = false;
703- #else
704- if (isDone != ExprEndResult )
705- return result ;
706- #endif
707718}
708719else
709720return scan_state -> slot ;
710721}
722+ #endif
711723}
712724
713725void