//--------------------------------------------------------------------------- // @function: // CMDAccessorTest::PvLookupMultipleObj // // @doc: // A task that looks up multiple objects from the MD cache // //--------------------------------------------------------------------------- void * CMDAccessorTest::PvLookupMultipleObj ( void * pv ) { GPOS_CHECK_ABORT; GPOS_ASSERT(NULL != pv); SMDCacheTaskParams *pmdtaskparams = (SMDCacheTaskParams *) pv; CMDAccessor *md_accessor = pmdtaskparams->m_pmda; GPOS_ASSERT(NULL != md_accessor); // lookup cache objects const ULONG ulNumberOfObjects = 10; for (ULONG ul = 0; ul < ulNumberOfObjects; ul++) { GPOS_CHECK_ABORT; // lookup relation CMDIdGPDB *mdid = GPOS_NEW(pmdtaskparams->m_mp) CMDIdGPDB(GPOPT_MDCACHE_TEST_OID /*OID*/, 1 /*major*/, ul + 1 /*minor*/); (void) md_accessor->RetrieveRel(mdid); mdid->Release(); } return NULL; }
//--------------------------------------------------------------------------- // @function: // CMDAccessorTest::PvLookupSingleObj // // @doc: // A task that looks up a single object from the MD cache // //--------------------------------------------------------------------------- void * CMDAccessorTest::PvLookupSingleObj ( void * pv ) { GPOS_CHECK_ABORT; GPOS_ASSERT(NULL != pv); SMDCacheTaskParams *pmdtaskparams = (SMDCacheTaskParams *) pv; CMDAccessor *md_accessor = pmdtaskparams->m_pmda; IMemoryPool *mp = pmdtaskparams->m_mp; GPOS_ASSERT(NULL != mp); GPOS_ASSERT(NULL != md_accessor); // lookup a cache object CMDIdGPDB *mdid = GPOS_NEW(mp) CMDIdGPDB(GPOPT_MDCACHE_TEST_OID /* OID */, 1 /* major version */, 1 /* minor version */); // lookup object (void) md_accessor->RetrieveRel(mdid); mdid->Release(); return NULL; }
//--------------------------------------------------------------------------- // @function: // CTranslatorDXLToQuery::TranslateGroupByColumns // // @doc: // Translate a logical group by columns // //--------------------------------------------------------------------------- void CTranslatorDXLToQuery::TranslateGroupByColumns ( const CDXLLogicalGroupBy *pdxlnlggrpby, Query *pquery, CStateDXLToQuery *pstatedxltoquery, CMappingColIdVarQuery *pmapcidvarquery ) { pquery->hasAggs = true; List *plGrpCl = NIL; const DrgPul *pdrgpulGrpColId = pdxlnlggrpby->PdrgpulGroupingCols(); // discard the previously inserted entries in the TE // as the query output will be composed of the grouping columns and the // project list defined in the group by operator pstatedxltoquery->Clear(); if (NULL != pdrgpulGrpColId) { for (ULONG ul = 0; ul < pdrgpulGrpColId->UlLength(); ul++) { GPOS_ASSERT(NULL != (*pdrgpulGrpColId)[ul]); ULONG ulGroupingCol = *((*pdrgpulGrpColId)[ul]); GroupClause *pgrpcl = MakeNode(GroupClause); m_ulSortgrouprefCounter++; pgrpcl->tleSortGroupRef = m_ulSortgrouprefCounter; plGrpCl = gpdb::PlAppendElement(plGrpCl, pgrpcl); TargetEntry *pte = const_cast<TargetEntry *>(pmapcidvarquery->Pte(ulGroupingCol)); OID oid = gpdb::OidExprType((Node*) pte->expr); CMDIdGPDB *pmdid = New(m_pmp) CMDIdGPDB(oid); const IMDType *pmdtype = m_pmda->Pmdtype(pmdid); pmdid->Release(); const CMDIdGPDB *pmdidSortOp = CMDIdGPDB::PmdidConvert(pmdtype->PmdidCmp(IMDType::EcmptL)); pgrpcl->sortop = pmdidSortOp->OidObjectId(); GPOS_ASSERT(NULL != pte); pte->resno = (AttrNumber) (ul + 1); pte->ressortgroupref = pgrpcl->tleSortGroupRef; pstatedxltoquery->AddOutputColumnEntry(pte, pte->resname, ulGroupingCol); } } pquery->groupClause = plGrpCl; }
//--------------------------------------------------------------------------- // @function: // CMDAccessorTest::EresUnittest_Negative // // @doc: // Test fetching non-existing metadata objects from the MD cache // //--------------------------------------------------------------------------- GPOS_RESULT CMDAccessorTest::EresUnittest_Negative() { CAutoMemoryPool amp(CAutoMemoryPool::ElcNone); IMemoryPool *mp = amp.Pmp(); // Setup an MD cache with a file-based provider CMDProviderMemory *pmdp = CTestUtils::m_pmdpf; pmdp->AddRef(); CMDAccessor mda(mp, CMDCache::Pcache(), CTestUtils::m_sysidDefault, pmdp); // lookup a non-existing objects CMDIdGPDB *pmdidNonExistingObject = GPOS_NEW(mp) CMDIdGPDB(GPOPT_MDCACHE_TEST_OID /* OID */, 15 /* version */, 1 /* minor version */); // call should result in an exception (void) mda.RetrieveRel(pmdidNonExistingObject); pmdidNonExistingObject->Release(); return GPOS_OK; }
//--------------------------------------------------------------------------- // @function: // CMDIdGPDB::CMDIdGPDB // // @doc: // Copy constructor // //--------------------------------------------------------------------------- CMDIdGPDB::CMDIdGPDB ( const CMDIdGPDB &mdidSource ) : IMDId(), m_sysid(mdidSource.Sysid()), m_oid(mdidSource.OidObjectId()), m_ulVersionMajor(mdidSource.UlVersionMajor()), m_ulVersionMinor(mdidSource.UlVersionMinor()), m_str(m_wszBuffer, GPOS_ARRAY_SIZE(m_wszBuffer)) { GPOS_ASSERT(mdidSource.FValid()); GPOS_ASSERT(IMDId::EmdidGPDB == mdidSource.Emdidt()); // serialize mdid into static string Serialize(); }
//--------------------------------------------------------------------------- // @function: // CTranslatorDXLToQuery::PrteFromTblDescr // // @doc: // Translates a DXL table descriptor into a range table entry // //--------------------------------------------------------------------------- RangeTblEntry * CTranslatorDXLToQuery::PrteFromTblDescr ( const CDXLTableDescr *pdxltabdesc, Index iRel, CStateDXLToQuery *pstatedxltoquery, CMappingColIdVarQuery *pmapcidvarquery ) { GPOS_ASSERT(0 == pstatedxltoquery->UlLength()); RangeTblEntry *prte = MakeNode(RangeTblEntry); prte->rtekind = RTE_RELATION; // get oid for table CMDIdGPDB *pmdid = CMDIdGPDB::PmdidConvert(pdxltabdesc->Pmdid()); prte->relid = pmdid->OidObjectId(); Alias *palias = MakeNode(Alias); palias->colnames = NIL; // get table alias palias->aliasname = CTranslatorUtils::SzFromWsz(pdxltabdesc->Pmdname()->Pstr()->Wsz()); // get column names const ULONG ulArity = pdxltabdesc->UlArity(); for (ULONG ul = 0; ul < ulArity; ++ul) { const CDXLColDescr *pdxlcd = pdxltabdesc->Pdxlcd(ul); CHAR *szColName = CTranslatorUtils::SzFromWsz(pdxlcd->Pmdname()->Pstr()->Wsz()); GPOS_ASSERT(NULL != pdxlcd); GPOS_ASSERT(0 != pdxlcd->IAttno()); Value *pvalColName = gpdb::PvalMakeString(szColName); palias->colnames = gpdb::PlAppendElement(palias->colnames, pvalColName); const CMDIdGPDB *pmdidColType = CMDIdGPDB::PmdidConvert(pdxlcd->PmdidType()); OID oidAttType = pmdidColType->OidObjectId(); GPOS_ASSERT(InvalidOid != oidAttType); Var *pvar = gpdb::PvarMakeVar ( iRel, (AttrNumber) pdxlcd->IAttno(), oidAttType, -1, // vartypmod 0 ); TargetEntry *pte = MakeNode(TargetEntry); pte->expr = (Expr*) pvar; pte->resname = szColName; pte->resno = (AttrNumber) pdxlcd->IAttno(); //save mapping col id -> Var in the query translation context pmapcidvarquery->FInsertMapping(pdxlcd->UlID(), pte); pstatedxltoquery->AddOutputColumnEntry(pte, pte->resname, pdxlcd->UlID()); } prte->eref = palias; return prte; }