コード例 #1
0
ファイル: CMDAccessorTest.cpp プロジェクト: b-xiang/gporca
//---------------------------------------------------------------------------
//	@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;
}
コード例 #2
0
ファイル: CMDAccessorTest.cpp プロジェクト: b-xiang/gporca
//---------------------------------------------------------------------------
//	@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;
}
コード例 #3
0
//---------------------------------------------------------------------------
//	@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;
}
コード例 #4
0
ファイル: CMDAccessorTest.cpp プロジェクト: b-xiang/gporca
//---------------------------------------------------------------------------
//	@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;
}
コード例 #5
0
ファイル: CMDIdGPDB.cpp プロジェクト: MoZhonghua/gporca
//---------------------------------------------------------------------------
//	@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();
}
コード例 #6
0
//---------------------------------------------------------------------------
//	@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;
}