//--------------------------------------------------------------------------- // @function: // CCostContext::FNeedsNewStats // // @doc: // Check if we need to derive new stats for this context, // by default a cost context inherits stats from the owner group, // the only current exception is when part of the plan below cost // context is affected by partition elimination done by partition // selection in some other part of the plan // //--------------------------------------------------------------------------- BOOL CCostContext::FNeedsNewStats() const { COperator *pop = m_pgexpr->Pop(); if (pop->FScalar()) { // return false if scalar operator return false; } CEnfdPartitionPropagation *pepp = Poc()->Prpp()->Pepp(); if (GPOS_FTRACE(EopttraceDeriveStatsForDPE) && CUtils::FPhysicalScan(pop) && CPhysicalScan::PopConvert(pop)->FDynamicScan() && !pepp->PpfmDerived()->FEmpty()) { // context is attached to a dynamic scan that went through // partition elimination in another part of the plan return true; } // we need to derive stats if any child has modified stats BOOL fDeriveStats = false; const ULONG ulArity = Pdrgpoc()->UlLength(); for (ULONG ul = 0; !fDeriveStats && ul < ulArity; ul++) { COptimizationContext *pocChild = (*Pdrgpoc())[ul]; CCostContext *pccChild = pocChild->PccBest(); GPOS_ASSERT(NULL != pccChild); fDeriveStats = pccChild->FOwnsStats(); } return fDeriveStats; }