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&#10;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&#10;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]

Reply via email to