//--------------------------------------------------------------------------- // @function: // CLogicalAssert::Maxcard // // @doc: // Derive max card // //--------------------------------------------------------------------------- CMaxCard CLogicalAssert::Maxcard ( IMemoryPool *, // pmp CExpressionHandle &exprhdl ) const { // in case of a false condition or a contradiction, maxcard should be 1 CExpression *pexprScalar = exprhdl.PexprScalarChild(1); GPOS_ASSERT(NULL != pexprScalar); if (CUtils::FScalarConstFalse(pexprScalar) || CDrvdPropRelational::Pdprel(exprhdl.Pdp())->Ppc()->FContradiction()) { return CMaxCard(1 /*ull*/); } // if Assert operator was generated from MaxOneRow operator, // then a max cardinality of 1 is expected if (NULL != exprhdl.Pgexpr() && CXform::ExfMaxOneRow2Assert == exprhdl.Pgexpr()->ExfidOrigin()) { return CMaxCard(1 /*ull*/); } // pass on max card of first child return exprhdl.Pdprel(0)->Maxcard(); }
//--------------------------------------------------------------------------- // @function: // CXformPushDownLeftOuterJoin::Exfp // // @doc: // Xform promise // //--------------------------------------------------------------------------- CXform::EXformPromise CXformPushDownLeftOuterJoin::Exfp ( CExpressionHandle &exprhdl ) const { CExpression *pexprScalar = exprhdl.PexprScalarChild(2); if (COperator::EopScalarConst == pexprScalar->Pop()->Eopid()) { return CXform::ExfpNone; } return CXform::ExfpHigh; }
//--------------------------------------------------------------------------- // @function: // CXformSimplifyLeftOuterJoin::Exfp // // @doc: // Compute xform promise for a given expression handle // //--------------------------------------------------------------------------- CXform::EXformPromise CXformSimplifyLeftOuterJoin::Exfp ( CExpressionHandle &exprhdl ) const { CExpression *pexprScalar = exprhdl.PexprScalarChild(2 /*ulChildIndex*/); if (CUtils::FScalarConstFalse(pexprScalar)) { // if LOJ predicate is False, we can replace inner child with empty table return CXform::ExfpHigh; } return CXform::ExfpNone; }
//--------------------------------------------------------------------------- // @function: // CLogicalSelect::Maxcard // // @doc: // Derive max card // //--------------------------------------------------------------------------- CMaxCard CLogicalSelect::Maxcard ( IMemoryPool *, // pmp CExpressionHandle &exprhdl ) const { // in case of a false condition or a contradiction, maxcard should be zero CExpression *pexprScalar = exprhdl.PexprScalarChild(1); if ((NULL != pexprScalar && CUtils::FScalarConstFalse(pexprScalar)) || CDrvdPropRelational::Pdprel(exprhdl.Pdp())->Ppc()->FContradiction()) { return CMaxCard(0 /*ull*/); } // pass on max card of first child return exprhdl.Pdprel(0)->Maxcard(); }
//--------------------------------------------------------------------------- // @function: // CLogicalLimit::Maxcard // // @doc: // Derive max card // //--------------------------------------------------------------------------- CMaxCard CLogicalLimit::Maxcard ( IMemoryPool *, // pmp CExpressionHandle &exprhdl ) const { CExpression *pexprCount = exprhdl.PexprScalarChild(2 /*ulChildIndex*/); if (CUtils::FScalarConstInt<IMDTypeInt8>(pexprCount)) { CScalarConst *popScalarConst = CScalarConst::PopConvert(pexprCount->Pop()); IDatumInt8 *pdatumInt8 = dynamic_cast<IDatumInt8 *>(popScalarConst->Pdatum()); return CMaxCard(pdatumInt8->LValue()); } // pass on max card of first child return exprhdl.Pdprel(0)->Maxcard(); }
//--------------------------------------------------------------------------- // @function: // CLogical::Maxcard // // @doc: // Derive max card given scalar child and constraint property. If a // contradiction is detected then return maxcard of zero, otherwise // use the given default maxcard // //--------------------------------------------------------------------------- CMaxCard CLogical::Maxcard ( CExpressionHandle &exprhdl, ULONG ulScalarIndex, CMaxCard maxcard ) { // in case of a false condition or a contradiction, maxcard should be zero CExpression *pexprScalar = exprhdl.PexprScalarChild(ulScalarIndex); if (NULL != pexprScalar && (CUtils::FScalarConstFalse(pexprScalar) || CDrvdPropRelational::Pdprel(exprhdl.Pdp())->Ppc()->FContradiction())) { return CMaxCard(0 /*ull*/); } return maxcard; }
//--------------------------------------------------------------------------- // @function: // CXformLeftSemiJoin2InnerJoin::Exfp // // @doc: // Compute xform promise for a given expression handle; // //--------------------------------------------------------------------------- CXform::EXformPromise CXformLeftSemiJoin2InnerJoin::Exfp ( CExpressionHandle &exprhdl ) const { if (exprhdl.HasOuterRefs() || exprhdl.GetDrvdScalarProps(2)->FHasSubquery()) { return ExfpNone; } CColRefSet *pcrsInnerOutput = exprhdl.GetRelationalProperties(1 /*child_index*/)->PcrsOutput(); CExpression *pexprScalar = exprhdl.PexprScalarChild(2 /*child_index*/); CAutoMemoryPool amp; // examine join predicate to determine xform applicability if (!CPredicateUtils::FSimpleEqualityUsingCols(amp.Pmp(), pexprScalar, pcrsInnerOutput)) { return ExfpNone; } return ExfpHigh; }