//--------------------------------------------------------------------------- // @function: // CXformImplementDML::Transform // // @doc: // Actual transformation // //--------------------------------------------------------------------------- void CXformImplementDML::Transform ( CXformContext *pxfctxt, CXformResult *pxfres, CExpression *pexpr ) const { GPOS_ASSERT(NULL != pxfctxt); GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr)); GPOS_ASSERT(FCheckPattern(pexpr)); CLogicalDML *popDML = CLogicalDML::PopConvert(pexpr->Pop()); IMemoryPool *mp = pxfctxt->Pmp(); // extract components for alternative CLogicalDML::EDMLOperator edmlop = popDML->Edmlop(); CTableDescriptor *ptabdesc = popDML->Ptabdesc(); ptabdesc->AddRef(); CColRefArray *pdrgpcrSource = popDML->PdrgpcrSource(); pdrgpcrSource->AddRef(); CBitSet *pbsModified = popDML->PbsModified(); pbsModified->AddRef(); CColRef *pcrAction = popDML->PcrAction(); CColRef *pcrTableOid = popDML->PcrTableOid(); CColRef *pcrCtid = popDML->PcrCtid(); CColRef *pcrSegmentId = popDML->PcrSegmentId(); CColRef *pcrTupleOid = popDML->PcrTupleOid(); // child of DML operator CExpression *pexprChild = (*pexpr)[0]; pexprChild->AddRef(); // create physical DML CExpression *pexprAlt = GPOS_NEW(mp) CExpression ( mp, GPOS_NEW(mp) CPhysicalDML(mp, edmlop, ptabdesc, pdrgpcrSource, pbsModified, pcrAction, pcrTableOid, pcrCtid, pcrSegmentId, pcrTupleOid), pexprChild ); // add alternative to transformation result pxfres->Add(pexprAlt); }
//--------------------------------------------------------------------------- // @function: // CLogicalDML::FMatch // // @doc: // Match function // //--------------------------------------------------------------------------- BOOL CLogicalDML::FMatch ( COperator *pop ) const { if (pop->Eopid() != Eopid()) { return false; } CLogicalDML *popDML = CLogicalDML::PopConvert(pop); return m_pcrAction == popDML->PcrAction() && m_pcrTableOid == popDML->PcrTableOid() && m_pcrCtid == popDML->PcrCtid() && m_pcrSegmentId == popDML->PcrSegmentId() && m_pcrTupleOid == popDML->PcrTupleOid() && m_ptabdesc->Pmdid()->FEquals(popDML->Ptabdesc()->Pmdid()) && m_pdrgpcrSource->FEqual(popDML->PdrgpcrSource()); }