//--------------------------------------------------------------------------- // @function: // CLogicalConstTableGet::FMatch // // @doc: // Match function on operator level // //--------------------------------------------------------------------------- BOOL CLogicalConstTableGet::FMatch ( COperator *pop ) const { if (pop->Eopid() != Eopid()) { return false; } CLogicalConstTableGet *popCTG = CLogicalConstTableGet::PopConvert(pop); // match if column descriptors, const values and output columns are identical return m_pdrgpcoldesc->FEqual(popCTG->Pdrgpcoldesc()) && m_pdrgpdrgpdatum->FEqual(popCTG->Pdrgpdrgpdatum()) && m_pdrgpcrOutput->FEqual(popCTG->PdrgpcrOutput()); }
//--------------------------------------------------------------------------- // @function: // CXformImplementConstTableGet::Transform // // @doc: // Actual transformation // //--------------------------------------------------------------------------- void CXformImplementConstTableGet::Transform ( CXformContext *pxfctxt, CXformResult *pxfres, CExpression *pexpr ) const { GPOS_ASSERT(NULL != pxfctxt); GPOS_ASSERT(FPromising(pxfctxt->Pmp(), this, pexpr)); GPOS_ASSERT(FCheckPattern(pexpr)); CLogicalConstTableGet *popConstTableGet = CLogicalConstTableGet::PopConvert(pexpr->Pop()); IMemoryPool *mp = pxfctxt->Pmp(); // create/extract components for alternative CColumnDescriptorArray *pdrgpcoldesc = popConstTableGet->Pdrgpcoldesc(); pdrgpcoldesc->AddRef(); IDatum2dArray *pdrgpdrgpdatum = popConstTableGet->Pdrgpdrgpdatum(); pdrgpdrgpdatum->AddRef(); CColRefArray *pdrgpcrOutput = popConstTableGet->PdrgpcrOutput(); pdrgpcrOutput->AddRef(); // create alternative expression CExpression *pexprAlt = GPOS_NEW(mp) CExpression ( mp, GPOS_NEW(mp) CPhysicalConstTableGet(mp, pdrgpcoldesc, pdrgpdrgpdatum, pdrgpcrOutput) ); // add alternative to transformation result pxfres->Add(pexprAlt); }