//--------------------------------------------------------------------------- // @function: // CLogical::PcrsDeriveCorrelatedApply // // @doc: // Derive columns from the inner child of a correlated-apply expression // that can be used above the apply expression // //--------------------------------------------------------------------------- CColRefSet * CLogical::PcrsDeriveCorrelatedApply ( IMemoryPool *pmp, CExpressionHandle &exprhdl ) const { GPOS_ASSERT(this == exprhdl.Pop()); ULONG ulArity = exprhdl.UlArity(); CColRefSet *pcrs = GPOS_NEW(pmp) CColRefSet(pmp); if (CUtils::FCorrelatedApply(exprhdl.Pop())) { // add inner columns of correlated-apply expression pcrs->Include(CLogicalApply::PopConvert(exprhdl.Pop())->PdrgPcrInner()); } // combine correlated-apply columns from logical children for (ULONG ul = 0; ul < ulArity; ul++) { if (!exprhdl.FScalarChild(ul)) { CDrvdPropRelational *pdprel = exprhdl.Pdprel(ul); pcrs->Union(pdprel->PcrsCorrelatedApply()); } } return pcrs; }