if (splan->plan->extParam != NULL) /* don't care about child
* local Params */
UpdateChangedParamSet(splan, node->chgParam); if (splan->chgParam != NULL)
ExecReScanSetParamPlan(sstate, node);
}
foreach(l, node->subPlan)
{
SubPlanState *sstate = (SubPlanState *) lfirst(l);
PlanState *splan = sstate->planstate;
if (splan->plan->extParam != NULL)
UpdateChangedParamSet(splan, node->chgParam);
} /* Well. Now set chgParam for child trees. */ if (outerPlanState(node) != NULL)
UpdateChangedParamSet(outerPlanState(node), node->chgParam); if (innerPlanState(node) != NULL)
UpdateChangedParamSet(innerPlanState(node), node->chgParam);
}
/* Call expression callbacks */ if (node->ps_ExprContext)
ReScanExprContext(node->ps_ExprContext);
/* And do node-type-specific processing */ switch (nodeTag(node))
{ case T_ResultState:
ExecReScanResult((ResultState *) node); break;
case T_ProjectSetState:
ExecReScanProjectSet((ProjectSetState *) node); break;
case T_ModifyTableState:
ExecReScanModifyTable((ModifyTableState *) node); break;
case T_AppendState:
ExecReScanAppend((AppendState *) node); break;
case T_MergeAppendState:
ExecReScanMergeAppend((MergeAppendState *) node); break;
case T_RecursiveUnionState:
ExecReScanRecursiveUnion((RecursiveUnionState *) node); break;
case T_BitmapAndState:
ExecReScanBitmapAnd((BitmapAndState *) node); break;
case T_BitmapOrState:
ExecReScanBitmapOr((BitmapOrState *) node); break;
case T_SeqScanState:
ExecReScanSeqScan((SeqScanState *) node); break;
case T_SampleScanState:
ExecReScanSampleScan((SampleScanState *) node); break;
case T_GatherState:
ExecReScanGather((GatherState *) node); break;
case T_GatherMergeState:
ExecReScanGatherMerge((GatherMergeState *) node); break;
case T_IndexScanState:
ExecReScanIndexScan((IndexScanState *) node); break;
case T_IndexOnlyScanState:
ExecReScanIndexOnlyScan((IndexOnlyScanState *) node); break;
case T_BitmapIndexScanState:
ExecReScanBitmapIndexScan((BitmapIndexScanState *) node); break;
case T_BitmapHeapScanState:
ExecReScanBitmapHeapScan((BitmapHeapScanState *) node); break;
case T_TidScanState:
ExecReScanTidScan((TidScanState *) node); break;
case T_TidRangeScanState:
ExecReScanTidRangeScan((TidRangeScanState *) node); break;
case T_SubqueryScanState:
ExecReScanSubqueryScan((SubqueryScanState *) node); break;
case T_FunctionScanState:
ExecReScanFunctionScan((FunctionScanState *) node); break;
case T_TableFuncScanState:
ExecReScanTableFuncScan((TableFuncScanState *) node); break;
case T_ValuesScanState:
ExecReScanValuesScan((ValuesScanState *) node); break;
case T_CteScanState:
ExecReScanCteScan((CteScanState *) node); break;
case T_NamedTuplestoreScanState:
ExecReScanNamedTuplestoreScan((NamedTuplestoreScanState *) node); break;
case T_WorkTableScanState:
ExecReScanWorkTableScan((WorkTableScanState *) node); break;
case T_ForeignScanState:
ExecReScanForeignScan((ForeignScanState *) node); break;
case T_CustomScanState:
ExecReScanCustomScan((CustomScanState *) node); break;
case T_NestLoopState:
ExecReScanNestLoop((NestLoopState *) node); break;
case T_MergeJoinState:
ExecReScanMergeJoin((MergeJoinState *) node); break;
case T_HashJoinState:
ExecReScanHashJoin((HashJoinState *) node); break;
case T_MaterialState:
ExecReScanMaterial((MaterialState *) node); break;
case T_MemoizeState:
ExecReScanMemoize((MemoizeState *) node); break;
case T_SortState:
ExecReScanSort((SortState *) node); break;
case T_IncrementalSortState:
ExecReScanIncrementalSort((IncrementalSortState *) node); break;
case T_GroupState:
ExecReScanGroup((GroupState *) node); break;
case T_AggState:
ExecReScanAgg((AggState *) node); break;
case T_WindowAggState:
ExecReScanWindowAgg((WindowAggState *) node); break;
case T_UniqueState:
ExecReScanUnique((UniqueState *) node); break;
case T_HashState:
ExecReScanHash((HashState *) node); break;
case T_SetOpState:
ExecReScanSetOp((SetOpState *) node); break;
case T_LockRowsState:
ExecReScanLockRows((LockRowsState *) node); break;
case T_LimitState:
ExecReScanLimit((LimitState *) node); break;
/* *Parallel-awarenodesreturnasubsetofthetuplesineachworker,and *ingeneralwecan'texpecttohaveenoughbookkeepingstatetoknow *whichoneswereturnedinthisworkerasopposedtosomeotherworker.
*/ if (node->parallel_aware) returnfalse;
switch (nodeTag(node))
{ case T_Result: if (outerPlan(node) != NULL) return ExecSupportsBackwardScan(outerPlan(node)); else returnfalse;
case T_Append:
{
ListCell *l;
/* With async, tuples may be interleaved, so can't back up. */ if (((Append *) node)->nasyncplans > 0) returnfalse;
foreach(l, ((Append *) node)->appendplans)
{ if (!ExecSupportsBackwardScan((Plan *) lfirst(l))) returnfalse;
} /* need not check tlist because Append doesn't evaluate it */ returntrue;
}
case T_SampleScan: /* Simplify life for tablesample methods by disallowing this */ returnfalse;
case T_Gather: returnfalse;
case T_IndexScan: return IndexSupportsBackwardScan(((IndexScan *) node)->indexid);
case T_IndexOnlyScan: return IndexSupportsBackwardScan(((IndexOnlyScan *) node)->indexid);
case T_SubqueryScan: return ExecSupportsBackwardScan(((SubqueryScan *) node)->subplan);
case T_CustomScan: if (((CustomScan *) node)->flags & CUSTOMPATH_SUPPORT_BACKWARD_SCAN) returntrue; returnfalse;
case T_SeqScan: case T_TidScan: case T_TidRangeScan: case T_FunctionScan: case T_ValuesScan: case T_CteScan: case T_Material: case T_Sort: /* these don't evaluate tlist */ returntrue;
/* Fetch the pg_class tuple of the index relation */
ht_idxrel = SearchSysCache1(RELOID, ObjectIdGetDatum(indexid)); if (!HeapTupleIsValid(ht_idxrel))
elog(ERROR, "cache lookup failed for relation %u", indexid);
idxrelrec = (Form_pg_class) GETSTRUCT(ht_idxrel);
/* Fetch the index AM's API struct */
amroutine = GetIndexAmRoutineByAmId(idxrelrec->relam, false);
result = amroutine->amcanbackward;
pfree(amroutine);
ReleaseSysCache(ht_idxrel);
return result;
}
/* *ExecMaterializesOutput-doesaplantypematerializeitsoutput? * *Returnstrueiftheplannodetypeisonethatautomaticallymaterializes *itsoutput(typicallybykeepingitinatuplestore).Forsuchplans, *arescanwithoutanyparameterchangewillhavezerostartupcostand *verylowper-tuplecost.
*/ bool
ExecMaterializesOutput(NodeTag plantype)
{ switch (plantype)
{ case T_Material: case T_FunctionScan: case T_TableFuncScan: case T_CteScan: case T_NamedTuplestoreScan: case T_WorkTableScan: case T_Sort: returntrue;
default: break;
}
returnfalse;
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.18Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.