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 6ca10b905544360c770645acb7a0e7f02f3542a8 Author: David Kimura <[email protected]> AuthorDate: Mon Oct 3 16:21:52 2022 -0700 [ORCA] Avoid pushdown of predicate with set-returning function (#14201) Issue is that if a predicate with a set-returning function is pushed down then it can lead to bad execution because there exist cases where the below context cannot accept a set. Logic already existed to prevent such a case, but it wasn't sufficient. Following example demonstrates such a case: ```sql CREATE TABLE t(a int[]) ; INSERT INTO t VALUES (ARRAY[1, 2]); SELECT * FROM (SELECT unnest(t1.a) a_unnest FROM t t1, t t2) s WHERE a_unnest IS NOT NULL; ``` Also similarly, do not push down a filter through a projected column containing a subquery. --- .../minidump/JoinOnViewWithSetReturningColumn.mdp | 148 +++-- .../dxl/minidump/JoinWithSubqueryProjectColumn.mdp | 678 +++++++++++++++++++++ .../src/operators/CExpressionPreprocessor.cpp | 12 +- src/backend/gporca/server/CMakeLists.txt | 2 +- src/test/regress/expected/qp_subquery.out | 76 +++ .../regress/expected/qp_subquery_optimizer.out | 79 +++ .../regress/expected/qp_with_clause_optimizer.out | 18 - src/test/regress/sql/qp_subquery.sql | 34 ++ 8 files changed, 958 insertions(+), 89 deletions(-) diff --git a/src/backend/gporca/data/dxl/minidump/JoinOnViewWithSetReturningColumn.mdp b/src/backend/gporca/data/dxl/minidump/JoinOnViewWithSetReturningColumn.mdp index 6499730ff1..4ffbdba054 100644 --- a/src/backend/gporca/data/dxl/minidump/JoinOnViewWithSetReturningColumn.mdp +++ b/src/backend/gporca/data/dxl/minidump/JoinOnViewWithSetReturningColumn.mdp @@ -318,7 +318,7 @@ <dxl:Plan Id="0" SpaceSize="6"> <dxl:GatherMotion InputSegments="0,1,2" OutputSegments="-1"> <dxl:Properties> - <dxl:Cost StartupCost="0" TotalCost="862.000682" Rows="1.000000" Width="16"/> + <dxl:Cost StartupCost="0" TotalCost="862.000660" Rows="1.000000" Width="16"/> </dxl:Properties> <dxl:ProjList> <dxl:ProjElem ColId="18" Alias="x"> @@ -338,14 +338,11 @@ <dxl:SortingColumnList/> <dxl:Result> <dxl:Properties> - <dxl:Cost StartupCost="0" TotalCost="862.000622" Rows="1.000000" Width="16"/> + <dxl:Cost StartupCost="0" TotalCost="862.000600" Rows="1.000000" Width="16"/> </dxl:Properties> <dxl:ProjList> <dxl:ProjElem ColId="18" Alias="x"> - <dxl:FuncExpr FuncId="0.1067.1.0" FuncRetSet="true" TypeMdid="0.23.1.0"> - <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/> - <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> - </dxl:FuncExpr> + <dxl:Ident ColId="18" ColName="x" TypeMdid="0.23.1.0"/> </dxl:ProjElem> <dxl:ProjElem ColId="0" Alias="a"> <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> @@ -357,19 +354,27 @@ <dxl:Ident ColId="10" ColName="d" TypeMdid="0.23.1.0"/> </dxl:ProjElem> </dxl:ProjList> - <dxl:Filter/> + <dxl:Filter> + <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0"> + <dxl:Ident ColId="18" ColName="x" TypeMdid="0.23.1.0"/> + <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/> + </dxl:Comparison> + </dxl:Filter> <dxl:OneTimeFilter/> - <dxl:HashJoin JoinType="Inner"> + <dxl:Result> <dxl:Properties> - <dxl:Cost StartupCost="0" TotalCost="862.000583" Rows="1.000000" Width="16"/> + <dxl:Cost StartupCost="0" TotalCost="862.000589" Rows="1.000000" Width="16"/> </dxl:Properties> <dxl:ProjList> + <dxl:ProjElem ColId="18" Alias="x"> + <dxl:FuncExpr FuncId="0.1067.1.0" FuncRetSet="true" TypeMdid="0.23.1.0"> + <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:FuncExpr> + </dxl:ProjElem> <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="9" Alias="c"> <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/> </dxl:ProjElem> @@ -378,16 +383,10 @@ </dxl:ProjElem> </dxl:ProjList> <dxl:Filter/> - <dxl:JoinFilter/> - <dxl:HashCondList> - <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0"> - <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> - <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/> - </dxl:Comparison> - </dxl:HashCondList> - <dxl:TableScan> + <dxl:OneTimeFilter/> + <dxl:HashJoin JoinType="Inner"> <dxl:Properties> - <dxl:Cost StartupCost="0" TotalCost="431.000069" Rows="1.000000" Width="8"/> + <dxl:Cost StartupCost="0" TotalCost="862.000550" Rows="1.000000" Width="16"/> </dxl:Properties> <dxl:ProjList> <dxl:ProjElem ColId="0" Alias="a"> @@ -396,35 +395,6 @@ <dxl:ProjElem ColId="1" Alias="b"> <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> </dxl:ProjElem> - </dxl:ProjList> - <dxl:Filter> - <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0"> - <dxl:FuncExpr FuncId="0.1067.1.0" FuncRetSet="true" TypeMdid="0.23.1.0"> - <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/> - <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> - </dxl:FuncExpr> - <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/> - </dxl:Comparison> - </dxl:Filter> - <dxl:TableDescriptor Mdid="0.81920.1.0" TableName="foo" ExecuteAsUser="10" 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="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> - <dxl:Column ColId="3" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> - <dxl:Column ColId="4" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> - <dxl:Column ColId="5" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> - <dxl:Column ColId="6" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> - <dxl:Column ColId="7" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> - <dxl:Column ColId="8" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> - </dxl:Columns> - </dxl:TableDescriptor> - </dxl:TableScan> - <dxl:TableScan> - <dxl:Properties> - <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="1.000000" Width="8"/> - </dxl:Properties> - <dxl:ProjList> <dxl:ProjElem ColId="9" Alias="c"> <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/> </dxl:ProjElem> @@ -433,21 +403,69 @@ </dxl:ProjElem> </dxl:ProjList> <dxl:Filter/> - <dxl:TableDescriptor Mdid="0.81923.1.0" TableName="bar" ExecuteAsUser="10" LockMode="1"> - <dxl:Columns> - <dxl:Column ColId="9" Attno="1" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/> - <dxl:Column ColId="10" Attno="2" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/> - <dxl:Column ColId="11" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> - <dxl:Column ColId="12" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> - <dxl:Column ColId="13" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> - <dxl:Column ColId="14" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> - <dxl:Column ColId="15" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> - <dxl:Column ColId="16" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> - <dxl:Column ColId="17" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> - </dxl:Columns> - </dxl:TableDescriptor> - </dxl:TableScan> - </dxl:HashJoin> + <dxl:JoinFilter/> + <dxl:HashCondList> + <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0"> + <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:Comparison> + </dxl:HashCondList> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="1.000000" Width="8"/> + </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:ProjList> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="0.81920.1.0" TableName="foo" ExecuteAsUser="10" 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="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="3" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="4" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="5" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="6" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="7" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="8" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:TableScan> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="1.000000" Width="8"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="9" Alias="c"> + <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="10" Alias="d"> + <dxl:Ident ColId="10" ColName="d" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="0.81923.1.0" TableName="bar" ExecuteAsUser="10" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="9" Attno="1" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="10" Attno="2" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="11" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="12" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="13" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="14" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="15" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="16" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="17" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:TableScan> + </dxl:HashJoin> + </dxl:Result> </dxl:Result> </dxl:GatherMotion> </dxl:Plan> diff --git a/src/backend/gporca/data/dxl/minidump/JoinWithSubqueryProjectColumn.mdp b/src/backend/gporca/data/dxl/minidump/JoinWithSubqueryProjectColumn.mdp new file mode 100644 index 0000000000..b850b47cbd --- /dev/null +++ b/src/backend/gporca/data/dxl/minidump/JoinWithSubqueryProjectColumn.mdp @@ -0,0 +1,678 @@ +<?xml version="1.0" encoding="UTF-8"?> +<dxl:DXLMessage xmlns:dxl="http://greenplum.com/dxl/2010/12/"> + <dxl:Comment><![CDATA[ + Objective: Ensure that ORCA does not try to push down a filter through a + projected column containing a subquery + + Setup: + CREATE TABLE foo(a int, b int, c int); + CREATE TABLE bar(a int, b int, c int); + + EXPLAIN (COSTS OFF) SELECT * FROM (SELECT (foo.a IN (SELECT a+foo.c FROM bar))::text AS xx, foo.b FROM foo,bar) t WHERE xx='dd'; + + QUERY PLAN + ----------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Result + Filter: ((text((SubPlan 1))) = 'dd'::text) + -> Nested Loop + Join Filter: true + -> Seq Scan on foo + -> Materialize + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Seq Scan on bar + SubPlan 1 + -> Result + -> Result + -> Materialize + -> Broadcast Motion 3:3 (slice3; segments: 3) + -> Seq Scan on bar bar_1 + Optimizer: Pivotal Optimizer (GPORCA) + ]]> + </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 MinNumOfPartsToRequireSortOnInsert="2147483647" JoinArityForAssociativityCommutativity="18" ArrayExpansionThreshold="20" JoinOrderDynamicProgThreshold="10" BroadcastThreshold="100000" EnforceConstraintsOnDML="false" PushGroupByBelowSetopThreshold="10" XformBindThreshold="0"/> + <dxl:TraceFlags Value="102001,102002,102003,102043,102074,102120,102144,103001,103014,103022,103026,103027,103029,103033,103038,103040,104002,104003,104004,104005,105000,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:RelationStatistics Mdid="2.57365.1.0" Name="foo" Rows="0.000000" RelPages="0" RelAllVisible="0" EmptyRelation="true"/> + <dxl:Relation Mdid="0.57365.1.0" Name="foo" IsTemporary="false" StorageType="Heap" DistributionPolicy="Hash" DistributionColumns="0" Keys="9,3" NumberLeafPartitions="0"> + <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" Attno="3" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> + <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:Triggers/> + <dxl:CheckConstraints/> + <dxl:DistrOpfamilies> + <dxl:DistrOpfamily Mdid="0.1977.1.0"/> + </dxl:DistrOpfamilies> + </dxl:Relation> + <dxl:Type Mdid="0.20.1.0" Name="Int8" IsRedistributable="true" IsHashable="true" IsMergeJoinable="true" IsComposite="false" IsTextRelated="false" IsFixedLength="true" Length="8" PassByValue="true"> + <dxl:DistrOpfamily Mdid="0.1977.1.0"/> + <dxl:LegacyDistrOpfamily Mdid="0.7100.1.0"/> + <dxl:EqualityOp Mdid="0.410.1.0"/> + <dxl:InequalityOp Mdid="0.411.1.0"/> + <dxl:LessThanOp Mdid="0.412.1.0"/> + <dxl:LessThanEqualsOp Mdid="0.414.1.0"/> + <dxl:GreaterThanOp Mdid="0.413.1.0"/> + <dxl:GreaterThanEqualsOp Mdid="0.415.1.0"/> + <dxl:ComparisonOp Mdid="0.351.1.0"/> + <dxl:ArrayType Mdid="0.1016.1.0"/> + <dxl:MinAgg Mdid="0.2131.1.0"/> + <dxl:MaxAgg Mdid="0.2115.1.0"/> + <dxl:AvgAgg Mdid="0.2100.1.0"/> + <dxl:SumAgg Mdid="0.2107.1.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.57365.1.0.9" Name="gp_segment_id" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:ColumnStatistics Mdid="1.57365.1.0.1" Name="b" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:GPDBScalarOp Mdid="0.410.1.0" Name="=" ComparisonType="Eq" ReturnsNullOnNullInput="true" IsNDVPreserving="false"> + <dxl:LeftType Mdid="0.20.1.0"/> + <dxl:RightType Mdid="0.20.1.0"/> + <dxl:ResultType Mdid="0.16.1.0"/> + <dxl:OpFunc Mdid="0.467.1.0"/> + <dxl:Commutator Mdid="0.410.1.0"/> + <dxl:InverseOp Mdid="0.411.1.0"/> + <dxl:HashOpfamily Mdid="0.1977.1.0"/> + <dxl:LegacyHashOpfamily Mdid="0.7100.1.0"/> + <dxl:Opfamilies> + <dxl:Opfamily Mdid="0.1976.1.0"/> + <dxl:Opfamily Mdid="0.1977.1.0"/> + <dxl:Opfamily Mdid="0.4054.1.0"/> + <dxl:Opfamily Mdid="0.7100.1.0"/> + <dxl:Opfamily Mdid="0.10009.1.0"/> + </dxl:Opfamilies> + </dxl:GPDBScalarOp> + <dxl:ColumnStatistics Mdid="1.57365.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:GPDBFunc Mdid="0.2971.1.0" Name="text" ReturnsSet="false" Stability="Immutable" DataAccess="NoSQL" IsStrict="true" IsNDVPreserving="false" IsAllowedForPS="false"> + <dxl:ResultType Mdid="0.25.1.0"/> + </dxl:GPDBFunc> + <dxl:GPDBScalarOp Mdid="0.413.1.0" Name=">" ComparisonType="GT" ReturnsNullOnNullInput="true" IsNDVPreserving="false"> + <dxl:LeftType Mdid="0.20.1.0"/> + <dxl:RightType Mdid="0.20.1.0"/> + <dxl:ResultType Mdid="0.16.1.0"/> + <dxl:OpFunc Mdid="0.470.1.0"/> + <dxl:Commutator Mdid="0.412.1.0"/> + <dxl:InverseOp Mdid="0.414.1.0"/> + <dxl:Opfamilies> + <dxl:Opfamily Mdid="0.1976.1.0"/> + <dxl:Opfamily Mdid="0.4054.1.0"/> + <dxl:Opfamily Mdid="0.10009.1.0"/> + </dxl:Opfamilies> + </dxl:GPDBScalarOp> + <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.57368.1.0" Name="bar" Rows="0.000000" RelPages="0" RelAllVisible="0" EmptyRelation="true"/> + <dxl:Relation Mdid="0.57368.1.0" Name="bar" IsTemporary="false" StorageType="Heap" DistributionPolicy="Hash" DistributionColumns="0" Keys="9,3" NumberLeafPartitions="0"> + <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" Attno="3" Mdid="0.23.1.0" Nullable="true" ColWidth="4"> + <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:Triggers/> + <dxl:CheckConstraints/> + <dxl:DistrOpfamilies> + <dxl:DistrOpfamily Mdid="0.1977.1.0"/> + </dxl:DistrOpfamilies> + </dxl:Relation> + <dxl:GPDBScalarOp Mdid="0.551.1.0" Name="+" ComparisonType="Other" ReturnsNullOnNullInput="true" IsNDVPreserving="false"> + <dxl:LeftType Mdid="0.23.1.0"/> + <dxl:RightType Mdid="0.23.1.0"/> + <dxl:ResultType Mdid="0.23.1.0"/> + <dxl:OpFunc Mdid="0.177.1.0"/> + <dxl:Commutator Mdid="0.551.1.0"/> + </dxl:GPDBScalarOp> + <dxl:ColumnStatistics Mdid="1.57365.1.0.3" Name="ctid" Width="6.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:ColumnStatistics Mdid="1.57365.1.0.2" Name="c" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:GPDBAgg Mdid="0.2108.1.0" Name="sum" IsSplittable="true" HashAggCapable="true"> + <dxl:ResultType Mdid="0.20.1.0"/> + <dxl:IntermediateResultType Mdid="0.20.1.0"/> + </dxl:GPDBAgg> + <dxl:GPDBFunc Mdid="0.65.1.0" Name="int4eq" ReturnsSet="false" Stability="Immutable" DataAccess="NoSQL" IsStrict="true" IsNDVPreserving="false" IsAllowedForPS="false"> + <dxl:ResultType Mdid="0.16.1.0"/> + </dxl:GPDBFunc> + <dxl:MDCast Mdid="3.23.1.0;23.1.0" Name="int4" BinaryCoercible="true" SourceTypeId="0.23.1.0" DestinationTypeId="0.23.1.0" CastFuncId="0.0.0.0" CoercePathType="0"/> + <dxl:ColumnStatistics Mdid="1.57368.1.0.3" Name="ctid" Width="6.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:GPDBScalarOp Mdid="0.96.1.0" Name="=" ComparisonType="Eq" ReturnsNullOnNullInput="true" IsNDVPreserving="false"> + <dxl:LeftType Mdid="0.23.1.0"/> + <dxl:RightType Mdid="0.23.1.0"/> + <dxl:ResultType Mdid="0.16.1.0"/> + <dxl:OpFunc Mdid="0.65.1.0"/> + <dxl:Commutator Mdid="0.96.1.0"/> + <dxl:InverseOp Mdid="0.518.1.0"/> + <dxl:HashOpfamily Mdid="0.1977.1.0"/> + <dxl:LegacyHashOpfamily Mdid="0.7100.1.0"/> + <dxl:Opfamilies> + <dxl:Opfamily Mdid="0.1976.1.0"/> + <dxl:Opfamily Mdid="0.1977.1.0"/> + <dxl:Opfamily Mdid="0.4054.1.0"/> + <dxl:Opfamily Mdid="0.7100.1.0"/> + <dxl:Opfamily Mdid="0.10009.1.0"/> + </dxl:Opfamilies> + </dxl:GPDBScalarOp> + <dxl:GPDBAgg Mdid="0.2147.1.0" Name="count" IsSplittable="true" HashAggCapable="true"> + <dxl:ResultType Mdid="0.20.1.0"/> + <dxl:IntermediateResultType Mdid="0.20.1.0"/> + </dxl:GPDBAgg> + <dxl:GPDBScalarOp Mdid="0.98.1.0" Name="=" ComparisonType="Eq" ReturnsNullOnNullInput="true" IsNDVPreserving="false"> + <dxl:LeftType Mdid="0.25.1.0"/> + <dxl:RightType Mdid="0.25.1.0"/> + <dxl:ResultType Mdid="0.16.1.0"/> + <dxl:OpFunc Mdid="0.67.1.0"/> + <dxl:Commutator Mdid="0.98.1.0"/> + <dxl:InverseOp Mdid="0.531.1.0"/> + <dxl:HashOpfamily Mdid="0.1995.1.0"/> + <dxl:LegacyHashOpfamily Mdid="0.7105.1.0"/> + <dxl:Opfamilies> + <dxl:Opfamily Mdid="0.1994.1.0"/> + <dxl:Opfamily Mdid="0.1995.1.0"/> + <dxl:Opfamily Mdid="0.2095.1.0"/> + <dxl:Opfamily Mdid="0.2229.1.0"/> + <dxl:Opfamily Mdid="0.4017.1.0"/> + <dxl:Opfamily Mdid="0.4056.1.0"/> + <dxl:Opfamily Mdid="0.7105.1.0"/> + <dxl:Opfamily Mdid="0.10018.1.0"/> + <dxl:Opfamily Mdid="0.10022.1.0"/> + </dxl:Opfamilies> + </dxl:GPDBScalarOp> + <dxl:GPDBAgg Mdid="0.2803.1.0" Name="count" IsSplittable="true" HashAggCapable="true"> + <dxl:ResultType Mdid="0.20.1.0"/> + <dxl:IntermediateResultType Mdid="0.20.1.0"/> + </dxl:GPDBAgg> + <dxl:ColumnStatistics Mdid="1.57368.1.0.9" Name="gp_segment_id" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + <dxl:ColumnStatistics Mdid="1.57368.1.0.0" Name="a" Width="4.000000" NullFreq="0.000000" NdvRemain="0.000000" FreqRemain="0.000000" ColStatsMissing="true"/> + </dxl:Metadata> + <dxl:Query> + <dxl:OutputColumns> + <dxl:Ident ColId="32" ColName="xx" TypeMdid="0.25.1.0"/> + <dxl:Ident ColId="2" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:OutputColumns> + <dxl:CTEList/> + <dxl:LogicalSelect> + <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0"> + <dxl:Ident ColId="32" ColName="xx" TypeMdid="0.25.1.0"/> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABmRk" LintValue="797270572"/> + </dxl:Comparison> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="32" Alias="xx"> + <dxl:FuncExpr FuncId="0.2971.1.0" FuncRetSet="false" TypeMdid="0.25.1.0"> + <dxl:SubqueryAny OperatorName="=" OperatorMdid="0.96.1.0" ColId="31"> + <dxl:Ident ColId="1" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:LogicalProject> + <dxl:ProjList> + <dxl:ProjElem ColId="31" Alias="?column?"> + <dxl:OpExpr OperatorName="+" OperatorMdid="0.551.1.0" OperatorType="0.23.1.0"> + <dxl:Ident ColId="21" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="3" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:OpExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalGet> + <dxl:TableDescriptor Mdid="0.57368.1.0" TableName="bar" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="21" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="22" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="23" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="24" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="25" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="26" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="27" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="28" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="29" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="30" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:LogicalGet> + </dxl:LogicalProject> + </dxl:SubqueryAny> + </dxl:FuncExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:LogicalJoin JoinType="Inner"> + <dxl:LogicalGet> + <dxl:TableDescriptor Mdid="0.57365.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" TypeMdid="0.23.1.0" ColWidth="4"/> + <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:LogicalGet> + <dxl:TableDescriptor Mdid="0.57368.1.0" TableName="bar" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="11" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="12" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="13" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="14" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="15" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="16" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="17" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="18" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="19" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="20" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:LogicalGet> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:LogicalJoin> + </dxl:LogicalProject> + </dxl:LogicalSelect> + </dxl:Query> + <dxl:Plan Id="0" SpaceSize="18"> + <dxl:GatherMotion InputSegments="0,1,2" OutputSegments="-1"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="1356691596.062735" Rows="1.000000" Width="12"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="31" Alias="xx"> + <dxl:Ident ColId="31" ColName="xx" TypeMdid="0.25.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:SortingColumnList/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="1356691596.062690" Rows="1.000000" Width="12"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="31" Alias="xx"> + <dxl:Ident ColId="31" ColName="xx" TypeMdid="0.25.1.0"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter> + <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0"> + <dxl:Ident ColId="31" ColName="xx" TypeMdid="0.25.1.0"/> + <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABmRk" LintValue="797270572"/> + </dxl:Comparison> + </dxl:Filter> + <dxl:OneTimeFilter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="1356691596.062679" Rows="1.000000" Width="12"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="31" Alias="xx"> + <dxl:FuncExpr FuncId="0.2971.1.0" FuncRetSet="false" TypeMdid="0.25.1.0"> + <dxl:SubPlan TypeMdid="0.16.1.0" SubPlanType="AnySubPlan"> + <dxl:TestExpr> + <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0"> + <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="30" ColName="?column?" TypeMdid="0.23.1.0"/> + </dxl:Comparison> + </dxl:TestExpr> + <dxl:ParamList> + <dxl:Param ColId="2" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:ParamList> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000254" Rows="3.000000" Width="5"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="30" Alias="?column?"> + <dxl:Ident ColId="30" ColName="?column?" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:Result> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000254" Rows="3.000000" Width="5"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="36" Alias="ColRef_0036"> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:ProjElem> + <dxl:ProjElem ColId="30" Alias="?column?"> + <dxl:OpExpr OperatorName="+" OperatorMdid="0.551.1.0" OperatorType="0.23.1.0"> + <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/> + <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:OpExpr> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:Materialize Eager="true"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000249" Rows="3.000000" Width="4"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="20" Alias="a"> + <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:BroadcastMotion InputSegments="0,1,2" OutputSegments="0,1,2"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000245" Rows="3.000000" Width="4"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="20" Alias="a"> + <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:SortingColumnList/> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000023" Rows="1.000000" Width="4"/> + </dxl:Properties> + <dxl:ProjList> + <dxl:ProjElem ColId="20" Alias="a"> + <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="0.57368.1.0" TableName="bar" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="23" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="24" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="25" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="26" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="27" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="28" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="29" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:TableScan> + </dxl:BroadcastMotion> + </dxl:Materialize> + </dxl:Result> + </dxl:Result> + </dxl:SubPlan> + </dxl:FuncExpr> + </dxl:ProjElem> + <dxl:ProjElem ColId="1" Alias="b"> + <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:OneTimeFilter/> + <dxl:NestedLoopJoin JoinType="Inner" IndexNestedLoopJoin="false" OuterRefAsParam="false"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="1324032.127343" Rows="1.000000" Width="12"/> + </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"> + <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:JoinFilter> + <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/> + </dxl:JoinFilter> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000023" Rows="1.000000" Width="12"/> + </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"> + <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/> + </dxl:ProjElem> + </dxl:ProjList> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="0.57365.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" TypeMdid="0.23.1.0" ColWidth="4"/> + <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:Materialize Eager="false"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000027" Rows="3.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList/> + <dxl:Filter/> + <dxl:BroadcastMotion InputSegments="0,1,2" OutputSegments="0,1,2"> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000026" Rows="3.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList/> + <dxl:Filter/> + <dxl:SortingColumnList/> + <dxl:TableScan> + <dxl:Properties> + <dxl:Cost StartupCost="0" TotalCost="431.000008" Rows="1.000000" Width="1"/> + </dxl:Properties> + <dxl:ProjList/> + <dxl:Filter/> + <dxl:TableDescriptor Mdid="0.57368.1.0" TableName="bar" LockMode="1"> + <dxl:Columns> + <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/> + <dxl:Column ColId="13" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/> + <dxl:Column ColId="14" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="15" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="16" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/> + <dxl:Column ColId="17" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/> + <dxl:Column ColId="18" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/> + <dxl:Column ColId="19" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/> + </dxl:Columns> + </dxl:TableDescriptor> + </dxl:TableScan> + </dxl:BroadcastMotion> + </dxl:Materialize> + </dxl:NestedLoopJoin> + </dxl:Result> + </dxl:Result> + </dxl:GatherMotion> + </dxl:Plan> + </dxl:Thread> +</dxl:DXLMessage> diff --git a/src/backend/gporca/libgpopt/src/operators/CExpressionPreprocessor.cpp b/src/backend/gporca/libgpopt/src/operators/CExpressionPreprocessor.cpp index d570a5197f..f591450b39 100644 --- a/src/backend/gporca/libgpopt/src/operators/CExpressionPreprocessor.cpp +++ b/src/backend/gporca/libgpopt/src/operators/CExpressionPreprocessor.cpp @@ -2840,18 +2840,20 @@ CExpressionPreprocessor::PexprTransposeSelectAndProject(CMemoryPool *mp, CExpression *pprojexpr = CUtils::PNthProjectElementExpr(pproject, ul); - CExpressionHandle exprhdl(mp); - exprhdl.Attach(pprojexpr); - exprhdl.DeriveProps(nullptr /*pdpctxt*/); - - if (exprhdl.Arity() > 1 && exprhdl.DeriveHasNonScalarFunction(1)) + if (pprojexpr->DeriveHasNonScalarFunction() || + pprojexpr->DeriveHasSubquery()) { // Bail if project expression contains a set-returning function + // or subquery pdrgpexpr->Release(); pexpr->AddRef(); return pexpr; } + CExpressionHandle exprhdl(mp); + exprhdl.Attach(pprojexpr); + exprhdl.DeriveProps(nullptr /*pdpctxt*/); + if (exprhdl.FChildrenHaveVolatileFunc()) { // Bail if project expression contains a volatile function diff --git a/src/backend/gporca/server/CMakeLists.txt b/src/backend/gporca/server/CMakeLists.txt index 924219e0c5..016893fd32 100644 --- a/src/backend/gporca/server/CMakeLists.txt +++ b/src/backend/gporca/server/CMakeLists.txt @@ -169,7 +169,7 @@ CJoinPredTest: MultipleDampedPredJoinCardinality MultipleIndependentPredJoinCardinality MultiDistKeyJoinCardinality MultiDistKeyWithOtherPredsJoinCardinality NoDistKeyMultiPredJoinCardinality OneDistKeyMultiPredJoinCardinality JoinOnViewWithCastedColumn JoinOnViewWithCastedColumnAndSubqueryInPredicate JoinOnViewWithVolatileColumn -JoinOnViewWithMixOfPushableAndNonpushablePredicates JoinOnViewWithSetReturningColumn OuterJoinOnViewWithCastedColumn; +JoinOnViewWithMixOfPushableAndNonpushablePredicates JoinOnViewWithSetReturningColumn OuterJoinOnViewWithCastedColumn JoinWithSubqueryProjectColumn; CArrayCmpTest: ArrayConcat ArrayRef FoldedArrayCmp ArrayCmpAll diff --git a/src/test/regress/expected/qp_subquery.out b/src/test/regress/expected/qp_subquery.out index 5e3031aea9..f1d8fd389d 100644 --- a/src/test/regress/expected/qp_subquery.out +++ b/src/test/regress/expected/qp_subquery.out @@ -1677,5 +1677,81 @@ select sum(case when b in (select b from temp_b where EXISTS (select sum(d) from 4 | 6 (1 row) +-- Check that predicate with set-returning function is not pushed down +create table table_with_array_column (an_array_column double precision[]); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'an_array_column' 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 table_with_array_column values (array[1.1, 2.2]); +explain (costs off) +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + QUERY PLAN +---------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Subquery Scan on zz + Filter: (zz.unnested_array_column IS NOT NULL) + -> ProjectSet + -> Nested Loop + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Seq Scan on table_with_array_column t2 + -> Materialize + -> Seq Scan on table_with_array_column t1 + Optimizer: Postgres query optimizer +(10 rows) + +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + unnested_array_column +----------------------- + 1.1 + 2.2 +(2 rows) + +-- check that predicate is not pushed through a projected non-correlated subquery +create table subquery_nonpush_through_1(a int, b int); +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. +create table subquery_nonpush_through_2(a int, b int); +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. +explain (costs off) +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + QUERY PLAN +----------------------------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Nested Loop + -> Broadcast Motion 3:3 (slice3; segments: 3) + -> Seq Scan on subquery_nonpush_through_2 + -> Materialize + -> Seq Scan on subquery_nonpush_through_1 + Filter: (((hashed SubPlan 2))::text = 'dd'::text) + SubPlan 2 + -> Broadcast Motion 3:3 (slice4; segments: 3) + -> Seq Scan on subquery_nonpush_through_2 subquery_nonpush_through_2_2 + SubPlan 1 + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Seq Scan on subquery_nonpush_through_2 subquery_nonpush_through_2_1 + Optimizer: Postgres query optimizer +(14 rows) + +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + xx | b +----+--- +(0 rows) + set client_min_messages='warning'; drop schema qp_subquery cascade; diff --git a/src/test/regress/expected/qp_subquery_optimizer.out b/src/test/regress/expected/qp_subquery_optimizer.out index 35ff4d71d7..5414069ba6 100644 --- a/src/test/regress/expected/qp_subquery_optimizer.out +++ b/src/test/regress/expected/qp_subquery_optimizer.out @@ -1675,5 +1675,84 @@ select sum(case when b in (select b from temp_b where EXISTS (select sum(d) from 4 | 6 (1 row) +-- Check that predicate with set-returning function is not pushed down +create table table_with_array_column (an_array_column double precision[]); +NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'an_array_column' 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 table_with_array_column values (array[1.1, 2.2]); +explain (costs off) +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + QUERY PLAN +--------------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Result + Filter: (NOT ((unnest(table_with_array_column_1.an_array_column)) IS NULL)) + -> ProjectSet + -> Nested Loop + Join Filter: true + -> Seq Scan on table_with_array_column table_with_array_column_1 + -> Materialize + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Seq Scan on table_with_array_column + Optimizer: Pivotal Optimizer (GPORCA) +(11 rows) + +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + unnested_array_column +----------------------- + 1.1 + 2.2 +(2 rows) + +-- check that predicate is not pushed through a projected non-correlated subquery +create table subquery_nonpush_through_1(a int, b int); +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. +create table subquery_nonpush_through_2(a int, b int); +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. +explain (costs off) +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------- + Gather Motion 3:1 (slice1; segments: 3) + -> Result + Filter: ((((SubPlan 1))::text) = 'dd'::text) + -> Nested Loop + Join Filter: true + -> Seq Scan on subquery_nonpush_through_1 + -> Materialize + -> Broadcast Motion 3:3 (slice2; segments: 3) + -> Seq Scan on subquery_nonpush_through_2 + SubPlan 1 + -> Result + -> Result + -> Materialize + -> Broadcast Motion 3:3 (slice3; segments: 3) + -> Seq Scan on subquery_nonpush_through_2 subquery_nonpush_through_2_1 + Optimizer: Pivotal Optimizer (GPORCA) +(19 rows) + +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + xx | b +----+--- +(0 rows) + set client_min_messages='warning'; drop schema qp_subquery cascade; diff --git a/src/test/regress/expected/qp_with_clause_optimizer.out b/src/test/regress/expected/qp_with_clause_optimizer.out index 12b1ef76cd..0815400f4c 100644 --- a/src/test/regress/expected/qp_with_clause_optimizer.out +++ b/src/test/regress/expected/qp_with_clause_optimizer.out @@ -6417,15 +6417,6 @@ CREATE TABLE countrylanguage_ao ( isofficial boolean NOT NULL, percentage real NOT NULL ) with (appendonly=true) distributed by (countrycode,language); -ALTER TABLE ONLY city_ao - ADD CONSTRAINT city_ao_pkey PRIMARY KEY (id); -ERROR: append-only tables do not support unique indexes -ALTER TABLE ONLY country_ao - ADD CONSTRAINT country_ao_pkey PRIMARY KEY (code); -ERROR: append-only tables do not support unique indexes -ALTER TABLE ONLY countrylanguage_ao - ADD CONSTRAINT countrylanguage_ao_pkey PRIMARY KEY (countrycode, "language"); -ERROR: append-only tables do not support unique indexes create index bitmap_city_ao_countrycode on city_ao using bitmap(countrycode); create index bitmap_country_ao_gf on country_ao using bitmap(governmentform); create index bitmap_country_ao_region on country_ao using bitmap(region); @@ -7323,15 +7314,6 @@ CREATE TABLE countrylanguage_co ( isofficial boolean NOT NULL, percentage real NOT NULL ) with (appendonly=true,orientation=column) distributed by (countrycode,language); -ALTER TABLE ONLY city_co - ADD CONSTRAINT city_co_pkey PRIMARY KEY (id); -ERROR: append-only tables do not support unique indexes -ALTER TABLE ONLY country_co - ADD CONSTRAINT country_co_pkey PRIMARY KEY (code); -ERROR: append-only tables do not support unique indexes -ALTER TABLE ONLY countrylanguage_co - ADD CONSTRAINT countrylanguage_co_pkey PRIMARY KEY (countrycode, "language"); -ERROR: append-only tables do not support unique indexes create index bitmap_city_co_countrycode on city_co using bitmap(countrycode); create index bitmap_country_co_gf on country_co using bitmap(governmentform); create index bitmap_country_co_region on country_co using bitmap(region); diff --git a/src/test/regress/sql/qp_subquery.sql b/src/test/regress/sql/qp_subquery.sql index 5f8bc099c1..e73998150b 100644 --- a/src/test/regress/sql/qp_subquery.sql +++ b/src/test/regress/sql/qp_subquery.sql @@ -670,5 +670,39 @@ select sum(case when b in (select b from temp_b where t.a>c) then 1 else 0 end), select sum(case when b in (select b from temp_b where EXISTS (select sum(d) from temp_c where t.a > d)) then 1 else 0 end),sum(case when not( b in (select b from temp_b where t.a>c)) then 1 else 0 end) from temp_a t; select sum(case when b in (select b from temp_b where EXISTS (select sum(d) from temp_c where t.a > d or t.a > temp_b.c)) then 1 else 0 end),sum(case when not( b in (select b from temp_b, temp_c where t.a>temp_b.c or t.a > temp_c.d)) then 1 else 0 end) from temp_a t; +-- Check that predicate with set-returning function is not pushed down +create table table_with_array_column (an_array_column double precision[]); +insert into table_with_array_column values (array[1.1, 2.2]); + +explain (costs off) +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + +select * +from ( + select unnest(t1.an_array_column) unnested_array_column + from table_with_array_column t1, table_with_array_column t2) zz +where unnested_array_column is not null; + +-- check that predicate is not pushed through a projected non-correlated subquery +create table subquery_nonpush_through_1(a int, b int); +create table subquery_nonpush_through_2(a int, b int); + +explain (costs off) +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + +select * +from( + select (subquery_nonpush_through_1.a in (select a from subquery_nonpush_through_2))::text as xx, subquery_nonpush_through_1.b + from subquery_nonpush_through_1,subquery_nonpush_through_2) t +where xx='dd'; + set client_min_messages='warning'; drop schema qp_subquery cascade; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
