HAWQ-764. Remove CTranslatorPlStmtToDXL Deadcode [#119102697]
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/752a98cd Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/752a98cd Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/752a98cd Branch: refs/heads/HAWQ-543 Commit: 752a98cdab62d40d46c66b0cb1abe1dcfb7860d7 Parents: 817249a Author: Venkatesh (Venky) Raghavan <vragha...@pivotal.io> Authored: Wed Jun 22 10:56:49 2016 -0700 Committer: Venkatesh (Venky) Raghavan <vragha...@pivotal.io> Committed: Wed Jun 22 10:56:49 2016 -0700 ---------------------------------------------------------------------- .../gpopt/translate/CTranslatorPlStmtToDXL.cpp | 2541 ------------------ .../gpopt/translate/CTranslatorQueryToDXL.cpp | 1 - .../gpopt/translate/CTranslatorScalarToDXL.cpp | 178 -- src/backend/gpopt/translate/Makefile | 3 +- src/backend/gpopt/utils/COptTasks.cpp | 87 - src/backend/gpopt/utils/funcs.cpp | 66 - src/backend/gpopt/utils/load.sql | 6 - .../gpopt/translate/CTranslatorPlStmtToDXL.h | 270 -- src/include/gpopt/utils/COptTasks.h | 8 - 9 files changed, 1 insertion(+), 3159 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/752a98cd/src/backend/gpopt/translate/CTranslatorPlStmtToDXL.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorPlStmtToDXL.cpp b/src/backend/gpopt/translate/CTranslatorPlStmtToDXL.cpp deleted file mode 100644 index 7657d4d..0000000 --- a/src/backend/gpopt/translate/CTranslatorPlStmtToDXL.cpp +++ /dev/null @@ -1,2541 +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: -// CTranslatorPlStmtToDXL.cpp -// -// @doc: -// Implementation of the methods for translating GPDB's PlannedStmt into DXL Tree. -// All translator methods allocate memory in the provided memory pool, and -// the caller is responsible for freeing it -// -// @test: -// -// -//--------------------------------------------------------------------------- - -#include "postgres.h" - -#include "nodes/plannodes.h" -#include "nodes/parsenodes.h" -#include "access/sysattr.h" -#include "optimizer/walkers.h" - -#include "gpos/base.h" -#include "gpos/string/CWStringDynamic.h" - -#include "gpopt/mdcache/CMDAccessor.h" -#include "gpopt/translate/CTranslatorPlStmtToDXL.h" -#include "gpopt/translate/CTranslatorUtils.h" -#include "gpopt/translate/CMappingVarColId.h" - -#include "naucrates/dxl/CDXLUtils.h" -#include "naucrates/dxl/xml/dxltokens.h" -#include "naucrates/dxl/operators/CDXLNode.h" -#include "naucrates/dxl/gpdb_types.h" - -#include "naucrates/md/IMDScalarOp.h" -#include "naucrates/md/IMDRelation.h" -#include "naucrates/md/IMDIndex.h" - -#include "gpopt/gpdbwrappers.h" - -using namespace gpdxl; -using namespace gpos; -using namespace gpopt; - -#define DEFAULT_QUERY_LEVEL 0 - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::CTranslatorPlStmtToDXL -// -// @doc: -// Constructor -// -//--------------------------------------------------------------------------- -CTranslatorPlStmtToDXL::CTranslatorPlStmtToDXL - ( - IMemoryPool *pmp, - CMDAccessor *pmda, - CIdGenerator *pulIdGenerator, - PlannedStmt *pplstmt, - CMappingParamIdScalarId *pmapps - ) - : - m_pmp(pmp), - m_pmda(pmda), - m_pidgtor(pulIdGenerator), - m_pplstmt(pplstmt), - m_pparammapping(pmapps) -{ - GPOS_ASSERT(NULL != m_pplstmt); - m_psctranslator = GPOS_NEW(m_pmp) - CTranslatorScalarToDXL - ( - m_pmp, - m_pmda, - pulIdGenerator, - NULL, // cte id generator - 0, // m_ulQueryLevel - false, // m_fQuery - m_pplstmt, - m_pparammapping, - NULL, // CTE Mapping - NULL // pdrgpdxlnCTE - ); - m_phmuldxlnSharedScanProjLists = GPOS_NEW(m_pmp) HMUlPdxln(m_pmp); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::~CTranslatorPlStmtToDXL -// -// @doc: -// Destructor -// -//--------------------------------------------------------------------------- -CTranslatorPlStmtToDXL::~CTranslatorPlStmtToDXL() -{ - m_phmuldxlnSharedScanProjLists->Release(); - GPOS_DELETE(m_psctranslator); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnFromPlstmt -// -// @doc: -// Translates a PlannedStmt into a DXL tree. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnFromPlstmt - () -{ - if (CMD_SELECT != m_pplstmt->commandType) - { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("DML operations") - ); - } - - if (NULL != m_pplstmt->intoClause) - { - GPOS_RAISE - ( - gpdxl::ExmaDXL, - gpdxl::ExmiPlStmt2DXLConversion, - GPOS_WSZ_LIT("Select into") - ); - } - - return PdxlnFromPlan(m_pplstmt->planTree); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnFromPlan -// -// @doc: -// Translates a Plan operator tree into a DXL tree. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - - STranslatorElem rgTranslators[] = - { - {T_Scan, &CTranslatorPlStmtToDXL::PdxlnTblScanFromPlan}, - {T_IndexScan, &CTranslatorPlStmtToDXL::PdxlnIndexScanFromPlan}, - // {T_IndexOnlyScan, &CTranslatorPlStmtToDXL::PdxlnIndexOnlyScanFromPlan}, - {T_SeqScan, &CTranslatorPlStmtToDXL::PdxlnTblScanFromPlan}, - {T_HashJoin, &CTranslatorPlStmtToDXL::PdxlnHashjoinFromPlan}, - {T_Hash, &CTranslatorPlStmtToDXL::PdxlnHashFromPlan}, - {T_NestLoop, &CTranslatorPlStmtToDXL::PdxlnNLJoinFromPlan}, - {T_MergeJoin, &CTranslatorPlStmtToDXL::PdxlnMergeJoinFromPlan}, - {T_Motion, &CTranslatorPlStmtToDXL::PdxlnMotionFromPlan}, - {T_Limit, &CTranslatorPlStmtToDXL::PdxlnLimitFromPlan}, - {T_Agg, &CTranslatorPlStmtToDXL::PdxlnAggFromPlan}, - {T_Window, &CTranslatorPlStmtToDXL::PdxlnWindowFromPlan}, - {T_Unique, &CTranslatorPlStmtToDXL::PdxlnUniqueFromPlan}, - {T_Sort, &CTranslatorPlStmtToDXL::PdxlnSortFromPlan}, - {T_SubqueryScan, &CTranslatorPlStmtToDXL::PdxlnSubqueryScanFromPlan}, - {T_Append, &CTranslatorPlStmtToDXL::PdxlnAppendFromPlan}, - {T_Result, &CTranslatorPlStmtToDXL::PdxlnResultFromPlan}, - {T_Material, &CTranslatorPlStmtToDXL::PdxlnMaterializeFromPlan}, - {T_ShareInputScan, &CTranslatorPlStmtToDXL::PdxlnSharedScanFromPlan}, - {T_Sequence, &CTranslatorPlStmtToDXL::PdxlnSequence}, - {T_DynamicTableScan, &CTranslatorPlStmtToDXL::PdxlnDynamicTableScan}, - {T_FunctionScan, &CTranslatorPlStmtToDXL::PdxlnFunctionScanFromPlan}, - }; - - const ULONG ulTranslators = GPOS_ARRAY_SIZE(rgTranslators); - - NodeTag ent = pplan->type; - - // find translator for the expression type - PfPdxln pf = NULL; - for (ULONG ul = 0; ul < ulTranslators; ul++) - { - STranslatorElem elem = rgTranslators[ul]; - if (ent == elem.ent) - { - pf = elem.pf; - break; - } - } - - if (NULL == pf) - { - CHAR *sz = (CHAR*) gpdb::SzNodeToString(const_cast<Plan*>(pplan)); - CWStringDynamic *pstr = CDXLUtils::PstrFromSz(m_pmp, sz); - - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiPlStmt2DXLConversion, pstr->Wsz()); - } - - return (this->*pf)(pplan); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnHashFromPlan -// -// @doc: -// Create a DXL hash node from a GPDB hash plan node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnHashFromPlan - ( - const Plan *pplan - ) -{ - return PdxlnFromPlan(pplan->lefttree); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnHashjoinFromPlan -// -// @doc: -// Create a DXL hash join node from a GPDB hash join plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnHashjoinFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, HashJoin)); - const HashJoin *phj = (HashJoin *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - EdxlJoinType edxljt = CTranslatorUtils::EdxljtFromJoinType((phj->join).jointype); - - // construct hash join operator - CDXLPhysicalHashJoin *pdxlopHj = GPOS_NEW(m_pmp) CDXLPhysicalHashJoin(m_pmp, edxljt); - - // construct hash join operator node - CDXLNode *pdxlnHJ = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopHj); - pdxlnHJ->SetProperties(pdxlprop); - - // translate left and right child - Plan *pplanLeft = outerPlan(phj); - Plan *pplanRight = innerPlan(phj); - - GPOS_ASSERT(NULL != pplanLeft); - GPOS_ASSERT(NULL != pplanRight); - - CDXLNode *pdxlnLeft = PdxlnFromPlan(pplanLeft); - CDXLNode *pdxlnRight = PdxlnFromPlan(pplanRight); - - GPOS_ASSERT(1 <= pdxlnLeft->UlArity()); - GPOS_ASSERT(1 <= pdxlnRight->UlArity()); - - // get left and right projection lists - CDXLNode *pdxlnPrLLeft = (*pdxlnLeft)[0]; - CDXLNode *pdxlnPrLRight = (*pdxlnRight)[0]; - - GPOS_ASSERT(pdxlnPrLLeft->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - GPOS_ASSERT(pdxlnPrLRight->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // translate hash condition - CDXLNode *pdxlnHashCondList = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarHashCondList(m_pmp)); - - List *plHashClauses = NIL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotHashjoin); - - // if all hash conditions are equality tests, hashclauses contain them; - // if there are is not distinct from (INDF) tests, the conditions are in hashqualclauses - if (NIL != phj->hashqualclauses) - { - // there are INDF conditions - plHashClauses = phj->hashqualclauses; - } - else - { - // all clauses are equality checks - plHashClauses = phj->hashclauses; - } - - const ULONG ulLen = gpdb::UlListLength(plHashClauses); - for (ULONG ul = 0; ul < ulLen; ul++) - { - Expr *pexpr = (Expr *) gpdb::PvListNth(plHashClauses, ul); - - CMappingVarColId mapvarcolid(m_pmp); - - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - - CDXLNode *pdxlnHashCond = m_psctranslator->PdxlnScOpFromExpr - ( - pexpr, - &mapvarcolid - ); - - pdxlnHashCondList->AddChild(pdxlnHashCond); - } - - // translate target list and additional join condition - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - TranslateTListAndQual( - (phj->join).plan.targetlist, - (phj->join).plan.qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLLeft, - pdxlnPrLRight, - &pdxlnPrL, - &pdxlnFilter - ); - - - GPOS_ASSERT(NULL != pdxlnPrL); - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - - CDXLNode *pdxlnJoinFilter = m_psctranslator->PdxlnFilterFromQual - ( - (phj->join).joinqual, - &mapvarcolid, - EdxlopScalarJoinFilter - ); - - // add children in the right order - pdxlnHJ->AddChild(pdxlnPrL); // proj list - pdxlnHJ->AddChild(pdxlnFilter); // filter - pdxlnHJ->AddChild(pdxlnJoinFilter); // additional join filter - pdxlnHJ->AddChild(pdxlnHashCondList); // hash join condition - pdxlnHJ->AddChild(pdxlnLeft); // left child - pdxlnHJ->AddChild(pdxlnRight); // right child - - return pdxlnHJ; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnNLJoinFromPlan -// -// @doc: -// Create a DXL nested loop join node from a GPDB NestLoop plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnNLJoinFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, NestLoop)); - const NestLoop *pnlj = (NestLoop *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - EdxlJoinType edxljt = CTranslatorUtils::EdxljtFromJoinType((pnlj->join).jointype); - - BOOL fIndexNLJ = IsA(pplan->righttree, IndexScan); - - // construct nested loop join operator - CDXLPhysicalNLJoin *pdxlnlj = GPOS_NEW(m_pmp) CDXLPhysicalNLJoin(m_pmp, edxljt, fIndexNLJ); - - // construct nested loop join operator node - CDXLNode *pdxlnNLJ = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlnlj); - pdxlnNLJ->SetProperties(pdxlprop); - - // translate left and right child - Plan *pplanLeft = outerPlan(pnlj); - Plan *pplanRight = innerPlan(pnlj); - - GPOS_ASSERT(NULL != pplanLeft); - GPOS_ASSERT(NULL != pplanRight); - - CDXLNode *pdxlnLeft = PdxlnFromPlan(pplanLeft); - CDXLNode *pdxlnRight = PdxlnFromPlan(pplanRight); - - GPOS_ASSERT(1 <= pdxlnLeft->UlArity()); - GPOS_ASSERT(1 <= pdxlnRight->UlArity()); - - // get left and right projection lists - CDXLNode *pdxlnPrLLeft = (*pdxlnLeft)[0]; - CDXLNode *pdxlnPrLRight = (*pdxlnRight)[0]; - - GPOS_ASSERT(pdxlnPrLLeft->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - GPOS_ASSERT(pdxlnPrLRight->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // translate target list and join filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotNLJoin); - - TranslateTListAndQual( - (pnlj->join).plan.targetlist, - (pnlj->join).plan.qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLLeft, - pdxlnPrLRight, - &pdxlnPrL, - &pdxlnFilter - ); - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - - CDXLNode *pdxlnJoinFilter = m_psctranslator->PdxlnFilterFromQual((pnlj->join).joinqual, &mapvarcolid, EdxlopScalarJoinFilter); - - // add children in the right order - pdxlnNLJ->AddChild(pdxlnPrL); // proj list - pdxlnNLJ->AddChild(pdxlnFilter); // plan filter - pdxlnNLJ->AddChild(pdxlnJoinFilter); // additional join filter - pdxlnNLJ->AddChild(pdxlnLeft); // left child - pdxlnNLJ->AddChild(pdxlnRight); // right child - - return pdxlnNLJ; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnMergeJoinFromPlan -// -// @doc: -// Create a DXL merge join node from a GPDB merge join plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnMergeJoinFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, MergeJoin)); - const MergeJoin *pmj = (MergeJoin *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - EdxlJoinType edxljt = CTranslatorUtils::EdxljtFromJoinType((pmj->join).jointype); - - // construct hash join operator - CDXLPhysicalMergeJoin *pdxlopMj = GPOS_NEW(m_pmp) CDXLPhysicalMergeJoin(m_pmp, edxljt, pmj->unique_outer); - - // construct merge join operator node - CDXLNode *pdxlnMJ = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopMj); - pdxlnMJ->SetProperties(pdxlprop); - - // translate left and right child - Plan *pplanLeft = outerPlan(pmj); - Plan *pplanRight = innerPlan(pmj); - - GPOS_ASSERT(NULL != pplanLeft); - GPOS_ASSERT(NULL != pplanRight); - - CDXLNode *pdxlnLeft = PdxlnFromPlan(pplanLeft); - CDXLNode *pdxlnRight = PdxlnFromPlan(pplanRight); - - GPOS_ASSERT(1 <= pdxlnLeft->UlArity()); - GPOS_ASSERT(1 <= pdxlnRight->UlArity()); - - // get left and right projection lists - CDXLNode *pdxlnPrLLeft = (*pdxlnLeft)[0]; - CDXLNode *pdxlnPrLRight = (*pdxlnRight)[0]; - - GPOS_ASSERT(pdxlnPrLLeft->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - GPOS_ASSERT(pdxlnPrLRight->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // translate hash condition - CDXLNode *pdxlnMergeCondList = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarMergeCondList(m_pmp)); - - m_psctranslator->SetCallingPhysicalOpType(EpspotMergeJoin); - - List *plMergeClauses = pmj->mergeclauses; - - const ULONG ulLength = (ULONG) gpdb::UlListLength(plMergeClauses); - for (ULONG ul = 0; ul < ulLength; ul++) - { - Expr *pexpr = (Expr *) gpdb::PvListNth(plMergeClauses, ul); - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - - CDXLNode *pdxlnMergeCond = m_psctranslator->PdxlnScOpFromExpr - ( - pexpr, - &mapvarcolid - ); - - pdxlnMergeCondList->AddChild(pdxlnMergeCond); - } - - // translate target list and additional join condition - CDXLNode *pdxlnPrL = NULL; - - CDXLNode *pdxlnFilter = NULL; - - TranslateTListAndQual( - (pmj->join).plan.targetlist, - (pmj->join).plan.qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLLeft, - pdxlnPrLRight, - &pdxlnPrL, - &pdxlnFilter - ); - - - GPOS_ASSERT(NULL != pdxlnPrL); - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - - CDXLNode *pdxlnJoinFilter = m_psctranslator->PdxlnFilterFromQual - ( - (pmj->join).joinqual, - &mapvarcolid, - EdxlopScalarJoinFilter - ); - - // add children in the right order - pdxlnMJ->AddChild(pdxlnPrL); // proj list - pdxlnMJ->AddChild(pdxlnFilter); // filter - pdxlnMJ->AddChild(pdxlnJoinFilter); // additional join filter - pdxlnMJ->AddChild(pdxlnMergeCondList); // merge join condition - pdxlnMJ->AddChild(pdxlnLeft); // left child - pdxlnMJ->AddChild(pdxlnRight); // right child - - return pdxlnMJ; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnResultFromPlan -// -// @doc: -// Create a DXL result node from a GPDB result node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnResultFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Result)); - const Result *pnresult = (Result *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // construct result operator - CDXLPhysicalResult *pdxlopResult = GPOS_NEW(m_pmp) CDXLPhysicalResult(m_pmp); - - GPOS_ASSERT(innerPlan(pnresult) == NULL && "Result node cannot have right child"); - - // translate child if there is one - Plan *pplanChild = outerPlan(pnresult); - CDXLNode *pdxlnChild = NULL; - CDXLNode *pdxlnPrLChild = NULL; - - if (NULL != pplanChild) - { - pdxlnChild = PdxlnFromPlan(pplanChild); - GPOS_ASSERT(1 <= pdxlnChild->UlArity()); - - // get child's projection lists - pdxlnPrLChild = (*pdxlnChild)[0]; - GPOS_ASSERT(pdxlnPrLChild->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - } - - // translate target list and filters - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - // assert that resconstantqual is actually a list - GPOS_ASSERT_IMP(NULL != pnresult->resconstantqual, nodeTag(pnresult->resconstantqual) == T_List); - - m_psctranslator->SetCallingPhysicalOpType(EpspotResult); - - TranslateTListAndQual - ( - (pnresult->plan).targetlist, - (pnresult->plan).qual, - 0, //ulRTEIndex - NULL, - NULL, //pmdindex - pdxlnPrLChild, - NULL, - &pdxlnPrL, - &pdxlnFilter - ); - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrL); - - CDXLNode *pdxlnOneTimeFilter = m_psctranslator->PdxlnFilterFromQual - ( - (List *) (pnresult->resconstantqual), - &mapvarcolid, - EdxlopScalarOneTimeFilter - ); - - // construct motion operator node - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopResult); - pdxln->SetProperties(pdxlprop); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // plan filter - pdxln->AddChild(pdxlnOneTimeFilter); // one time filter - - if (NULL != pdxlnChild) - { - pdxln->AddChild(pdxlnChild); - } - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnMotionFromPlan -// -// @doc: -// Create a DXL motion node from a GPDB Motion plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnMotionFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Motion)); - const Motion *pmotion = (Motion *) pplan; - - CDXLPhysicalMotion *pdxlopMotion = NULL; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // construct DXL motion operator - GPOS_ASSERT(MOTIONTYPE_FIXED == pmotion->motionType || - MOTIONTYPE_HASH == pmotion->motionType); - - if (MOTIONTYPE_FIXED == pmotion->motionType) - { - if (0 == pmotion->numOutputSegs) - { - pdxlopMotion = GPOS_NEW(m_pmp) CDXLPhysicalBroadcastMotion(m_pmp); - } - else - { - pdxlopMotion = GPOS_NEW(m_pmp) CDXLPhysicalGatherMotion(m_pmp); - } - } - else - { - pdxlopMotion = GPOS_NEW(m_pmp) CDXLPhysicalRedistributeMotion(m_pmp, false /*fDuplicateSensitive*/); - } - - DrgPi *pdrgpiInputSegIds = GPOS_NEW(m_pmp) DrgPi(m_pmp); - DrgPi *pdrgpiOutputSegIds = GPOS_NEW(m_pmp) DrgPi(m_pmp); - - TranslateMotionSegmentInfo(pmotion, pdrgpiInputSegIds, pdrgpiOutputSegIds); - - pdxlopMotion->SetInputSegIds(pdrgpiInputSegIds); - pdxlopMotion->SetOutputSegIds(pdrgpiOutputSegIds); - - // construct motion operator node - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopMotion); - pdxln->SetProperties(pdxlprop); - - // translate child of motion node - Plan *pplanChild = (pmotion->plan).lefttree; - - GPOS_ASSERT(NULL != pplanChild); - - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - - GPOS_ASSERT(1 <= pdxlnChild->UlArity()); - - // get child projection lists - CDXLNode *pdxlnPrLChild = (*pdxlnChild)[0]; - - GPOS_ASSERT(pdxlnPrLChild->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotMotion); - - TranslateTListAndQual( - (pmotion->plan).targetlist, - (pmotion->plan).qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLChild, - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // construct sorting column info - CDXLNode *pdxlnSortColList = PdxlnSortingColListFromPlan(pmotion->sortColIdx, pmotion->sortOperators, pmotion->numSortCols, pdxlnPrL); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnSortColList); // sorting column list - - if (pdxlopMotion->Edxlop() == EdxlopPhysicalMotionRedistribute) - { - // redistribute is a motion: translate hash expr list - CDXLNode *pdxlnHashExprList = PdxlnHashExprLFromList - ( - pmotion->hashExpr, - pmotion->hashDataTypes, - pdxlnPrLChild - ); - - pdxln->AddChild(pdxlnHashExprList); - } - - pdxln->AddChild(pdxlnChild); // child - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnAggFromPlan -// -// @doc: -// Create a DXL aggregate node from a GPDB Agg plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnAggFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Agg)); - const Agg *pagg = (Agg *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // construct DXL aggregate operator - EdxlAggStrategy edxlaggstr = EdxlaggstrategySentinel; - switch (pagg->aggstrategy) - { - case AGG_PLAIN: - edxlaggstr = EdxlaggstrategyPlain; - break; - case AGG_SORTED: - edxlaggstr = EdxlaggstrategySorted; - break; - case AGG_HASHED: - edxlaggstr = EdxlaggstrategyHashed; - break; - default: - GPOS_ASSERT(!"Invalid aggregation strategy"); - } - - BOOL fStreamSafe = pagg->streaming; - CDXLPhysicalAgg *pdxlopAgg = GPOS_NEW(m_pmp) CDXLPhysicalAgg(m_pmp, edxlaggstr, fStreamSafe); - - // translate child of aggregate operator - Plan *pplanChild = (pagg->plan).lefttree; - GPOS_ASSERT(NULL != pplanChild); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - -#ifdef GPOS_DEBUG - pdxlnChild->Pdxlop()->AssertValid(pdxlnChild, false /* fValidateChildren */); -#endif - - // get child projection lists - CDXLNode *pdxlnPrLChild = (*pdxlnChild)[0]; - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotAgg); - - TranslateTListAndQual( - (pagg->plan).targetlist, - (pagg->plan).qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLChild, - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // translate grouping column list - GPOS_ASSERT( (0 == pagg->numCols && NULL == pagg->grpColIdx) || - (0 < pagg->numCols && NULL != pagg->grpColIdx)); - - // translate output segment cols - DrgPul *pdrgpulGroupingCols = GPOS_NEW(m_pmp) DrgPul(m_pmp); - - for(ULONG ul = 0; ul < (ULONG) pagg->numCols; ul++) - { - ULONG ulColIdx = pagg->grpColIdx[ul]; - - // find grouping column in the project list of the child node - CDXLNode *pdxlnGroupingCol = (*pdxlnPrLChild)[ulColIdx-1]; - CDXLScalarProjElem *pdxlopPrEl = (CDXLScalarProjElem *) pdxlnGroupingCol->Pdxlop(); - - ULONG *pulGroupingColId = GPOS_NEW(m_pmp) ULONG(pdxlopPrEl->UlId()); - pdrgpulGroupingCols->Append(pulGroupingColId); - } - - pdxlopAgg->SetGroupingCols(pdrgpulGroupingCols); - - // construct aggregate operator node - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopAgg); - pdxln->SetProperties(pdxlprop); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnChild); // child - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnWindowFromPlan -// -// @doc: -// Create a DXL window node from a GPDB window plan node. -// The function allocates memory in the translator memory pool, -// and the caller is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnWindowFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Window)); - const Window *pwindow = (Window *) pplan; - - // translate child of window operator - Plan *pplanChild = (pwindow->plan).lefttree; - GPOS_ASSERT(NULL != pplanChild); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - -#ifdef GPOS_DEBUG - pdxlnChild->Pdxlop()->AssertValid(pdxlnChild, false /* fValidateChildren */); -#endif - - // get child projection lists - CDXLNode *pdxlnPrLChild = (*pdxlnChild)[0]; - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotWindow); - - TranslateTListAndQual - ( - (pwindow->plan).targetlist, - (pwindow->plan).qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLChild, - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - const ULONG ulSize = (ULONG) pwindow->numPartCols; - // translate partition columns - DrgPul *pdrgpulPartCols = GPOS_NEW(m_pmp) DrgPul(m_pmp); - for(ULONG ul = 0; ul < ulSize; ul++) - { - ULONG ulColIdx = (ULONG) pwindow->partColIdx[ul]; - - // find partition column in the project list of the child node - CDXLNode *pdxlnPartCol = (*pdxlnPrLChild)[ulColIdx-1]; - CDXLScalarProjElem *pdxlopPrEl = (CDXLScalarProjElem *) pdxlnPartCol->Pdxlop(); - - ULONG *pulPartColId = GPOS_NEW(m_pmp) ULONG(pdxlopPrEl->UlId()); - pdrgpulPartCols->Append(pulPartColId); - } - - // add the window keys - DrgPdxlwk *pdrgpdxlwk = GPOS_NEW(m_pmp) DrgPdxlwk(m_pmp); - ListCell *plcWindowKey = NULL; - ForEach (plcWindowKey, pwindow->windowKeys) - { - WindowKey *pwindowkey = (WindowKey *) lfirst(plcWindowKey); - CDXLWindowKey *pdxlWindowKey = GPOS_NEW(m_pmp) CDXLWindowKey(m_pmp); - - CDXLNode *pdxlnSortColList = PdxlnSortingColListFromPlan - ( - pwindowkey->sortColIdx, - pwindowkey->sortOperators, - pwindowkey->numSortCols, - pdxlnPrLChild - ); - - pdxlWindowKey->SetSortColList(pdxlnSortColList); - - if (NULL != pwindowkey->frame) - { - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLChild); - - CDXLWindowFrame *pdxlwf = m_psctranslator->Pdxlwf - ( - (Expr *) pwindowkey->frame, - &mapvarcolid, - NULL - ); - pdxlWindowKey->SetWindowFrame(pdxlwf); - } - pdrgpdxlwk->Append(pdxlWindowKey); - } - - // construct window operator node - CDXLPhysicalWindow *pdxlopWindow = GPOS_NEW(m_pmp) CDXLPhysicalWindow(m_pmp, pdrgpulPartCols, pdrgpdxlwk); - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopWindow); - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - GPOS_ASSERT(NULL != pdxlprop); - pdxln->SetProperties(pdxlprop); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnChild); // child - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CPlStmtTranslator::PdxlnAggFromPlan -// -// @doc: -// Create a DXL Aggregate node from a GPDB Unique plan node. -// We do not support a separate Unique node in DXL. Instead, we convert the -// Unique operator into an Aggregate node, which groups on the unique columns. -// -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnUniqueFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Unique)); - const Unique *punique = (Unique *) pplan; - - Agg *pagg = MakeNode(Agg); - Plan *pplanAgg = &(pagg->plan); - const Plan *pplanUnique = &(punique->plan); - - // copy basic plan properties - pplanAgg->plan_node_id = pplanUnique->plan_node_id; - pplanAgg->plan_parent_node_id = pplanUnique->plan_parent_node_id; - - pplanAgg->startup_cost = pplanUnique->startup_cost; - pplanAgg->total_cost = pplanUnique->total_cost; - pplanAgg->plan_rows = pplanUnique->plan_rows; - pplanAgg->plan_width = pplanUnique->plan_width; - - pplanAgg->nMotionNodes = pplanUnique->nMotionNodes; - - pplanAgg->targetlist = pplanUnique->targetlist; - pplanAgg->qual = pplanUnique->qual; - - pplanAgg->lefttree = pplanUnique->lefttree; - - // copy unique-specific fields - // execution of unique always assumes sorted input - pagg->aggstrategy = AGG_SORTED; - - pagg->grpColIdx = punique->uniqColIdx; - pagg->numCols = punique->numCols; - - return PdxlnAggFromPlan((Plan *)pagg); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnSortFromPlan -// -// @doc: -// Create a DXL sort node from a GPDB Sort plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnSortFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Sort)); - const Sort *psort = (Sort *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // construct DXL sort operator - // TODO: antovl - Jan 19, 2011; currently GPDB supports only nullsLast behavior - GPOS_ASSERT(NULL == psort->nullsFirst); - - CDXLPhysicalSort *pdxlopSort = GPOS_NEW(m_pmp) CDXLPhysicalSort(m_pmp, psort->noduplicates); - - // translate child of sort operator - Plan *pplanChild = (psort->plan).lefttree; - GPOS_ASSERT(NULL != pplanChild); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - -#ifdef GPOS_DEBUG - pdxlnChild->Pdxlop()->AssertValid(pdxlnChild, false /* fValidateChildren */); -#endif - - // get child projection lists - CDXLNode *pdxlnPrLChild = (*pdxlnChild)[0]; - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotSort); - - TranslateTListAndQual( - (psort->plan).targetlist, - (psort->plan).qual, - 0, //ulRTEIndex - NULL, //pdxltabdesc - NULL, //pmdindex - pdxlnPrLChild, - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // translate sorting column list - GPOS_ASSERT(0 < psort->numCols && NULL!= psort->sortColIdx); - - CDXLNode *pdxlnSortColList = PdxlnSortingColListFromPlan(psort->sortColIdx, psort->sortOperators, psort->numCols, pdxlnPrLChild); - - // translate limit information - - CDXLNode *pdxlnLimitCount = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarLimitCount(m_pmp)); - CDXLNode *pdxlnLimitOffset = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarLimitOffset(m_pmp)); - - if (NULL != psort->limitCount) - { - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLChild); - pdxlnLimitCount->AddChild(m_psctranslator->PdxlnScOpFromExpr - ( - (Expr *) (psort->limitCount), - &mapvarcolid - ) - ); - } - - if (NULL != psort->limitOffset) - { - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLChild); - - pdxlnLimitOffset->AddChild - ( - m_psctranslator->PdxlnScOpFromExpr - ( - (Expr *) (psort->limitOffset), - &mapvarcolid - ) - ); - } - - - // construct sort operator node - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopSort); - pdxln->SetProperties(pdxlprop); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnSortColList); // sorting columns - pdxln->AddChild(pdxlnLimitCount); // limit count - pdxln->AddChild(pdxlnLimitOffset); // limit offset - pdxln->AddChild(pdxlnChild); // child - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnSubqueryScanFromPlan -// -// @doc: -// Create a DXL SubqueryScan node from a GPDB SubqueryScan plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnSubqueryScanFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, SubqueryScan)); - const SubqueryScan *psubqscan = (SubqueryScan *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // get name for the subquery scan node from the range table - RangeTblEntry *prte = (RangeTblEntry *) gpdb::PvListNth(m_pplstmt->rtable, (psubqscan->scan).scanrelid - 1); - CHAR *szSubqName = prte->eref->aliasname; - - CWStringDynamic *pstrSubqName = CDXLUtils::PstrFromSz(m_pmp, szSubqName); - // copy table name - CMDName *pmdnameSubqScan = GPOS_NEW(m_pmp) CMDName(m_pmp, pstrSubqName); - GPOS_DELETE(pstrSubqName); - - // construct DXL subquery scan operator - CDXLPhysicalSubqueryScan *pdxlopSubqScan = GPOS_NEW(m_pmp) CDXLPhysicalSubqueryScan(m_pmp, pmdnameSubqScan); - - // translate child of subquery operator - Plan *pplanChild = psubqscan->subplan; - GPOS_ASSERT(NULL != pplanChild); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - -#ifdef GPOS_DEBUG - pdxlnChild->Pdxlop()->AssertValid(pdxlnChild, false /* fValidateChildren */); -#endif - - // get child projection lists - CDXLNode *pdxlnPrLChild = (*pdxlnChild)[0]; - - // construct a fake table descriptor for the subquery scan - // since the project list and filter refer to the rtable rather than OUTER - // construct projection list and filter - CDXLTableDescr *pdxltabdesc = GPOS_NEW(m_pmp) CDXLTableDescr - ( - m_pmp, - GPOS_NEW(m_pmp) CMDIdGPDB(CMDIdGPDB::m_mdidInvalidKey.OidObjectId()), - GPOS_NEW(m_pmp) CMDName(pmdnameSubqScan->Pstr()), - prte->checkAsUser - ); - - ListCell *plcCol = NULL; - ULONG ulAttno = 1; - - // add columns from RangeTableEntry to table descriptor - ForEach (plcCol, prte->eref->colnames) - { - Value *pvalue = (Value *) lfirst(plcCol); - CHAR *szColName = strVal(pvalue); - - BOOL fColDropped = false; - - if ('\0' == szColName[0]) - { - fColDropped = true; - } - - // column is not dropped - CWStringDynamic *pstrColName = CDXLUtils::PstrFromSz(m_pmp, szColName); - - // copy string into column name - CMDName *pmdnameColName = GPOS_NEW(m_pmp) CMDName(m_pmp, pstrColName); - - GPOS_DELETE(pstrColName); - - // get column id from the subplan's target list - CDXLNode *pdxlnPrEl = (*pdxlnPrLChild)[ulAttno-1]; - ULONG ulId = ((CDXLScalarProjElem *) pdxlnPrEl->Pdxlop())->UlId(); - - // create a column descriptor for the column - CDXLColDescr *pdxlcd = GPOS_NEW(m_pmp) CDXLColDescr - ( - m_pmp, - pmdnameColName, - ulId, - ulAttno, - GPOS_NEW(m_pmp) CMDIdGPDB(CMDIdGPDB::m_mdidInvalidKey.OidObjectId()), - fColDropped - ); - - pdxltabdesc->AddColumnDescr(pdxlcd); - - ulAttno++; - } - - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotSubqueryScan); - - TranslateTListAndQual( - (psubqscan->scan.plan).targetlist, - (psubqscan->scan.plan).qual, - ULONG((psubqscan->scan).scanrelid), - pdxltabdesc, - NULL, // pmdindex - NULL, // pdxlnPrLChild - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // construct sort operator node - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopSubqScan); - pdxln->SetProperties(pdxlprop); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnChild); // child - - // cleanup - pdxltabdesc->Release(); - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnAppendFromPlan -// -// @doc: -// Create a DXL Append node from a GPDB Append plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnAppendFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Append)); - const Append *pappend = (Append *) pplan; - - GPOS_ASSERT(NULL != pappend->appendplans); - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - - GPOS_ASSERT(NULL != pdxlprop); - - // construct DXL Append operator - CDXLPhysicalAppend *pdxlopAppend = GPOS_NEW(m_pmp) CDXLPhysicalAppend(m_pmp, pappend->isTarget, pappend->isZapped); - - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopAppend); - pdxln->SetProperties(pdxlprop); - - // translate first child of append operator so we can translate the project list - // and the filter - Plan *pplanFirstChild = (Plan*) LInitial(pappend->appendplans); - - GPOS_ASSERT(NULL != pplanFirstChild); - CDXLNode *pdxlnFirstChild = PdxlnFromPlan(pplanFirstChild); -#ifdef GPOS_DEBUG - pdxlnFirstChild->Pdxlop()->AssertValid(pdxlnFirstChild, false /* fValidateChildren */); -#endif - - // get first child projection list - CDXLNode *pdxlnPrLFirstChild = (*pdxlnFirstChild)[0]; - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotAppend); - - TranslateTListAndQual( - (pappend->plan).targetlist, - (pappend->plan).qual, - 0, //ulRTEIndex - NULL, //table descr - NULL, //pmdindex - pdxlnPrLFirstChild, - NULL, //pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - pdxln->AddChild(pdxlnFilter); // filter - pdxln->AddChild(pdxlnFirstChild); // first child - - // translate the rest of the append child plans - const ULONG ulLen = gpdb::UlListLength(pappend->appendplans); - for (ULONG ul = 1; ul < ulLen; ul++) - { - Plan *pplanChild = (Plan*) gpdb::PvListNth(pappend->appendplans, ul); - GPOS_ASSERT(NULL != pplanChild); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - pdxln->AddChild(pdxlnChild); - } - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnResultFromFoldedFuncExpr -// -// @doc: -// Create a DXL physical Result node from a folded function expression -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnResultFromFoldedFuncExpr - ( - const Expr *pexpr, - CWStringDynamic *pstrAlias, - CDXLPhysicalProperties *pdxlprop, - CMappingVarColId *pmapvarcolid - ) -{ - CDXLNode *pdxlnPrL = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarProjList(m_pmp)); - - // construct a scalar operator for the expression - CDXLNode *pdxlnChild = m_psctranslator->PdxlnScOpFromExpr(pexpr, pmapvarcolid); - - ULONG ulPrElId = m_pidgtor->UlNextId(); - CMDName *pmdnameAlias = GPOS_NEW(m_pmp) CMDName(m_pmp, pstrAlias); - - CDXLNode *pdxlnPrEl = GPOS_NEW(m_pmp) CDXLNode - ( - m_pmp, - GPOS_NEW(m_pmp) CDXLScalarProjElem(m_pmp, ulPrElId, pmdnameAlias) - ); - pdxlnPrEl->AddChild(pdxlnChild); - - // add proj elem to proj list - pdxlnPrL->AddChild(pdxlnPrEl); - - CDXLPhysicalResult *pdxlopResult = GPOS_NEW(m_pmp) CDXLPhysicalResult(m_pmp); - - CDXLNode *pdxlnFilter = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarFilter(m_pmp)); - - pmapvarcolid->LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrL); - - CDXLNode *pdxlnOneTimeFilter = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarOneTimeFilter(m_pmp)); - - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopResult); - pdxln->SetProperties(pdxlprop); - - pdxln->AddChild(pdxlnPrL); - pdxln->AddChild(pdxlnFilter); - pdxln->AddChild(pdxlnOneTimeFilter); - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnFunctionScanFromPlan -// -// @doc: -// Create a DXL physical TVF node from a GPDB function scan node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnFunctionScanFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, FunctionScan)); - const FunctionScan *pfuncscan = (FunctionScan *) pplan; - - Index iRel = pfuncscan->scan.scanrelid; - GPOS_ASSERT(0 < iRel); - - RangeTblEntry *prte = (RangeTblEntry *) gpdb::PvListNth(m_pplstmt->rtable, (iRel) - 1); - - GPOS_ASSERT(NULL != prte); - GPOS_ASSERT(RTE_FUNCTION == prte->rtekind); - - Alias *palias = prte->eref; - CWStringDynamic *pstrAlias = CDXLUtils::PstrFromSz(m_pmp, palias->aliasname); - - // get properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - CMappingVarColId mapvarcolid(m_pmp); - - if (!IsA(prte->funcexpr, FuncExpr)) - { - // for folded function expressions, construct a result node - CDXLNode *pdxln = PdxlnResultFromFoldedFuncExpr - ( - (Expr *)prte->funcexpr, - pstrAlias, - pdxlprop, - &mapvarcolid - ); - GPOS_DELETE(pstrAlias); - - return pdxln; - } - - FuncExpr *pfuncexpr = (FuncExpr *) prte->funcexpr; - CMDIdGPDB *pmdidFunc = CTranslatorUtils::PmdidWithVersion(m_pmp, pfuncexpr->funcid); - CMDIdGPDB *pmdidRetType = CTranslatorUtils::PmdidWithVersion(m_pmp, pfuncexpr->funcresulttype); - - CWStringConst *pstrFunc = GPOS_NEW(m_pmp) CWStringConst(m_pmp, pstrAlias->Wsz()); - GPOS_DELETE(pstrAlias); - CDXLPhysicalTVF *pdxlop = GPOS_NEW(m_pmp) CDXLPhysicalTVF(m_pmp, pmdidFunc, pmdidRetType, pstrFunc); - - CDXLNode *pdxlnTVF = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlop); - // add properties - pdxlnTVF->SetProperties(pdxlprop); - - // construct and add projection list - mapvarcolid.Load(DEFAULT_QUERY_LEVEL, iRel, m_pidgtor, palias->colnames); - - CDXLNode *pdxlnPrL = PdxlnPrLFromTL(pfuncscan->scan.plan.targetlist, &mapvarcolid); - - pdxlnTVF->AddChild(pdxlnPrL); - - // translate scalar children - ListCell *plcArg = NULL; - - ForEach (plcArg, pfuncexpr->args) - { - Expr *pexpr = (Expr *) lfirst(plcArg); - - CDXLNode *pdxlnChild = m_psctranslator->PdxlnScOpFromExpr - ( - pexpr, - &mapvarcolid - ); - - pdxlnTVF->AddChild(pdxlnChild); - } - - return pdxlnTVF; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnTblScanFromPlan -// -// @doc: -// Create a DXL table scan node from a GPDB sequential scan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnTblScanFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, SeqScan)); - const SeqScan *psscan = (SeqScan *) pplan; - - GPOS_ASSERT(0 < psscan->scanrelid); - - // construct table descriptor for the scan node from the range table entry - RangeTblEntry *prte = (RangeTblEntry *) gpdb::PvListNth(m_pplstmt->rtable, (psscan->scanrelid) - 1); - - GPOS_ASSERT(NULL != prte); - GPOS_ASSERT(RTE_RELATION == prte->rtekind); - - CDXLTableDescr *pdxltabdesc = CTranslatorUtils::Pdxltabdesc(m_pmp, m_pmda, m_pidgtor, prte); - // get plan costs - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - CDXLPhysicalTableScan *pdxlopTS = GPOS_NEW(m_pmp) CDXLPhysicalTableScan(m_pmp, pdxltabdesc); - - CDXLNode *pdxlnTblScan = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopTS); - pdxlnTblScan->SetProperties(pdxlprop); - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotTblScan); - - TranslateTListAndQual( - (psscan->plan).targetlist, - (psscan->plan).qual, - ULONG(psscan->scanrelid), - pdxltabdesc, - NULL, // pmdindex - NULL, // pdxlnPrLLeft - NULL, // pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // add children in the right order - pdxlnTblScan->AddChild(pdxlnPrL); - pdxlnTblScan->AddChild(pdxlnFilter); - - return pdxlnTblScan; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnIndexScanFromPlan -// -// @doc: -// Create a DXL index scan node from a GPDB index scan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnIndexScanFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, IndexScan)); - const IndexScan *pindexscan = (IndexScan *) pplan; - - EPlStmtPhysicalOpType eplstmtphoptype = m_psctranslator->Eplsphoptype(); - m_psctranslator->SetCallingPhysicalOpType(EpspotIndexScan); - - CDXLNode *pdxln = PdxlnIndexScanFromGPDBIndexScan(pindexscan, false /*fIndexOnlyScan*/); - - m_psctranslator->SetCallingPhysicalOpType(eplstmtphoptype); - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnIndexScanFromGPDBIndexScan -// -// @doc: -// Create a DXL index (only) scan node from a GPDB index (only) scan node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnIndexScanFromGPDBIndexScan - ( - const IndexScan *pindexscan, - BOOL fIndexOnlyScan - ) -{ - GPOS_ASSERT(0 < pindexscan->scan.scanrelid); - GPOS_ASSERT(0 < pindexscan->indexid); - - // construct table descriptor for the scan node from the range table entry - RangeTblEntry *prte = - (RangeTblEntry *) gpdb::PvListNth(m_pplstmt->rtable, (pindexscan->scan.scanrelid) - 1); - - GPOS_ASSERT(NULL != prte); - GPOS_ASSERT(RTE_RELATION == prte->rtekind); - CDXLTableDescr *pdxltabdesc = CTranslatorUtils::Pdxltabdesc(m_pmp, m_pmda, m_pidgtor, prte); - - // create the index descriptor - CMDIdGPDB *pmdid = CTranslatorUtils::PmdidWithVersion(m_pmp, pindexscan->indexid); - CDXLIndexDescr *pdxlid = CTranslatorUtils::Pdxlid(m_pmp, m_pmda, pmdid); - const IMDIndex *pmdindex = m_pmda->Pmdindex(pmdid); - - EdxlIndexScanDirection edxlissd = CTranslatorUtils::EdxlIndexDirection(pindexscan->indexorderdir); - - CDXLPhysicalIndexScan *pdxlop = NULL; - - GPOS_ASSERT(!fIndexOnlyScan); - //{ - // pdxlop = GPOS_NEW(m_pmp) CDXLPhysicalIndexOnlyScan(m_pmp, pdxltabdesc, pdxlid, edxlissd); - //} - //else - //{ - pdxlop = GPOS_NEW(m_pmp) CDXLPhysicalIndexScan(m_pmp, pdxltabdesc, pdxlid, edxlissd); - //} - - CDXLNode *pdxlnIndexScan = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlop); - - // get plan costs - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan((Plan *)pindexscan); - pdxlnIndexScan->SetProperties(pdxlprop); - - // translate the index condition - CMappingVarColId mapvarcolidForIndex(m_pmp); - - if (NULL != pdxltabdesc) - { - mapvarcolidForIndex.LoadIndexColumns(DEFAULT_QUERY_LEVEL, ULONG(pindexscan->scan.scanrelid), pmdindex, pdxltabdesc); - } - - // translate index condition - CDXLNode *pdxlnIdxCondList = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarIndexCondList(m_pmp)); - - ListCell *plcQual = NULL; - ForEach (plcQual, pindexscan->indexqual) - { - Expr *pexpr = (Expr *) lfirst(plcQual); - CDXLNode *pdxlnIdxQual = m_psctranslator->PdxlnScOpFromExpr(pexpr, &mapvarcolidForIndex); - pdxlnIdxCondList->AddChild(pdxlnIdxQual); - } - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - const IMDIndex *pmdindexProjList = NULL; - if (fIndexOnlyScan) - { - pmdindexProjList = pmdindex; - } - - TranslateTListAndQual - ( - (pindexscan->scan.plan).targetlist, - (pindexscan->scan.plan).qual, - ULONG(pindexscan->scan.scanrelid), - pdxltabdesc, - pmdindexProjList, - NULL, // pdxlnPrLLeft - NULL, // pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - // add children in the right order - pdxlnIndexScan->AddChild(pdxlnPrL); - pdxlnIndexScan->AddChild(pdxlnFilter); - pdxlnIndexScan->AddChild(pdxlnIdxCondList); - - return pdxlnIndexScan; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnLimitFromPlan -// -// @doc: -// Create a DXL Limit node from a GPDB LIMIT node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnLimitFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Limit)); - const Limit *plimit = (Limit *) pplan; - - // get plan costs - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - CDXLPhysicalLimit *pdxlopLimit = GPOS_NEW(m_pmp) CDXLPhysicalLimit(m_pmp); - CDXLNode *pdxlnLimit = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopLimit); - pdxlnLimit->SetProperties(pdxlprop); - - Plan *pplanChildPlan = outerPlan(plimit); - - GPOS_ASSERT(NULL != pplanChildPlan); - CDXLNode *pdxlnChildPlan = PdxlnFromPlan(pplanChildPlan); - GPOS_ASSERT(1 <= pdxlnChildPlan->UlArity()); - - CDXLNode *pdxlnPrLLeft = (*pdxlnChildPlan)[0]; - GPOS_ASSERT(pdxlnPrLLeft->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - CMappingVarColId mapvarcolid(m_pmp); - m_psctranslator->SetCallingPhysicalOpType(EpspotLimit); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - - // construct projection list - CDXLNode *pdxlnPrL = PdxlnPrLFromTL((plimit->plan).targetlist, &mapvarcolid); - - // add children in the right order - pdxlnLimit->AddChild(pdxlnPrL); // project list - pdxlnLimit->AddChild(pdxlnChildPlan); - - CDXLScalarLimitCount *pdxlopLimitCount = GPOS_NEW(m_pmp) CDXLScalarLimitCount(m_pmp); - CDXLNode *pdxlnLimitCount = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopLimitCount); - - if(NULL != plimit->limitCount) - { - pdxlnLimitCount->AddChild(m_psctranslator->PdxlnScOpFromExpr - ( - (Expr *) (plimit->limitCount), - &mapvarcolid - ) - ); - } - pdxlnLimit->AddChild(pdxlnLimitCount); - - CDXLScalarLimitOffset *pdxlopLimitOffset = GPOS_NEW(m_pmp) CDXLScalarLimitOffset(m_pmp); - CDXLNode *pdxlnLimitOffset = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopLimitOffset); - - if(NULL != plimit->limitOffset) - { - pdxlnLimitOffset->AddChild(m_psctranslator->PdxlnScOpFromExpr - ( - (Expr *) (plimit->limitOffset), - &mapvarcolid - ) - ); - } - - pdxlnLimit->AddChild(pdxlnLimitOffset); - - return pdxlnLimit; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnMaterializeFromPlan -// -// @doc: -// Create a DXL Materialize node from a GPDB MATERIAL node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnMaterializeFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Material)); - const Material *pmat = (Material *) pplan; - // get plan costs - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - CDXLPhysicalMaterialize *pdxlopMat = NULL; - - if (SHARE_NOTSHARED == pmat->share_type) - { - // materialize node is not shared - pdxlopMat = GPOS_NEW(m_pmp) CDXLPhysicalMaterialize(m_pmp, pmat->cdb_strict); - } - else - { - // create a shared materialize node - pdxlopMat = GPOS_NEW(m_pmp) CDXLPhysicalMaterialize(m_pmp, pmat->cdb_strict, pmat->share_id, pmat->driver_slice, pmat->nsharer_xslice); - } - - CDXLNode *pdxlnMaterialize = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopMat); - pdxlnMaterialize->SetProperties(pdxlprop); - - Plan *pplanChildPlan = outerPlan(pmat); - GPOS_ASSERT(NULL != pplanChildPlan); - CDXLNode *pdxlnChildPlan = PdxlnFromPlan(pplanChildPlan); - GPOS_ASSERT(1 <= pdxlnChildPlan->UlArity()); - - CDXLNode *pdxlnPrLLeft = (*pdxlnChildPlan)[0]; - GPOS_ASSERT(pdxlnPrLLeft->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotMaterialize); - - TranslateTListAndQual( - (pmat->plan).targetlist, - (pmat->plan).qual, - 0, //ulRTEIndex - NULL, // table descr - NULL, // pmdindex - pdxlnPrLLeft, // pdxlnPrLLeft - NULL, // pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - pdxlnMaterialize->AddChild(pdxlnPrL); - pdxlnMaterialize->AddChild(pdxlnFilter); - pdxlnMaterialize->AddChild(pdxlnChildPlan); - - return pdxlnMaterialize; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnSharedScanFromPlan -// -// @doc: -// Create a DXL SharedScan node from a GPDB SHAREINPUTSCAN node. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnSharedScanFromPlan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, ShareInputScan)); - const ShareInputScan *pshscan = (ShareInputScan *) pplan; - - // get plan costs - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - CDXLPhysicalSharedScan *pdxlopShScan = NULL; - - CDXLSpoolInfo *pspoolinfo = PspoolinfoFromSharedScan(pshscan); - pdxlopShScan = GPOS_NEW(m_pmp) CDXLPhysicalSharedScan(m_pmp, pspoolinfo); - CDXLNode *pdxlnSharedScan = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopShScan); - pdxlnSharedScan->SetProperties(pdxlprop); - - Plan *pplanChildPlan = outerPlan(pshscan); - - // project list of child operator - const CDXLNode *pdxlnPrLChild = NULL; - CDXLNode *pdxlnChildPlan = NULL; - if (NULL != pplanChildPlan) - { - // translate shared scan child - pdxlnChildPlan = PdxlnFromPlan(pplanChildPlan); - GPOS_ASSERT(1 <= pdxlnChildPlan->UlArity()); - pdxlnPrLChild = (*pdxlnChildPlan)[0]; - } - else - { - // input for shared scan node has already been translated elsewhere: - // fetch the corresponding project list - ULONG ulSharedScanId = (ULONG) pshscan->share_id; - pdxlnPrLChild = m_phmuldxlnSharedScanProjLists->PtLookup(&ulSharedScanId); - } - - GPOS_ASSERT(NULL != pdxlnPrLChild); - GPOS_ASSERT(pdxlnPrLChild->Pdxlop()->Edxlop() == EdxlopScalarProjectList); - - // construct projection list and filter - CDXLNode *pdxlnPrL = NULL; - CDXLNode *pdxlnFilter = NULL; - - m_psctranslator->SetCallingPhysicalOpType(EpspotSharedScan); - - TranslateTListAndQual( - (pshscan->plan).targetlist, - (pshscan->plan).qual, - 0, //ulRTEIndex - NULL, // table descr - NULL, // pmdindex - pdxlnPrLChild, // pdxlnPrLLeft - NULL, // pdxlnPrLRight - &pdxlnPrL, - &pdxlnFilter - ); - - if (NULL != pplanChildPlan) - { - // first encounter of this shared scan id: store the translated proj list - ULONG *pulSharedScanId = GPOS_NEW(m_pmp) ULONG(pshscan->share_id); - - pdxlnPrL->AddRef(); -#ifdef GPOS_DEBUG - BOOL fInserted = -#endif - m_phmuldxlnSharedScanProjLists->FInsert(pulSharedScanId, pdxlnPrL); - GPOS_ASSERT(fInserted); - } - - // add children in the right order - pdxlnSharedScan->AddChild(pdxlnPrL); // project list - pdxlnSharedScan->AddChild(pdxlnFilter); // filter - - if (NULL != pdxlnChildPlan) - { - pdxlnSharedScan->AddChild(pdxlnChildPlan); - } - - return pdxlnSharedScan; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnSequence -// -// @doc: -// Create a DXL Sequnce node from a GPDB Sequence plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnSequence - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, Sequence)); - const Sequence *psequence = (Sequence *) pplan; - GPOS_ASSERT(NULL != psequence->subplans); - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - GPOS_ASSERT(NULL != pdxlprop); - - // construct DXL sequence operator - CDXLPhysicalSequence *pdxlop = GPOS_NEW(m_pmp) CDXLPhysicalSequence(m_pmp); - - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlop); - pdxln->SetProperties(pdxlprop); - - // translate last child of sequence operator so we can translate the project list - // and the filter - const ULONG ulSubplans = gpdb::UlListLength(psequence->subplans); - - GPOS_ASSERT(0 < ulSubplans); - - Plan *pplanLastChild = (Plan*) gpdb::PvListNth(psequence->subplans, ulSubplans - 1); - - GPOS_ASSERT(NULL != pplanLastChild); - - CDXLNode *pdxlnLastChild = PdxlnFromPlan(pplanLastChild); - - // get last child projection list - CDXLNode *pdxlnPrLLastChild = (*pdxlnLastChild)[0]; - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLastChild); - - // construct projection list - CDXLNode *pdxlnPrL = PdxlnPrLFromTL((psequence->plan).targetlist, &mapvarcolid); - - // add children in the right order - pdxln->AddChild(pdxlnPrL); // proj list - - // translate the rest of the sequence subplans - for (ULONG ul = 0; ul < ulSubplans - 1; ul++) - { - Plan *pplanChild = (Plan*) gpdb::PvListNth(psequence->subplans, ul); - CDXLNode *pdxlnChild = PdxlnFromPlan(pplanChild); - pdxln->AddChild(pdxlnChild); - } - - pdxln->AddChild(pdxlnLastChild); // last child - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnDynamicTableScan -// -// @doc: -// Create a DXL Dynamic Table Scan node from the corresponding GPDB plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnDynamicTableScan - ( - const Plan *pplan - ) -{ - GPOS_ASSERT(NULL != pplan); - GPOS_ASSERT(IsA(pplan, DynamicTableScan)); - const DynamicTableScan *pdts = (DynamicTableScan *) pplan; - - // extract plan properties - CDXLPhysicalProperties *pdxlprop = PdxlpropFromPlan(pplan); - - // construct DXL dynamic table scan operator - - // construct table descriptor for the scan node from the range table entry - RangeTblEntry *prte = (RangeTblEntry *) gpdb::PvListNth(m_pplstmt->rtable, (pdts->scanrelid) - 1); - - GPOS_ASSERT(NULL != prte); - GPOS_ASSERT(RTE_RELATION == prte->rtekind); - - CDXLTableDescr *pdxltabdesc = CTranslatorUtils::Pdxltabdesc(m_pmp, m_pmda, m_pidgtor, prte); - - CDXLPhysicalDynamicTableScan *pdxlop = GPOS_NEW(m_pmp) CDXLPhysicalDynamicTableScan(m_pmp, pdxltabdesc, pdts->partIndex, pdts->partIndexPrintable); - - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlop); - pdxln->SetProperties(pdxlprop); - - // construct projection list - - CMappingVarColId mapvarcolid(m_pmp); - mapvarcolid.LoadTblColumns(DEFAULT_QUERY_LEVEL, ULONG(pdts->scanrelid), pdxltabdesc); - - // construct projection list - CDXLNode *pdxlnPrL = PdxlnPrLFromTL((pdts->plan).targetlist, &mapvarcolid); - - pdxln->AddChild(pdxlnPrL); // project list - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::TranslateTListAndQual -// -// @doc: -// Translate GPDB translate target and qual lists into DXL project list and -// filter, respectively. -// This function can be used for constructing the projection list and filter of a -// base node (e.g. a scan node), in which case the the table descriptor is -// not null and is used for resolving the column references, or in an intermediate -// plan nodes, where pdxlnprlLeft and pldxlnprlRight are the projection lists -// for the left and right child, respectively. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -void -CTranslatorPlStmtToDXL::TranslateTListAndQual - ( - List *plTargetList, - List *plQual, - ULONG ulRTEIndex, - const CDXLTableDescr *pdxltabdesc, - const IMDIndex *pmdindex, - const CDXLNode *pdxlnPrLLeft, - const CDXLNode *pdxlnPrLRight, - CDXLNode **ppdxlnPrLOut, - CDXLNode **ppdxlnFilterOut - ) -{ - GPOS_ASSERT_IMP(NULL != pmdindex, NULL != pdxltabdesc); - - CMappingVarColId mapvarcolid(m_pmp); - if (NULL != pdxlnPrLLeft) - { - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLLeft); - } - - if (NULL != pdxlnPrLRight) - { - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, INNER, pdxlnPrLRight); - } - - if (NULL != pdxltabdesc) - { - GPOS_ASSERT(ulRTEIndex > 0); - if (NULL != pmdindex) - { - mapvarcolid.LoadIndexColumns(DEFAULT_QUERY_LEVEL, ulRTEIndex, pmdindex, pdxltabdesc); - } - else - { - mapvarcolid.LoadTblColumns(DEFAULT_QUERY_LEVEL, ulRTEIndex, pdxltabdesc); - } - } - - // construct projection list - *ppdxlnPrLOut = PdxlnPrLFromTL(plTargetList, &mapvarcolid); - *ppdxlnFilterOut = m_psctranslator->PdxlnFilterFromQual - ( - plQual, - &mapvarcolid, - EdxlopScalarFilter - ); -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnPrLFromTL -// -// @doc: -// Create a DXL projection list node table descriptor from a GPDB target list. -// This function can be used for constructing the projection list of a -// base node (e.g. a scan node), in which case the the table descriptor is -// not null and is used for resolving the column references, or in an intermediate -// plan nodes, where pdxlnprlLeft and pldxlnprlRight are the projection lists -// for the left and right child, respectively. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnPrLFromTL - ( - List *plTargetList, - CMappingVarColId *pmapvarcolid - ) -{ - CDXLNode *pdxlnPrL = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarProjList(m_pmp)); - ListCell *plcte = NULL; - - // construct a proj list node for each entry in the target list - ForEach (plcte, plTargetList) - { - TargetEntry *pte = (TargetEntry *) lfirst(plcte); - GPOS_ASSERT(IsA(pte, TargetEntry)); - - // construct a scalar operator for the the Var's expression - CDXLNode *pdxlnChild = m_psctranslator->PdxlnScOpFromExpr(pte->expr, pmapvarcolid); - // construct a projection element - CDXLScalarProjElem *pdxlopPrEl = NULL; - // get the id and alias for the proj elem - ULONG ulPrElId; - CMDName *pmdnameAlias = NULL; - - if (NULL != pte->resname) - { - CWStringDynamic *pstrAlias = CDXLUtils::PstrFromSz(m_pmp, pte->resname); - pmdnameAlias = GPOS_NEW(m_pmp) CMDName(m_pmp, pstrAlias); - // CName constructor copies string - GPOS_DELETE(pstrAlias); - } - - if (IsA(pte->expr, Var)) - { - // project elem is a a reference to a column - use the colref id - GPOS_ASSERT(EdxlopScalarIdent == pdxlnChild->Pdxlop()->Edxlop()); - CDXLScalarIdent *pdxlopIdent = (CDXLScalarIdent *) pdxlnChild->Pdxlop(); - ulPrElId = pdxlopIdent->Pdxlcr()->UlID(); - - if (NULL == pte->resname) - { - // no alias provided - create a copy of the original column name - pmdnameAlias = GPOS_NEW(m_pmp) CMDName - ( - m_pmp, - pdxlopIdent->Pdxlcr()->Pmdname()->Pstr() - ); - } - } - else - { - // project elem is a defined column - get a new id - ulPrElId = m_pidgtor->UlNextId(); - // GPOS_ASSERT(NULL != pte->resname); - if (NULL == pte->resname) - { - // no column name - make up one - CWStringConst strUnnamedCol(GPOS_WSZ_LIT("?column?")); - pmdnameAlias = GPOS_NEW(m_pmp) CMDName(m_pmp, &strUnnamedCol); - } - } - - GPOS_ASSERT(NULL != pmdnameAlias); - - // construct a projection element operator - pdxlopPrEl = GPOS_NEW(m_pmp) CDXLScalarProjElem(m_pmp, ulPrElId, pmdnameAlias); - - // create the DXL node holding the proj elem - CDXLNode *pdxlnPrEl = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopPrEl); - pdxlnPrEl->AddChild(pdxlnChild); - - // add proj elem to proj list - pdxlnPrL->AddChild(pdxlnPrEl); - } - - return pdxlnPrL; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlpropFromPlan -// -// @doc: -// Extract cost estimates from Plan structures and store them in a -// DXL properties container. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLPhysicalProperties * -CTranslatorPlStmtToDXL::PdxlpropFromPlan - ( - const Plan *pplan - ) -{ - CWStringDynamic *pstrTotalCost = GPOS_NEW(m_pmp) CWStringDynamic(m_pmp); - CWStringDynamic *pstrStartupCost = GPOS_NEW(m_pmp) CWStringDynamic(m_pmp); - CWStringDynamic *pstrRows = GPOS_NEW(m_pmp) CWStringDynamic(m_pmp); - CWStringDynamic *pstrWidth = GPOS_NEW(m_pmp) CWStringDynamic(m_pmp); - - const WCHAR wszFormat[] = GPOS_WSZ_LIT("%.2f"); - pstrTotalCost->AppendFormat(wszFormat, pplan->total_cost); - pstrWidth->AppendFormat(GPOS_WSZ_LIT("%d"), pplan->plan_width); - pstrStartupCost->AppendFormat(wszFormat, pplan->startup_cost); - pstrRows->AppendFormat(wszFormat, pplan->plan_rows); - - CDXLOperatorCost *pdxlopcost = GPOS_NEW(m_pmp) CDXLOperatorCost - ( - pstrStartupCost, - pstrTotalCost, - pstrRows, - pstrWidth - ); - CDXLPhysicalProperties *pdxlprop = GPOS_NEW(m_pmp) CDXLPhysicalProperties(pdxlopcost); - - return pdxlprop; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnHashExprLFromList -// -// @doc: -// Translate the list of hash expressions in a RedistributeMotion plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnHashExprLFromList - ( - List *plHashExpr, - List *plHashExprTypes, - const CDXLNode *pdxlnPrLChild - ) -{ - GPOS_ASSERT(NULL != plHashExpr); - GPOS_ASSERT(NULL != plHashExprTypes); - GPOS_ASSERT(gpdb::UlListLength(plHashExpr) == gpdb::UlListLength(plHashExprTypes)); - - CDXLNode *pdxlnHashExprList = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarHashExprList(m_pmp)); - - ListCell *plcHashExpr = NULL; - ListCell *plcHashExprType = NULL; - - // construct a list of DXL hash expressions - ForBoth (plcHashExpr, plHashExpr, - plcHashExprType, plHashExprTypes) - { - Expr *pexpr = (Expr *) lfirst(plcHashExpr); - OID oid = lfirst_oid(plcHashExprType); - - // construct a DXL hash expression node from the hash expression type id and the translated expression - CMDIdGPDB *pmdidExprType = CTranslatorUtils::PmdidWithVersion(m_pmp, oid); - CDXLNode *pdxlnHashExpr = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarHashExpr(m_pmp, pmdidExprType)); - - CMappingVarColId mapvarcolid(m_pmp); - - mapvarcolid.LoadProjectElements(DEFAULT_QUERY_LEVEL, OUTER, pdxlnPrLChild); - - // translate expression - CDXLNode *pdxlnExpr = m_psctranslator->PdxlnScOpFromExpr(pexpr,&mapvarcolid); - GPOS_ASSERT(NULL != pdxlnExpr); - - pdxlnHashExpr->AddChild(pdxlnExpr); - pdxlnHashExprList->AddChild(pdxlnHashExpr); - } - - return pdxlnHashExprList; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PdxlnSortingColListFromPlan -// -// @doc: -// Translate the list of hash expressions in a RedistributeMotion plan node. -// The function allocates memory in the translator memory pool, and the caller -// is responsible for freeing it. -// -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorPlStmtToDXL::PdxlnSortingColListFromPlan - ( - AttrNumber *pattnoSortColIds, - OID *poidSortOpIds, - ULONG ulNumCols, - const CDXLNode *pdxlnPrL - ) -{ - CDXLScalarSortColList *pdxlopSortColList = GPOS_NEW(m_pmp) CDXLScalarSortColList(m_pmp); - CDXLNode *pdxlnSortColList = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopSortColList); - - if (0 == ulNumCols) - { - // no sorting columns present - return the empty list - return pdxlnSortColList; - } - - GPOS_ASSERT(NULL != pattnoSortColIds && NULL != poidSortOpIds); - - // construct a list of DXL sorting columns - for (ULONG ul = 0; ul < ulNumCols; ul++) - { - // find col id for the current sorting column - AttrNumber attnoSortColId = pattnoSortColIds[ul]; - - // find sorting column in the project list - CDXLNode *pdxlnPrEl = (*pdxlnPrL)[attnoSortColId-1]; - CDXLScalarProjElem *pdxlopPrEl = (CDXLScalarProjElem *) pdxlnPrEl->Pdxlop(); - ULONG ulSortColId = pdxlopPrEl->UlId(); - - // retrieve sorting operator oid and name - OID oidSortOpId = poidSortOpIds[ul]; - - CMDIdGPDB *pmdidSortOp = CTranslatorUtils::PmdidWithVersion(m_pmp, oidSortOpId); - const IMDScalarOp *pmdscop = m_pmda->Pmdscop(pmdidSortOp); - - const CWStringConst *pstrSortOpName = pmdscop->Mdname().Pstr();; - GPOS_ASSERT(NULL != pstrSortOpName); - - // TODO: antovl - Jan 19, 2011; read nullsFirst from the plan node; - // currently GPDB does not support this - CDXLScalarSortCol *pdxlopSortCol = GPOS_NEW(m_pmp) CDXLScalarSortCol - ( - m_pmp, - ulSortColId, - pmdidSortOp, - GPOS_NEW(m_pmp) CWStringConst(pstrSortOpName->Wsz()), - false // nullsFirst - ); - - CDXLNode *pdxlnSortCol = GPOS_NEW(m_pmp) CDXLNode(m_pmp, pdxlopSortCol); - pdxlnSortColList->AddChild(pdxlnSortCol); - } - - return pdxlnSortColList; -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::TranslateMotionSegmentInfo -// -// @doc: -// Populate the input and output segments id lists from a Motion node -// -//--------------------------------------------------------------------------- -void -CTranslatorPlStmtToDXL::TranslateMotionSegmentInfo - ( - const Motion *pmotion, - DrgPi *pdrgpiInputSegIds, - DrgPi *pdrgpiOutputSegIds - ) -{ - GPOS_ASSERT(NULL != pdrgpiInputSegIds); - GPOS_ASSERT(NULL != pdrgpiOutputSegIds); - - const ULONG ulSegmentCount = gpdb::UlSegmentCountGP(); - - // populate input segment ids - Flow *pChildFlow = (pmotion->plan).lefttree->flow; - - if (pChildFlow->flotype == FLOW_SINGLETON) - { - // only one segment sends data - INT *piInputSegId = GPOS_NEW(m_pmp) INT(pChildFlow->segindex); - pdrgpiInputSegIds->Append(piInputSegId); - } - else - { - // all segments send data - for (ULONG ul = 0; ul < ulSegmentCount; ul++) - { - INT *piInputSegId = GPOS_NEW(m_pmp) INT(ul); - pdrgpiInputSegIds->Append(piInputSegId ); - } - } - - // populate output segment ids - if (pmotion->motionType == MOTIONTYPE_HASH) - { - // redistribute motion - GPOS_ASSERT(0 < pmotion->numOutputSegs && NULL!= pmotion->outputSegIdx); - - for(ULONG ul = 0; ul < (ULONG) pmotion->numOutputSegs; ul++) - { - INT *piSegId = GPOS_NEW(m_pmp) INT(pmotion->outputSegIdx[ul]); - pdrgpiOutputSegIds->Append(piSegId); - } - } - else if (pmotion->motionType == MOTIONTYPE_FIXED && pmotion->numOutputSegs > 0) - { - // gather motion - GPOS_ASSERT(1 == pmotion->numOutputSegs); - - INT *piOutputSegId = GPOS_NEW(m_pmp) INT(pmotion->outputSegIdx[0]); - pdrgpiOutputSegIds->Append(piOutputSegId); - } - else - { - // broadcast motion - for (ULONG ul = 0; ul < ulSegmentCount; ul++) - { - INT *piOutputSegId = GPOS_NEW(m_pmp) INT(ul); - pdrgpiOutputSegIds->Append(piOutputSegId); - } - } -} - -//--------------------------------------------------------------------------- -// @function: -// CTranslatorPlStmtToDXL::PspoolinfoFromSharedScan -// -// @doc: -// Creates a spool info structure for a shared scan from a GPDB shared scan node -// -//--------------------------------------------------------------------------- -CDXLSpoolInfo * -CTranslatorPlStmtToDXL::PspoolinfoFromSharedScan - ( - const ShareInputScan *pshscan - ) -{ - GPOS_ASSERT(NULL != pshscan); - GPOS_ASSERT(SHARE_NOTSHARED != pshscan->share_type); - - Edxlspooltype edxlsptype = EdxlspoolSentinel; - - switch (pshscan->share_type) - { - case SHARE_MATERIAL: - case SHARE_MATERIAL_XSLICE: - edxlsptype = EdxlspoolMaterialize; - break; - - case SHARE_SORT: - case SHARE_SORT_XSLICE: - edxlsptype = EdxlspoolSort; - break; - - default: - GPOS_ASSERT(!"Invalid sharing type"); - } - - // is scan shared across slices - BOOL fMultiSlice = false; - - if (SHARE_MATERIAL_XSLICE == pshscan->share_type || SHARE_SORT_XSLICE == pshscan->share_type) - { - fMultiSlice = true; - } - - CDXLSpoolInfo *pspoolinfo = GPOS_NEW(m_pmp) CDXLSpoolInfo(pshscan->share_id, edxlsptype, fMultiSlice, pshscan->driver_slice); - return pspoolinfo; -} - -// EOF http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/752a98cd/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp index be9c077..ed23282 100644 --- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp @@ -47,7 +47,6 @@ #include "gpopt/translate/CQueryMutators.h" #include "gpopt/translate/CTranslatorUtils.h" #include "gpopt/translate/CTranslatorQueryToDXL.h" -#include "gpopt/translate/CTranslatorPlStmtToDXL.h" #include "gpopt/translate/CTranslatorDXLToPlStmt.h" #include "gpopt/translate/CTranslatorRelcacheToDXL.h" http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/752a98cd/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp index 2be912b..0a9dcfa 100644 --- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp @@ -37,7 +37,6 @@ #define ALLOW_isnan #include "postgres.h" #include "gpopt/translate/CTranslatorScalarToDXL.h" -#include "gpopt/translate/CTranslatorPlStmtToDXL.h" #include "gpopt/translate/CTranslatorQueryToDXL.h" #include "gpopt/translate/CTranslatorUtils.h" #include "gpopt/translate/CCTEListEntry.h" @@ -243,110 +242,6 @@ CTranslatorScalarToDXL::PdxlnScIdFromParam //--------------------------------------------------------------------------- // @function: -// CTranslatorScalarToDXL::PdxlnSubPlanFromSubPlan -// -// @doc: -// Create a DXL SubPlan node for a from a GPDB SubPlan -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorScalarToDXL::PdxlnSubPlanFromSubPlan - ( - const Expr *pexpr, - const CMappingVarColId* pmapvarcolid - ) -{ - GPOS_ASSERT(IsA(pexpr, SubPlan)); - GPOS_ASSERT(NULL != m_pparammapping); - - const SubPlan * psubplan = (SubPlan *)pexpr; - - // outer references - DrgPdxlcr *pdrgdxlcr = GPOS_NEW(m_pmp) DrgPdxlcr(m_pmp); - DrgPmdid *pdrgmdid = GPOS_NEW(m_pmp) DrgPmdid(m_pmp); - - ListCell *plc = NULL; - ULONG ul = 0; - - ForEachWithCount (plc, psubplan->args, ul) - { - Var *pvar = (Var*) lfirst(plc); - - // get the param id - ULONG ulParamId = gpdb::IListNth(psubplan->parParam, ul); - - // insert mapping - if (NULL == m_pparammapping->Pscid(ulParamId)) - { - CDXLNode *pdxln = PdxlnScIdFromVar((Expr *)pvar, pmapvarcolid); - CDXLScalarIdent *pdxlopIdent = CDXLScalarIdent::PdxlopConvert(pdxln->Pdxlop()); - pdxlopIdent->AddRef(); - m_pparammapping->FInsertMapping(ulParamId, pdxlopIdent); - pdxln->Release(); - } - - // column name - const CWStringBase *pstr = pmapvarcolid->PstrColName(m_ulQueryLevel, pvar, m_eplsphoptype); - // column id - ULONG ulId = 0; - - if(0 != pvar->varattno) - { - ulId = pmapvarcolid->UlColId(m_ulQueryLevel, pvar, m_eplsphoptype); - } - else - { - ulId = m_pidgtorCol->UlNextId(); - } - - CMDName *pmdname = GPOS_NEW(m_pmp) CMDName(m_pmp, pstr); - - // create a column reference for the given var - CDXLColRef *pdxlcr = GPOS_NEW(m_pmp) CDXLColRef(m_pmp, pmdname, ulId); - - pdrgdxlcr->Append(pdxlcr); - pdrgmdid->Append(CTranslatorUtils::PmdidWithVersion(m_pmp,pvar->vartype)); - } - - // translate subplan test expression - CDXLNode *pdxlnTestExpr = NULL; - if (NULL != psubplan->testexpr) - { - pdxlnTestExpr = PdxlnScOpFromExpr((Expr *)psubplan->testexpr, pmapvarcolid); - } - - IMDId *pmdid = CTranslatorUtils::PmdidWithVersion(m_pmp, psubplan->firstColType); - - // create the DXL node holding the scalar subplan - EdxlSubPlanType edxlsubplantype = CTranslatorUtils::Edxlsubplantype(psubplan->subLinkType); - CDXLNode *pdxln = GPOS_NEW(m_pmp) CDXLNode - ( - m_pmp, - GPOS_NEW(m_pmp) CDXLScalarSubPlan - ( - m_pmp, - pmdid, - pdrgdxlcr, - pdrgmdid, - edxlsubplantype, - pdxlnTestExpr - ) - ); - - // get the actual sub plan from the plstmt - Plan *pplanChild = (Plan *) gpdb::PvListNth(m_pplstmt->subplans, psubplan->plan_id - 1); - - // Since a sub plan has relational children, we create a new translator to handle its translation - CTranslatorPlStmtToDXL trplstmttodxl(m_pmp, m_pmda, m_pidgtorCol, m_pplstmt, m_pparammapping); - - CDXLNode *pdxlnSubPlan = trplstmttodxl.PdxlnFromPlan(pplanChild); - - pdxln->AddChild(pdxlnSubPlan); - - return pdxln; -} - -//--------------------------------------------------------------------------- -// @function: // CTranslatorScalarToDXL::PdxlnScOpFromExpr // // @doc: @@ -384,8 +279,6 @@ CTranslatorScalarToDXL::PdxlnScOpFromExpr {T_NullIfExpr, &CTranslatorScalarToDXL::PdxlnScNullIfFromExpr}, {T_RelabelType, &CTranslatorScalarToDXL::PdxlnScCastFromRelabelType}, {T_CoerceToDomain, &CTranslatorScalarToDXL::PdxlnScCoerceFromCoerce}, - {T_Param, &CTranslatorScalarToDXL::PdxlnPlanFromParam}, - {T_SubPlan, &CTranslatorScalarToDXL::PdxlnSubPlanFromSubPlan}, {T_SubLink, &CTranslatorScalarToDXL::PdxlnFromSublink}, {T_ArrayExpr, &CTranslatorScalarToDXL::PdxlnArray}, {T_ArrayRef, &CTranslatorScalarToDXL::PdxlnArrayRef}, @@ -2139,77 +2032,6 @@ CTranslatorScalarToDXL::PdxlnExistSubqueryFromSublink //--------------------------------------------------------------------------- // @function: -// CTranslatorScalarToDXL::PdxlnPlanFromParam -// -// @doc: -// Create a DXL InitPlan/Var node from a GPDB PARAM node -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorScalarToDXL::PdxlnPlanFromParam - ( - const Expr *pexpr, - const CMappingVarColId * // pmapvarcolid - ) -{ - const Param *pparam = (Param *) pexpr; - // check first if this param can be translated into a scalar id (from a subplan) - CDXLNode *pdxln = PdxlnScIdFromParam((Param *) pexpr); - if (NULL != pdxln) - { - return pdxln; - } - - // TODO: Venky; Need to handle when parameters that are passed to the plan - - if (PARAM_EXEC == pparam->paramkind) - { - return PdxlnInitPlanFromParam(pparam); - } - else - { - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("External Parameters")); - } - return NULL; -} -//--------------------------------------------------------------------------- -// @function: -// CTranslatorScalarToDXL::PdxlnInitPlanFromParam -// -// @doc: -// Create a DXL InitPlan node from a GPDB PARAM node -//--------------------------------------------------------------------------- -CDXLNode * -CTranslatorScalarToDXL::PdxlnInitPlanFromParam - ( - const Param *pparam - ) - const -{ - GPOS_ASSERT(NULL != pparam); - - // TODO: Venky; Need to handle when parameters that are passed to the plan - CDXLNode *pdxlnInitPlan = GPOS_NEW(m_pmp) CDXLNode(m_pmp, GPOS_NEW(m_pmp) CDXLScalarInitPlan(m_pmp)); - - GPOS_ASSERT(NULL != m_pplstmt->subplans && "We only support parameters that are generated by initplans"); - - // Get the plan defining the param - GPOS_ASSERT(gpdb::UlListLength(m_pplstmt->subplans) >= pparam->paramid && "Parameter ID not found"); - - Plan *ppl = (Plan *) gpdb::PvListNth(m_pplstmt->subplans, pparam->paramid); - - GPOS_ASSERT(NULL != ppl); - - // Since an init plan is not a scalar node, we create a new PlStmt translator to handle its translation - CTranslatorPlStmtToDXL trplstmttodxl(m_pmp, m_pmda, m_pidgtorCol, m_pplstmt, m_pparammapping); - CDXLNode *pdxlnSubPlan = trplstmttodxl.PdxlnFromPlan(ppl); - GPOS_ASSERT(NULL != pdxlnSubPlan); - pdxlnInitPlan->AddChild(pdxlnSubPlan); - - return pdxlnInitPlan; -} - -//--------------------------------------------------------------------------- -// @function: // CTranslatorScalarToDXL::Pdatum // // @doc: http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/752a98cd/src/backend/gpopt/translate/Makefile ---------------------------------------------------------------------- diff --git a/src/backend/gpopt/translate/Makefile b/src/backend/gpopt/translate/Makefile index 1bd2a48..276c895 100644 --- a/src/backend/gpopt/translate/Makefile +++ b/src/backend/gpopt/translate/Makefile @@ -33,7 +33,6 @@ OBJS = CMappingColIdVar.o \ CTranslatorRelcacheToDXL.o \ CTranslatorDXLToQuery.o \ CTranslatorQueryToDXL.o \ - CTranslatorDXLToPlStmt.o \ - CTranslatorPlStmtToDXL.o + CTranslatorDXLToPlStmt.o include $(top_srcdir)/src/backend/common.mk