//--------------------------------------------------------------------------- // @function: // CXformImplementLimit::Transform // // @doc: // Actual transformation // //--------------------------------------------------------------------------- void CXformImplementLimit::Transform ( CXformContext *pxfctxt, CXformResult *pxfres, CExpression *pexpr ) const { GPOS_ASSERT(NULL != pxfctxt); GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr)); GPOS_ASSERT(FCheckPattern(pexpr)); IMemoryPool *pmp = pxfctxt->Pmp(); // extract components CLogicalLimit *popLimit = CLogicalLimit::PopConvert(pexpr->Pop()); CExpression *pexprRelational = (*pexpr)[0]; CExpression *pexprScalarStart = (*pexpr)[1]; CExpression *pexprScalarRows = (*pexpr)[2]; COrderSpec *pos = popLimit->Pos(); // addref all components pexprRelational->AddRef(); pexprScalarStart->AddRef(); pexprScalarRows->AddRef(); popLimit->Pos()->AddRef(); // assemble physical operator CExpression *pexprLimit = GPOS_NEW(pmp) CExpression ( pmp, GPOS_NEW(pmp) CPhysicalLimit ( pmp, pos, popLimit->FGlobal(), popLimit->FHasCount(), popLimit->FTopLimitUnderDML() ), pexprRelational, pexprScalarStart, pexprScalarRows ); // add alternative to results pxfres->Add(pexprLimit); }
//--------------------------------------------------------------------------- // @function: // CLogicalLimit::FMatch // // @doc: // Match function on operator level // //--------------------------------------------------------------------------- BOOL CLogicalLimit::FMatch ( COperator *pop ) const { if (pop->Eopid() == Eopid()) { CLogicalLimit *popLimit = CLogicalLimit::PopConvert(pop); if (popLimit->FGlobal() == m_fGlobal && popLimit->FHasCount() == m_fHasCount) { // match if order specs match return m_pos->FMatch(popLimit->m_pos); } } return false; }