//--------------------------------------------------------------------------- // @function: // CSubqueryHandlerTest::EresUnittest_SubqueryWithConstSubqueries // // @doc: // Test of subquery handler for ALL subquery over const table get // //--------------------------------------------------------------------------- GPOS_RESULT CSubqueryHandlerTest::EresUnittest_SubqueryWithConstSubqueries() { CAutoMemoryPool amp; IMemoryPool *mp = amp.Pmp(); // setup a file-based provider CMDProviderMemory *pmdp = CTestUtils::m_pmdpf; pmdp->AddRef(); // we need to use an auto pointer for the cache here to ensure // deleting memory of cached objects when we throw CAutoP<CMDAccessor::MDCache> apcache; apcache = CCacheFactory::CreateCache<gpopt::IMDCacheObject*, gpopt::CMDKey*> ( true, // fUnique 0 /* unlimited cache quota */, CMDKey::UlHashMDKey, CMDKey::FEqualMDKey ); CMDAccessor::MDCache *pcache = apcache.Value(); { CMDAccessor mda(mp, pcache, CTestUtils::m_sysidDefault, pmdp); // install opt context in TLS CAutoOptCtxt aoc ( mp, &mda, NULL, /* pceeval */ CTestUtils::GetCostModel(mp) ); // create a subquery with const table get expression CExpression *pexpr = CSubqueryTestUtils::PexprSubqueryWithDisjunction(mp); CXform *pxform = CXformFactory::Pxff()->Pxf(CXform::ExfSelect2Apply); CWStringDynamic str(mp); COstreamString oss(&str); oss << std::endl << "EXPRESSION:" << std::endl << *pexpr << std::endl; CExpression *pexprLogical = (*pexpr)[0]; CExpression *pexprScalar = (*pexpr)[1]; oss << std::endl << "LOGICAL:" << std::endl << *pexprLogical << std::endl; oss << std::endl << "SCALAR:" << std::endl << *pexprScalar << std::endl; GPOS_TRACE(str.GetBuffer()); str.Reset(); CXformContext *pxfctxt = GPOS_NEW(mp) CXformContext(mp); CXformResult *pxfres = GPOS_NEW(mp) CXformResult(mp); // calling the xform to perform subquery to Apply transformation; // xform must fail since we do not expect constant subqueries pxform->Transform(pxfctxt, pxfres, pexpr); CExpression *pexprResult = pxfres->PexprNext(); oss << std::endl << "NEW LOGICAL:" << std::endl << *((*pexprResult)[0]) << std::endl; oss << std::endl << "RESIDUAL SCALAR:" << std::endl << *((*pexprResult)[1]) << std::endl; GPOS_TRACE(str.GetBuffer()); str.Reset(); pxfres->Release(); pxfctxt->Release(); pexpr->Release(); } return GPOS_FAILED; }
//--------------------------------------------------------------------------- // @function: // CGroupExpression::Transform // // @doc: // Transform group expression using the given xform // //--------------------------------------------------------------------------- void CGroupExpression::Transform ( IMemoryPool *pmp, IMemoryPool *pmpLocal, CXform *pxform, CXformResult *pxfres, ULONG *pulElapsedTime // output: elapsed time in millisecond ) { GPOS_ASSERT(NULL != pulElapsedTime); GPOS_CHECK_ABORT; CTimerUser timer; // check traceflag and compatibility with origin xform if (GPOPT_FDISABLED_XFORM(pxform->Exfid())|| !pxform->FCompatible(m_exfidOrigin)) { *pulElapsedTime = timer.UlElapsedMS(); return; } // check xform promise CExpressionHandle exprhdl(pmp); exprhdl.Attach(this); exprhdl.DeriveProps(NULL /*pdpctxt*/); if (CXform::ExfpNone == pxform->Exfp(exprhdl)) { *pulElapsedTime = timer.UlElapsedMS(); return; } // pre-processing before applying xform to group expression PreprocessTransform(pmpLocal, pmp, pxform); // extract memo bindings to apply xform CBinding binding; CXformContext *pxfctxt = GPOS_NEW(pmp) CXformContext(pmp); CExpression *pexprPattern = pxform->PexprPattern(); CExpression *pexpr = binding.PexprExtract(pmp, this, pexprPattern , NULL); while (NULL != pexpr) { pxform->Transform(pxfctxt, pxfres, pexpr); PrintXform(pmp, pxform, pexpr, pxfres); if (CXformUtils::FApplyOnce(pxform->Exfid()) || (0 < pxfres->Pdrgpexpr()->UlLength() && !CXformUtils::FApplyToNextBinding(pxform, pexpr))) { // do not apply xform to other possible patterns pexpr->Release(); break; } CExpression *pexprLast = pexpr; pexpr = binding.PexprExtract(pmp, this, pexprPattern, pexprLast); // release last extracted expression pexprLast->Release(); GPOS_CHECK_ABORT; } pxfctxt->Release(); // post-prcoessing before applying xform to group expression PostprocessTransform(pmpLocal, pmp, pxform); *pulElapsedTime = timer.UlElapsedMS(); }