HAWQ-765. Delete Deadcode: CTranslatorDXLToQuery [#122087307]
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/a6622b81 Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/a6622b81 Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/a6622b81 Branch: refs/heads/HAWQ-537 Commit: a6622b81b5a138e4a524baf82dca270def5ad961 Parents: ce3f7c6 Author: Venkatesh (Venky) Raghavan <vragha...@pivotal.io> Authored: Fri Jun 24 15:52:18 2016 -0700 Committer: Venkatesh (Venky) Raghavan <vragha...@pivotal.io> Committed: Fri Jun 24 15:52:18 2016 -0700 ---------------------------------------------------------------------- .../gpopt/translate/CTranslatorDXLToQuery.cpp | 1478 ------------------ .../gpopt/translate/CTranslatorDXLToScalar.cpp | 213 --- src/backend/gpopt/translate/Makefile | 1 - src/backend/gpopt/utils/COptTasks.cpp | 87 -- src/backend/gpopt/utils/funcs.cpp | 113 -- .../gpopt/translate/CTranslatorDXLToQuery.h | 317 ---- .../gpopt/translate/CTranslatorDXLToScalar.h | 25 - src/include/gpopt/utils/COptTasks.h | 8 - 8 files changed, 2242 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/backend/gpopt/translate/CTranslatorDXLToQuery.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorDXLToQuery.cpp b/src/backend/gpopt/translate/CTranslatorDXLToQuery.cpp deleted file mode 100644 index 260fe63..0000000 --- a/src/backend/gpopt/translate/CTranslatorDXLToQuery.cpp +++ /dev/null @@ -1,1478 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -//--------------------------------------------------------------------------- -// @filename: -// CTranslatorDXLToQuery.cpp -// -// @doc: -// Implementation of the methods used to translate a DXL tree into query. -// All translator methods allocate memory in the provided memory pool, and -// the caller is responsible for freeing it. -// -// -// @test: -// -// -//--------------------------------------------------------------------------- - -#define ALLOW_DatumGetPointer -#define ALLOW_ntohl -#define ALLOW_memset -#define ALLOW_printf - -#include "postgres.h" -#include "gpopt/translate/CMappingColIdVarQuery.h" -#include "gpopt/translate/CMappingElementColIdTE.h" -#include "gpopt/translate/CTranslatorDXLToQuery.h" -#include "gpopt/translate/CTranslatorDXLToPlStmt.h" -#include "gpopt/translate/CTranslatorUtils.h" - -#include "gpos/base.h" -#include "gpos/common/CBitSet.h" - -#include "naucrates/dxl/CDXLUtils.h" -#include "naucrates/md/IMDColumn.h" -#include "naucrates/md/IMDRelation.h" - -#include "gpopt/mdcache/CMDAccessor.h" - -#include "gpopt/gpdbwrappers.h" - -using namespace gpmd; -using namespace gpdxl; -using namespace gpos; - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::CTranslatorDXLToQuery -// -// @doc: -// Constructor -// -//--------------------------------------------------------------------------- -CTranslatorDXLToQuery::CTranslatorDXLToQuery - ( - IMemoryPool *pmp, - CMDAccessor *pmda, - ULONG ulSegments - ) - : - m_pmp(pmp), - m_pmda(pmda), - m_ulSortgrouprefCounter(0), - m_ulSegments(ulSegments) -{ - m_pdxlsctranslator = GPOS_NEW(m_pmp) CTranslatorDXLToScalar(m_pmp, m_pmda, m_ulSegments); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::~CTranslatorDXLToQuery -// -// @doc: -// Destructor -// -//--------------------------------------------------------------------------- -CTranslatorDXLToQuery::~CTranslatorDXLToQuery() -{ - GPOS_DELETE(m_pdxlsctranslator); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PqueryFromDXL -// -// @doc: -// Translate DXL node into a Query -// -//--------------------------------------------------------------------------- -Query * -CTranslatorDXLToQuery::PqueryFromDXL - ( - const CDXLNode *pdxln, - const DrgPdxln *pdrgpdxlnQueryOutput, - CStateDXLToQuery *pstatedxltoquery, - TEMap *ptemap, - ULONG ulQueryLevel - ) -{ - // initialize the colid->var mapping - CMappingColIdVarQuery *pmapcidvarquery = GPOS_NEW(m_pmp) CMappingColIdVarQuery(m_pmp, ptemap, ulQueryLevel); - - GPOS_ASSERT(NULL != pdxln); - - Query *pquery = MakeNode(Query); - - TranslateLogicalOp(pdxln, pquery, pstatedxltoquery, pmapcidvarquery); - - if(0 == ulQueryLevel) - { - SetQueryOutput - ( - pdrgpdxlnQueryOutput, - pquery, - pstatedxltoquery, - pmapcidvarquery - ); - } - else - { - List *plTE = NIL; - const ULONG ulSize = pstatedxltoquery->UlLength(); - for (ULONG ul = 0; ul < ulSize ; ul++) - { - TargetEntry *pte = pstatedxltoquery->PteColumn(ul); - GPOS_ASSERT(NULL != pte); - - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(pte); - pteCopy->resno = (AttrNumber) (ul + 1); - - plTE = gpdb::PlAppendElement(plTE, pteCopy); - } - pquery->targetList = plTE; - } - - // TODO: venky; June 14 2011, We currently assume that all queries are of the type select. - pquery->commandType = CMD_SELECT; - - GPOS_DELETE(pmapcidvarquery); - - if (m_pdxlsctranslator->FHasSubqueries()) - { - pquery->hasSubLinks = true; - } - - return pquery; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PqueryFromDXLSubquery -// -// @doc: -// Translate DXL node subquery into a Query -// -//--------------------------------------------------------------------------- -Query * -CTranslatorDXLToQuery::PqueryFromDXLSubquery - ( - const CDXLNode *pdxln, - ULONG ulColId, - CStateDXLToQuery *pstatedxltoquery, - TEMap *ptemap, - ULONG ulQueryLevel - ) -{ - - // initialize the colid->var mapping - CMappingColIdVarQuery *pmapcidvarquery = GPOS_NEW (m_pmp) CMappingColIdVarQuery(m_pmp, ptemap, ulQueryLevel); - - GPOS_ASSERT(NULL != pdxln); - - Query *pquery = MakeNode(Query); - - TranslateLogicalOp(pdxln, pquery, pstatedxltoquery, pmapcidvarquery); - - - SetSubqueryOutput - ( - ulColId, - pquery, - pstatedxltoquery, - pmapcidvarquery - ); - - pquery->commandType = CMD_SELECT; - - GPOS_DELETE(pmapcidvarquery); - - if (m_pdxlsctranslator->FHasSubqueries()) - { - pquery->hasSubLinks = true; - } - - return pquery; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::SetSubqueryOutput -// -// @doc: -// Set query target list based on the DXL query output -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::SetSubqueryOutput - ( - ULONG ulColId, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(NULL != pquery); - CStateDXLToQuery *pstatedxltoqueryOutput = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - - List *plTE = NIL; - ULONG ulResno = 1; - const TargetEntry *pte = pmapcidvarquery->Pte(ulColId); - - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(const_cast<TargetEntry*>(pte)); - pteCopy->resno = (AttrNumber) ulResno; - - pstatedxltoqueryOutput->AddOutputColumnEntry(pteCopy, pteCopy->resname, ulColId); - plTE = gpdb::PlAppendElement(plTE, pteCopy); - - const ULONG ulSize = pstatedxltoquery->UlLength(); - - // Add grouping and ordering columns that are not in the query output in the - // target list as resjunk entries. - ULONG ulCounter = 0; - - for (ULONG ul = 0; ul < ulSize ; ul++) - { - TargetEntry *pteCurr = pstatedxltoquery->PteColumn(ul); - GPOS_ASSERT(NULL != pteCurr); - - // we are only interested in grouping and ordering columns - if(pteCurr->ressortgroupref > 0) - { - // check if we have already added the corresponding pte entry in pplTE - BOOL fres = pstatedxltoqueryOutput->FTEFound(pteCurr); - - if(!fres) - { - ulResno++; - // copy the entries - TargetEntry *pteCopyCurr = (TargetEntry*) gpdb::PvCopyObject(pteCurr); - pteCopyCurr->resno = (AttrNumber) ulResno; - pteCopyCurr->resjunk = true; - - pstatedxltoqueryOutput->AddOutputColumnEntry - ( - pteCopyCurr, - pteCopyCurr->resname, - pstatedxltoquery->UlColId(ul) - ); - plTE = gpdb::PlAppendElement(plTE, pteCopyCurr); - } - } - ulCounter++; - } - - pstatedxltoquery->Reload(pstatedxltoqueryOutput); - GPOS_DELETE(pstatedxltoqueryOutput); - - pquery->targetList = plTE; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::SetQueryOutput -// -// @doc: -// Set query target list based on the DXL query output -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::SetQueryOutput - ( - const DrgPdxln *pdrgpdxlnQueryOutput, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(NULL != pdrgpdxlnQueryOutput && NULL != pquery); - - CStateDXLToQuery *pstatedxltoqueryOutput = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - - List *plTE = NIL; - - ULONG ulResno = 0; - const ULONG ulLen = pdrgpdxlnQueryOutput->UlLength(); - // translate each DXL scalar ident into a target entry - for (ULONG ul = 0; ul < ulLen; ul++) - { - CDXLNode *pdxlnIdent = (*pdrgpdxlnQueryOutput)[ul]; - CDXLScalarIdent *pdxlop = CDXLScalarIdent::PdxlopConvert(pdxlnIdent->Pdxlop()); - const CDXLColRef *pdxlcr = pdxlop->Pdxlcr(); - - GPOS_ASSERT(NULL != pdxlcr); - const ULONG ulColId = pdxlcr->UlID(); - const CMDName *pmdname = pdxlcr->Pmdname(); - const TargetEntry *pte = pmapcidvarquery->Pte(ulColId); - - ulResno++; - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(const_cast<TargetEntry*>(pte)); - pteCopy->resname = CTranslatorUtils::SzFromWsz(pmdname->Pstr()->Wsz()); - pteCopy->resno = (AttrNumber) ulResno; - - pstatedxltoqueryOutput->AddOutputColumnEntry(pteCopy, pteCopy->resname, ulColId); - plTE = gpdb::PlAppendElement(plTE, pteCopy); - } - - const ULONG ulSize = pstatedxltoquery->UlLength(); - - // Add grouping and ordering columns that are not in the query output in the - // target list as resjunk entries. - - ULONG ulCounter = 0; - - for (ULONG ul = 0; ul < ulSize ; ul++) - { - TargetEntry *pte = pstatedxltoquery->PteColumn(ul); - GPOS_ASSERT(NULL != pte); - - // we are only interested in grouping and ordering columns - if(pte->ressortgroupref > 0) - { - // check if we have already added the corresponding pte entry in pplTE - BOOL fres = pstatedxltoqueryOutput->FTEFound(pte); - - if(!fres) - { - ULONG ulColId = pstatedxltoquery->UlColId(ul); - - ulResno++; - // copy the entries - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(pte); - pteCopy->resno = (AttrNumber) ulResno; - pteCopy->resjunk = true; - - pstatedxltoqueryOutput->AddOutputColumnEntry(pteCopy, pteCopy->resname, ulColId); - plTE = gpdb::PlAppendElement(plTE, pteCopy); - } - } - ulCounter++; - } - - pstatedxltoquery->Reload(pstatedxltoqueryOutput); - GPOS_DELETE(pstatedxltoqueryOutput); - - pquery->targetList = plTE; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateLogicalOp -// -// @doc: -// Translates a DXL tree into a Query node -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateLogicalOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - STranslatorElem rgTranslators[] = - { - {EdxlopLogicalGet, &CTranslatorDXLToQuery::TranslateGet}, - {EdxlopLogicalProject, &CTranslatorDXLToQuery::TranslateProject}, - {EdxlopLogicalSelect, &CTranslatorDXLToQuery::TranslateSelect}, - {EdxlopLogicalJoin, &CTranslatorDXLToQuery::TranslateJoin}, - {EdxlopLogicalGrpBy, &CTranslatorDXLToQuery::TranslateGroupBy}, - {EdxlopLogicalLimit, &CTranslatorDXLToQuery::TranslateLimit}, - {EdxlopLogicalTVF, &CTranslatorDXLToQuery::TranslateTVF}, - {EdxlopLogicalSetOp, &CTranslatorDXLToQuery::TranslateSetOp}, - }; - - const ULONG ulTranslators = GPOS_ARRAY_SIZE(rgTranslators); - - GPOS_ASSERT(NULL != pdxln); - GPOS_ASSERT(NULL != pquery); - Edxlopid eopid = pdxln->Pdxlop()->Edxlop(); - - // find translator for the node type - PfPexpr pf = NULL; - for (ULONG ul = 0; ul < ulTranslators; ul++) - { - STranslatorElem elem = rgTranslators[ul]; - if (eopid == elem.eopid) - { - pf = elem.pf; - break; - } - } - - if (NULL == pf) - { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXLUnrecognizedOperator, pdxln->Pdxlop()->PstrOpName()->Wsz()); - } - - (this->*pf)(pdxln, pquery, pstatedxltoquery, pmapcidvarquery); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateGet -// -// @doc: -// Translate a logical get operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateGet -( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery -) -{ - // This function must be called only for single table queries. - // For multi-table queries, see TranslateDXLLgJoin - - RangeTblRef *prtref = PrtrefFromDXLLgGet(pdxln, pquery, pstatedxltoquery, pmapcidvarquery); - - GPOS_ASSERT(NULL == pquery->jointree); - - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, prtref); - pquery->jointree = pfromexpr; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateTVF -// -// @doc: -// Translate a logical TVF operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateTVF -( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery -) -{ - RangeTblRef *prtref = PrtrefFromDXLLgTVF(pdxln, pquery, pstatedxltoquery, pmapcidvarquery); - - GPOS_ASSERT(NULL == pquery->jointree); - - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, prtref); - pquery->jointree = pfromexpr; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateSelect -// -// @doc: -// Translate a logical select operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateSelect -( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery -) -{ - // translate children - CDXLNode *pdxlnCond = (*pdxln)[0]; - CDXLNode *pdxlnChild = (*pdxln)[1]; - - // creating a range table entry because we could have the condition on an aggregate or a computed column - RangeTblRef *prtref = PrtrefFromDXLLgOp(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, prtref); - pquery->jointree = pfromexpr; - - Expr *pexpr = m_pdxlsctranslator->PexprFromDXLNodeScalar - ( - pdxlnCond, - pmapcidvarquery - ); - GPOS_ASSERT(NULL == pquery->jointree->quals); - - pquery->jointree->quals = (Node*) pexpr; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateSetOp -// -// @doc: -// Translate a logical set operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateSetOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - // TODO: venky, Oct 24th 2012, we currently assume during DXL->Query translations that - // set ops are binary in nature which is not the case. - GPOS_ASSERT(2 == pdxln->UlArity()); - - CDXLLogicalSetOp *pdxlop = CDXLLogicalSetOp::PdxlopConvert(pdxln->Pdxlop()); - EdxlSetOpType edxlsetop = pdxlop->Edxlsetoptype(); - - SetOperationStmt *psetop = MakeNode(SetOperationStmt); - psetop->op = CTranslatorUtils::Setoptype(pdxlop->Edxlsetoptype()); - psetop->all = false; - - if (EdxlsetopUnionAll == edxlsetop || - EdxlsetopIntersectAll == edxlsetop || - EdxlsetopDifferenceAll == edxlsetop - ) - { - psetop->all = true; - } - - // translate children - const ULONG ulArity = pdxln->UlArity(); - for (ULONG ul = 0; ul < ulArity; ul++) - { - CDXLNode *pdxlnChild = (*pdxln)[ul]; - - CStateDXLToQuery *pstatedxltoqueryChild = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - RangeTblRef *prtrefChild = PrtrefFromDXLLgOp(pdxlnChild, pquery, pstatedxltoqueryChild, pmapcidvarquery); - MarkUnusedColumns(pquery, prtrefChild, pstatedxltoqueryChild, pdxlop->Pdrgpul(ul) /*array of colids of the first child*/); - GPOS_DELETE(pstatedxltoqueryChild); - - if (0 == ul) - { - psetop->larg = (Node*) prtrefChild; - } - else - { - psetop->rarg = (Node*) prtrefChild; - } - } - - // add the output columns to the translator state - // add type information of the output columns to the set operator - psetop->colTypes = NIL; - psetop->colTypmods = NIL; - - const DrgPdxlcd *pdrgpdxlcd = pdxlop->Pdrgpdxlcd(); - const ULONG ulLen = pdrgpdxlcd->UlLength(); - for (ULONG ul = 0; ul < ulLen; ul++) - { - const CDXLColDescr *pdxlcd = (*pdrgpdxlcd)[ul]; - OID oid = CMDIdGPDB::PmdidConvert(pdxlcd->PmdidType())->OidObjectId(); - psetop->colTypes = gpdb::PlAppendOid(psetop->colTypes, oid); - psetop->colTypmods = gpdb::PlAppendInt(psetop->colTypmods, -1); - - TargetEntry *pte = MakeNode(TargetEntry); - Var *pvar = gpdb::PvarMakeVar(1, (AttrNumber) (ul + 1), oid, -1, 0); - pte->expr = (Expr*) pvar; - pte->resname = CTranslatorUtils::SzFromWsz(pdxlcd->Pmdname()->Pstr()->Wsz()); - pte->resno = 1; - - pstatedxltoquery->AddOutputColumnEntry(pte, pte->resname, pdxlcd->UlID()); - } - - pquery->jointree = MakeNode(FromExpr); // GPDB expects a from expr clause - pquery->setOperations = (Node *) psetop; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::MarkUnusedColumns -// -// @doc: -// Mark unused target list entries in the setop child -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::MarkUnusedColumns - ( - Query *pquery, - RangeTblRef *prtref, - CStateDXLToQuery *pstatedxltoquery, - const DrgPul *pdrgpulColids - ) -{ - const ULONG ulRTIndex = prtref->rtindex; - RangeTblEntry *prte = (RangeTblEntry*) gpdb::PvListNth(pquery->rtable, ulRTIndex -1); - - GPOS_ASSERT(RTE_SUBQUERY == prte->rtekind); - Query *pqueryDerTbl = prte->subquery; - - // maintain the list of used columns in a bit set - CBitSet *pds = GPOS_NEW(m_pmp) CBitSet(m_pmp); - const ULONG ulLen = pdrgpulColids->UlLength(); - for (ULONG ul = 0; ul < ulLen; ul++) - { - ULONG ulValue = *((*pdrgpulColids)[ul]); - (void) pds->FExchangeSet(ulValue); - } - - // Mark all columns that are not in the list of required input columns as being unused - const ULONG ulSize = pstatedxltoquery->UlLength(); - for (ULONG ul = 0; ul < ulSize; ul++) - { - ULONG ulColId = pstatedxltoquery->UlColId(ul); - BOOL fSet = pds->FBit(ulColId); - - if (!fSet) - { - // mark the column as unused in the query - TargetEntry *pte2 = (TargetEntry*) gpdb::PvListNth(pqueryDerTbl->targetList, ul); - pte2->resjunk = true; - - // mark the column as unused in the state - TargetEntry *pte = pstatedxltoquery->PteColumn(ul); - pte->resjunk = true; - } - } - - pds->Release(); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateGroupBy -// -// @doc: -// Translate a logical groupby operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateGroupBy -( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery -) -{ - CDXLOperator *pdxlop = pdxln->Pdxlop(); - CDXLLogicalGroupBy *pdxlnlggrpby = CDXLLogicalGroupBy::PdxlopConvert(pdxlop); - - // translate children - CDXLNode *pdxlnProjectList = (*pdxln)[0]; - CDXLNode *pdxlnChild = (*pdxln)[1]; - - RangeTblRef *prtref = PrtrefFromDXLLgOp(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, prtref); - pquery->jointree = pfromexpr; - - TranslateGroupByColumns(pdxlnlggrpby, pquery, pstatedxltoquery, pmapcidvarquery); - TranslateProjList(pdxlnProjectList, pstatedxltoquery, pmapcidvarquery, pdxlnlggrpby->PdrgpulGroupingCols()->UlLength()); -} - -//--------------------------------------------------------------------------- -// @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 = CTranslatorUtils::PmdidWithVersion(m_pmp, 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: -// CTranslatorDXLToQuery::TranslateProject -// -// @doc: -// Translate a logical project operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateProject -( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery -) -{ - // translate children - CDXLNode *pdxlnProjectList = (*pdxln)[0]; - CDXLNode *pdxlnChild = (*pdxln)[1]; - - RangeTblRef *prtref = PrtrefFromDXLLgOp(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, prtref); - pquery->jointree = pfromexpr; - - TranslateProjList(pdxlnProjectList, pstatedxltoquery, pmapcidvarquery, 0); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateJoin -// -// @doc: -// Translate a logical join operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateJoin - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(NULL == pquery->jointree); - - ULONG ulChildCount = pdxln->UlArity(); - GPOS_ASSERT(2 < ulChildCount); - - FromExpr *pfromexpr = MakeNode(FromExpr); - pfromexpr->fromlist = NULL; - pfromexpr->quals = NULL; - pquery->jointree = pfromexpr; - - if (3 == ulChildCount) - { - // Convert pdxln into a JoinExpr - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, PjoinexprFromDXLLgJoin(pdxln, pquery, pstatedxltoquery, pmapcidvarquery)); - } - else - { - // An n-ary (where n > 2) join is: - // 1. stored as a list of (RangeTableRef or JoinExpr) in pfromexpr->fromlist - // 2. always of join type "inner" (All other join types are required to be a 2-way join) - - GPOS_ASSERT(EdxljtInner == CDXLLogicalJoin::PdxlopConvert(pdxln->Pdxlop())->Edxltype()); - - ULONG ulResno=0; - for (ULONG ulI = 0; ulI < ulChildCount-1; ++ulI) - { - CDXLNode *pdxlnChild = (*pdxln)[ulI]; - - CStateDXLToQuery statedxltoqueryChild(m_pmp); - - pfromexpr->fromlist = gpdb::PlAppendElement(pfromexpr->fromlist, PnodeFromDXLLgJoinChild(pdxlnChild, pquery, &statedxltoqueryChild, pmapcidvarquery)); - - ULONG ulSize = statedxltoqueryChild.UlLength(); - - // insert alias names from the right child to its parent - for(ULONG ulJ = 0; ulJ < ulSize; ulJ++) - { - ulResno++; - TargetEntry *pte = statedxltoqueryChild.PteColumn(ulJ); - CHAR *szColName = statedxltoqueryChild.SzColumnName(ulJ); - GPOS_ASSERT(NULL != pte && NULL != szColName); - - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(pte); - pteCopy->resno = (AttrNumber) ulResno; - - pstatedxltoquery->AddOutputColumnEntry(pteCopy, szColName, statedxltoqueryChild.UlColId(ulJ)); - } - - } - - // An n-ary (n > 2) with a where clause is represented as a: CDXLLogicalSelect on top of a CDXLLogicalJoin - // The last child (CDXLScalar) will be CDXLScalarConstValue representing "true" to signify a cross product. - - GPOS_ASSERT(NULL != (*pdxln)[ulChildCount-1]); - - // translate scalar condition representing the joinqual - CDXLNode *pdxlnCond = (*pdxln)[ulChildCount-1]; - - Expr *pexpr = m_pdxlsctranslator->PexprFromDXLNodeScalar - ( - pdxlnCond, - pmapcidvarquery - ); - - pquery->jointree->quals = (Node*) pexpr; - } -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateLimit -// -// @doc: -// Translate a logical limit operator -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateLimit - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - List *plSortCl = NIL; - - GPOS_ASSERT(4 == pdxln->UlArity()); - - // get children - CDXLNode *pdxlnSortColList = (*pdxln)[0]; - CDXLNode *pdxlnLimitCount = (*pdxln)[1]; - CDXLNode *pdxlnLimitOffset = (*pdxln)[2]; - CDXLNode *pdxlnChild = (*pdxln)[3]; - - // translate child node - TranslateLogicalOp(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - - // translate sorting column lists - const ULONG ulNumSortCols = pdxlnSortColList->UlArity(); - if (0 < ulNumSortCols) - { - for (ULONG ul = 0; ul < ulNumSortCols; ul++) - { - CDXLNode *pdxlnSortCol = (*pdxlnSortColList)[ul]; - CDXLScalarSortCol *pdxlopSortCol = CDXLScalarSortCol::PdxlopConvert(pdxlnSortCol->Pdxlop()); - - // get the target entry and the set the sortgroupref - ULONG ulSortColId = pdxlopSortCol->UlColId(); - TargetEntry *pte = const_cast<TargetEntry *>(pmapcidvarquery->Pte(ulSortColId)); - GPOS_ASSERT(NULL != pte); - - // create the sort clause - SortClause *psortcl = MakeNode(SortClause); - psortcl->sortop = CMDIdGPDB::PmdidConvert(pdxlopSortCol->PmdidSortOp())->OidObjectId(); - plSortCl = gpdb::PlAppendElement(plSortCl, psortcl); - - // If ressortgroupref is not set then this column - // was not used as a grouping column. - if(0 == pte->ressortgroupref) - { - m_ulSortgrouprefCounter++; - pte->ressortgroupref = m_ulSortgrouprefCounter; - } - - psortcl->tleSortGroupRef = pte->ressortgroupref; - - if(!pstatedxltoquery->FTEFound(pte)) - { - pstatedxltoquery->AddOutputColumnEntry(pte, pte->resname, ulSortColId); - } - } - } - - GPOS_ASSERT(NULL != pdxlnLimitCount && NULL != pdxlnLimitOffset); - - // translate the limit count and offset; - if(pdxlnLimitCount->UlArity() >0) - { - Expr *pexprCount = m_pdxlsctranslator->PexprFromDXLNodeScalar - ( - (*pdxlnLimitCount)[0], - pmapcidvarquery - ); - - pquery->limitCount = (Node *) pexprCount; - } - - if(pdxlnLimitOffset->UlArity() >0) - { - Expr *pexprOffset = m_pdxlsctranslator->PexprFromDXLNodeScalar - ( - (*pdxlnLimitOffset)[0], - pmapcidvarquery - ); - - pquery->limitOffset = (Node *) pexprOffset; - } - - pquery->sortClause = plSortCl; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PrtrefFromDXLLgGet -// -// @doc: -// Create a range table reference for a CDXLLogicalGet node -// -//--------------------------------------------------------------------------- -RangeTblRef * -CTranslatorDXLToQuery::PrtrefFromDXLLgGet - ( - const CDXLNode *pdxlnGet, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - // For each CDXLLogicalGet node: - // 1. Add an rtable entry to query->rtable - // 2. Create an rtable reference to the newly generated rtable entry - // 3. Return the rtref - - GPOS_ASSERT(NULL != pquery); - - // translate table descriptor into a range table entry - CDXLLogicalGet *pdxlopGet = CDXLLogicalGet::PdxlopConvert(pdxlnGet->Pdxlop()); - - // we will add the new range table entry as the last element of the range table - Index iRel = gpdb::UlListLength(pquery->rtable) + 1; - - RangeTblEntry *prte = PrteFromTblDescr(pdxlopGet->Pdxltabdesc(), iRel, pstatedxltoquery, pmapcidvarquery); - - GPOS_ASSERT(NULL != prte); - - pquery->rtable = gpdb::PlAppendElement(pquery->rtable, prte); - - RangeTblRef *prtref = MakeNode(RangeTblRef); - prtref->rtindex = iRel; - return prtref; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PnodeFromDXLLgJoinChild -// -// @doc: -// Translate a child of a CDXLogicalJoin node into a GPDB Node -// -//--------------------------------------------------------------------------- -Node * -CTranslatorDXLToQuery::PnodeFromDXLLgJoinChild - ( - const CDXLNode *pdxlnChild, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - Node *pnode = NULL; - - switch (pdxlnChild->Pdxlop()->Edxlop()) - { - case EdxlopLogicalGet: - pnode = (Node*) PrtrefFromDXLLgGet(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - break; - case EdxlopLogicalJoin: - pnode = (Node*) PjoinexprFromDXLLgJoin(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - break; - case EdxlopLogicalTVF: - pnode = (Node*) PrtrefFromDXLLgTVF(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - break; - default: - pnode = (Node*) PrtrefFromDXLLgOp(pdxlnChild, pquery, pstatedxltoquery, pmapcidvarquery); - break; - } - return pnode; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PrtrefFromDXLLgOp -// -// @doc: -// Translate a CDXL Logical Node into derived table -// -//--------------------------------------------------------------------------- -RangeTblRef * -CTranslatorDXLToQuery::PrtrefFromDXLLgOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(EdxloptypeLogical == pdxln->Pdxlop()->Edxloperatortype()); - - // initialize hash tables that maintains the mapping between ColId and TE and ColId and query level - TEMap *ptemapDerTbl = CTranslatorUtils::PtemapCopy(m_pmp, pmapcidvarquery->Ptemap()); - - CStateDXLToQuery statedxltoqueryDerived = CStateDXLToQuery(m_pmp); - - // translate the CDXLNode representing the derived table - Query *pqueryDerTbl = PqueryFromDXL - ( - pdxln, - NULL, // NULL stands for the fact that we do not care about the output columns of derived table (This is not true for subqueries) - &statedxltoqueryDerived, - ptemapDerTbl, - pmapcidvarquery->UlQueryLevel()+1 - ); - - CRefCount::SafeRelease(ptemapDerTbl); - - // create a rtable entry for the derived table - RangeTblEntry *prte = MakeNode(RangeTblEntry); - - prte->subquery = pqueryDerTbl; - prte->rtekind = RTE_SUBQUERY; - prte->inFromCl = false; - pquery->rtable = gpdb::PlAppendElement(pquery->rtable, prte); - - ULONG ulRTIndex = gpdb::UlListLength(pquery->rtable); - ULONG ulResno = 0; - // create alias - Alias *palias = MakeNode(Alias); - - - ULONG ulDerivedOutputColumnSize = statedxltoqueryDerived.UlLength(); - - // from each target list entry of the derived table - // 1. create a target list entry and map col->TE at query current level - // 2. insert the alias name in the joinaliasvars - - for(ULONG ul=0; ul<ulDerivedOutputColumnSize; ul++) - { - ulResno++; - TargetEntry *pte = statedxltoqueryDerived.PteColumn(ul); - CHAR *szColName = statedxltoqueryDerived.SzColumnName(ul); - ULONG ulColId = statedxltoqueryDerived.UlColId(ul); - - if (!pte->resjunk) - { - TargetEntry *pteCopy = MakeNode(TargetEntry); - Var *pvarNew = NULL; - - if (IsA(pte->expr, Var)) - { - prte->joinaliasvars = gpdb::PlAppendElement(prte->joinaliasvars, pte->expr); - Var *pvar = (Var*) pte->expr; - - pvarNew = gpdb::PvarMakeVar(ulRTIndex, (AttrNumber) ulResno, pvar->vartype, pvar->vartypmod, 0); - } - else - { - pvarNew = gpdb::PvarMakeVar(ulRTIndex, (AttrNumber) ulResno, gpdb::OidExprType( (Node*) pte->expr), -1, 0); - } - - pteCopy->resno = (AttrNumber) ulResno; - pteCopy->expr = (Expr*) pvarNew; - pteCopy->resname = PStrDup(szColName); - - pmapcidvarquery->FInsertMapping(ulColId, pteCopy); - palias->colnames = gpdb::PlAppendElement(palias->colnames, gpdb::PvalMakeString(szColName)); - pstatedxltoquery->AddOutputColumnEntry(pteCopy, pteCopy->resname, ulColId); - } - } - - prte->alias = palias; - prte->eref = palias; - - RangeTblRef *prtref = MakeNode(RangeTblRef); - prtref->rtindex = ulRTIndex; - - return prtref; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PjoinexprFromDXLLgJoin -// -// @doc: -// Translate a Logical Join Node into a GPDB JoinExpr -// -//--------------------------------------------------------------------------- -JoinExpr * -CTranslatorDXLToQuery::PjoinexprFromDXLLgJoin - ( - const CDXLNode *pdxlnJoin, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(NULL != pquery && NULL != pdxlnJoin); - const ULONG ulChildCount = pdxlnJoin->UlArity(); - GPOS_ASSERT(3 == ulChildCount); - - // create a joinexpr - JoinExpr *pjoinexpr = MakeNode(JoinExpr); - - // translate the left child - CDXLNode *pdxlnLeft = (*pdxlnJoin)[0]; - - CStateDXLToQuery statedxltoqueryLeft = CStateDXLToQuery(m_pmp); - pjoinexpr->larg = PnodeFromDXLLgJoinChild(pdxlnLeft, pquery, &statedxltoqueryLeft, pmapcidvarquery); - - // translate the right child - CDXLNode *pdxlnRight = (*pdxlnJoin)[1]; - - CStateDXLToQuery statedxltoqueryRight = CStateDXLToQuery(m_pmp); - pjoinexpr->rarg = PnodeFromDXLLgJoinChild(pdxlnRight, pquery, &statedxltoqueryRight, pmapcidvarquery); - - // set the join type - CDXLLogicalJoin *pdxlopJoin = CDXLLogicalJoin::PdxlopConvert(pdxlnJoin->Pdxlop()); - pjoinexpr->jointype = CTranslatorDXLToPlStmt::JtFromEdxljt(pdxlopJoin->Edxltype()); - - // translate scalar condition representing the joinqual - CDXLNode *pdxlnCond = (*pdxlnJoin)[ulChildCount-1]; - - Expr *pexpr = m_pdxlsctranslator->PexprFromDXLNodeScalar - ( - pdxlnCond, - pmapcidvarquery - ); - - // Add the new range table entry for the join to the range table - Index iRel = gpdb::UlListLength(pquery->rtable) + 1; - pjoinexpr->rtindex = iRel; - RangeTblEntry *prte = MakeNode(RangeTblEntry); - - prte->rtekind = RTE_JOIN; - prte->jointype = pjoinexpr->jointype; - prte->inFromCl = false; - - Alias *palias = MakeNode(Alias); - ULONG ulResno = 0; - const ULONG ulLeftOutputColumnSize = statedxltoqueryLeft.UlLength(); - // insert alias names from the left child to its parent - for(ULONG ul = 0; ul < ulLeftOutputColumnSize; ul++) - { - TargetEntry *pte = statedxltoqueryLeft.PteColumn(ul); - CHAR *szColName = statedxltoqueryLeft.SzColumnName(ul); - - ulResno++; - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(pte); - pteCopy->resno = (AttrNumber) ulResno; - - if(IsA(pteCopy->expr, Var)) - { - prte->joinaliasvars = gpdb::PlAppendElement(prte->joinaliasvars, pteCopy->expr); - } - - pstatedxltoquery->AddOutputColumnEntry(pteCopy, szColName, statedxltoqueryLeft.UlColId(ul)); - palias->colnames = gpdb::PlAppendElement(palias->colnames, gpdb::PvalMakeString(szColName)); - } - - const ULONG ulRightOutputColumnSize = statedxltoqueryRight.UlLength(); - - // insert alias names from the right child to its parent - for(ULONG ul = 0; ul < ulRightOutputColumnSize; ul++) - { - TargetEntry *pte = statedxltoqueryRight.PteColumn(ul); - CHAR *szColName = statedxltoqueryRight.SzColumnName(ul); - - ulResno++; - TargetEntry *pteCopy = (TargetEntry*) gpdb::PvCopyObject(pte); - pteCopy->resno = (AttrNumber) ulResno; - - if(IsA(pteCopy->expr, Var)) - { - prte->joinaliasvars = gpdb::PlAppendElement(prte->joinaliasvars, pteCopy->expr); - } - - pstatedxltoquery->AddOutputColumnEntry(pteCopy, szColName, statedxltoqueryRight.UlColId(ul)); - palias->colnames = gpdb::PlAppendElement(palias->colnames, gpdb::PvalMakeString(szColName)); - } - - prte->alias = palias; - prte->eref = palias; - - pjoinexpr->quals = (Node*) pexpr; - - pquery->rtable = gpdb::PlAppendElement(pquery->rtable, prte); - - return pjoinexpr; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::TranslateProjList -// -// @doc: -// Translates a DXL projection list -// -//--------------------------------------------------------------------------- -void -CTranslatorDXLToQuery::TranslateProjList - ( - const CDXLNode *pdxlnPrL, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery, - ULONG ulTargetEntryIndex - ) -{ - if (NULL != pdxlnPrL) - { - // translate each DXL project element into a target entry - const ULONG ulArity = pdxlnPrL->UlArity(); - for (ULONG ul = 0; ul < ulArity; ++ul) - { - CDXLNode *pdxlnPrEl = (*pdxlnPrL)[ul]; - CDXLScalarProjElem *pdxlopPrEl = CDXLScalarProjElem::PdxlopConvert(pdxlnPrEl->Pdxlop()); - - GPOS_ASSERT(1 == pdxlnPrEl->UlArity()); - // translate proj element expression - CDXLNode *pdxlnExpr = (*pdxlnPrEl)[0]; - - Expr *pexpr = m_pdxlsctranslator->PexprFromDXLNodeScalar(pdxlnExpr, pmapcidvarquery); - - GPOS_ASSERT(NULL != pexpr); - - TargetEntry *pte = MakeNode(TargetEntry); - pte->expr = pexpr; - pte->resname = CTranslatorUtils::SzFromWsz(pdxlopPrEl->PmdnameAlias()->Pstr()->Wsz()); - pte->resno = (AttrNumber) (ulTargetEntryIndex + ul + 1); - - pstatedxltoquery->AddOutputColumnEntry(pte, pte->resname, pdxlopPrEl->UlId()); - //save mapping col id -> Var in the query translation context - pmapcidvarquery->FInsertMapping(pdxlopPrEl->UlId(), pte); - } - } -} - -//--------------------------------------------------------------------------- -// @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; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToQuery::PrtrefFromDXLLgTVF -// -// @doc: -// Create a range table reference for a CDXLLogicalTVF node -// -//--------------------------------------------------------------------------- -RangeTblRef * -CTranslatorDXLToQuery::PrtrefFromDXLLgTVF - ( - const CDXLNode *pdxlnTVF, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ) -{ - GPOS_ASSERT(0 == pstatedxltoquery->UlLength()); - - Index iRel = gpdb::UlListLength(pquery->rtable) + 1; - - CDXLLogicalTVF *pdxlopTVF = CDXLLogicalTVF::PdxlopConvert(pdxlnTVF->Pdxlop()); - - RangeTblEntry *prte = MakeNode(RangeTblEntry); - prte->rtekind = RTE_FUNCTION; - - FuncExpr *pfuncexpr = MakeNode(FuncExpr); - - pfuncexpr->funcid = CMDIdGPDB::PmdidConvert(pdxlopTVF->PmdidFunc())->OidObjectId(); - pfuncexpr->funcretset = true; - // this is a function call, as opposed to a cast - pfuncexpr->funcformat = COERCE_EXPLICIT_CALL; - pfuncexpr->funcresulttype = CMDIdGPDB::PmdidConvert(pdxlopTVF->PmdidRetType())->OidObjectId(); - - Alias *palias = MakeNode(Alias); - palias->colnames = NIL; - - // get function alias - palias->aliasname = CTranslatorUtils::SzFromWsz(pdxlopTVF->Pmdname()->Pstr()->Wsz()); - - // get column names and types - const ULONG ulColumns = pdxlopTVF->UlArity(); - for (ULONG ul = 0; ul < ulColumns; ++ul) - { - const CDXLColDescr *pdxlcd = pdxlopTVF->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); - - prte->funccoltypes = gpdb::PlAppendOid(prte->funccoltypes, oidAttType); - prte->funccoltypmods = gpdb::PlAppendInt(prte->funccoltypmods, -1); - - 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()); - } - - // function arguments - const ULONG ulArity = pdxlnTVF->UlArity(); - for (ULONG ul = 0; ul < ulArity; ++ul) - { - CDXLNode *pdxlnFuncArg = (*pdxlnTVF)[ul]; - Expr *pexprFuncArg = m_pdxlsctranslator->PexprFromDXLNodeScalar(pdxlnFuncArg, pmapcidvarquery); - pfuncexpr->args = gpdb::PlAppendElement(pfuncexpr->args, pexprFuncArg); - } - - prte->funcexpr = (Node *)pfuncexpr; - prte->inFromCl = true; - prte->eref = palias; - - pquery->rtable = gpdb::PlAppendElement(pquery->rtable, prte); - - RangeTblRef *prtref = MakeNode(RangeTblRef); - prtref->rtindex = iRel; - return prtref; -} - -// EOF http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp index 7d0b0ce..33dc686 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp @@ -42,7 +42,6 @@ #include "gpopt/base/COptCtxt.h" #include "gpopt/translate/CTranslatorDXLToScalar.h" #include "gpopt/translate/CTranslatorDXLToPlStmt.h" -#include "gpopt/translate/CTranslatorDXLToQuery.h" #include "gpopt/translate/CTranslatorUtils.h" #include "gpopt/translate/CMappingColIdVarPlStmt.h" @@ -125,10 +124,6 @@ CTranslatorDXLToScalar::PexprFromDXLNodeScalar {EdxlopScalarCoerceToDomain, &CTranslatorDXLToScalar::PcoerceFromDXLNodeScCoerce}, {EdxlopScalarInitPlan, &CTranslatorDXLToScalar::PparamFromDXLNodeScInitPlan}, {EdxlopScalarSubPlan, &CTranslatorDXLToScalar::PsubplanFromDXLNodeScSubPlan}, - {EdxlopScalarSubquery, &CTranslatorDXLToScalar::PsublinkFromDXLNodeScalarSubquery}, - {EdxlopScalarSubqueryExists, &CTranslatorDXLToScalar::PsublinkFromDXLNodeSubqueryExists}, - {EdxlopScalarSubqueryAny, &CTranslatorDXLToScalar::PexprFromDXLNodeSubqueryAnyAll}, - {EdxlopScalarSubqueryAll, &CTranslatorDXLToScalar::PexprFromDXLNodeSubqueryAnyAll}, {EdxlopScalarArray, &CTranslatorDXLToScalar::PexprArray}, {EdxlopScalarArrayRef, &CTranslatorDXLToScalar::PexprArrayRef}, {EdxlopScalarDMLAction, &CTranslatorDXLToScalar::PexprDMLAction}, @@ -988,214 +983,6 @@ CTranslatorDXLToScalar::PparamFromMapping //--------------------------------------------------------------------------- // @function: -// CTranslatorDXLToScalar::PexprFromDXLNodeSubqueryAnyAll -// -// @doc: -// Translates a DXL scalar ANY/ALL subquery into a GPDB Expr -// -//--------------------------------------------------------------------------- -Expr * -CTranslatorDXLToScalar::PexprFromDXLNodeSubqueryAnyAll - ( - const CDXLNode *pdxlnSubqueryAnyAll, - CMappingColIdVar *pmapcidvar - ) -{ - GPOS_ASSERT(2 == pdxlnSubqueryAnyAll->UlArity()); - - // translate subquery into a sublink - return (Expr*) PsublinkFromDXLNodeQuantifiedSubquery(pdxlnSubqueryAnyAll, pmapcidvar); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToScalar::PsublinkFromDXLNodeSubqueryExists -// -// @doc: -// Translates a DXL scalar EXISTS subquery into a GPDB EXISTS sublink -// -//--------------------------------------------------------------------------- -Expr * -CTranslatorDXLToScalar::PsublinkFromDXLNodeSubqueryExists - ( - const CDXLNode *pdxlnSubqueryExists, - CMappingColIdVar *pmapcidvar - ) -{ - GPOS_ASSERT(1 == pdxlnSubqueryExists->UlArity()); - CDXLNode *pdxlnChild = (*pdxlnSubqueryExists)[0]; - - CTranslatorDXLToQuery trdxlquery(m_pmp, m_pmda, m_ulSegments); - CStateDXLToQuery *pstatedxltoquery = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - - // empty list of output columns - DrgPdxln *pdrgpdxlnOutputCols = GPOS_NEW(m_pmp) DrgPdxln(m_pmp); - CMappingColIdVarQuery *pmapcidvarquery = dynamic_cast<CMappingColIdVarQuery *>(pmapcidvar); - TEMap *ptemapCopy = CTranslatorUtils::PtemapCopy(m_pmp, pmapcidvarquery->Ptemap()); - - Query *pquery = trdxlquery.PqueryFromDXL - ( - pdxlnChild, - pdrgpdxlnOutputCols, - pstatedxltoquery, - ptemapCopy, - pmapcidvarquery->UlQueryLevel() + 1 - ); - - // clean up - pdrgpdxlnOutputCols->Release(); - GPOS_DELETE(pstatedxltoquery); - CRefCount::SafeRelease(ptemapCopy); - - SubLink *psublink = MakeNode(SubLink); - psublink->subLinkType = EXISTS_SUBLINK; - psublink->subselect = (Node*) pquery; - m_fHasSubqueries = true; - - return (Expr *)psublink; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToScalar::PsublinkFromDXLNodeQuantifiedSubquery -// -// @doc: -// Translates a DXL scalar ANY/ALL subquery into a GPDB ANY/ALL sublink -// -//--------------------------------------------------------------------------- -SubLink * -CTranslatorDXLToScalar::PsublinkFromDXLNodeQuantifiedSubquery - ( - const CDXLNode *pdxlnQuantifiedSubquery, - CMappingColIdVar *pmapcidvar - ) -{ - GPOS_ASSERT(2 == pdxlnQuantifiedSubquery->UlArity()); - GPOS_ASSERT((EdxlopScalarSubqueryAll == pdxlnQuantifiedSubquery->Pdxlop()->Edxlop()) - || (EdxlopScalarSubqueryAny == pdxlnQuantifiedSubquery->Pdxlop()->Edxlop())); - - ULONG ulColId = 0; - // create the test expression - OpExpr *popexpr = MakeNode(OpExpr);; - // create a subquery node - SubLink *psublink = MakeNode(SubLink); - - CDXLScalarSubqueryQuantified *pdxlopQuantified = - CDXLScalarSubqueryQuantified::PdxlopConvert(pdxlnQuantifiedSubquery->Pdxlop()); - ulColId = pdxlopQuantified->UlColId(); - popexpr->opno = CMDIdGPDB::PmdidConvert(pdxlopQuantified->PmdidScalarOp())->OidObjectId(); - - if (EdxlopScalarSubqueryAll == pdxlnQuantifiedSubquery->Pdxlop()->Edxlop()) - { - psublink->subLinkType = ALL_SUBLINK; - } - else - { - psublink->subLinkType = ANY_SUBLINK; - } - - popexpr->opresulttype = CMDIdGPDB::PmdidConvert(m_pmda->PtMDType<IMDTypeBool>()->Pmdid())->OidObjectId(); - popexpr->opretset = false; - psublink->testexpr = (Node*) popexpr; - - GPOS_ASSERT(0 < ulColId); - - CDXLNode *pdxlnOuter = (*pdxlnQuantifiedSubquery)[0]; - CDXLNode *pdxlnInner = (*pdxlnQuantifiedSubquery)[1]; - - CTranslatorDXLToQuery trdxlquery(m_pmp, m_pmda, m_ulSegments); - CMappingColIdVarQuery *pmapcidvarquery = dynamic_cast<CMappingColIdVarQuery *>(pmapcidvar); - - CStateDXLToQuery *pstatedxltoquery = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - - TEMap *ptemapCopy = CTranslatorUtils::PtemapCopy(m_pmp, pmapcidvarquery->Ptemap()); - - // translate inner side (with the output column referred to by the colid) - Query *pqueryInner = trdxlquery.PqueryFromDXLSubquery - ( - pdxlnInner, - ulColId, - pstatedxltoquery, - ptemapCopy, - pmapcidvarquery->UlQueryLevel() + 1 - ); - psublink->subselect = (Node*) pqueryInner; - - // translate the outer side - Expr *pexprOuter = PexprFromDXLNodeScalar(pdxlnOuter, pmapcidvar); - popexpr->args = gpdb::PlAppendElement(popexpr->args, pexprOuter); - - Param *pparam = MakeNode(Param); - pparam->paramkind = PARAM_SUBLINK; - pparam->paramid = 1; - - const CMappingElementColIdTE *pmappingelement = ptemapCopy->PtLookup(&ulColId); - if (NULL == pmappingelement) - { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtAttributeNotFound, ulColId); - } - TargetEntry *pte = const_cast<TargetEntry *>(pmappingelement->Pte()); - - pparam->paramtype = gpdb::OidExprType((Node*) pte->expr); - popexpr->args = gpdb::PlAppendElement(popexpr->args, pparam); - - m_fHasSubqueries = true; - - // clean up - ptemapCopy->Release(); - GPOS_DELETE(pstatedxltoquery); - - return psublink; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorDXLToScalar::PsublinkFromDXLNodeScalarSubquery -// -// @doc: -// Translates a DXL scalar subquery into a GPDB scalar expression sublink -// -//--------------------------------------------------------------------------- -Expr * -CTranslatorDXLToScalar::PsublinkFromDXLNodeScalarSubquery - ( - const CDXLNode *pdxlnSubquery, - CMappingColIdVar *pmapcidvar - ) -{ - GPOS_ASSERT(1 == pdxlnSubquery->UlArity()); - ULONG ulColId = CDXLScalarSubquery::PdxlopConvert(pdxlnSubquery->Pdxlop())->UlColId(); - CDXLNode *pdxlnChild = (*pdxlnSubquery)[0]; - - CTranslatorDXLToQuery trdxlquery(m_pmp, m_pmda, m_ulSegments); - CStateDXLToQuery *pstatedxltoquery = GPOS_NEW(m_pmp) CStateDXLToQuery(m_pmp); - - CMappingColIdVarQuery *pmapcidvarquery = dynamic_cast<CMappingColIdVarQuery *>(pmapcidvar); - TEMap *ptemapCopy = CTranslatorUtils::PtemapCopy(m_pmp, pmapcidvarquery->Ptemap()); - - Query *pquery = trdxlquery.PqueryFromDXLSubquery - ( - pdxlnChild, - ulColId, - pstatedxltoquery, - ptemapCopy, - pmapcidvarquery->UlQueryLevel() + 1 - ); - - // clean up - CRefCount::SafeRelease(ptemapCopy); - GPOS_DELETE(pstatedxltoquery); - - SubLink *psublink = MakeNode(SubLink); - psublink->subLinkType = EXPR_SUBLINK; - psublink->subselect = (Node*) pquery; - m_fHasSubqueries = true; - - return (Expr *)psublink; -} - -//--------------------------------------------------------------------------- -// @function: // CTranslatorDXLToScalar::PboolexprFromDXLNodeScBoolExpr // // @doc: http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/backend/gpopt/translate/Makefile ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/Makefile b/src/backend/gpopt/translate/Makefile index 276c895..0d76113 100644 --- a/src/backend/gpopt/translate/Makefile +++ b/src/backend/gpopt/translate/Makefile @@ -31,7 +31,6 @@ OBJS = CMappingColIdVar.o \ CTranslatorDXLToScalar.o \ CTranslatorUtils.o \ CTranslatorRelcacheToDXL.o \ - CTranslatorDXLToQuery.o \ CTranslatorQueryToDXL.o \ CTranslatorDXLToPlStmt.o http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/backend/gpopt/utils/COptTasks.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/utils/COptTasks.cpp b/src/backend/gpopt/utils/COptTasks.cpp index 4d6e2f7..faa2bdb 100644 --- a/src/backend/gpopt/utils/COptTasks.cpp +++ b/src/backend/gpopt/utils/COptTasks.cpp @@ -42,7 +42,6 @@ #include "gpopt/translate/CTranslatorUtils.h" #include "gpopt/translate/CTranslatorQueryToDXL.h" #include "gpopt/translate/CTranslatorDXLToPlStmt.h" -#include "gpopt/translate/CTranslatorDXLToQuery.h" #include "gpopt/translate/CContextDXLToPlStmt.h" #include "gpopt/translate/CTranslatorRelcacheToDXL.h" #include "gpopt/eval/CConstExprEvaluatorDXL.h" @@ -1311,65 +1310,6 @@ COptTasks::PvPlstmtFromDXLTask //--------------------------------------------------------------------------- // @function: -// COptTasks::PvQueryFromDXLTask -// -// @doc: -// task that does the translation from xml to dxl to pquery -// -//--------------------------------------------------------------------------- -void* -COptTasks::PvQueryFromDXLTask - ( - void *pv - ) -{ - GPOS_ASSERT(NULL != pv); - - SOptContext *poctx = SOptContext::PoptctxtConvert(pv); - - GPOS_ASSERT(NULL == poctx->m_pquery); - GPOS_ASSERT(NULL != poctx->m_szQueryDXL); - - AUTO_MEM_POOL(amp); - IMemoryPool *pmp = amp.Pmp(); - - CWStringDynamic str(pmp); - COstreamString oss(&str); - - // parse the DXL - CQueryToDXLResult *ptroutput = CDXLUtils::PdxlnParseDXLQuery(pmp, poctx->m_szQueryDXL, NULL); - - GPOS_ASSERT(NULL != ptroutput->Pdxln()); - - // relcache MD provider - CMDProviderRelcache *pmdpr = GPOS_NEW(pmp) CMDProviderRelcache(pmp); - - { - CAutoMDAccessor amda(pmp, pmdpr, sysidDefault); - - // initialize hash table that maintains the mapping between ColId and Var - TEMap *ptemap = GPOS_NEW(pmp) TEMap(pmp); - - CTranslatorDXLToQuery trdxlquery(pmp, amda.Pmda(), gpdb::UlSegmentCountGP()); - CStateDXLToQuery statedxltoquery(pmp); - - Query *pquery = trdxlquery.PqueryFromDXL(ptroutput->Pdxln(), ptroutput->PdrgpdxlnOutputCols(), &statedxltoquery, ptemap, GPDXL_QUERY_LEVEL); - - CRefCount::SafeRelease(ptemap); - GPOS_DELETE(ptroutput); - - GPOS_ASSERT(NULL != pquery); - GPOS_ASSERT(NULL != CurrentMemoryContext); - - poctx->m_pquery = pquery; - } - - return NULL; -} - - -//--------------------------------------------------------------------------- -// @function: // COptTasks::PvDXLFromMDObjsTask // // @doc: @@ -1714,33 +1654,6 @@ COptTasks::SzDXL //--------------------------------------------------------------------------- // @function: -// COptTasks::PqueryFromXML -// -// @doc: -// deserializes query from DXL -// -//--------------------------------------------------------------------------- -Query * -COptTasks::PqueryFromXML - ( - char *szDXL - ) -{ - Assert(NULL != szDXL); - - SOptContext octx; - octx.m_szQueryDXL = szDXL; - Execute(&PvQueryFromDXLTask, &octx); - - // clean up context - octx.Free(octx.epinQueryDXL, octx.epinQuery); - - return (Query *) octx.m_pquery; -} - - -//--------------------------------------------------------------------------- -// @function: // COptTasks::PplstmtFromXML // // @doc: http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/backend/gpopt/utils/funcs.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/utils/funcs.cpp b/src/backend/gpopt/utils/funcs.cpp index dbecb60..78f521b 100644 --- a/src/backend/gpopt/utils/funcs.cpp +++ b/src/backend/gpopt/utils/funcs.cpp @@ -79,8 +79,6 @@ PG_FUNCTION_INFO_V1(RestoreQueryFromFile); PG_FUNCTION_INFO_V1(DumpQueryDXL); PG_FUNCTION_INFO_V1(DumpQueryToDXLFile); PG_FUNCTION_INFO_V1(DumpQueryFromFileToDXLFile); -PG_FUNCTION_INFO_V1(RestoreQueryDXL); -PG_FUNCTION_INFO_V1(RestoreQueryFromDXLFile); PG_FUNCTION_INFO_V1(DisableXform); PG_FUNCTION_INFO_V1(EnableXform); PG_FUNCTION_INFO_V1(LibraryVersion); @@ -469,80 +467,6 @@ DumpQueryFromFileToDXLFile(PG_FUNCTION_ARGS) //--------------------------------------------------------------------------- // @function: -// RestoreQueryDXL -// -// @doc: -// Take an xml representation of a plan and execute it. Restores a query, -// along with meta-data from a bytea, executes it and returns number of rows. -// Input: bytea corresponding to serialized query -// Output: number of rows corresponding to execution of plan. -// -//--------------------------------------------------------------------------- - -extern "C" { -Datum -RestoreQueryDXL(PG_FUNCTION_ARGS) -{ - char *szXmlString = textToString(PG_GETARG_TEXT_P(0)); - - int iProcessed = executeXMLQuery(szXmlString); - - StringInfoData str; - initStringInfo(&str); - appendStringInfo(&str, "processed %d rows", iProcessed); - - text *ptResult = stringToText(str.data); - - PG_RETURN_TEXT_P(ptResult); -} -} - -//--------------------------------------------------------------------------- -// @function: -// RestoreQueryFromDXLFile -// -// @doc: -// Restores a query specified in DXL format in an XML file, executes it -// and returns number of rows. -// Input: bytea corresponding to XML file name -// Output: number of rows corresponding to execution of plan. -// -//--------------------------------------------------------------------------- - -extern "C" { -Datum -RestoreQueryFromDXLFile(PG_FUNCTION_ARGS) -{ - char *szFilename = textToString(PG_GETARG_TEXT_P(0)); - - CFileReader fr; - fr.Open(szFilename); - ULLONG ullSize = fr.UllSize(); - - char *pcBuf = (char*) gpdb::GPDBAlloc(ullSize + 1); - fr.UlpRead((BYTE*)pcBuf, ullSize); - pcBuf[ullSize] = '\0'; - - fr.Close(); - - int iProcessed = executeXMLQuery(pcBuf); - - elog(NOTICE, "Processed %d rows.", iProcessed); - gpdb::GPDBFree(pcBuf); - - StringInfoData str; - initStringInfo(&str); - - appendStringInfo(&str, "Query processed %d rows", iProcessed); - text *ptResult = stringToText(str.data); - - PG_RETURN_TEXT_P(ptResult); -} -} - - -//--------------------------------------------------------------------------- -// @function: // EvalExprFromDXLFile // // @doc: @@ -948,43 +872,6 @@ static int extractFrozenPlanAndExecute(char *pcSerializedPS) return iProcessed; } -//--------------------------------------------------------------------------- -// @function: -// executeXMLQuery -// -// @doc: -// -// -//--------------------------------------------------------------------------- - -static int executeXMLQuery(char *szXml) -{ - Query *pquery = COptTasks::PqueryFromXML(szXml); - - PlannedStmt *pplstmt = pg_plan_query(pquery, NULL, QRL_ONCE); - - DestReceiver *pdest = CreateDestReceiver(DestNone, NULL); - QueryDesc *pqueryDesc = CreateQueryDesc(pplstmt, PStrDup("Internal Query") /*plan->query */, - ActiveSnapshot, - InvalidSnapshot, - pdest, - NULL /*paramLI*/, - false); - - elog(NOTICE, "Executing thawed plan..."); - - ExecutorStart(pqueryDesc, 0); - - ExecutorRun(pqueryDesc, ForwardScanDirection, 0); - - ExecutorEnd(pqueryDesc); - - int iProcessed = (int) pqueryDesc->es_processed; - - FreeQueryDesc(pqueryDesc); - - return iProcessed; -} static int executeXMLPlan(char *szXml) { http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/include/gpopt/translate/CTranslatorDXLToQuery.h ---------------------------------------------------------------------- diff --git a/src/include/gpopt/translate/CTranslatorDXLToQuery.h b/src/include/gpopt/translate/CTranslatorDXLToQuery.h deleted file mode 100644 index f160364..0000000 --- a/src/include/gpopt/translate/CTranslatorDXLToQuery.h +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -//--------------------------------------------------------------------------- -// @filename: -// CTranslatorDXLToQuery.h -// -// @doc: -// Class providing methods for translating from DXL tree to GPDB's Query. -// -// @test: -// -// -//--------------------------------------------------------------------------- - -#ifndef GPDXL_CTranslatorDXLToQuery_H -#define GPDXL_CTranslatorDXLToQuery_H -#define GPDXL_QUERY_LEVEL 0 - -#include "gpopt/translate/CMappingColIdVarQuery.h" -#include "gpopt/translate/CDXLTranslateContext.h" -#include "gpopt/translate/CTranslatorDXLToScalar.h" -#include "gpopt/translate/CDXLTranslateContextBaseTable.h" -#include "gpopt/translate/CStateDXLToQuery.h" - -#include "gpos/base.h" - -#include "naucrates/dxl/CIdGenerator.h" -#include "naucrates/dxl/operators/dxlops.h" - -// fwd declarations -namespace gpopt -{ - class CMDAccessor; -} - -struct JoinExpr; -struct Node; -struct Query; -struct RangeTblEntry; -struct RangeTblRef; -struct TargetEntry; -struct SortClause; - -namespace gpdxl -{ - - using namespace gpopt; - - // gpdb type - typedef SortClause GroupClause; - - //--------------------------------------------------------------------------- - // @class: - // CTranslatorDXLToQuery - // - // @doc: - // Class providing methods for translating from DXL tree to GPDB's Query. - // - //--------------------------------------------------------------------------- - class CTranslatorDXLToQuery - { - // shorthand for functions for translating DXL nodes to GPDB expressions - typedef void (CTranslatorDXLToQuery::*PfPexpr)(const CDXLNode *pdxln, Query *pquery, CStateDXLToQuery *pstatedxltoquery, CMappingColIdVarQuery *pmapcidvarquery); - - private: - - // pair of DXL op id and translator function - struct STranslatorElem - { - Edxlopid eopid; - PfPexpr pf; - }; - - // memory pool - IMemoryPool *m_pmp; - - // meta data accessor - CMDAccessor *m_pmda; - - // counter for grouping and ordering columns - ULONG m_ulSortgrouprefCounter; - - CTranslatorDXLToScalar *m_pdxlsctranslator; - - // number of segments - ULONG m_ulSegments; - - // private copy ctor - CTranslatorDXLToQuery(const CTranslatorDXLToQuery&); - - void SetSubqueryOutput - ( - ULONG ulColId, // output column id - Query *pquery, // the newly generated GPDB query object - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - void SetQueryOutput - ( - const DrgPdxln *pdrgpdxlnQueryOutput, // list of output columns - Query *pquery, // the newly generated GPDB query object - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate DXL operator node into a Query node - void TranslateLogicalOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical TVF operator - void TranslateTVF - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical get operator - void TranslateGet - ( - const CDXLNode *pdxl, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical select operator - void TranslateSelect - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical group by operator - void TranslateGroupBy - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical group by columns - void TranslateGroupByColumns - ( - const CDXLLogicalGroupBy *pdxlnlggrpby, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - void TranslateProject - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical limit by operator - void TranslateLimit - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate a logical set operator - void TranslateSetOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // resjunk unused target list entry of the set op child - void MarkUnusedColumns - ( - Query *pquery, - RangeTblRef *prtref, - CStateDXLToQuery *pstatedxltoquery, - const DrgPul *pdrgpulColids - ); - - // translate a logical join operator - void TranslateJoin - ( - const CDXLNode *pdxl, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create range table entry from a table descriptor - RangeTblEntry *PrteFromTblDescr - ( - const CDXLTableDescr *, - Index, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create range table reference for a logical get - RangeTblRef *PrtrefFromDXLLgGet - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create range table reference for a logical TVF - RangeTblRef *PrtrefFromDXLLgTVF - ( - const CDXLNode *pdxlnFnGet, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create a range table reference for CDXLNode representing a derived table - RangeTblRef *PrtrefFromDXLLgOp - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create join expr for a logical join node - JoinExpr *PjoinexprFromDXLLgJoin - ( - const CDXLNode *pdxln, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // create a node from a child node of CDXLLogicalJoin - Node *PnodeFromDXLLgJoinChild - ( - const CDXLNode *pdxlnChild, - Query *pquery, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery - ); - - // translate the project list CDXLNode - void TranslateProjList - ( - const CDXLNode *pdxlnPrL, - CStateDXLToQuery *pstatedxltoquery, - CMappingColIdVarQuery *pmapcidvarquery, - ULONG ulTargetEntryIndex - ); - - - public: - // ctor - CTranslatorDXLToQuery(IMemoryPool *pmp, CMDAccessor *pmda, ULONG ulSegments); - - // dtor - ~CTranslatorDXLToQuery(); - - // main translation routine for DXL tree -> Query - Query *PqueryFromDXL - ( - const CDXLNode *pdxln, - const DrgPdxln *pdrgpdxlnQueryOutput, // array of dxl nodes representing the list of output columns - CStateDXLToQuery *pstatedxltoquery, - TEMap *ptemap, // hash map storing the mapping of ColId->TE - ULONG ulQueryLevel // the level of the query being translated - ); - - // main translation routine for DXL tree -> Query - Query *PqueryFromDXLSubquery - ( - const CDXLNode *pdxln, - ULONG ulColId, // output column id - CStateDXLToQuery *pstatedxltoquery, - TEMap *ptemap, // hash map storing the mapping of ColId->Var - ULONG ulQueryLevel // the level of the query being translated - ); - }; -} - -#endif // !GPDXL_CTranslatorDXLToQuery_H - -// EOF http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/include/gpopt/translate/CTranslatorDXLToScalar.h ---------------------------------------------------------------------- diff --git a/src/include/gpopt/translate/CTranslatorDXLToScalar.h b/src/include/gpopt/translate/CTranslatorDXLToScalar.h index 01a73d4..739e57c 100644 --- a/src/include/gpopt/translate/CTranslatorDXLToScalar.h +++ b/src/include/gpopt/translate/CTranslatorDXLToScalar.h @@ -263,31 +263,6 @@ namespace gpdxl const CMappingElementColIdParamId *pmecolidparamid ); - Expr *PsublinkFromDXLNodeScalarSubquery - ( - const CDXLNode *pdxlnSubquery, - CMappingColIdVar *pmapcidvar - ); - - SubLink *PsublinkFromDXLNodeQuantifiedSubquery - ( - const CDXLNode *pdxlnQuantifiedSubquery, - CMappingColIdVar *pmapcidvar - ); - - Expr *PsublinkFromDXLNodeSubqueryExists - ( - const CDXLNode *pdxlnSubqueryExists, - CMappingColIdVar *pmapcidvar - ); - - // translate a DXL scalar ANY/ALL subquery - Expr *PexprFromDXLNodeSubqueryAnyAll - ( - const CDXLNode *pdxlnSubqueryAnyAll, - CMappingColIdVar *pmapcidvar - ); - // translate a scalar coalesce Expr *PcoalesceFromDXLNodeScCoalesce ( http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/a6622b81/src/include/gpopt/utils/COptTasks.h ---------------------------------------------------------------------- diff --git a/src/include/gpopt/utils/COptTasks.h b/src/include/gpopt/utils/COptTasks.h index a62155f..8916814 100644 --- a/src/include/gpopt/utils/COptTasks.h +++ b/src/include/gpopt/utils/COptTasks.h @@ -187,10 +187,6 @@ class COptTasks static void* PvDXLFromQueryTask(void *pv); - // task that does the translation from xml to dxl to pquery - static - void* PvQueryFromDXLTask(void *pv); - // dump relcache info for an object into DXL static void* PvDXLFromMDObjsTask(void *pv); @@ -281,10 +277,6 @@ class COptTasks static char *SzDXL(Query *pquery); - // convert xml string to DXL and to Query - static - Query *PqueryFromXML(char *szXmlString); - // convert xml string to DXL and to PS static PlannedStmt *PplstmtFromXML(char *szXmlString);