void AssertValidChildDistributions ( IMemoryPool *mp, CExpressionHandle &exprhdl, CDistributionSpec::EDistributionType *pedt, // array of distribution types to check ULONG ulDistrs, // number of distribution types to check const CHAR *szAssertMsg ) { const ULONG arity = exprhdl.Arity(); for (ULONG ulChild = 0; ulChild < arity; ulChild++) { CDistributionSpec *pdsChild = exprhdl.Pdpplan(ulChild)->Pds(); CDistributionSpec::EDistributionType edtChild = pdsChild->Edt(); BOOL fMatch = false; for (ULONG ulDistr = 0; !fMatch && ulDistr < ulDistrs; ulDistr++) { fMatch = (pedt[ulDistr] == edtChild); } if (!fMatch) { CAutoTrace at(mp); at.Os() << szAssertMsg; } GPOS_ASSERT(fMatch); } }
//--------------------------------------------------------------------------- // @function: // CPhysicalUnionAll::FProvidesReqdCols // // @doc: // Check if required columns are included in output columns // //--------------------------------------------------------------------------- BOOL CPhysicalUnionAll::FProvidesReqdCols ( CExpressionHandle & #ifdef GPOS_DEBUG exprhdl #endif // GPOS_DEBUG , CColRefSet *pcrsRequired, ULONG // ulOptReq ) const { GPOS_ASSERT(NULL != pcrsRequired); GPOS_ASSERT(PdrgpdrgpcrInput()->Size() == exprhdl.Arity()); CColRefSet *pcrs = GPOS_NEW(m_mp) CColRefSet(m_mp); // include output columns pcrs->Include(PdrgpcrOutput()); BOOL fProvidesCols = pcrs->ContainsAll(pcrsRequired); pcrs->Release(); return fProvidesCols; }
//--------------------------------------------------------------------------- // @function: // CLogicalSequence::Maxcard // // @doc: // Derive max card // //--------------------------------------------------------------------------- CMaxCard CLogicalSequence::Maxcard ( IMemoryPool *, // mp CExpressionHandle &exprhdl ) const { // pass on max card of last child return exprhdl.GetRelationalProperties(exprhdl.Arity() - 1)->Maxcard(); }
//--------------------------------------------------------------------------- // @function: // CXformSubqJoin2Apply::Exfp // // @doc: // Compute xform promise for a given expression handle; // if subqueries exist in the scalar predicate, we must have an // equivalent logical Apply expression created during exploration; // no need for generating a Join expression here // //--------------------------------------------------------------------------- CXform::EXformPromise CXformSubqJoin2Apply::Exfp ( CExpressionHandle &exprhdl ) const { if (exprhdl.GetDrvdScalarProps(exprhdl.Arity() - 1)->FHasSubquery()) { return CXform::ExfpHigh; } return CXform::ExfpNone; }
//--------------------------------------------------------------------------- // @function: // CPhysical::FUnaryUsesDefinedColumns // // @doc: // Return true if the given column set includes any of the columns defined // by the unary node, as given by the handle // //--------------------------------------------------------------------------- BOOL CPhysical::FUnaryUsesDefinedColumns ( CColRefSet *pcrs, CExpressionHandle &exprhdl ) { GPOS_ASSERT(NULL != pcrs); GPOS_ASSERT(2 == exprhdl.Arity() && "Not a unary operator"); if (0 == pcrs->Size()) { return false; } return !pcrs->IsDisjoint(exprhdl.GetDrvdScalarProps(1)->PcrsDefined()); }
//--------------------------------------------------------------------------- // @function: // CLogicalUnion::Maxcard // // @doc: // Derive max card // //--------------------------------------------------------------------------- CMaxCard CLogicalUnion::Maxcard ( IMemoryPool *, // mp CExpressionHandle &exprhdl ) const { const ULONG arity = exprhdl.Arity(); CMaxCard maxcard = exprhdl.GetRelationalProperties(0)->Maxcard(); for (ULONG ul = 1; ul < arity; ul++) { maxcard += exprhdl.GetRelationalProperties(ul)->Maxcard(); } return maxcard; }
//--------------------------------------------------------------------------- // @function: // CPhysical::FChildrenHaveCompatibleDistributions // // @doc: // Returns true iff the delivered distributions of the children are // compatible among themselves. // //--------------------------------------------------------------------------- BOOL CPhysical::FCompatibleChildrenDistributions ( const CExpressionHandle &exprhdl ) const { GPOS_ASSERT(exprhdl.Pop() == this); BOOL fSingletonOrUniversalChild = false; BOOL fNotSingletonOrUniversalDistributedChild = false; const ULONG arity = exprhdl.Arity(); for (ULONG ul = 0; ul < arity; ul++) { if (!exprhdl.FScalarChild(ul)) { CDrvdPropPlan *pdpplanChild = exprhdl.Pdpplan(ul); // an operator cannot have a singleton or universal distributed child // and one distributed on multiple nodes // this assumption is safe for all current operators, but it can be // too conservative: we could allow for instance the following cases // * LeftOuterJoin (universal, distributed) // * AntiSemiJoin (universal, distributed) // These cases can be enabled if considered necessary by overriding // this function. if (CDistributionSpec::EdtUniversal == pdpplanChild->Pds()->Edt() || pdpplanChild->Pds()->FSingletonOrStrictSingleton()) { fSingletonOrUniversalChild = true; } else { fNotSingletonOrUniversalDistributedChild = true; } if (fSingletonOrUniversalChild && fNotSingletonOrUniversalDistributedChild) { return false; } } } return true; }
//--------------------------------------------------------------------------- // @function: // CPhysicalPartitionSelectorDML::FProvidesReqdCols // // @doc: // Check if required columns are included in output columns // //--------------------------------------------------------------------------- BOOL CPhysicalPartitionSelectorDML::FProvidesReqdCols ( CExpressionHandle &exprhdl, CColRefSet *pcrsRequired, ULONG // ulOptReq ) const { GPOS_ASSERT(NULL != pcrsRequired); GPOS_ASSERT(1 == exprhdl.Arity()); CColRefSet *pcrs = GPOS_NEW(m_mp) CColRefSet(m_mp); // include the defined oid column pcrs->Include(m_pcrOid); // include output columns of the relational child pcrs->Union(exprhdl.GetRelationalProperties(0 /*child_index*/)->PcrsOutput()); BOOL fProvidesCols = pcrs->ContainsAll(pcrsRequired); pcrs->Release(); return fProvidesCols; }