This is an automated email from the ASF dual-hosted git repository. maxyang pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 08c1ee0d07df01a56a51f4348d1b994a2c561450 Author: Ekta Khanna <[email protected]> AuthorDate: Wed Apr 5 10:53:59 2023 -0700 Update CDXLScalarArrayCoerceExpr to pass elemexpr As part of GP6 and older versions, ArrayCoerceExpr struct held the information of the cast function as function oid and a boolean isExplicit for representing if its an explicit or implicit cast. Starting PG11 this was changed to an Expr elemexpr. This commit updates the representation of CDXLScalarArrayCoerceExpr in ORCA so that we can correctly roundtrip the Expr *elemexpr. Thus addressing the 2 FIXME's that are removed as part of this commit. --- .../gpopt/translate/CTranslatorDXLToScalar.cpp | 38 ++------------ .../gpopt/translate/CTranslatorScalarToDXL.cpp | 37 +++++--------- .../gporca/data/dxl/minidump/ArrayCoerceExpr.mdp | 12 +++-- .../gpopt/operators/CScalarArrayCoerceExpr.h | 18 ++----- .../gporca/libgpopt/src/base/CCastUtils.cpp | 8 +-- src/backend/gporca/libgpopt/src/base/CUtils.cpp | 4 +- .../src/operators/CScalarArrayCoerceExpr.cpp | 59 +++------------------- .../src/translate/CTranslatorDXLToExpr.cpp | 24 +++------ .../src/translate/CTranslatorExprToDXL.cpp | 10 ++-- .../dxl/operators/CDXLScalarArrayCoerceExpr.h | 29 ++--------- .../include/naucrates/dxl/xml/dxltokens.h | 1 - .../src/operators/CDXLOperatorFactory.cpp | 12 ++--- .../src/operators/CDXLScalarArrayCoerceExpr.cpp | 14 ++--- .../parser/CParseHandlerScalarArrayCoerceExpr.cpp | 13 ++++- .../gporca/libnaucrates/src/xml/dxltokens.cpp | 1 - 15 files changed, 72 insertions(+), 208 deletions(-) diff --git a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp index 0ff73e028e..c640913243 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp @@ -1515,52 +1515,22 @@ CTranslatorDXLToScalar::TranslateDXLScalarArrayCoerceExprToScalar( CDXLScalarArrayCoerceExpr *dxlop = CDXLScalarArrayCoerceExpr::Cast(scalar_coerce_node->GetOperator()); - GPOS_ASSERT(1 == scalar_coerce_node->Arity()); + GPOS_ASSERT(2 == scalar_coerce_node->Arity()); CDXLNode *child_dxl = (*scalar_coerce_node)[0]; + CDXLNode *elemexpr_dxl = (*scalar_coerce_node)[1]; Expr *child_expr = TranslateDXLToScalar(child_dxl, colid_var); + Expr *elem_expr = TranslateDXLToScalar(elemexpr_dxl, colid_var); ArrayCoerceExpr *coerce = MakeNode(ArrayCoerceExpr); coerce->arg = child_expr; - Oid elemfuncid = CMDIdGPDB::CastMdid(dxlop->GetCoerceFuncMDid())->Oid(); + coerce->elemexpr = elem_expr; coerce->resulttype = CMDIdGPDB::CastMdid(dxlop->GetResultTypeMdId())->Oid(); coerce->resulttypmod = dxlop->TypeModifier(); - // GPDB_91_MERGE_FIXME: collation coerce->resultcollid = gpdb::TypeCollation(coerce->resulttype); coerce->coerceformat = (CoercionForm) dxlop->GetDXLCoercionForm(); coerce->location = dxlop->GetLocation(); - // GPDB_12_MERGE_FIXME: change the representation of - // CDXLScalarArrayCoerceExpr so that we can correctly roundtrip - CaseTestExpr *case_test_expr = MakeNode(CaseTestExpr); - Oid input_array_type = gpdb::ExprType((Node *) child_expr); - int32 input_array_elem_typmod = gpdb::ExprTypeMod((Node *) child_expr); - case_test_expr->typeId = gpdb::GetElementType(input_array_type); - case_test_expr->typeMod = input_array_elem_typmod; - if (elemfuncid != 0) - { - FuncExpr *func_expr = MakeNode(FuncExpr); - func_expr->funcid = elemfuncid; - func_expr->funcformat = COERCE_EXPLICIT_CAST; - func_expr->funcresulttype = - CMDIdGPDB::CastMdid(dxlop->GetResultTypeMdId())->Oid(); - - // FIXME: this is a giant hack. We really should know the arity of the - // function we're calling. Instead, we're jamming three arguments, - // _always_ - func_expr->args = gpdb::LPrepend( - case_test_expr, ListMake2(gpdb::MakeIntConst(dxlop->TypeModifier()), - gpdb::MakeBoolConst(true, false))); - coerce->elemexpr = (Expr *) func_expr; - } - else - { - RelabelType *rt = MakeNode(RelabelType); - rt->resulttypmod = dxlop->TypeModifier(); - rt->resulttype = gpdb::GetElementType(coerce->resulttype); - rt->arg = (Expr *) case_test_expr; - coerce->elemexpr = (Expr *) rt; - } return (Expr *) coerce; } diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp index f52155477e..67cdf5d36f 100644 --- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp @@ -1270,42 +1270,31 @@ CTranslatorScalarToDXL::TranslateArrayCoerceExprToDXL( CDXLNode *child_node = TranslateScalarToDXL(array_coerce_expr->arg, var_colid_mapping); + CDXLNode *elemexpr_node = + TranslateScalarToDXL(array_coerce_expr->elemexpr, var_colid_mapping); GPOS_ASSERT(nullptr != child_node); + GPOS_ASSERT(nullptr != elemexpr_node); - Oid elemfuncid = 0; - - if (IsA(array_coerce_expr->elemexpr, FuncExpr)) - { - elemfuncid = ((FuncExpr *) array_coerce_expr->elemexpr)->funcid; - } - else if (IsA(array_coerce_expr->elemexpr, RelabelType)) - { - ; - } - else + if (!(IsA(array_coerce_expr->elemexpr, FuncExpr) || + IsA(array_coerce_expr->elemexpr, RelabelType))) { GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, GPOS_WSZ_LIT("ArrayCoerceExpr with elemexpr that is neither " "FuncExpr or RelabelType")); } - // GPDB_12_MERGE_FIXME: faking an explicit cast is wrong - // This _will_ lead to wrong behavior, e.g. - // INSERT INTO bar SELECT b FROM foo; - // where foo.b is of type varchar(100)[] - // and bar.b is of type varchar(9)[] CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( - m_mp, - GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr( - m_mp, GPOS_NEW(m_mp) CMDIdGPDB(IMDId::EmdidGeneral, elemfuncid), - GPOS_NEW(m_mp) - CMDIdGPDB(IMDId::EmdidGeneral, array_coerce_expr->resulttype), - array_coerce_expr->resulttypmod, true, - (EdxlCoercionForm) array_coerce_expr->coerceformat, - array_coerce_expr->location)); + m_mp, GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr( + m_mp, + GPOS_NEW(m_mp) CMDIdGPDB(IMDId::EmdidGeneral, + array_coerce_expr->resulttype), + array_coerce_expr->resulttypmod, + (EdxlCoercionForm) array_coerce_expr->coerceformat, + array_coerce_expr->location)); dxlnode->AddChild(child_node); + dxlnode->AddChild(elemexpr_node); return dxlnode; } diff --git a/src/backend/gporca/data/dxl/minidump/ArrayCoerceExpr.mdp b/src/backend/gporca/data/dxl/minidump/ArrayCoerceExpr.mdp index 421e507f0e..a1a0e593fe 100644 --- a/src/backend/gporca/data/dxl/minidump/ArrayCoerceExpr.mdp +++ b/src/backend/gporca/data/dxl/minidump/ArrayCoerceExpr.mdp @@ -193,11 +193,14 @@ explain select * from foo where d in ('a', 'b'); <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0"> <dxl:Ident ColId="2" ColName="d" TypeMdid="0.1043.1.0"/> </dxl:Cast> - <dxl:ArrayCoerceExpr ElementFunc="0.0.0.0" TypeMdid="0.1009.1.0" IsExplicit="false" CoercionForm="2" Location="0"> + <dxl:ArrayCoerceExpr TypeMdid="0.1009.1.0" CoercionForm="2" Location="0"> <dxl:Array ArrayType="0.1015.1.0" ElementType="0.1043.1.0" MultiDimensional="false"> <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABWE=" LintValue="160440876"/> <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABWI=" LintValue="160449068"/> </dxl:Array> + <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0"> + <dxl:CaseTest TypeMdid="0.1043.1.0"/> + </dxl:Cast> </dxl:ArrayCoerceExpr> </dxl:ArrayComp> <dxl:LogicalGet> @@ -249,12 +252,15 @@ explain select * from foo where d in ('a', 'b'); <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0"> <dxl:Ident ColId="1" ColName="d" TypeMdid="0.1043.1.0"/> </dxl:Cast> - <dxl:ArrayCoerceExpr ElementFunc="0.0.0.0" TypeMdid="0.1009.1.0" IsExplicit="false" CoercionForm="2" Location="0"> + <dxl:ArrayCoerceExpr TypeMdid="0.1009.1.0" CoercionForm="2" Location="0"> <dxl:Array ArrayType="0.1015.1.0" ElementType="0.1043.1.0" MultiDimensional="false"> <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABWE=" LintValue="160440876"/> <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABWI=" LintValue="160449068"/> </dxl:Array> - </dxl:ArrayCoerceExpr> + <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0"> + <dxl:CaseTest TypeMdid="0.1043.1.0"/> + </dxl:Cast> + </dxl:ArrayCoerceExpr> </dxl:ArrayComp> </dxl:Filter> <dxl:TableDescriptor Mdid="6.97283.1.1" TableName="foo"> diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarArrayCoerceExpr.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarArrayCoerceExpr.h index 5eb4fd901b..4dff917727 100644 --- a/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarArrayCoerceExpr.h +++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarArrayCoerceExpr.h @@ -38,28 +38,16 @@ using namespace gpos; class CScalarArrayCoerceExpr : public CScalarCoerceBase { private: - // catalog MDId of the element function - IMDId *m_pmdidElementFunc; - - // conversion semantics flag to pass to func - BOOL m_is_explicit; - public: CScalarArrayCoerceExpr(const CScalarArrayCoerceExpr &) = delete; // ctor - CScalarArrayCoerceExpr(CMemoryPool *mp, IMDId *element_func, - IMDId *result_type_mdid, INT type_modifier, - BOOL is_explicit, ECoercionForm dxl_coerce_format, + CScalarArrayCoerceExpr(CMemoryPool *mp, IMDId *result_type_mdid, + INT type_modifier, ECoercionForm dxl_coerce_format, INT location); // dtor - ~CScalarArrayCoerceExpr() override; - - // return metadata id of element coerce function - IMDId *PmdidElementFunc() const; - - BOOL IsExplicit() const; + ~CScalarArrayCoerceExpr() override = default; EOperatorId Eopid() const override; diff --git a/src/backend/gporca/libgpopt/src/base/CCastUtils.cpp b/src/backend/gporca/libgpopt/src/base/CCastUtils.cpp index b816871891..d14ff5047e 100644 --- a/src/backend/gporca/libgpopt/src/base/CCastUtils.cpp +++ b/src/backend/gporca/libgpopt/src/base/CCastUtils.cpp @@ -134,9 +134,7 @@ CCastUtils::PexprCast(CMemoryPool *mp, CMDAccessor *md_accessor, pexpr = GPOS_NEW(mp) CExpression( mp, GPOS_NEW(mp) CScalarArrayCoerceExpr( - mp, parrayCoerceCast->GetCastFuncMdId(), mdid_dest, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + mp, mdid_dest, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()), CUtils::PexprScalarIdent(mp, colref)); @@ -331,9 +329,7 @@ CCastUtils::PexprCast(CMemoryPool *mp, CMDAccessor *md_accessor, pexprCast = GPOS_NEW(mp) CExpression( mp, GPOS_NEW(mp) CScalarArrayCoerceExpr( - mp, parrayCoerceCast->GetCastFuncMdId(), mdid_dest, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + mp, mdid_dest, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()), pexpr); diff --git a/src/backend/gporca/libgpopt/src/base/CUtils.cpp b/src/backend/gporca/libgpopt/src/base/CUtils.cpp index e8735b3a3c..804fe1cc63 100644 --- a/src/backend/gporca/libgpopt/src/base/CUtils.cpp +++ b/src/backend/gporca/libgpopt/src/base/CUtils.cpp @@ -3795,9 +3795,7 @@ CUtils::PexprCast(CMemoryPool *mp, CMDAccessor *md_accessor, CExpression *pexpr, pexprCast = GPOS_NEW(mp) CExpression( mp, GPOS_NEW(mp) CScalarArrayCoerceExpr( - mp, parrayCoerceCast->GetCastFuncMdId(), mdid_dest, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + mp, mdid_dest, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()), pexpr); diff --git a/src/backend/gporca/libgpopt/src/operators/CScalarArrayCoerceExpr.cpp b/src/backend/gporca/libgpopt/src/operators/CScalarArrayCoerceExpr.cpp index 27921b13b4..54875a477f 100644 --- a/src/backend/gporca/libgpopt/src/operators/CScalarArrayCoerceExpr.cpp +++ b/src/backend/gporca/libgpopt/src/operators/CScalarArrayCoerceExpr.cpp @@ -31,57 +31,12 @@ using namespace gpmd; // Ctor // //--------------------------------------------------------------------------- -CScalarArrayCoerceExpr::CScalarArrayCoerceExpr( - CMemoryPool *mp, IMDId *element_func, IMDId *result_type_mdid, - INT type_modifier, BOOL is_explicit, ECoercionForm ecf, INT location) - : CScalarCoerceBase(mp, result_type_mdid, type_modifier, ecf, location), - m_pmdidElementFunc(element_func), - m_is_explicit(is_explicit) +CScalarArrayCoerceExpr::CScalarArrayCoerceExpr(CMemoryPool *mp, + IMDId *result_type_mdid, + INT type_modifier, + ECoercionForm ecf, INT location) + : CScalarCoerceBase(mp, result_type_mdid, type_modifier, ecf, location) { - GPOS_ASSERT(nullptr != element_func); -} - -//--------------------------------------------------------------------------- -// @function: -// CScalarArrayCoerceExpr::~CScalarArrayCoerceExpr -// -// @doc: -// dtor -// -//--------------------------------------------------------------------------- -CScalarArrayCoerceExpr::~CScalarArrayCoerceExpr() -{ - m_pmdidElementFunc->Release(); -} - - -//--------------------------------------------------------------------------- -// @function: -// CScalarArrayCoerceExpr::PmdidElementFunc -// -// @doc: -// Return metadata id of element coerce function -// -//--------------------------------------------------------------------------- -IMDId * -CScalarArrayCoerceExpr::PmdidElementFunc() const -{ - return m_pmdidElementFunc; -} - - -//--------------------------------------------------------------------------- -// @function: -// CScalarArrayCoerceExpr::IsExplicit -// -// @doc: -// Conversion semantics flag to pass to func -// -//--------------------------------------------------------------------------- -BOOL -CScalarArrayCoerceExpr::IsExplicit() const -{ - return m_is_explicit; } @@ -133,10 +88,8 @@ CScalarArrayCoerceExpr::Matches(COperator *pop) const CScalarArrayCoerceExpr *popCoerce = CScalarArrayCoerceExpr::PopConvert(pop); - return popCoerce->PmdidElementFunc()->Equals(m_pmdidElementFunc) && - popCoerce->MdidType()->Equals(MdidType()) && + return popCoerce->MdidType()->Equals(MdidType()) && popCoerce->TypeModifier() == TypeModifier() && - popCoerce->IsExplicit() == m_is_explicit && popCoerce->Ecf() == Ecf() && popCoerce->Location() == Location(); } diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp index 26384b1f0c..28b6a5d6b1 100644 --- a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp +++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp @@ -800,9 +800,7 @@ CTranslatorDXLToExpr::PexprCastPrjElem(IMDId *pmdidSource, IMDId *mdid_dest, pexprCast = GPOS_NEW(m_mp) CExpression( m_mp, GPOS_NEW(m_mp) CScalarArrayCoerceExpr( - m_mp, parrayCoerceCast->GetCastFuncMdId(), mdid_dest, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + m_mp, mdid_dest, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()), GPOS_NEW(m_mp) CExpression( @@ -2974,9 +2972,7 @@ CTranslatorDXLToExpr::PexprScalarFunc(const CDXLNode *pdxlnFunc) CMDArrayCoerceCastGPDB *parrayCoerceCast = (CMDArrayCoerceCastGPDB *) pmdcast; pop = GPOS_NEW(m_mp) CScalarArrayCoerceExpr( - m_mp, parrayCoerceCast->GetCastFuncMdId(), mdid_return_type, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + m_mp, mdid_return_type, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()); } @@ -3680,9 +3676,7 @@ CTranslatorDXLToExpr::PexprScalarCast(const CDXLNode *pdxlnCast) pexpr = GPOS_NEW(m_mp) CExpression( m_mp, GPOS_NEW(m_mp) CScalarArrayCoerceExpr( - m_mp, parrayCoerceCast->GetCastFuncMdId(), mdid_type, - parrayCoerceCast->TypeModifier(), - parrayCoerceCast->IsExplicit(), + m_mp, mdid_type, parrayCoerceCast->TypeModifier(), (COperator::ECoercionForm) parrayCoerceCast->GetCoercionForm(), parrayCoerceCast->Location()), pexprChild); @@ -3789,12 +3783,11 @@ CTranslatorDXLToExpr::PexprScalarArrayCoerceExpr( CDXLScalarArrayCoerceExpr *dxl_op = CDXLScalarArrayCoerceExpr::Cast(pdxlnArrayCoerceExpr->GetOperator()); - GPOS_ASSERT(1 == pdxlnArrayCoerceExpr->Arity()); + GPOS_ASSERT(2 == pdxlnArrayCoerceExpr->Arity()); CDXLNode *child_dxlnode = (*pdxlnArrayCoerceExpr)[0]; + CDXLNode *elemexpr_dxlnode = (*pdxlnArrayCoerceExpr)[1]; CExpression *pexprChild = Pexpr(child_dxlnode); - - IMDId *element_func = dxl_op->GetCoerceFuncMDid(); - element_func->AddRef(); + CExpression *pexprElem = Pexpr(elemexpr_dxlnode); IMDId *result_type_mdid = dxl_op->GetResultTypeMdId(); result_type_mdid->AddRef(); @@ -3804,12 +3797,11 @@ CTranslatorDXLToExpr::PexprScalarArrayCoerceExpr( return GPOS_NEW(m_mp) CExpression( m_mp, GPOS_NEW(m_mp) CScalarArrayCoerceExpr( - m_mp, element_func, result_type_mdid, dxl_op->TypeModifier(), - dxl_op->IsExplicit(), + m_mp, result_type_mdid, dxl_op->TypeModifier(), (COperator::ECoercionForm) dxl_coerce_format, // map Coercion Form directly based on position in enum dxl_op->GetLocation()), - pexprChild); + pexprChild, pexprElem); } //--------------------------------------------------------------------------- diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp index f37400e322..ed73c62b90 100644 --- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp +++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp @@ -6163,25 +6163,25 @@ CTranslatorExprToDXL::PdxlnScArrayCoerceExpr(CExpression *pexprArrayCoerceExpr) CScalarArrayCoerceExpr *popScArrayCoerceExpr = CScalarArrayCoerceExpr::PopConvert(pexprArrayCoerceExpr->Pop()); - IMDId *pmdidElemFunc = popScArrayCoerceExpr->PmdidElementFunc(); - pmdidElemFunc->AddRef(); IMDId *mdid = popScArrayCoerceExpr->MdidType(); mdid->AddRef(); CDXLNode *pdxlnArrayCoerceExpr = GPOS_NEW(m_mp) CDXLNode( m_mp, GPOS_NEW(m_mp) CDXLScalarArrayCoerceExpr( - m_mp, pmdidElemFunc, mdid, popScArrayCoerceExpr->TypeModifier(), - popScArrayCoerceExpr->IsExplicit(), + m_mp, mdid, popScArrayCoerceExpr->TypeModifier(), (EdxlCoercionForm) popScArrayCoerceExpr ->Ecf(), // map Coercion Form directly based on position in enum popScArrayCoerceExpr->Location())); // translate child - GPOS_ASSERT(1 == pexprArrayCoerceExpr->Arity()); + GPOS_ASSERT(2 == pexprArrayCoerceExpr->Arity()); CExpression *pexprChild = (*pexprArrayCoerceExpr)[0]; + CExpression *pexprElemExpr = (*pexprArrayCoerceExpr)[1]; CDXLNode *child_dxlnode = PdxlnScalar(pexprChild); + CDXLNode *elemexpr_dxlnode = PdxlnScalar(pexprElemExpr); pdxlnArrayCoerceExpr->AddChild(child_dxlnode); + pdxlnArrayCoerceExpr->AddChild(elemexpr_dxlnode); return pdxlnArrayCoerceExpr; } diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h index 748aec3797..7a14be918e 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h @@ -38,24 +38,14 @@ using namespace gpmd; class CDXLScalarArrayCoerceExpr : public CDXLScalarCoerceBase { private: - // catalog MDId of element coerce function - IMDId *m_coerce_func_mdid; - - // conversion semantics flag to pass to func - BOOL m_explicit; - public: CDXLScalarArrayCoerceExpr(const CDXLScalarArrayCoerceExpr &) = delete; - CDXLScalarArrayCoerceExpr(CMemoryPool *mp, IMDId *coerce_func_mdid, - IMDId *result_type_mdid, INT type_modifier, - BOOL is_explicit, EdxlCoercionForm coerce_format, + CDXLScalarArrayCoerceExpr(CMemoryPool *mp, IMDId *result_type_mdid, + INT type_modifier, EdxlCoercionForm coerce_format, INT location); - ~CDXLScalarArrayCoerceExpr() override - { - m_coerce_func_mdid->Release(); - } + ~CDXLScalarArrayCoerceExpr() override = default; // ident accessor Edxlopid @@ -64,19 +54,6 @@ public: return EdxlopScalarArrayCoerceExpr; } - // return metadata id of element coerce function - IMDId * - GetCoerceFuncMDid() const - { - return m_coerce_func_mdid; - } - - BOOL - IsExplicit() const - { - return m_explicit; - } - // name of the DXL operator name const CWStringConst *GetOpNameStr() const override; diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h index 78a9283f88..2ccc675dc1 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h @@ -279,7 +279,6 @@ enum Edxltoken EdxltokenTypeMod, EdxltokenCoercionForm, EdxltokenLocation, - EdxltokenElementFunc, EdxltokenIsExplicit, EdxltokenJoinType, diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp index 2b068b9de7..8dfd9b97ef 100644 --- a/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp +++ b/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp @@ -947,18 +947,12 @@ CDXLOperatorFactory::MakeDXLArrayCoerceExpr( { CMemoryPool *mp = dxl_memory_manager->Pmp(); - IMDId *element_func = ExtractConvertAttrValueToMdId( - dxl_memory_manager, attrs, EdxltokenElementFunc, - EdxltokenScalarArrayCoerceExpr); IMDId *mdid_type = ExtractConvertAttrValueToMdId( dxl_memory_manager, attrs, EdxltokenTypeId, EdxltokenScalarArrayCoerceExpr); INT type_modifier = ExtractConvertAttrValueToInt( dxl_memory_manager, attrs, EdxltokenTypeMod, EdxltokenScalarArrayCoerceExpr, true, default_type_modifier); - BOOL is_explicit = ExtractConvertAttrValueToBool( - dxl_memory_manager, attrs, EdxltokenIsExplicit, - EdxltokenScalarArrayCoerceExpr); ULONG coercion_form = ExtractConvertAttrValueToUlong( dxl_memory_manager, attrs, EdxltokenCoercionForm, EdxltokenScalarArrayCoerceExpr); @@ -966,9 +960,9 @@ CDXLOperatorFactory::MakeDXLArrayCoerceExpr( EdxltokenLocation, EdxltokenScalarArrayCoerceExpr); - return GPOS_NEW(mp) CDXLScalarArrayCoerceExpr( - mp, element_func, mdid_type, type_modifier, is_explicit, - (EdxlCoercionForm) coercion_form, location); + return GPOS_NEW(mp) + CDXLScalarArrayCoerceExpr(mp, mdid_type, type_modifier, + (EdxlCoercionForm) coercion_form, location); } //--------------------------------------------------------------------------- diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLScalarArrayCoerceExpr.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLScalarArrayCoerceExpr.cpp index 6a7707f2de..21960d452f 100644 --- a/src/backend/gporca/libnaucrates/src/operators/CDXLScalarArrayCoerceExpr.cpp +++ b/src/backend/gporca/libnaucrates/src/operators/CDXLScalarArrayCoerceExpr.cpp @@ -33,15 +33,11 @@ using namespace gpdxl; // //--------------------------------------------------------------------------- CDXLScalarArrayCoerceExpr::CDXLScalarArrayCoerceExpr( - CMemoryPool *mp, IMDId *coerce_func_mdid, IMDId *result_type_mdid, - INT type_modifier, BOOL is_explicit, EdxlCoercionForm coerce_format, - INT location) + CMemoryPool *mp, IMDId *result_type_mdid, INT type_modifier, + EdxlCoercionForm coerce_format, INT location) : CDXLScalarCoerceBase(mp, result_type_mdid, type_modifier, coerce_format, - location), - m_coerce_func_mdid(coerce_func_mdid), - m_explicit(is_explicit) + location) { - GPOS_ASSERT(nullptr != coerce_func_mdid); } //--------------------------------------------------------------------------- @@ -75,8 +71,6 @@ CDXLScalarArrayCoerceExpr::SerializeToDXL(CXMLSerializer *xml_serializer, xml_serializer->OpenElement( CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name); - m_coerce_func_mdid->Serialize( - xml_serializer, CDXLTokens::GetDXLTokenStr(EdxltokenElementFunc)); GetResultTypeMdId()->Serialize(xml_serializer, CDXLTokens::GetDXLTokenStr(EdxltokenTypeId)); @@ -85,8 +79,6 @@ CDXLScalarArrayCoerceExpr::SerializeToDXL(CXMLSerializer *xml_serializer, xml_serializer->AddAttribute( CDXLTokens::GetDXLTokenStr(EdxltokenTypeMod), TypeModifier()); } - xml_serializer->AddAttribute( - CDXLTokens::GetDXLTokenStr(EdxltokenIsExplicit), m_explicit); xml_serializer->AddAttribute( CDXLTokens::GetDXLTokenStr(EdxltokenCoercionForm), (ULONG) GetDXLCoercionForm()); diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerScalarArrayCoerceExpr.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerScalarArrayCoerceExpr.cpp index c34ad9fdce..395ea52f1a 100644 --- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerScalarArrayCoerceExpr.cpp +++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerScalarArrayCoerceExpr.cpp @@ -85,7 +85,15 @@ CParseHandlerScalarArrayCoerceExpr::StartElement( m_parse_handler_mgr, this); m_parse_handler_mgr->ActivateParseHandler(child_parse_handler); + // parse handler for exprelem scalar node + CParseHandlerBase *exprelem_parse_handler = + CParseHandlerFactory::GetParseHandler( + m_mp, CDXLTokens::XmlstrToken(EdxltokenScalar), + m_parse_handler_mgr, this); + m_parse_handler_mgr->ActivateParseHandler(exprelem_parse_handler); + // store parse handler + this->Append(exprelem_parse_handler); this->Append(child_parse_handler); } else @@ -121,12 +129,15 @@ CParseHandlerScalarArrayCoerceExpr::EndElement( GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXLUnexpectedTag, str->GetBuffer()); } - GPOS_ASSERT(1 == this->Length()); + GPOS_ASSERT(2 == this->Length()); // add constructed child from child parse handlers CParseHandlerScalarOp *child_parse_handler = dynamic_cast<CParseHandlerScalarOp *>((*this)[0]); AddChildFromParseHandler(child_parse_handler); + CParseHandlerScalarOp *elemexpr_parse_handler = + dynamic_cast<CParseHandlerScalarOp *>((*this)[1]); + AddChildFromParseHandler(elemexpr_parse_handler); // deactivate handler m_parse_handler_mgr->DeactivateHandler(); diff --git a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp index 12ac001239..908821eb26 100644 --- a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp +++ b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp @@ -275,7 +275,6 @@ CDXLTokens::Init(CMemoryPool *mp) {EdxltokenTypeMod, GPOS_WSZ_LIT("TypeModifier")}, {EdxltokenCoercionForm, GPOS_WSZ_LIT("CoercionForm")}, {EdxltokenLocation, GPOS_WSZ_LIT("Location")}, - {EdxltokenElementFunc, GPOS_WSZ_LIT("ElementFunc")}, {EdxltokenIsExplicit, GPOS_WSZ_LIT("IsExplicit")}, {EdxltokenJoinType, GPOS_WSZ_LIT("JoinType")}, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
