//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerLogicalCTAS::EndElement
//
//	@doc:
//		Invoked by Xerces to process a closing tag
//
//---------------------------------------------------------------------------
void
CParseHandlerLogicalCTAS::EndElement
	(
	const XMLCh* const, // xmlszUri,
	const XMLCh* const xmlszLocalname,
	const XMLCh* const // xmlszQname
	)
{
	if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(EdxltokenLogicalCTAS), xmlszLocalname))
	{
		CWStringDynamic *pstr = CDXLUtils::PstrFromXMLCh(m_pphm->Pmm(), xmlszLocalname);
		GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXLUnexpectedTag, pstr->Wsz());
	}

	GPOS_ASSERT(3 == this->UlLength());

	CParseHandlerColDescr *pphColDescr = dynamic_cast<CParseHandlerColDescr *>((*this)[0]);
	CParseHandlerCtasStorageOptions *pphCTASOptions = dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[1]);
	CParseHandlerLogicalOp *pphChild = dynamic_cast<CParseHandlerLogicalOp*>((*this)[2]);

	GPOS_ASSERT(NULL != pphColDescr->Pdrgpdxlcd());
	GPOS_ASSERT(NULL != pphCTASOptions->Pdxlctasopt());
	GPOS_ASSERT(NULL != pphChild->Pdxln());
	
	DrgPdxlcd *pdrgpdxlcd = pphColDescr->Pdrgpdxlcd();
	pdrgpdxlcd->AddRef();
	
	CDXLCtasStorageOptions *pdxlctasopt = pphCTASOptions->Pdxlctasopt();
	pdxlctasopt->AddRef();
	
	m_pdxln = GPOS_NEW(m_pmp) CDXLNode
							(
							m_pmp,
							GPOS_NEW(m_pmp) CDXLLogicalCTAS
										(
										m_pmp, 
										m_pmdid, 
										m_pmdnameSchema, 
										m_pmdname, 
										pdrgpdxlcd, 
										pdxlctasopt, 
										m_ereldistrpolicy, 
										m_pdrgpulDistr, 
										m_fTemporary, 
										m_fHasOids, 
										m_erelstorage, 
										m_pdrgpulSource,
										m_pdrgpiVarTypeMod
										)
							);
	
	AddChildFromParseHandler(pphChild);

#ifdef GPOS_DEBUG
	m_pdxln->Pdxlop()->AssertValid(m_pdxln, false /* fValidateChildren */);
#endif // GPOS_DEBUG

	// deactivate handler
	m_pphm->DeactivateHandler();
}
//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerMDRelationCtas::EndElement
//
//	@doc:
//		Invoked by Xerces to process a closing tag
//
//---------------------------------------------------------------------------
void
CParseHandlerMDRelationCtas::EndElement
(
    const XMLCh* const, // xmlszUri,
    const XMLCh* const xmlszLocalname,
    const XMLCh* const // xmlszQname
)
{
    if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(EdxltokenRelationCTAS), xmlszLocalname))
    {
        CWStringDynamic *pstr = CDXLUtils::PstrFromXMLCh(m_pphm->Pmm(), xmlszLocalname);
        GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXLUnexpectedTag, pstr->Wsz());
    }

    CParseHandlerMetadataColumns *pphMdCol = dynamic_cast<CParseHandlerMetadataColumns *>((*this)[0]);
    CParseHandlerCtasStorageOptions *pphCTASOptions = dynamic_cast<CParseHandlerCtasStorageOptions *>((*this)[1]);

    GPOS_ASSERT(NULL != pphMdCol->Pdrgpmdcol());
    GPOS_ASSERT(NULL != pphCTASOptions->Pdxlctasopt());

    DrgPmdcol *pdrgpmdcol = pphMdCol->Pdrgpmdcol();
    CDXLCtasStorageOptions *pdxlctasopt = pphCTASOptions->Pdxlctasopt();

    pdrgpmdcol->AddRef();
    pdxlctasopt->AddRef();

    m_pimdobj = GPOS_NEW(m_pmp) CMDRelationCtasGPDB
                (
                    m_pmp,
                    m_pmdid,
                    m_pmdnameSchema,
                    m_pmdname,
                    m_fTemporary,
                    m_fHasOids,
                    m_erelstorage,
                    m_ereldistrpolicy,
                    pdrgpmdcol,
                    m_pdrgpulDistrColumns,
                    m_pdrgpdrgpulKeys,
                    pdxlctasopt,
                    m_pdrgpiVarTypeMod
                );

    // deactivate handler
    m_pphm->DeactivateHandler();
}