5959#include "utils/syscache.h"
6060
6161
62- static bool TargetListSupportsBackwardScan (List * targetlist );
6362static bool IndexSupportsBackwardScan (Oid indexid );
6463
6564
@@ -120,7 +119,7 @@ ExecReScan(PlanState *node)
120119 UpdateChangedParamSet (node -> righttree , node -> chgParam );
121120 }
122121
123- /* Shut down any SRFs in the plan node's targetlist */
122+ /* Call expression callbacks */
124123 if (node -> ps_ExprContext )
125124 ReScanExprContext (node -> ps_ExprContext );
126125
@@ -460,8 +459,7 @@ ExecSupportsBackwardScan(Plan *node)
460459 {
461460 case T_Result :
462461 if (outerPlan (node ) != NULL )
463- return ExecSupportsBackwardScan (outerPlan (node )) &&
464- TargetListSupportsBackwardScan (node -> targetlist );
462+ return ExecSupportsBackwardScan (outerPlan (node ));
465463 else
466464 return false;
467465
@@ -478,13 +476,6 @@ ExecSupportsBackwardScan(Plan *node)
478476 return true;
479477 }
480478
481- case T_SeqScan :
482- case T_TidScan :
483- case T_FunctionScan :
484- case T_ValuesScan :
485- case T_CteScan :
486- return TargetListSupportsBackwardScan (node -> targetlist );
487-
488479 case T_SampleScan :
489480 /* Simplify life for tablesample methods by disallowing this */
490481 return false;
@@ -493,54 +484,41 @@ ExecSupportsBackwardScan(Plan *node)
493484 return false;
494485
495486 case T_IndexScan :
496- return IndexSupportsBackwardScan (((IndexScan * ) node )-> indexid ) &&
497- TargetListSupportsBackwardScan (node -> targetlist );
487+ return IndexSupportsBackwardScan (((IndexScan * ) node )-> indexid );
498488
499489 case T_IndexOnlyScan :
500- return IndexSupportsBackwardScan (((IndexOnlyScan * ) node )-> indexid ) &&
501- TargetListSupportsBackwardScan (node -> targetlist );
490+ return IndexSupportsBackwardScan (((IndexOnlyScan * ) node )-> indexid );
502491
503492 case T_SubqueryScan :
504- return ExecSupportsBackwardScan (((SubqueryScan * ) node )-> subplan ) &&
505- TargetListSupportsBackwardScan (node -> targetlist );
493+ return ExecSupportsBackwardScan (((SubqueryScan * ) node )-> subplan );
506494
507495 case T_CustomScan :
508496 {
509497 uint32 flags = ((CustomScan * ) node )-> flags ;
510498
511- if ((flags & CUSTOMPATH_SUPPORT_BACKWARD_SCAN ) &&
512- TargetListSupportsBackwardScan (node -> targetlist ))
499+ if (flags & CUSTOMPATH_SUPPORT_BACKWARD_SCAN )
513500 return true;
514501 }
515502 return false;
516503
504+ case T_SeqScan :
505+ case T_TidScan :
506+ case T_FunctionScan :
507+ case T_ValuesScan :
508+ case T_CteScan :
517509 case T_Material :
518510 case T_Sort :
519- /* these don't evaluate tlist */
520511 return true;
521512
522513 case T_LockRows :
523514 case T_Limit :
524- /* these don't evaluate tlist */
525515 return ExecSupportsBackwardScan (outerPlan (node ));
526516
527517 default :
528518 return false;
529519 }
530520}
531521
532- /*
533- * If the tlist contains set-returning functions, we can't support backward
534- * scan, because the TupFromTlist code is direction-ignorant.
535- */
536- static bool
537- TargetListSupportsBackwardScan (List * targetlist )
538- {
539- if (expression_returns_set ((Node * ) targetlist ))
540- return false;
541- return true;
542- }
543-
544522/*
545523 * An IndexScan or IndexOnlyScan node supports backward scan only if the
546524 * index's AM does.
0 commit comments