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 71bf73bee505d2518650b61142b67fc613254c35 Author: nishant sharma <[email protected]> AuthorDate: Wed Mar 8 17:40:39 2023 +0530 Allow queries with valid function variadic flag Through this PR, we have allowed processing of functional Expressions with 'funcvariadic' as true. Prior to this update, if for any functional expression 'funcvariadic' flag was 'true' then ORCA would fall back to planner. An exception was raised in CTranslatorScalarToDXL::TranslateFuncExprToDXL(,). To solve the problem, we passed the 'funcvariadic' through to the planned statement. Two approaches were tried, APPROACH 1- Used the data coming in ‘func_expr->funcvariadic’ (at Query to DXL creation) as the base value and passed it all through out ORCA. APPROACH 2- Add the 'funcvariadic' flag value in CMDFunctionGPDB (from pg_proc) and used it from here. This approach was tried in following PR (closed) #15236 APPROACH-1 was selected because as we tried to read the 'funcvariadic' from the PG_PROC catalog instead of the value we receive after parsing the query. It was found that using APPROACH-2, for some queries there was a difference in the value read from both the points, this caused an error. Eg: select format('|%20s|', 'ten'); 'funcvariadic' flag from query - FALSE 'funcvariadic' flag from Catalog - TRUE This caused failure in "Datum text_format(PG_FUNCTION_ARGS)" Thus, it was decided not to read value from catalog and continue with the value received after parsing the query. --- .../gpopt/translate/CTranslatorDXLToScalar.cpp | 1 + .../gpopt/translate/CTranslatorScalarToDXL.cpp | 17 +- .../dxl/minidump/VariadicFlagWithFormatQuery.mdp | 138 +++++++++ .../data/dxl/minidump/VariadicFlagWithJson.mdp | 343 +++++++++++++++++++++ .../data/dxl/minidump/VariadicFlagWithUnionAll.mdp | 177 +++++++++++ .../data/dxl/parse_tests/q14-FuncExpr-NoArg.xml | 2 +- .../data/dxl/parse_tests/q15-FuncExpr-WithArgs.xml | 2 +- .../q16-FuncExpr-WithNestedFuncExpr.xml | 6 +- .../gporca/data/dxl/parse_tests/q26-Metadata.xml | 12 +- .../data/dxl/parse_tests/q31-LogicalLimit.xml | 6 +- .../gporca/data/dxl/parse_tests/q69-ArrayRef2.xml | 4 +- .../data/dxl/parse_tests/s02-NestedFuncExpr.xml | 6 +- .../libgpopt/include/gpopt/operators/CScalarFunc.h | 10 +- .../src/operators/COrderedAggPreprocessor.cpp | 2 +- .../gporca/libgpopt/src/operators/CScalarFunc.cpp | 12 +- .../src/translate/CTranslatorDXLToExpr.cpp | 3 +- .../src/translate/CTranslatorExprToDXL.cpp | 2 +- .../naucrates/dxl/operators/CDXLScalarFuncExpr.h | 9 +- .../include/naucrates/dxl/xml/dxltokens.h | 1 + .../src/operators/CDXLOperatorFactory.cpp | 6 +- .../src/operators/CDXLScalarFuncExpr.cpp | 21 +- .../gporca/libnaucrates/src/xml/dxltokens.cpp | 2 + src/backend/gporca/server/CMakeLists.txt | 2 +- src/test/regress/expected/text.out | 2 + src/test/regress/expected/variadic_parameters.out | 25 ++ src/test/regress/sql/text.sql | 4 +- src/test/regress/sql/variadic_parameters.sql | 15 + 27 files changed, 782 insertions(+), 48 deletions(-) diff --git a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp index a51b6df33c..0ff73e028e 100644 --- a/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp +++ b/src/backend/gpopt/translate/CTranslatorDXLToScalar.cpp @@ -763,6 +763,7 @@ CTranslatorDXLToScalar::TranslateDXLScalarFuncExprToScalar( CMDIdGPDB::CastMdid(dxlop->ReturnTypeMdId())->Oid(); func_expr->args = TranslateScalarChildren(func_expr->args, scalar_func_expr_node, colid_var); + func_expr->funcvariadic = dxlop->IsFuncVariadic(); // GPDB_91_MERGE_FIXME: collation func_expr->inputcollid = gpdb::ExprCollation((Node *) func_expr->args); diff --git a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp index 5d9ed3926b..f52155477e 100644 --- a/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp +++ b/src/backend/gpopt/translate/CTranslatorScalarToDXL.cpp @@ -1330,26 +1330,13 @@ CTranslatorScalarToDXL::TranslateFuncExprToDXL( CMDIdGPDB *mdid_func = GPOS_NEW(m_mp) CMDIdGPDB(IMDId::EmdidGeneral, func_expr->funcid); - if (func_expr->funcvariadic) - { - // DXL doesn't have a field for variadic. We could plan it like a normal, - // non-VARIADIC call, and it would work for most functions that don't - // care whether they're called as VARIADIC or not. But some functions - // care. For example, text_format() checks, with get_fn_expr_variadic(), - // whether it was called as VARIADIC or with a normal ARRAY argument. - // GPDB_93_MERGE_FIXME: Fix ORCA to pass the 'funcvariadic' flag through - // the planning. - GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature, - GPOS_WSZ_LIT("VARIADIC argument")); - } - - // create the DXL node holding the scalar funcexpr + // create the DXL node holding the scalar funcexpr. CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode( m_mp, GPOS_NEW(m_mp) CDXLScalarFuncExpr( m_mp, mdid_func, GPOS_NEW(m_mp) CMDIdGPDB(IMDId::EmdidGeneral, func_expr->funcresulttype), - type_modifier, func_expr->funcretset, static_cast<INT>(func_expr->funcformat))); + type_modifier, func_expr->funcretset, static_cast<INT>(func_expr->funcformat), func_expr->funcvariadic)); const IMDFunction *md_func = m_md_accessor->RetrieveFunc(mdid_func); if (IMDFunction::EfsVolatile == md_func->GetFuncStability()) diff --git a/src/backend/gporca/data/dxl/minidump/VariadicFlagWithFormatQuery.mdp b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithFormatQuery.mdp new file mode 100644 index 0000000000..fb28fedc75 --- /dev/null +++ b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithFormatQuery.mdp @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="UTF-8"?> +<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/"> + <dxl:Comment><![CDATA[ + Objective: Check if ORCA generates correct plan, if for a function expression, + variadic flag is true using FORMAT query + + explain SELECT format('%s %s', VARIADIC ARRAY['first', 'second']); + QUERY PLAN + ------------------------------------------ + Result (cost=0.00..0.00 rows=1 width=1) + Optimizer: Pivotal Optimizer (GPORCA) + (2 rows)) + ]]> + </dxl:Comment> + <dxl:Thread Id="0"> + <dxl:OptimizerConfig> + <dxl:EnumeratorConfig Id="0" PlanSamples="0" CostThreshold="0"/> + <dxl:StatisticsConfig DampingFactorFilter="0.750000" DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" MaxStatsBuckets="100"/> + <dxl:CTEConfig CTEInliningCutoff="0"/> + <dxl:WindowOids RowNumber="3100" Rank="3101"/> + <dxl:CostModelConfig CostModelType="1" SegmentsForCosting="3"> + <dxl:CostParams> + <dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/> + </dxl:CostParams> + </dxl:CostModelConfig> + <dxl:Hint JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="20" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10" XformBindThreshold="0" SkewFactor="0"/> + <dxl:TraceFlags Value="101013,102001,102002,102003,102043,102074,102120,102144,103001,103003,103014,103022,103026,103027,103029,103033,103038,103040,104002,104003,104004,104005,106000"/> + </dxl:OptimizerConfig> + <dxl:Metadata SystemIds="0.GPDB"> + <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.2222.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/> + <dxl:EqualityOp Mdid="0.91.1.0"/> + <dxl:InequalityOp Mdid="0.85.1.0"/> + <dxl:LessThanOp Mdid="0.58.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.1694.1.0"/> + <dxl:GreaterThanOp Mdid="0.59.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.1695.1.0"/> + <dxl:ComparisonOp Mdid="0.1693.1.0"/> + <dxl:ArrayType Mdid="0.1000.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.25.1.0" Name="text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="true" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.1995.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7105.1.0"/> + <dxl:EqualityOp Mdid="0.98.1.0"/> + <dxl:InequalityOp Mdid="0.531.1.0"/> + <dxl:LessThanOp Mdid="0.664.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.665.1.0"/> + <dxl:GreaterThanOp Mdid="0.666.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.667.1.0"/> + <dxl:ComparisonOp Mdid="0.360.1.0"/> + <dxl:ArrayType Mdid="0.1009.1.0"/> + <dxl:MinAgg Mdid="0.2145.1.0"/> + <dxl:MaxAgg Mdid="0.2129.1.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:GPDBFunc Mdid="0.3539.1.0" Name="format" ReturnsSet="false" Stability="Stable" DataAccess="NoSQL" IsStrict="false" IsNDVPreserving="false" IsAllowedForPS="false"> + <dxl:ResultType Mdid="0.25.1.0"/> + </dxl:GPDBFunc> + <dxl:Type Mdid="0.1009.1.0" Name="_text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.627.1.0"/> + <dxl:EqualityOp Mdid="0.1070.1.0"/> + <dxl:InequalityOp Mdid="0.1071.1.0"/> + <dxl:LessThanOp Mdid="0.1072.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.1074.1.0"/> + <dxl:GreaterThanOp Mdid="0.1073.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.1075.1.0"/> + <dxl:ComparisonOp Mdid="0.382.1.0"/> + <dxl:ArrayType Mdid="0.0.0.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + </dxl:Metadata> + <dxl:Query> + <dxl:OutputColumns> + <dxl:Ident ColId="2" ColName="format" TypeMdid="0.25.1.0"/> + </dxl:OutputColumns> + <dxl:CTEList/> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="2" Alias="format"> + <dxl:FuncExpr FuncId="0.3539.1.0" FuncRetSet="false" TypeMdid="0.25.1.0" FuncVariadic="true"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAACSVzICVz" LintValue="2338443864"/> + <dxl:ConstValue TypeMdid="0.1009.1.0" Value="AAAAMAEAAAAAAAAAGQAAAAIAAAABAAAAAAAACWZpcnN0AAAAAAAACnNlY29u ZAAA"/> + </dxl:FuncExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalConstTable> + <dxl:Columns> + <dxl:Column ColId="1" Attno="1" ColName="" TypeMdid="0.16.1.0"/> + </dxl:Columns> + <dxl:ConstTuple> + <dxl:Datum TypeMdid="0.16.1.0" Value="true"/> + </dxl:ConstTuple> + </dxl:LogicalConstTable> + </dxl:LogicalProject> + </dxl:Query> + <dxl:Plan Id="0" SpaceSize="2"> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000109" Rows="1.000000" Width="8"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="1" Alias="format"> + <dxl:FuncExpr FuncId="0.3539.1.0" FuncRetSet="false" TypeMdid="0.25.1.0" FuncVariadic="true"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAACSVzICVz" LintValue="2338443864"/> + <dxl:ConstValue TypeMdid="0.1009.1.0" Value="AAAAMAEAAAAAAAAAGQAAAAIAAAABAAAAAAAACWZpcnN0AAAAAAAACnNlY29u ZAAA"/> + </dxl:FuncExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000001" Rows="1.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="0" Alias=""> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + </dxl:Result> + </dxl:Result> + </dxl:Plan> + </dxl:Thread> +</dxl:DXLMessage> diff --git a/src/backend/gporca/data/dxl/minidump/VariadicFlagWithJson.mdp b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithJson.mdp new file mode 100644 index 0000000000..a40bd9a88c --- /dev/null +++ b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithJson.mdp @@ -0,0 +1,343 @@ +<?xml version="1.0" encoding="UTF-8"?> +<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/"> + <dxl:Comment><![CDATA[ + Objective: Check if ORCA generates correct plan, if for a function expression, variadic flag is true + + create table foo (a int,b int, c_json json); + insert into foo values (1,1,'{"1":"10"}'); + insert into foo values (2,2,'{"2":"20"}'); + insert into foo values (3,3,'{"3":"30"}'); + explain select *, (json_extract_path_text(c_json, '1')) AS jsonValues from foo; + QUERY PLAN + ------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=24) + -> Seq Scan on foo (cost=0.00..431.00 rows=1 width=16) + Optimizer: Pivotal Optimizer (GPORCA) + (3 rows) + ]]> + </dxl:Comment> + <dxl:Thread Id="0"> + <dxl:OptimizerConfig> + <dxl:EnumeratorConfig Id="0" PlanSamples="0" CostThreshold="0"/> + <dxl:StatisticsConfig DampingFactorFilter="0.750000" DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" MaxStatsBuckets="100"/> + <dxl:CTEConfig CTEInliningCutoff="0"/> + <dxl:WindowOids RowNumber="3100" Rank="3101"/> + <dxl:CostModelConfig CostModelType="1" SegmentsForCosting="3"> + <dxl:CostParams> + <dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/> + </dxl:CostParams> + </dxl:CostModelConfig> + <dxl:Hint JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="20" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10" XformBindThreshold="0" SkewFactor="0"/> + <dxl:TraceFlags Value="101013,102001,102002,102003,102043,102074,102120,102144,103001,103014,103022,103026,103027,103029,103033,103038,103040,104002,104003,104004,104005,106000"/> + </dxl:OptimizerConfig> + <dxl:Metadata SystemIds="0.GPDB"> + <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.2222.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/> + <dxl:EqualityOp Mdid="0.91.1.0"/> + <dxl:InequalityOp Mdid="0.85.1.0"/> + <dxl:LessThanOp Mdid="0.58.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.1694.1.0"/> + <dxl:GreaterThanOp Mdid="0.59.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.1695.1.0"/> + <dxl:ComparisonOp Mdid="0.1693.1.0"/> + <dxl:ArrayType Mdid="0.1000.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.23.1.0" Name="int4" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.1977.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7100.1.0"/> + <dxl:EqualityOp Mdid="0.96.1.0"/> + <dxl:InequalityOp Mdid="0.518.1.0"/> + <dxl:LessThanOp Mdid="0.97.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.523.1.0"/> + <dxl:GreaterThanOp Mdid="0.521.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.525.1.0"/> + <dxl:ComparisonOp Mdid="0.351.1.0"/> + <dxl:ArrayType Mdid="0.1007.1.0"/> + <dxl:MinAgg Mdid="0.2132.1.0"/> + <dxl:MaxAgg Mdid="0.2116.1.0"/> + <dxl:AvgAgg Mdid="0.2101.1.0"/> + <dxl:SumAgg Mdid="0.2108.1.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.25.1.0" Name="text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="true" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.1995.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7105.1.0"/> + <dxl:EqualityOp Mdid="0.98.1.0"/> + <dxl:InequalityOp Mdid="0.531.1.0"/> + <dxl:LessThanOp Mdid="0.664.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.665.1.0"/> + <dxl:GreaterThanOp Mdid="0.666.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.667.1.0"/> + <dxl:ComparisonOp Mdid="0.360.1.0"/> + <dxl:ArrayType Mdid="0.1009.1.0"/> + <dxl:MinAgg Mdid="0.2145.1.0"/> + <dxl:MaxAgg Mdid="0.2129.1.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:ColumnStatistics Mdid="1.16385.1.0.0" Name="a" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:Type Mdid="0.26.1.0" Name="oid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.1990.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7109.1.0"/> + <dxl:EqualityOp Mdid="0.607.1.0"/> + <dxl:InequalityOp Mdid="0.608.1.0"/> + <dxl:LessThanOp Mdid="0.609.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.611.1.0"/> + <dxl:GreaterThanOp Mdid="0.610.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.612.1.0"/> + <dxl:ComparisonOp Mdid="0.356.1.0"/> + <dxl:ArrayType Mdid="0.1028.1.0"/> + <dxl:MinAgg Mdid="0.2134.1.0"/> + <dxl:MaxAgg Mdid="0.2118.1.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.27.1.0" Name="tid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="6" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.2227.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7110.1.0"/> + <dxl:EqualityOp Mdid="0.387.1.0"/> + <dxl:InequalityOp Mdid="0.402.1.0"/> + <dxl:LessThanOp Mdid="0.2799.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.2801.1.0"/> + <dxl:GreaterThanOp Mdid="0.2800.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.2802.1.0"/> + <dxl:ComparisonOp Mdid="0.2794.1.0"/> + <dxl:ArrayType Mdid="0.1010.1.0"/> + <dxl:MinAgg Mdid="0.2798.1.0"/> + <dxl:MaxAgg Mdid="0.2797.1.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.29.1.0" Name="cid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.2226.1.0"/> + <dxl:EqualityOp Mdid="0.385.1.0"/> + <dxl:InequalityOp Mdid="0.0.0.0"/> + <dxl:LessThanOp Mdid="0.0.0.0"/> + <dxl:LessThanEqualsOp Mdid="0.0.0.0"/> + <dxl:GreaterThanOp Mdid="0.0.0.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.0.0.0"/> + <dxl:ComparisonOp Mdid="0.0.0.0"/> + <dxl:ArrayType Mdid="0.1012.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.28.1.0" Name="xid" IsRedistributable="true" IsHashable="true" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="4" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.2225.1.0"/> + <dxl:EqualityOp Mdid="0.352.1.0"/> + <dxl:InequalityOp Mdid="0.3315.1.0"/> + <dxl:LessThanOp Mdid="0.0.0.0"/> + <dxl:LessThanEqualsOp Mdid="0.0.0.0"/> + <dxl:GreaterThanOp Mdid="0.0.0.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.0.0.0"/> + <dxl:ComparisonOp Mdid="0.0.0.0"/> + <dxl:ArrayType Mdid="0.1011.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:RelationStatistics Mdid="2.16385.1.0" Name="foo" Rows="0.000000" RelPages="0" RelAllVisible="0" EmptyRelation="true"/> + <dxl:Relation Mdid="6.16385.1.0" Name="foo" IsTemporary="false" StorageType="Heap" DistributionPolicy="Hash" DistributionColumns="0" Keys="9,3"> + <dxl:Columns> + <dxl:Column Name="a" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="b" Attno="2" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="c_json" Attno="3" Mdid="0.114.1.0" Nullable="true" ColWidth="8"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="ctid" Attno="-1" Mdid="0.27.1.0" Nullable="false" ColWidth="6"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="xmin" Attno="-2" Mdid="0.28.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="cmin" Attno="-3" Mdid="0.29.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="xmax" Attno="-4" Mdid="0.28.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="cmax" Attno="-5" Mdid="0.29.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="tableoid" Attno="-6" Mdid="0.26.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + <dxl:Column Name="gp_segment_id" Attno="-7" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> + <dxl:DefaultValue/> + </dxl:Column> + </dxl:Columns> + <dxl:IndexInfoList/> + <dxl:CheckConstraints/> + <dxl:DistrOpfamilies> + <dxl:DistrOpfamily Mdid="0.1977.1.0"/> + </dxl:DistrOpfamilies> + </dxl:Relation> + <dxl:ColumnStatistics Mdid="1.16385.1.0.2" Name="c_json" Width="8.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:RelationExtendedStatistics Mdid="10.16385.1.0" Name="foo"/> + <dxl:Type Mdid="0.1009.1.0" Name="_text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.627.1.0"/> + <dxl:EqualityOp Mdid="0.1070.1.0"/> + <dxl:InequalityOp Mdid="0.1071.1.0"/> + <dxl:LessThanOp Mdid="0.1072.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.1074.1.0"/> + <dxl:GreaterThanOp Mdid="0.1073.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.1075.1.0"/> + <dxl:ComparisonOp Mdid="0.382.1.0"/> + <dxl:ArrayType Mdid="0.0.0.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:GPDBFunc Mdid="0.3953.1.0" Name="json_extract_path_text" ReturnsSet="false" Stability="Immutable" DataAccess="NoSQL" IsStrict="true" IsNDVPreserving="false" IsAllowedForPS="false"> + <dxl:ResultType Mdid="0.25.1.0"/> + </dxl:GPDBFunc> + <dxl:Type Mdid="0.114.1.0" Name="json" IsRedistributable="false" IsHashable="false" IsMergeJoinable="false" IsComposite="false" IsTextRelated="false" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:EqualityOp Mdid="0.0.0.0"/> + <dxl:InequalityOp Mdid="0.0.0.0"/> + <dxl:LessThanOp Mdid="0.0.0.0"/> + <dxl:LessThanEqualsOp Mdid="0.0.0.0"/> + <dxl:GreaterThanOp Mdid="0.0.0.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.0.0.0"/> + <dxl:ComparisonOp Mdid="0.0.0.0"/> + <dxl:ArrayType Mdid="0.199.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + </dxl:Metadata> + <dxl:Query> + <dxl:OutputColumns> + <dxl:Ident ColId="1" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="2" ColName="b" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="3" ColName="c_json" TypeMdid="0.114.1.0"/> + <dxl:Ident ColId="11" ColName="jsonvalues" TypeMdid="0.25.1.0"/> + </dxl:OutputColumns> + <dxl:CTEList/> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="11" Alias="jsonvalues"> + <dxl:FuncExpr FuncId="0.3953.1.0" FuncRetSet="false" TypeMdid="0.25.1.0" FuncVariadic="true"> + <dxl:Ident ColId="3" ColName="c_json" TypeMdid="0.114.1.0"/> + <dxl:ConstValue TypeMdid="0.1009.1.0" Value="AAAAIAEAAAAAAAAAGQAAAAEAAAABAAAAAAAABTEAAAA="/> + </dxl:FuncExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalGet> + <dxl:TableDescriptor Mdid="6.16385.1.0" TableName="foo" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="1" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="2" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="3" Attno="3" ColName="c_json" TypeMdid="0.114.1.0" ColWidth="8"/> + <dxl:Column ColId="4" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="5" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="6" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="7" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="8" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="9" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="10" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:LogicalGet> + </dxl:LogicalProject> + </dxl:Query> + <dxl:Plan Id="0" SpaceSize="2"> + <dxl:GatherMotion InputSegments="0,1,2" OutputSegments="-1"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000149" Rows="1.000000" Width="24"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="0" Alias="a"> + <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="2" Alias="c_json"> + <dxl:Ident ColId="2" ColName="c_json" TypeMdid="0.114.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="10" Alias="jsonvalues"> + <dxl:Ident ColId="10" ColName="jsonvalues" TypeMdid="0.25.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:SortingColumnList/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000060" Rows="1.000000" Width="24"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="0" Alias="a"> + <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="2" Alias="c_json"> + <dxl:Ident ColId="2" ColName="c_json" TypeMdid="0.114.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="10" Alias="jsonvalues"> + <dxl:FuncExpr FuncId="0.3953.1.0" FuncRetSet="false" TypeMdid="0.25.1.0" FuncVariadic="true"> + <dxl:Ident ColId="2" ColName="c_json" TypeMdid="0.114.1.0"/> + <dxl:ConstValue TypeMdid="0.1009.1.0" Value="AAAAIAEAAAAAAAAAGQAAAAEAAAABAAAAAAAABTEAAAA="/> + </dxl:FuncExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000008" Rows="1.000000" Width="16"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="0" Alias="a"> + <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="2" Alias="c_json"> + <dxl:Ident ColId="2" ColName="c_json" TypeMdid="0.114.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="6.16385.1.0" TableName="foo" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="2" Attno="3" ColName="c_json" TypeMdid="0.114.1.0" ColWidth="8"/> + <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="4" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="5" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="6" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="7" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="8" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="9" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:TableScan> + </dxl:Result> + </dxl:GatherMotion> + </dxl:Plan> + </dxl:Thread> +</dxl:DXLMessage> diff --git a/src/backend/gporca/data/dxl/minidump/VariadicFlagWithUnionAll.mdp b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithUnionAll.mdp new file mode 100644 index 0000000000..18fc92f01d --- /dev/null +++ b/src/backend/gporca/data/dxl/minidump/VariadicFlagWithUnionAll.mdp @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="UTF-8"?> +<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/"> + <dxl:Comment><![CDATA[ + Objective: Check if ORCA generates correct plan, + using union all of 2 FORMAT queries with variadic flag true & false + + explain select format('|%20s|', 'ten') union all select format('|%10s%10s|', variadic array['first', 'second']); + QUERY PLAN + ------------------------------------------------ + Append (cost=0.00..0.00 rows=2 width=8) + -> Result (cost=0.00..0.00 rows=1 width=1) + -> Result (cost=0.00..0.00 rows=1 width=1) + Optimizer: Pivotal Optimizer (GPORCA) + (4 rows) + + select format('|%20s|', 'ten') union all select format('|%10s%10s|', variadic array['first', 'second']); + format + ------------------------ + | ten| + | first second| + (2 rows) + ]]> + </dxl:Comment> + <dxl:Thread Id="0"> + <dxl:OptimizerConfig> + <dxl:EnumeratorConfig Id="0" PlanSamples="0" CostThreshold="0"/> + <dxl:StatisticsConfig DampingFactorFilter="0.750000" DampingFactorJoin="0.000000" DampingFactorGroupBy="0.750000" MaxStatsBuckets="100"/> + <dxl:CTEConfig CTEInliningCutoff="0"/> + <dxl:WindowOids RowNumber="3100" Rank="3101"/> + <dxl:CostModelConfig CostModelType="1" SegmentsForCosting="3"> + <dxl:CostParams> + <dxl:CostParam Name="NLJFactor" Value="1024.000000" LowerBound="1023.500000" UpperBound="1024.500000"/> + </dxl:CostParams> + </dxl:CostModelConfig> + <dxl:Hint JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="20" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10" XformBindThreshold="0" SkewFactor="0"/> + <dxl:TraceFlags Value="101013,102001,102002,102003,102043,102074,102120,102144,103001,103003,103014,103022,103026,103027,103029,103033,103038,103040,104002,104003,104004,104005,106000"/> + </dxl:OptimizerConfig> + <dxl:Metadata SystemIds="0.GPDB"> + <dxl:Type Mdid="0.16.1.0" Name="bool" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="1" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.2222.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7124.1.0"/> + <dxl:EqualityOp Mdid="0.91.1.0"/> + <dxl:InequalityOp Mdid="0.85.1.0"/> + <dxl:LessThanOp Mdid="0.58.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.1694.1.0"/> + <dxl:GreaterThanOp Mdid="0.59.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.1695.1.0"/> + <dxl:ComparisonOp Mdid="0.1693.1.0"/> + <dxl:ArrayType Mdid="0.1000.1.0"/> + <dxl:MinAgg Mdid="0.0.0.0"/> + <dxl:MaxAgg Mdid="0.0.0.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + <dxl:Type Mdid="0.25.1.0" Name="text" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="true" IsFixedLength="false" Length="-1" PassByValue="false"> + <dxl:DistrOpfamily Mdid="0.1995.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7105.1.0"/> + <dxl:EqualityOp Mdid="0.98.1.0"/> + <dxl:InequalityOp Mdid="0.531.1.0"/> + <dxl:LessThanOp Mdid="0.664.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.665.1.0"/> + <dxl:GreaterThanOp Mdid="0.666.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.667.1.0"/> + <dxl:ComparisonOp Mdid="0.360.1.0"/> + <dxl:ArrayType Mdid="0.1009.1.0"/> + <dxl:MinAgg Mdid="0.2145.1.0"/> + <dxl:MaxAgg Mdid="0.2129.1.0"/> + <dxl:AvgAgg Mdid="0.0.0.0"/> + <dxl:SumAgg Mdid="0.0.0.0"/> + <dxl:CountAgg Mdid="0.2147.1.0"/> + </dxl:Type> + </dxl:Metadata> + <dxl:Query> + <dxl:OutputColumns> + <dxl:Ident ColId="2" ColName="format" TypeMdid="0.25.1.0"/> + </dxl:OutputColumns> + <dxl:CTEList/> + <dxl:UnionAll InputColumns="2;4" CastAcrossInputs="false"> + <dxl:Columns> + <dxl:Column ColId="2" Attno="1" ColName="format" TypeMdid="0.25.1.0"/> + </dxl:Columns> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="2" Alias="format"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAGnwgICAgICAgICAgICAgICAgIHRlbnw=" LintValue="3819016131"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalConstTable> + <dxl:Columns> + <dxl:Column ColId="1" Attno="1" ColName="" TypeMdid="0.16.1.0"/> + </dxl:Columns> + <dxl:ConstTuple> + <dxl:Datum TypeMdid="0.16.1.0" Value="true"/> + </dxl:ConstTuple> + </dxl:LogicalConstTable> + </dxl:LogicalProject> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="4" Alias="format"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAGnwgICAgIGZpcnN0ICAgIHNlY29uZHw=" LintValue="2009583676"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalConstTable> + <dxl:Columns> + <dxl:Column ColId="3" Attno="1" ColName="" TypeMdid="0.16.1.0"/> + </dxl:Columns> + <dxl:ConstTuple> + <dxl:Datum TypeMdid="0.16.1.0" Value="true"/> + </dxl:ConstTuple> + </dxl:LogicalConstTable> + </dxl:LogicalProject> + </dxl:UnionAll> + </dxl:Query> + <dxl:Plan Id="0" SpaceSize="2"> + <dxl:Append IsTarget="false" IsZapped="false"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000034" Rows="2.000000" Width="8"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="1" Alias="format"> + <dxl:Ident ColId="1" ColName="format" TypeMdid="0.25.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000009" Rows="1.000000" Width="8"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="1" Alias="format"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAGnwgICAgICAgICAgICAgICAgIHRlbnw=" LintValue="3819016131"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000001" Rows="1.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="0" Alias=""> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + </dxl:Result> + </dxl:Result> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000009" Rows="1.000000" Width="8"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="3" Alias="format"> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAGnwgICAgIGZpcnN0ICAgIHNlY29uZHw=" LintValue="2009583676"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="0.000001" Rows="1.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="2" Alias=""> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + </dxl:Result> + </dxl:Result> + </dxl:Append> + </dxl:Plan> + </dxl:Thread> +</dxl:DXLMessage> diff --git a/src/backend/gporca/data/dxl/parse_tests/q14-FuncExpr-NoArg.xml b/src/backend/gporca/data/dxl/parse_tests/q14-FuncExpr-NoArg.xml index cf098ed791..1abc11bd8e 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q14-FuncExpr-NoArg.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q14-FuncExpr-NoArg.xml @@ -16,7 +16,7 @@ <dxl:Filter> <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0"> <dxl:Ident ColId="1" ColName="A" TypeMdid="0.23.1.0"/> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:Comparison> </dxl:Filter> <dxl:TableDescriptor Mdid="6.1234.1.1" TableName="R"> diff --git a/src/backend/gporca/data/dxl/parse_tests/q15-FuncExpr-WithArgs.xml b/src/backend/gporca/data/dxl/parse_tests/q15-FuncExpr-WithArgs.xml index a913cf3ebc..3318e32b60 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q15-FuncExpr-WithArgs.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q15-FuncExpr-WithArgs.xml @@ -16,7 +16,7 @@ <dxl:Filter> <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0"> <dxl:Ident ColId="1" ColName="A" TypeMdid="0.23.1.0"/> - <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> + <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> <dxl:Ident ColId="2" ColName="B" TypeMdid="0.23.1.0"/> <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/> </dxl:FuncExpr> diff --git a/src/backend/gporca/data/dxl/parse_tests/q16-FuncExpr-WithNestedFuncExpr.xml b/src/backend/gporca/data/dxl/parse_tests/q16-FuncExpr-WithNestedFuncExpr.xml index d0ce88349b..807dcf5673 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q16-FuncExpr-WithNestedFuncExpr.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q16-FuncExpr-WithNestedFuncExpr.xml @@ -7,11 +7,11 @@ </dxl:Properties> <dxl:ProjList> <dxl:ProjElem ColId="3" Alias="pow"> - <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> - <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> + <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> + <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> <dxl:Ident ColId="2" ColName="b" TypeMdid="0.23.1.0"/> </dxl:FuncExpr> - <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> + <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> <dxl:Ident ColId="1" ColName="a" TypeMdid="0.23.1.0"/> </dxl:FuncExpr> </dxl:FuncExpr> diff --git a/src/backend/gporca/data/dxl/parse_tests/q26-Metadata.xml b/src/backend/gporca/data/dxl/parse_tests/q26-Metadata.xml index 6c1f6f38c5..71f3156480 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q26-Metadata.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q26-Metadata.xml @@ -44,7 +44,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> @@ -64,7 +64,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> @@ -95,7 +95,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> @@ -132,7 +132,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> @@ -148,7 +148,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> @@ -387,7 +387,7 @@ <dxl:Columns> <dxl:Column Name="A" Attno="1" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> <dxl:DefaultValue> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:DefaultValue> </dxl:Column> <dxl:Column Name="B" Attno="2" Mdid="0.23.1.0" Nullable="false" ColWidth="4"> diff --git a/src/backend/gporca/data/dxl/parse_tests/q31-LogicalLimit.xml b/src/backend/gporca/data/dxl/parse_tests/q31-LogicalLimit.xml index 34ae9a184c..ae0c0f6c4b 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q31-LogicalLimit.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q31-LogicalLimit.xml @@ -9,13 +9,13 @@ <dxl:LogicalLimit> <dxl:SortingColumnList/> <dxl:LimitCount> - <dxl:FuncExpr FuncId="0.481.1.0" FuncRetSet="false" TypeMdid="0.20.1.0"> + <dxl:FuncExpr FuncId="0.481.1.0" FuncRetSet="false" TypeMdid="0.20.1.0" FuncVariadic="false"> <dxl:ConstValue TypeMdid="0.23.1.0" Value="100"/> </dxl:FuncExpr> </dxl:LimitCount> <dxl:LimitOffset> - <dxl:FuncExpr FuncId="0.483.1.0" FuncRetSet="false" TypeMdid="0.20.1.0"> - <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"/> + <dxl:FuncExpr FuncId="0.483.1.0" FuncRetSet="false" TypeMdid="0.20.1.0" FuncVariadic="false"> + <dxl:FuncExpr FuncId="0.1598.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"/> </dxl:FuncExpr> </dxl:LimitOffset> <dxl:LogicalGet> diff --git a/src/backend/gporca/data/dxl/parse_tests/q69-ArrayRef2.xml b/src/backend/gporca/data/dxl/parse_tests/q69-ArrayRef2.xml index 77874e343c..ec69948366 100644 --- a/src/backend/gporca/data/dxl/parse_tests/q69-ArrayRef2.xml +++ b/src/backend/gporca/data/dxl/parse_tests/q69-ArrayRef2.xml @@ -80,14 +80,14 @@ <dxl:ConstValue TypeMdid="0.1009.1.0" Value="AAAAEAAAAAAAAAAAGQAAAA=="/> </dxl:ProjElem> <dxl:ProjElem ColId="6" Alias="f"> - <dxl:FuncExpr FuncId="0.1291.1.0" FuncRetSet="false" TypeMdid="0.1014.1.0"> + <dxl:FuncExpr FuncId="0.1291.1.0" FuncRetSet="false" TypeMdid="0.1014.1.0" FuncVariadic="false"> <dxl:ConstValue TypeMdid="0.1014.1.0" Value="AAAAEAAAAAAAAAAAEgQAAA=="/> <dxl:ConstValue TypeMdid="0.23.1.0" Value="9"/> <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/> </dxl:FuncExpr> </dxl:ProjElem> <dxl:ProjElem ColId="7" Alias="g"> - <dxl:FuncExpr FuncId="0.1291.1.0" FuncRetSet="false" TypeMdid="0.1015.1.0"> + <dxl:FuncExpr FuncId="0.1291.1.0" FuncRetSet="false" TypeMdid="0.1015.1.0" FuncVariadic="false"> <dxl:ConstValue TypeMdid="0.1015.1.0" Value="AAAAEAAAAAAAAAAAEwQAAA=="/> <dxl:ConstValue TypeMdid="0.23.1.0" Value="9"/> <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/> diff --git a/src/backend/gporca/data/dxl/parse_tests/s02-NestedFuncExpr.xml b/src/backend/gporca/data/dxl/parse_tests/s02-NestedFuncExpr.xml index 44ddf80035..9b3ddc7be2 100644 --- a/src/backend/gporca/data/dxl/parse_tests/s02-NestedFuncExpr.xml +++ b/src/backend/gporca/data/dxl/parse_tests/s02-NestedFuncExpr.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/"> <dxl:ScalarExpr> - <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> - <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> + <dxl:FuncExpr FuncId="0.1346.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> + <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> <dxl:ConstValue TypeMdid="0.23.1.0" Value="222"/> </dxl:FuncExpr> - <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0"> + <dxl:FuncExpr FuncId="0.316.1.0" FuncRetSet="false" TypeMdid="0.701.1.0" FuncVariadic="false"> <dxl:ConstValue TypeMdid="0.23.1.0" Value="333"/> </dxl:FuncExpr> </dxl:FuncExpr> diff --git a/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarFunc.h b/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarFunc.h index 1a89ced830..a00b38f1f7 100644 --- a/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarFunc.h +++ b/src/backend/gporca/libgpopt/include/gpopt/operators/CScalarFunc.h @@ -59,6 +59,10 @@ protected: // how to display function expr INT m_func_format; + // It is true if in the function, variadic arguments have been + // combined into an array last argument + BOOL m_funcvariadic; + private: public: CScalarFunc(const CScalarFunc &) = delete; @@ -67,7 +71,8 @@ public: // ctor CScalarFunc(CMemoryPool *mp, IMDId *mdid_func, IMDId *mdid_return_type, - INT return_type_modifier, const CWStringConst *pstrFunc, INT func_format); + INT return_type_modifier, const CWStringConst *pstrFunc, + INT func_format, BOOL funcvariadic); // dtor ~CScalarFunc() override; @@ -156,7 +161,8 @@ public: // how to display function expr INT FuncFormat() const; - + // Is variadic flag set + BOOL IsFuncVariadic() const; }; // class CScalarFunc } // namespace gpopt diff --git a/src/backend/gporca/libgpopt/src/operators/COrderedAggPreprocessor.cpp b/src/backend/gporca/libgpopt/src/operators/COrderedAggPreprocessor.cpp index 7109f21bae..b340db691d 100644 --- a/src/backend/gporca/libgpopt/src/operators/COrderedAggPreprocessor.cpp +++ b/src/backend/gporca/libgpopt/src/operators/COrderedAggPreprocessor.cpp @@ -290,7 +290,7 @@ COrderedAggPreprocessor::SplitPrjList( // Is it necessary to keep `m_func_format` in `CScalarFunc`? CScalarFunc *popCastScalarFunc = GPOS_NEW(mp) CScalarFunc( mp, mdid_func, cast_func->GetResultTypeMdid(), -1, pstrFunc, - 1 /* Explicit Cast */); + 1 /* Explicit Cast */, false /* funcvariadic */); CExpression *pexprCastScalarIdent = GPOS_NEW(mp) CExpression(mp, popCastScalarFunc, pexprScalarIdentSum); CExpressionArray *colref_array1 = GPOS_NEW(mp) CExpressionArray(mp); diff --git a/src/backend/gporca/libgpopt/src/operators/CScalarFunc.cpp b/src/backend/gporca/libgpopt/src/operators/CScalarFunc.cpp index 01a58586ff..7eb48694ce 100644 --- a/src/backend/gporca/libgpopt/src/operators/CScalarFunc.cpp +++ b/src/backend/gporca/libgpopt/src/operators/CScalarFunc.cpp @@ -56,7 +56,8 @@ CScalarFunc::CScalarFunc(CMemoryPool *mp) //--------------------------------------------------------------------------- CScalarFunc::CScalarFunc(CMemoryPool *mp, IMDId *mdid_func, IMDId *mdid_return_type, INT return_type_modifier, - const CWStringConst *pstrFunc, INT func_format) + const CWStringConst *pstrFunc, INT func_format, + BOOL funcvariadic) : CScalar(mp), m_func_mdid(mdid_func), m_return_type_mdid(mdid_return_type), @@ -65,7 +66,8 @@ CScalarFunc::CScalarFunc(CMemoryPool *mp, IMDId *mdid_func, m_returns_set(false), m_returns_null_on_null_input(false), m_fBoolReturnType(false), - m_func_format(func_format) + m_func_format(func_format), + m_funcvariadic(funcvariadic) { GPOS_ASSERT(mdid_func->IsValid()); GPOS_ASSERT(mdid_return_type->IsValid()); @@ -81,7 +83,6 @@ CScalarFunc::CScalarFunc(CMemoryPool *mp, IMDId *mdid_func, CMDAccessorUtils::FBoolType(md_accessor, m_return_type_mdid); } - //--------------------------------------------------------------------------- // @function: // CScalarFunc::~CScalarFunc @@ -257,6 +258,11 @@ CScalarFunc::Eber(ULongPtrArray *pdrgpulChildren) const return EberAny; } +BOOL +CScalarFunc::IsFuncVariadic() const +{ + return m_funcvariadic; +} // EOF diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp index fd35faef08..26384b1f0c 100644 --- a/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp +++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorDXLToExpr.cpp @@ -2991,7 +2991,8 @@ CTranslatorDXLToExpr::PexprScalarFunc(const CDXLNode *pdxlnFunc) pop = GPOS_NEW(m_mp) CScalarFunc( m_mp, mdid_func, mdid_return_type, pdxlopFuncExpr->TypeModifier(), GPOS_NEW(m_mp) CWStringConst( - m_mp, (pmdfunc->Mdname().GetMDName())->GetBuffer()), pdxlopFuncExpr->FuncFormat()); + m_mp, (pmdfunc->Mdname().GetMDName())->GetBuffer()), + pdxlopFuncExpr->FuncFormat(), pdxlopFuncExpr->IsFuncVariadic()); } CExpression *pexprFunc = nullptr; diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp index 1528acdf5c..f37400e322 100644 --- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp +++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp @@ -5609,7 +5609,7 @@ CTranslatorExprToDXL::PdxlnScFuncExpr(CExpression *pexprFunc) CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarFuncExpr( m_mp, mdid_func, mdid_return_type, popScFunc->TypeModifier(), pmdfunc->ReturnsSet(), - popScFunc->FuncFormat())); + popScFunc->FuncFormat(), popScFunc->IsFuncVariadic())); // translate children TranslateScalarChildren(pexprFunc, pdxlnFuncExpr); diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarFuncExpr.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarFuncExpr.h index 747a21ba4f..0b1a431079 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarFuncExpr.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLScalarFuncExpr.h @@ -48,13 +48,17 @@ private: // how to display function expr const INT m_func_format; + // true if in the function, variadic arguments have been + // combined into an array last argument + BOOL m_funcvariadic; + public: CDXLScalarFuncExpr(const CDXLScalarFuncExpr &) = delete; // ctor CDXLScalarFuncExpr(CMemoryPool *mp, IMDId *mdid_func, IMDId *mdid_return_type, INT return_type_modifier, - BOOL returns_set, INT func_format); + BOOL returns_set, INT func_format, BOOL funcvariadic); //dtor ~CDXLScalarFuncExpr() override; @@ -79,6 +83,9 @@ public: // how to display function expr INT FuncFormat() const; + // Is the variadic flag set + BOOL IsFuncVariadic() const; + // serialize operator in DXL format void SerializeToDXL(CXMLSerializer *xml_serializer, const CDXLNode *dxlnode) 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 7223cbbd10..417853e472 100644 --- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h +++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h @@ -394,6 +394,7 @@ enum Edxltoken EdxltokenFuncId, EdxltokenFuncRetSet, + EdxltokenFuncVariadic, EdxltokenSortOpId, diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp index 53d34950c4..2b068b9de7 100644 --- a/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp +++ b/src/backend/gporca/libnaucrates/src/operators/CDXLOperatorFactory.cpp @@ -1029,6 +1029,10 @@ CDXLOperatorFactory::MakeDXLFuncExpr(CDXLMemoryManager *dxl_memory_manager, EdxltokenFuncRetSet, EdxltokenScalarFuncExpr); + BOOL is_funcvariadic = ExtractConvertAttrValueToBool( + dxl_memory_manager, attrs, EdxltokenFuncVariadic, + EdxltokenScalarFuncExpr, true, false); + IMDId *mdid_return_type = ExtractConvertAttrValueToMdId( dxl_memory_manager, attrs, EdxltokenTypeId, EdxltokenScalarFuncExpr); @@ -1037,7 +1041,7 @@ CDXLOperatorFactory::MakeDXLFuncExpr(CDXLMemoryManager *dxl_memory_manager, default_type_modifier); return GPOS_NEW(mp) CDXLScalarFuncExpr(mp, mdid_func, mdid_return_type, - type_modifier, is_retset, 0); + type_modifier, is_retset, 0, is_funcvariadic); } //--------------------------------------------------------------------------- diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLScalarFuncExpr.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLScalarFuncExpr.cpp index 661893ce88..e157b6e8df 100644 --- a/src/backend/gporca/libnaucrates/src/operators/CDXLScalarFuncExpr.cpp +++ b/src/backend/gporca/libnaucrates/src/operators/CDXLScalarFuncExpr.cpp @@ -31,13 +31,15 @@ using namespace gpdxl; //--------------------------------------------------------------------------- CDXLScalarFuncExpr::CDXLScalarFuncExpr(CMemoryPool *mp, IMDId *mdid_func, IMDId *mdid_return_type, - INT return_type_modifier, BOOL fRetSet, INT func_format) + INT return_type_modifier, BOOL fRetSet, + INT func_format, BOOL funcvariadic) : CDXLScalar(mp), m_func_mdid(mdid_func), m_return_type_mdid(mdid_return_type), m_return_type_modifier(return_type_modifier), m_returns_set(fRetSet), - m_func_format(func_format) + m_func_format(func_format), + m_funcvariadic(funcvariadic) { GPOS_ASSERT(m_func_mdid->IsValid()); GPOS_ASSERT(m_return_type_mdid->IsValid()); @@ -133,6 +135,19 @@ CDXLScalarFuncExpr::ReturnsSet() const { return m_returns_set; } +//--------------------------------------------------------------------------- +// @function: +// CDXLScalarFuncExpr::IsFuncVariadic +// +// @doc: +// Returns whether the function is variadic +// +//--------------------------------------------------------------------------- +BOOL +CDXLScalarFuncExpr::IsFuncVariadic() const +{ + return m_funcvariadic; +} //--------------------------------------------------------------------------- // @function: @@ -170,6 +185,8 @@ CDXLScalarFuncExpr::SerializeToDXL(CXMLSerializer *xml_serializer, CDXLTokens::GetDXLTokenStr(EdxltokenFuncRetSet), m_returns_set); m_return_type_mdid->Serialize(xml_serializer, CDXLTokens::GetDXLTokenStr(EdxltokenTypeId)); + xml_serializer->AddAttribute( + CDXLTokens::GetDXLTokenStr(EdxltokenFuncVariadic), m_funcvariadic); if (default_type_modifier != TypeModifier()) { diff --git a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp index 7ba8de536d..b6d84db844 100644 --- a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp +++ b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp @@ -442,6 +442,8 @@ CDXLTokens::Init(CMemoryPool *mp) {EdxltokenFuncId, GPOS_WSZ_LIT("FuncId")}, {EdxltokenFuncRetSet, GPOS_WSZ_LIT("FuncRetSet")}, + {EdxltokenFuncVariadic, GPOS_WSZ_LIT("FuncVariadic")}, + {EdxltokenAlias, GPOS_WSZ_LIT("Alias")}, diff --git a/src/backend/gporca/server/CMakeLists.txt b/src/backend/gporca/server/CMakeLists.txt index e99e2f615b..23f50d93a5 100644 --- a/src/backend/gporca/server/CMakeLists.txt +++ b/src/backend/gporca/server/CMakeLists.txt @@ -168,7 +168,7 @@ CTAS-random-distributed-from-replicated-distributed-table ProjectRepeatedColumn1 ProjectRepeatedColumn2 NLJ-BC-Outer-Spool-Inner Self-Comparison Self-Comparison-Nullable SelectCheckConstraint ExpandJoinOrder SelectOnBpchar EqualityJoin EffectsOfJoinFilter InnerJoin-With-OuterRefs UDA-AnyElement-1 UDA-AnyElement-2 Project-With-NonScalar-Func SixWayDPv2 Join-Varchar-Equality NLJ-Rewindability -NLJ-Rewindability-CTAS DisableBroadcastThreshold; +NLJ-Rewindability-CTAS DisableBroadcastThreshold VariadicFlagWithJson VariadicFlagWithFormatQuery VariadicFlagWithUnionAll; CJoinPredTest: MultipleDampedPredJoinCardinality MultipleIndependentPredJoinCardinality MultiDistKeyJoinCardinality diff --git a/src/test/regress/expected/text.out b/src/test/regress/expected/text.out index bd5d0992d8..a7080ef22b 100644 --- a/src/test/regress/expected/text.out +++ b/src/test/regress/expected/text.out @@ -1,6 +1,7 @@ -- -- TEXT -- +set optimizer_trace_fallback to on; SELECT text 'this is a text string' = text 'this is a text string' AS true; true ------ @@ -467,3 +468,4 @@ select format('>>%2$*1$L<<', 0, 'Hello'); >>'Hello'<< (1 row) +set optimizer_trace_fallback to off; diff --git a/src/test/regress/expected/variadic_parameters.out b/src/test/regress/expected/variadic_parameters.out index fdec06d3e5..3d9792680b 100644 --- a/src/test/regress/expected/variadic_parameters.out +++ b/src/test/regress/expected/variadic_parameters.out @@ -62,3 +62,28 @@ select * from tfunc ('hello', 'morning'); drop table people; drop function tfunc(variadic char[]); +set optimizer_trace_fallback to on; +drop table if exists foo; +NOTICE: table "foo" does not exist, skipping +create table foo (a int,b int, c_json json); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Greenplum Database data distribution key for this table. +HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. +insert into foo values (1,1,'{"1":"10"}'); +insert into foo values (2,2,'{"2":"20"}'); +insert into foo values (3,3,'{"3":"30"}'); +select *, (json_extract_path_text(c_json, '1')) AS jsonValues from foo; + a | b | c_json | jsonvalues +---+---+------------+------------ + 2 | 2 | {"2":"20"} | + 3 | 3 | {"3":"30"} | + 1 | 1 | {"1":"10"} | 10 +(3 rows) + +select json_build_array(VARIADIC '{a,b,c}'::text[]); + json_build_array +------------------ + ["a", "b", "c"] +(1 row) + +drop table if exists foo; +set optimizer_trace_fallback to off; diff --git a/src/test/regress/sql/text.sql b/src/test/regress/sql/text.sql index 8a1c32721c..4366fc2107 100644 --- a/src/test/regress/sql/text.sql +++ b/src/test/regress/sql/text.sql @@ -1,7 +1,7 @@ -- -- TEXT -- - +set optimizer_trace_fallback to on; SELECT text 'this is a text string' = text 'this is a text string' AS true; SELECT text 'this is a text string' = text 'this is a text strin' AS false; @@ -127,3 +127,5 @@ select format('>>%-s<<', 'Hello'); select format('>>%10L<<', NULL); select format('>>%2$*1$L<<', NULL, 'Hello'); select format('>>%2$*1$L<<', 0, 'Hello'); + +set optimizer_trace_fallback to off; diff --git a/src/test/regress/sql/variadic_parameters.sql b/src/test/regress/sql/variadic_parameters.sql index 7ca21d9593..a658c87da5 100644 --- a/src/test/regress/sql/variadic_parameters.sql +++ b/src/test/regress/sql/variadic_parameters.sql @@ -33,3 +33,18 @@ select * from tfunc ('hello', 'morning'); drop table people; drop function tfunc(variadic char[]); + +set optimizer_trace_fallback to on; +drop table if exists foo; +create table foo (a int,b int, c_json json); +insert into foo values (1,1,'{"1":"10"}'); +insert into foo values (2,2,'{"2":"20"}'); +insert into foo values (3,3,'{"3":"30"}'); + +select *, (json_extract_path_text(c_json, '1')) AS jsonValues from foo; + +select json_build_array(VARIADIC '{a,b,c}'::text[]); + +drop table if exists foo; + +set optimizer_trace_fallback to off; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
