You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ma...@apache.org on 2024/12/24 08:13:25 UTC
(cloudberry) branch main updated (589191e855 -> 43ca55d2a9)
This is an automated email from the ASF dual-hosted git repository.
maxyang pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
from 589191e855 Add dynamic test selection and flexible defaults
new 9178c9f6dc Fallback to Postgres optimizer on empty target list in CTE producer
new 38c560f90b Revert "Remove unused Dynamic (bitmap/index/table) Scan code"
new ef95449dba Adds Orca support for Dynamic Table Scan
new 2617770361 Adds Orca support for Dynamic Index Scan
new 5f5250e70b Adds Orca support for Dynamic Bitmap Heap/Index Scan
new 10bc16c245 Assorted changes and cleanup for Dynamic Scan support
new b4476faac5 ICW changes
new 80026068d0 MDP changes
new 12ed1a8e82 Fix compiler warnings from Dynamic Scan commit
new 5612f4b4d7 Adapt dynamic (bitmap/index/table) scan to PG 14
new 43ca55d2a9 Fix the icw tests which generated by dynamic (bitmap/index/table) scan
The 11 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
src/backend/cdb/cdbplan.c | 52 +-
src/backend/commands/explain.c | 76 +-
src/backend/commands/explain_gp.c | 85 ++
src/backend/executor/Makefile | 5 +
src/backend/executor/execAmi.c | 24 +
src/backend/executor/execExprInterp.c | 9 +
src/backend/executor/execProcnode.c | 44 +
src/backend/executor/execUtils.c | 61 +
src/backend/executor/nodeBitmapHeapscan.c | 41 +-
src/backend/executor/nodeDynamicBitmapHeapscan.c | 348 +++++
src/backend/executor/nodeDynamicBitmapIndexscan.c | 281 ++++
src/backend/executor/nodeDynamicIndexscan.c | 347 +++++
src/backend/executor/nodeDynamicSeqscan.c | 326 +++++
src/backend/executor/nodeIndexscan.c | 39 +-
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 309 +++-
.../gpopt/translate/CTranslatorQueryToDXL.cpp | 10 +-
.../gporca/data/dxl/indexjoin/positive_04.mdp | 2 +
.../dxl/minidump/AddRedistributeBeforeInsert-3.mdp | 98 +-
.../dxl/minidump/AddRedistributeBeforeInsert-4.mdp | 178 +--
.../dxl/minidump/AddRedistributeBeforeInsert-5.mdp | 70 +-
.../gporca/data/dxl/minidump/AssertMaxOneRow.mdp | 3 +
.../minidump/BTreeIndex-Against-ScalarSubquery.mdp | 1 +
.../BitmapIndexApply-InnerSelect-PartTable.mdp | 221 +--
.../dxl/minidump/BitmapIndexApply-PartTable.mdp | 293 +---
.../dxl/minidump/BitmapIndexNLJWithProject.mdp | 339 +----
.../minidump/BitmapIndexNLJWithProjectNoFilt.mdp | 343 +----
.../dxl/minidump/BitmapIndexNLOJWithProject.mdp | 339 +----
.../dxl/minidump/BitmapIndexProbeMergeFilters.mdp | 139 +-
.../BitmapScan-Hetrogeneous-Partitioned.mdp | 164 +--
.../minidump/BtreeIndexNLJWithProjectNoPart.mdp | 1 +
.../dxl/minidump/BtreeIndexNLOJWithProject.mdp | 245 +---
.../FallBackToSerialAppend.mdp | 84 +-
.../data/dxl/minidump/CTE-NoPushProperties.mdp | 382 +----
.../gporca/data/dxl/minidump/CTE-PartTbl.mdp | 174 +--
.../data/dxl/minidump/CTE-PushProperties.mdp | 382 +----
.../dxl/minidump/CastedScalarIf-On-Index-Key.mdp | 142 +-
.../data/dxl/minidump/Coalesce-With-Subquery.mdp | 1 +
.../CorrelatedNLJ-PartSelector-Subplan.mdp | 194 +--
src/backend/gporca/data/dxl/minidump/DPE-IN.mdp | 68 +-
.../gporca/data/dxl/minidump/DPE-NOT-IN.mdp | 140 +-
.../gporca/data/dxl/minidump/DPE-SemiJoin.mdp | 81 +-
.../dxl/minidump/DPE-with-unsupported-pred.mdp | 222 +--
.../dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp | 108 +-
.../minidump/DirectDispatch-DynamicIndexScan.mdp | 332 +----
.../data/dxl/minidump/DirectDispatch-IndexScan.mdp | 1 +
.../dxl/minidump/DonotPushPartConstThruLimit.mdp | 80 +-
.../minidump/DontAddRedistributeBeforeInsert-1.mdp | 178 +--
.../data/dxl/minidump/DynamicBitmapBoolOp.mdp | 394 +----
.../data/dxl/minidump/DynamicBitmapIndexScan.mdp | 288 +---
.../dxl/minidump/DynamicBitmapTableScan-Basic.mdp | 97 +-
.../DynamicBitmapTableScan-Heterogeneous.mdp | 256 +---
.../dxl/minidump/DynamicBitmapTableScan-UUID.mdp | 145 +-
.../dxl/minidump/DynamicIndexScan-BoolFalse.mdp | 222 +--
.../dxl/minidump/DynamicIndexScan-BoolTrue.mdp | 222 +--
.../DynamicIndexScan-DefaultPartition-2.mdp | 222 +--
.../minidump/DynamicIndexScan-DefaultPartition.mdp | 66 +-
.../dxl/minidump/DynamicIndexScan-DroppedCols.mdp | 84 +-
...ndexScan-Heterogenous-EnabledDateConstraint.mdp | 66 +-
.../DynamicIndexScan-Heterogenous-NoDTS.mdp | 61 +-
.../DynamicIndexScan-Heterogenous-Overlapping.mdp | 61 +-
...icIndexScan-Heterogenous-PartSelectEquality.mdp | 79 +-
...namicIndexScan-Heterogenous-PartSelectRange.mdp | 215 +--
.../DynamicIndexScan-Heterogenous-Union.mdp | 698 +--------
...ndexScan-Heterogenous-UnsupportedConstraint.mdp | 72 +-
.../dxl/minidump/DynamicIndexScan-Heterogenous.mdp | 61 +-
...cIndexScan-Homogenous-EnabledDateConstraint.mdp | 66 +-
...cIndexScan-Homogenous-UnsupportedConstraint.mdp | 66 +-
.../dxl/minidump/DynamicIndexScan-Homogenous.mdp | 78 +-
.../DynamicIndexScan-OpenEndedPartitions.mdp | 61 +-
.../data/dxl/minidump/DynamicIndexScan-Relabel.mdp | 213 +--
.../data/dxl/minidump/EffectOfLocalPredOnJoin2.mdp | 677 +--------
.../data/dxl/minidump/EffectOfLocalPredOnJoin3.mdp | 876 +----------
.../minidump/ExtractOneBindingFromScalarGroups.mdp | 1 +
.../data/dxl/minidump/ExtractPredicateFromDisj.mdp | 778 +---------
.../FullJoin-Subquery-CastedPredicates.mdp | 1 +
.../Gist-NestedLoopJoin-Lossy-IndexPlan.mdp | 1 +
.../Gist-NestedLoopJoin-Postgis-IndexPlan.mdp | 1 +
.../Gist-NonPart-Lossy-BitmapIndexPlan.mdp | 1 +
.../dxl/minidump/Gist-NonPart-Lossy-IndexPlan.mdp | 1 +
.../data/dxl/minidump/Gist-OrderBy-BitmapPlan.mdp | 1 +
.../data/dxl/minidump/Gist-OrderBy-IndexPlan.mdp | 1 +
.../minidump/Gist-PartTable-Lossy-IndexPlan.mdp | 117 +-
.../Gist-PartTable-NonLossy-BitmapIndexPlan.mdp | 75 +-
.../dxl/minidump/Gist-PartialIndex-TableScan.mdp | 150 +-
.../data/dxl/minidump/GroupingOnSameTblCol-1.mdp | 1 +
.../dxl/minidump/HJN-DPE-Bitmap-Outer-Child.mdp | 506 +------
.../minidump/Index-Join-With-Subquery-In-Pred.mdp | 1 +
...dexApply-Heterogeneous-BothSidesPartitioned.mdp | 222 +--
.../dxl/minidump/IndexApply-Heterogeneous-DTS.mdp | 3 +
.../minidump/IndexApply-Heterogeneous-NoDTS.mdp | 128 +-
.../dxl/minidump/IndexApply-InnerSelect-Basic.mdp | 1 +
.../IndexApply-InnerSelect-Heterogeneous-DTS.mdp | 160 +-
.../minidump/IndexApply-InnerSelect-PartTable.mdp | 168 +--
.../minidump/IndexApply-InnerSelect-PartTable2.mdp | 96 +-
.../dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp | 2 +
.../IndexApply-MultiDistKey-WithComplexPreds.mdp | 1 +
...pply-MultiDistKeys-IncompletePDS-3-DistCols.mdp | 1 +
.../minidump/IndexApply-No-Motion-Below-Join.mdp | 1 +
.../minidump/IndexApply-PartKey-Is-IndexKey.mdp | 151 +-
.../dxl/minidump/IndexApply-PartResolverExpand.mdp | 1 +
.../data/dxl/minidump/IndexApply-PartTable.mdp | 223 +--
.../IndexApply-Redistribute-Const-Table.mdp | 1 +
.../minidump/IndexApply1-CalibratedCostModel.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply1.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply2.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply3.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply4.mdp | 1 +
.../IndexApply_NestLoopWithNestParamTrue.mdp | 1 +
.../data/dxl/minidump/IndexGet-OuterRefs.mdp | 1 +
.../dxl/minidump/IndexNLJ-IndexGet-OuterRef.mdp | 1 +
.../dxl/minidump/IndexNLJoin_Cast_NoMotion.mdp | 1 +
...itionToRootTableContainingHeterogenousIndex.mdp | 1 +
...nLeaf-AddPartitionToRootWithHomogenousIndex.mdp | 1 +
...rlappingHeterogenousIndex-ANDPredicate-HEAP.mdp | 1 +
...rlappingHeterogenousIndex-ANDPredicate-HEAP.mdp | 1 +
...-SingleColumnHeterogenousIndexOnRoot-1-HEAP.mdp | 1 +
...-SingleColumnHeterogenousIndexOnRoot-2-HEAP.mdp | 1 +
.../minidump/IndexOnlyScan-NoDistKeyInIndex.mdp | 1 +
.../data/dxl/minidump/IndexScan-BoolFalse.mdp | 1 +
.../data/dxl/minidump/IndexScan-BoolTrue.mdp | 1 +
.../data/dxl/minidump/IndexScan-DroppedColumns.mdp | 1 +
.../data/dxl/minidump/IndexScan-ORPredsAOPart.mdp | 372 +----
.../gporca/data/dxl/minidump/IndexScan-Relabel.mdp | 1 +
.../minidump/IndexScanWithNestedCTEAndSetOp.mdp | 1 +
.../gporca/data/dxl/minidump/IndexedNLJBitmap.mdp | 201 +--
.../gporca/data/dxl/minidump/InferPredicates.mdp | 117 +-
.../data/dxl/minidump/InferPredicatesForPartSQ.mdp | 66 +-
.../dxl/minidump/InferPredicatesInnerOfLOJ.mdp | 53 +-
.../data/dxl/minidump/Join-Varchar-Equality.mdp | 174 +--
...inOptimizationLevelQuery3WayHashJoinPartTbl.mdp | 136 +-
.../gporca/data/dxl/minidump/JoinOrderDPE.mdp | 186 +--
.../data/dxl/minidump/LOJ-DynBitmapIndex.mdp | 121 +-
.../gporca/data/dxl/minidump/LOJ-DynBtreeIndex.mdp | 96 +-
.../minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp | 1 +
.../LOJ-IndexApply-CompsiteKey-NoMotion.mdp | 1 +
.../LOJ-IndexApply-DistKey-Multiple-Predicates.mdp | 1 +
.../minidump/LOJ-IndexApply-MasterOnly-Table.mdp | 2 +
...ly-MultiDistKey-MultiIndexKey-NoExtraFilter.mdp | 1 +
.../LOJ-IndexApply-MultiDistKey-MultiIndexKey.mdp | 1 +
.../LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp | 1 +
...J-IndexApply-MultiDistKeys-WithComplexPreds.mdp | 1 +
.../dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp | 1 +
.../dxl/minidump/LOJ-IndexApply-NonDistKey.mdp | 1 +
.../LOJ-IndexApply-WithComplexPredicates.mdp | 1 +
.../LOJ_convert_to_inner_with_and_predicate.mdp | 1 +
.../LOJ_convert_to_inner_with_or_predicate.mdp | 1 +
.../data/dxl/minidump/LargeMultiColumnInList.mdp | 1307 ++---------------
.../dxl/minidump/LogicalIndexGetDroppedCols.mdp | 1 +
.../gporca/data/dxl/minidump/MS-UnionAll-1.mdp | 1343 +++++------------
.../gporca/data/dxl/minidump/MS-UnionAll-2.mdp | 1343 +++++------------
.../gporca/data/dxl/minidump/MS-UnionAll-4.mdp | 1391 +++++-------------
.../gporca/data/dxl/minidump/MS-UnionAll-5.mdp | 412 ++----
.../gporca/data/dxl/minidump/MS-UnionAll-6.mdp | 408 ++----
.../gporca/data/dxl/minidump/MS-UnionAll-7.mdp | 408 ++----
.../dxl/minidump/NLJ-Broadcast-DPE-Outer-Child.mdp | 170 +--
.../data/dxl/minidump/Negative-IndexApply1.mdp | 2 +
.../data/dxl/minidump/Negative-IndexApply2.mdp | 2 +
.../dxl/minidump/NestedNLJWithBlockingSpool.mdp | 1 +
.../data/dxl/minidump/NewBtreeIndexScanCost.mdp | 1 +
.../gporca/data/dxl/minidump/NoSortPlan.mdp | 1 +
...ngHomogenousIndexesOnRoot-ANDPredicate-HEAP.mdp | 1 +
...ngHomogenousIndexesOnRoot-ANDPredicate-HEAP.mdp | 1 +
.../OverlappingHomogenousIndexesOnRoot-HEAP.mdp | 1 +
.../dxl/minidump/Part-Selection-ConstArray-1.mdp | 128 +-
.../dxl/minidump/Part-Selection-ConstArray-2.mdp | 128 +-
.../gporca/data/dxl/minidump/Part-Selection-IN.mdp | 68 +-
.../data/dxl/minidump/Part-Selection-NOT-IN.mdp | 140 +-
.../data/dxl/minidump/PartPredsWithRandom.mdp | 128 +-
.../data/dxl/minidump/PartSelectorOnJoinSide.mdp | 396 +----
.../data/dxl/minidump/PartSelectorOnJoinSide2.mdp | 739 +---------
.../PartTbl-AggWithExistentialSubquery.mdp | 144 +-
.../gporca/data/dxl/minidump/PartTbl-ArrayIn.mdp | 132 +-
.../minidump/PartTbl-AsymmetricRangePredicate.mdp | 62 +-
.../dxl/minidump/PartTbl-AvoidRangePred-DPE.mdp | 640 +-------
.../data/dxl/minidump/PartTbl-CSQ-NonPartKey.mdp | 369 +----
.../data/dxl/minidump/PartTbl-CSQ-PartKey.mdp | 369 +----
.../dxl/minidump/PartTbl-ComplexPredicate1.mdp | 127 +-
.../dxl/minidump/PartTbl-ComplexPredicate2.mdp | 537 +------
.../dxl/minidump/PartTbl-ComplexPredicate3.mdp | 603 +-------
.../dxl/minidump/PartTbl-ComplexPredicate4.mdp | 669 +--------
.../dxl/minidump/PartTbl-ComplexPredicate5.mdp | 647 +-------
.../PartTbl-ComplexRangePredicate-DefaultPart.mdp | 170 +--
...PartTbl-ComplexRangePredicate-NoDefaultPart.mdp | 152 +-
.../minidump/PartTbl-DPE-Correlated-NLOuter.mdp | 62 +-
.../data/dxl/minidump/PartTbl-DPE-GroupBy.mdp | 238 +--
.../gporca/data/dxl/minidump/PartTbl-DPE-Limit.mdp | 238 +--
.../gporca/data/dxl/minidump/PartTbl-DPE.mdp | 252 +---
.../gporca/data/dxl/minidump/PartTbl-DateTime.mdp | 396 +----
.../dxl/minidump/PartTbl-DisablePartSelection.mdp | 128 +-
.../minidump/PartTbl-DisablePartSelectionJoin.mdp | 164 +--
.../data/dxl/minidump/PartTbl-Disjunction.mdp | 141 +-
.../minidump/PartTbl-EqPredicateWithCastRange.mdp | 136 +-
.../gporca/data/dxl/minidump/PartTbl-HJ3.mdp | 328 +----
.../gporca/data/dxl/minidump/PartTbl-HJ4.mdp | 276 +---
.../gporca/data/dxl/minidump/PartTbl-HJ5.mdp | 226 +--
.../gporca/data/dxl/minidump/PartTbl-IDFList.mdp | 183 +--
.../gporca/data/dxl/minidump/PartTbl-IDFNull.mdp | 183 +--
.../data/dxl/minidump/PartTbl-IDFWithCast.mdp | 136 +-
.../dxl/minidump/PartTbl-IndexOnDefPartOnly.mdp | 243 +--
.../dxl/minidump/PartTbl-IsNotNullPredicate.mdp | 112 +-
.../data/dxl/minidump/PartTbl-IsNullPredicate.mdp | 80 +-
.../data/dxl/minidump/PartTbl-JoinOverExcept.mdp | 324 +---
.../data/dxl/minidump/PartTbl-JoinOverGbAgg-2.mdp | 255 +---
.../data/dxl/minidump/PartTbl-JoinOverGbAgg.mdp | 328 +----
.../dxl/minidump/PartTbl-JoinOverIntersect.mdp | 328 +----
.../data/dxl/minidump/PartTbl-JoinOverUnion-1.mdp | 324 +---
.../data/dxl/minidump/PartTbl-JoinOverUnion-2.mdp | 164 +--
.../gporca/data/dxl/minidump/PartTbl-LASJ.mdp | 176 +--
.../PartTbl-LeftOuterHashJoin-DPE-IsNull.mdp | 80 +-
.../PartTbl-LeftOuterNLJoin-DPE-IsNull.mdp | 80 +-
.../minidump/PartTbl-List-DPE-Int-Predicates.mdp | 386 +----
.../data/dxl/minidump/PartTbl-MultiWayJoin.mdp | 74 +-
.../dxl/minidump/PartTbl-MultiWayJoinWithDPE-2.mdp | 1378 ++---------------
.../dxl/minidump/PartTbl-MultiWayJoinWithDPE.mdp | 1320 ++---------------
.../data/dxl/minidump/PartTbl-NEqPredicate.mdp | 109 +-
.../data/dxl/minidump/PartTbl-NonConstSelect.mdp | 217 +--
.../dxl/minidump/PartTbl-PredicateWithCast.mdp | 136 +-
.../dxl/minidump/PartTbl-PredicateWithCastList.mdp | 136 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost1.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost2.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost3.mdp | 124 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost4.mdp | 218 +--
.../PartTbl-SPE-DynamicTableScan-List-Cost5.mdp | 124 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost1.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost2.mdp | 127 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost3.mdp | 306 +---
.../PartTbl-SPE-DynamicTableScan-Range-Cost4.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost5.mdp | 478 +-----
.../gporca/data/dxl/minidump/PartTbl-SQAll.mdp | 256 +---
.../gporca/data/dxl/minidump/PartTbl-SQAny.mdp | 272 +---
.../gporca/data/dxl/minidump/PartTbl-SQExists.mdp | 252 +---
.../data/dxl/minidump/PartTbl-SQNotExists.mdp | 252 +---
.../gporca/data/dxl/minidump/PartTbl-SQScalar.mdp | 256 +---
.../data/dxl/minidump/PartTbl-SubqueryOuterRef.mdp | 385 +----
.../data/dxl/minidump/PartTbl-VolatileFunc.mdp | 206 +--
.../data/dxl/minidump/PartTbl-WindowFunction.mdp | 136 +-
.../minidump/PushSelectWithOuterRefBelowUnion.mdp | 239 +--
...ueryMismatchedDistribution-DynamicIndexScan.mdp | 70 +-
.../dxl/minidump/QueryMismatchedDistribution.mdp | 173 +--
.../minidump/ReplicatedJoinPartitionedTable.mdp | 62 +-
.../data/dxl/minidump/RightJoinNoDPSNonDistKey.mdp | 304 +---
.../data/dxl/minidump/Select-Over-PartTbl.mdp | 423 +-----
.../data/dxl/minidump/Select-Proj-OuterJoin.mdp | 2 +
.../SingleColumnHomogenousIndexOnRoot-HEAP.mdp | 1 +
...SpoolShouldInvalidateUnresolvedDynamicScans.mdp | 108 +-
.../dxl/minidump/Stat-Derivation-Leaf-Pattern.mdp | 2 +
.../data/dxl/minidump/TPCH-Partitioned-256GB.mdp | 396 +----
.../dxl/minidump/TimeTypeStatsNotComparable.mdp | 1 +
.../gporca/data/dxl/minidump/UnnestSQJoins.mdp | 1 +
.../gporca/data/dxl/parse_tests/q37-IndexScan.xml | 1 +
.../data/dxl/parse_tests/q48-IndexOnlyScan.xml | 1 +
.../src/translate/CTranslatorExprToDXL.cpp | 443 ++----
.../include/naucrates/dxl/operators/CDXLOperator.h | 3 +
.../operators/CDXLPhysicalDynamicBitmapTableScan.h | 99 ++
.../dxl/operators/CDXLPhysicalDynamicIndexScan.h | 116 ++
.../dxl/operators/CDXLPhysicalDynamicTableScan.h | 101 ++
...IndexScan.h => CParseHandlerDynamicIndexScan.h} | 39 +-
...IndexScan.h => CParseHandlerDynamicTableScan.h} | 42 +-
.../naucrates/dxl/parser/CParseHandlerFactory.h | 15 +
.../naucrates/dxl/parser/CParseHandlerIndexScan.h | 3 +-
.../CParseHandlerPhysicalAbstractBitmapScan.h | 3 +-
.../CParseHandlerPhysicalDynamicBitmapTableScan.h | 72 +
.../include/naucrates/dxl/parser/parsehandlers.h | 3 +
.../include/naucrates/dxl/xml/dxltokens.h | 3 +
.../CDXLPhysicalDynamicBitmapTableScan.cpp | 84 ++
...exScan.cpp => CDXLPhysicalDynamicIndexScan.cpp} | 87 +-
.../src/operators/CDXLPhysicalDynamicTableScan.cpp | 165 +++
.../src/operators/CDXLPhysicalIndexScan.cpp | 7 +
.../gporca/libnaucrates/src/operators/Makefile | 3 +
.../src/parser/CParseHandlerDynamicIndexScan.cpp | 92 ++
...pScan.cpp => CParseHandlerDynamicTableScan.cpp} | 113 +-
.../src/parser/CParseHandlerFactory.cpp | 34 +
.../src/parser/CParseHandlerIndexOnlyScan.cpp | 3 +-
.../src/parser/CParseHandlerIndexScan.cpp | 32 +-
.../CParseHandlerPhysicalAbstractBitmapScan.cpp | 58 +-
.../CParseHandlerPhysicalBitmapTableScan.cpp | 3 +-
...ParseHandlerPhysicalDynamicBitmapTableScan.cpp} | 29 +-
.../src/parser/CParseHandlerSequence.cpp | 1 +
.../gporca/libnaucrates/src/parser/Makefile | 3 +
.../gporca/libnaucrates/src/xml/dxltokens.cpp | 4 +
src/backend/nodes/copyfuncs.c | 71 +
src/backend/nodes/outfast.c | 12 +
src/backend/nodes/outfuncs.c | 87 +-
src/backend/nodes/readfast.c | 25 +
src/backend/nodes/readfuncs.c | 95 +-
src/backend/optimizer/util/walkers.c | 5 +-
src/include/executor/nodeDynamicBitmapHeapscan.h | 24 +
src/include/executor/nodeDynamicBitmapIndexscan.h | 24 +
src/include/executor/nodeDynamicIndexscan.h | 26 +
src/include/executor/nodeDynamicSeqscan.h | 24 +
.../gpopt/translate/CTranslatorDXLToPlStmt.h | 22 +-
src/include/nodes/execnodes.h | 149 ++
src/include/nodes/nodes.h | 8 +
src/include/nodes/plannodes.h | 90 ++
src/test/regress/expected/aggregates_optimizer.out | 7 +-
src/test/regress/expected/bfv_index_optimizer.out | 8 +-
src/test/regress/expected/bfv_partition_plans.out | 1 +
.../expected/bfv_partition_plans_optimizer.out | 212 ++-
src/test/regress/expected/dpe_optimizer.out | 106 +-
.../regress/expected/explain_format_optimizer.out | 21 +-
src/test/regress/expected/gporca.out | 19 +
src/test/regress/expected/gporca_optimizer.out | 487 +++---
src/test/regress/expected/inherit_optimizer.out | 105 +-
src/test/regress/expected/join_gp_optimizer.out | 15 +-
src/test/regress/expected/join_optimizer.out | 15 +-
.../expected/orca_static_pruning_optimizer.out | 125 +-
src/test/regress/expected/partition_optimizer.out | 30 +-
.../regress/expected/partition_prune_optimizer.out | 849 +++++------
.../expected/partition_pruning_optimizer.out | 1544 ++++++++------------
src/test/regress/expected/qp_dpe_optimizer.out | 26 +-
.../regress/expected/qp_dropped_cols_optimizer.out | 68 +-
.../expected/qp_gist_indexes4_optimizer.out | 17 +-
.../regress/expected/qp_misc_jiras_optimizer.out | 30 +-
.../expected/qp_targeted_dispatch_optimizer.out | 29 +-
.../regress/expected/subselect_gp_optimizer.out | 79 +-
src/test/regress/expected/subselect_optimizer.out | 28 +-
src/test/regress/sql/bfv_partition_plans.sql | 1 +
src/test/regress/sql/gporca.sql | 14 +
318 files changed, 12176 insertions(+), 38684 deletions(-)
create mode 100644 src/backend/executor/nodeDynamicBitmapHeapscan.c
create mode 100644 src/backend/executor/nodeDynamicBitmapIndexscan.c
create mode 100644 src/backend/executor/nodeDynamicIndexscan.c
create mode 100644 src/backend/executor/nodeDynamicSeqscan.c
create mode 100644 src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
create mode 100644 src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
create mode 100644 src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
copy src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/{CParseHandlerIndexScan.h => CParseHandlerDynamicIndexScan.h} (55%)
copy src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/{CParseHandlerIndexScan.h => CParseHandlerDynamicTableScan.h} (52%)
create mode 100644 src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
create mode 100644 src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
copy src/backend/gporca/libnaucrates/src/operators/{CDXLPhysicalIndexScan.cpp => CDXLPhysicalDynamicIndexScan.cpp} (65%)
create mode 100644 src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
create mode 100644 src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
copy src/backend/gporca/libnaucrates/src/parser/{CParseHandlerPhysicalAbstractBitmapScan.cpp => CParseHandlerDynamicTableScan.cpp} (59%)
copy src/backend/gporca/libnaucrates/src/parser/{CParseHandlerPhysicalBitmapTableScan.cpp => CParseHandlerPhysicalDynamicBitmapTableScan.cpp} (54%)
create mode 100644 src/include/executor/nodeDynamicBitmapHeapscan.h
create mode 100644 src/include/executor/nodeDynamicBitmapIndexscan.h
create mode 100644 src/include/executor/nodeDynamicIndexscan.h
create mode 100644 src/include/executor/nodeDynamicSeqscan.h
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 01/11: Fallback to Postgres optimizer on empty target list in CTE producer
Posted by ma...@apache.org.
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 9178c9f6dc0708bfcfd7dde45aa49104ab3eeb55
Author: Alexey Gordeev <go...@arenadata.io>
AuthorDate: Fri Jun 24 23:36:16 2022 +0500
Fallback to Postgres optimizer on empty target list in CTE producer
greenplum-db/gpdb-postgres-merge@98154a8f6c47fc6007638ffe84e7ae8999b19f2a and
a8bb542fb8de88682bbfb18de0dbab0200674307 started a small refactoring, which
pointed that we have a lot of `NULL != target_list` asserts to be appropriately
replaced. There is a new case which cause SIGSEGV on builds without asserts -
empty target list in CTE producer. From now, we fallback to Postgres optimizer
in such case.
---
.../gpopt/translate/CTranslatorQueryToDXL.cpp | 10 ++++++++--
src/test/regress/expected/gporca.out | 19 +++++++++++++++++++
src/test/regress/expected/gporca_optimizer.out | 21 +++++++++++++++++++++
src/test/regress/sql/gporca.sql | 14 ++++++++++++++
4 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
index d4b9052b30..d959f85b21 100644
--- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
@@ -3800,8 +3800,14 @@ CTranslatorQueryToDXL::TranslateCTEToDXL(const RangeTblEntry *rte,
const List *cte_producer_target_list =
cte_list_entry->GetCTEProducerTargetList(rte->ctename);
- GPOS_ASSERT(nullptr != cte_producer_dxlnode &&
- nullptr != cte_producer_target_list);
+ // fallback to Postgres optimizer in case of empty target list
+ if (NIL == cte_producer_target_list)
+ {
+ GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,
+ GPOS_WSZ_LIT("Empty target list"));
+ }
+
+ GPOS_ASSERT(nullptr != cte_producer_dxlnode);
CDXLLogicalCTEProducer *cte_producer_dxlop =
CDXLLogicalCTEProducer::Cast(cte_producer_dxlnode->GetOperator());
diff --git a/src/test/regress/expected/gporca.out b/src/test/regress/expected/gporca.out
index 3202b8c186..619eda6cca 100644
--- a/src/test/regress/expected/gporca.out
+++ b/src/test/regress/expected/gporca.out
@@ -14614,3 +14614,22 @@ select c from mix_func_cast();
t
(1 row)
+-- the query with empty CTE producer target list should fall back to Postgres
+-- optimizer without any error on build without asserts
+drop table if exists empty_cte_tl_test;
+NOTICE: table "empty_cte_tl_test" does not exist, skipping
+create table empty_cte_tl_test(id int);
+NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' 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.
+set optimizer_trace_fallback = on;
+with cte as (
+ select from empty_cte_tl_test
+)
+select *
+from empty_cte_tl_test
+where id in(select id from cte);
+ id
+----
+(0 rows)
+
+reset optimizer_trace_fallback;
diff --git a/src/test/regress/expected/gporca_optimizer.out b/src/test/regress/expected/gporca_optimizer.out
index 1a679609e4..db42c71fca 100644
--- a/src/test/regress/expected/gporca_optimizer.out
+++ b/src/test/regress/expected/gporca_optimizer.out
@@ -14849,3 +14849,24 @@ select c from mix_func_cast();
t
(1 row)
+-- the query with empty CTE producer target list should fall back to Postgres
+-- optimizer without any error on build without asserts
+drop table if exists empty_cte_tl_test;
+NOTICE: table "empty_cte_tl_test" does not exist, skipping
+create table empty_cte_tl_test(id int);
+NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' 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.
+set optimizer_trace_fallback = on;
+with cte as (
+ select from empty_cte_tl_test
+)
+select *
+from empty_cte_tl_test
+where id in(select id from cte);
+INFO: GPORCA failed to produce a plan, falling back to planner
+DETAIL: Feature not supported: Empty target list
+ id
+----
+(0 rows)
+
+reset optimizer_trace_fallback;
diff --git a/src/test/regress/sql/gporca.sql b/src/test/regress/sql/gporca.sql
index 100ba7a4e0..c87d9929de 100644
--- a/src/test/regress/sql/gporca.sql
+++ b/src/test/regress/sql/gporca.sql
@@ -3592,6 +3592,20 @@ select a from mix_func_cast();
select b from mix_func_cast();
select c from mix_func_cast();
+-- the query with empty CTE producer target list should fall back to Postgres
+-- optimizer without any error on build without asserts
+drop table if exists empty_cte_tl_test;
+create table empty_cte_tl_test(id int);
+
+set optimizer_trace_fallback = on;
+with cte as (
+ select from empty_cte_tl_test
+)
+select *
+from empty_cte_tl_test
+where id in(select id from cte);
+reset optimizer_trace_fallback;
+
-- start_ignore
DROP SCHEMA orca CASCADE;
-- end_ignore
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 06/11: Assorted changes and cleanup for Dynamic Scan support
Posted by ma...@apache.org.
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 10bc16c245295e86cc1a26f28c1c45952ccc196a
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:59:48 2022 -0700
Assorted changes and cleanup for Dynamic Scan support
This includes changes that touched multiple scans and fixed up some of
the explain output. Also some code cleanup.
---
src/backend/commands/explain.c | 48 +++----
src/backend/commands/explain_gp.c | 39 +-----
src/backend/executor/Makefile | 12 +-
src/backend/executor/execAmi.c | 13 +-
src/backend/executor/execExprInterp.c | 9 ++
src/backend/executor/execProcnode.c | 23 +---
src/backend/executor/execUtils.c | 67 +++++++++-
src/backend/executor/nodeBitmapHeapscan.c | 1 -
src/backend/executor/nodeDynamicBitmapHeapscan.c | 10 +-
src/backend/executor/nodeDynamicBitmapIndexscan.c | 6 +-
src/backend/executor/nodeDynamicIndexscan.c | 20 +--
src/backend/executor/nodeDynamicSeqscan.c | 10 +-
src/backend/gpopt/gpdbwrappers.cpp | 31 -----
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 4 +-
.../src/translate/CTranslatorExprToDXL.cpp | 28 ++--
.../include/naucrates/dxl/operators/dxlops.h | 145 ---------------------
src/backend/nodes/copyfuncs.c | 33 +----
src/backend/nodes/outfuncs.c | 22 +---
src/backend/nodes/readfast.c | 2 +
src/backend/nodes/readfuncs.c | 33 ++---
src/include/executor/nodeDynamicIndexscan.h | 2 +-
src/include/gpopt/gpdbwrappers.h | 9 --
.../gpopt/translate/CTranslatorRelcacheToDXL.h | 1 -
src/include/nodes/execnodes.h | 93 +++++--------
src/include/nodes/plannodes.h | 71 +++++-----
25 files changed, 237 insertions(+), 495 deletions(-)
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index b68c81c062..33bc59ad91 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -50,7 +50,6 @@
#include "utils/xml.h"
#include "cdb/cdbgang.h"
-#include "executor/execDynamicScan.h"
#include "optimizer/tlist.h"
#include "optimizer/optimizer.h"
@@ -1920,7 +1919,6 @@ ExplainNode(PlanState *planstate, List *ancestors,
{
case T_SeqScan:
case T_DynamicSeqScan:
- case T_DynamicIndexScan:
case T_SampleScan:
case T_BitmapHeapScan:
case T_DynamicBitmapHeapScan:
@@ -1973,19 +1971,25 @@ ExplainNode(PlanState *planstate, List *ancestors,
ExplainPropertyText("Index Name", indexname, es);
}
break;
+ case T_DynamicIndexScan:
+ {
+ DynamicIndexScan *dynamicIndexScan = (DynamicIndexScan *) plan;
+ Oid indexoid = dynamicIndexScan->indexscan.indexid;
+ const char *indexname =
+ explain_get_index_name(indexoid);
+
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ appendStringInfo(es->str, " on %s", indexname);
+ else
+ ExplainPropertyText("Index Name", indexname, es);
+
+ ExplainScanTarget((Scan *) plan, es);
+ }
+ break;
case T_DynamicBitmapIndexScan:
{
- /* GPDB_12_MERGE_FIXME */
-#if 0
BitmapIndexScan *bitmapindexscan = (BitmapIndexScan *) plan;
Oid indexoid = bitmapindexscan->indexid;
- Oid parentOid = rel_partition_get_root(indexoid);
- while (parentOid != InvalidOid)
- {
- indexoid = parentOid;
- parentOid = rel_partition_get_root(indexoid);
- }
-
const char *indexname =
explain_get_index_name(indexoid);
@@ -1993,7 +1997,6 @@ ExplainNode(PlanState *planstate, List *ancestors,
appendStringInfo(es->str, " on %s", indexname);
else
ExplainPropertyText("Index Name", indexname, es);
-#endif
}
break;
case T_ModifyTable:
@@ -2293,7 +2296,12 @@ ExplainNode(PlanState *planstate, List *ancestors,
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
if (plan->qual)
show_instrumentation_count("Rows Removed by Filter", 1,
+
planstate, es);
+ if (IsA(plan, DynamicIndexScan))
+ ExplainPropertyInteger(
+ "Number of partitions to scan", "",
+ list_length(((DynamicIndexScan *) plan)->partOids), es);
break;
case T_IndexOnlyScan:
show_scan_qual(((IndexOnlyScan *) plan)->indexqual,
@@ -2321,6 +2329,11 @@ ExplainNode(PlanState *planstate, List *ancestors,
{
List *bitmapqualorig;
+ if (IsA(plan, DynamicBitmapHeapScan))
+ ExplainPropertyInteger(
+ "Number of partitions to scan", "",
+ list_length(((DynamicBitmapHeapScan *) plan)->partOids), es);
+
bitmapqualorig = ((BitmapHeapScan *) plan)->bitmapqualorig;
show_scan_qual(bitmapqualorig,
@@ -2362,7 +2375,6 @@ ExplainNode(PlanState *planstate, List *ancestors,
ExplainPropertyInteger(
"Number of partitions to scan", "",
list_length(((DynamicSeqScan *) plan)->partOids), es);
-
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
if (plan->qual)
show_instrumentation_count("Rows Removed by Filter", 1,
@@ -4570,16 +4582,6 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
if (es->verbose)
namespace = get_namespace_name(get_rel_namespace(rte->relid));
objecttag = "Relation Name";
-
- /* Print dynamic scan id for dynamic scan operators */
-/* GPDB_12_MERGE_FIXME */
-#if 0
- if (isDynamicScan(plan))
- {
- dynamicScanId = DynamicScan_GetDynamicScanIdPrintable(plan);
- }
-#endif
-
break;
case T_FunctionScan:
{
diff --git a/src/backend/commands/explain_gp.c b/src/backend/commands/explain_gp.c
index 559ec16c93..5411b5c720 100644
--- a/src/backend/commands/explain_gp.c
+++ b/src/backend/commands/explain_gp.c
@@ -286,7 +286,6 @@ static void cdbexplain_depositStatsToNode(PlanState *planstate,
CdbExplain_RecvStatCtx *ctx);
static int cdbexplain_collectExtraText(PlanState *planstate,
StringInfo notebuf);
-static int cdbexplain_countLeafPartTables(PlanState *planstate);
static void show_motion_keys(PlanState *planstate, List *hashExpr, int nkeys,
AttrNumber *keycols, const char *qlabel,
@@ -1657,7 +1656,8 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
* Print number of partitioned tables scanned for dynamic scans.
*/
if (0 <= ns->totalPartTableScanned.vcnt && (T_DynamicSeqScanState == planstate->type
- || T_DynamicIndexScanState == planstate->type))
+ || T_DynamicIndexScanState == planstate->type
+ || T_DynamicBitmapHeapScanState == planstate->type))
{
/*
* FIXME: Only displayed in TEXT format
@@ -1671,18 +1671,14 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
{
if (T_DynamicBitmapHeapScanState == planstate->type)
{
- int numTotalLeafParts = cdbexplain_countLeafPartTables(planstate);
-
appendStringInfoSpaces(es->str, es->indent * 2);
appendStringInfo(es->str,
- "Partitions scanned: 0 (out of %d).\n",
- numTotalLeafParts);
+ "Partitions scanned: 0 .\n");
}
}
else
{
cdbexplain_formatSeg(segbuf, sizeof(segbuf), ns->totalPartTableScanned.imax, ns->ninst);
- int numTotalLeafParts = cdbexplain_countLeafPartTables(planstate);
appendStringInfoSpaces(es->str, es->indent * 2);
@@ -1695,18 +1691,16 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
double totalPartTableScannedPerRescan = ns->totalPartTableScanned.vmax / instr->nloops;
appendStringInfo(es->str,
- "Partitions scanned: %.0f (out of %d) %s of %ld scans.\n",
+ "Partitions scanned: %.0f %s of %ld scans.\n",
totalPartTableScannedPerRescan,
- numTotalLeafParts,
segbuf,
instr->nloops);
}
else
{
appendStringInfo(es->str,
- "Partitions scanned: %.0f (out of %d) %s.\n",
+ "Partitions scanned: %.0f %s.\n",
ns->totalPartTableScanned.vmax,
- numTotalLeafParts,
segbuf);
}
}
@@ -1719,10 +1713,9 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
double maxPartTableScannedPerRescan = ns->totalPartTableScanned.vmax / instr->nloops;
appendStringInfo(es->str,
- "Partitions scanned: Avg %.1f (out of %d) x %d workers of %ld scans."
+ "Partitions scanned: Avg %.1f x %d workers of %ld scans."
" Max %.0f parts%s.\n",
totalPartTableScannedPerRescan,
- numTotalLeafParts,
ns->totalPartTableScanned.vcnt,
instr->nloops,
maxPartTableScannedPerRescan,
@@ -1732,10 +1725,9 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
else
{
appendStringInfo(es->str,
- "Partitions scanned: Avg %.1f (out of %d) x %d workers."
+ "Partitions scanned: Avg %.1f x %d workers."
" Max %.0f parts%s.\n",
nPartTableScanned_avg,
- numTotalLeafParts,
ns->totalPartTableScanned.vcnt,
ns->totalPartTableScanned.vmax,
segbuf);
@@ -2226,23 +2218,6 @@ gpexplain_formatSlicesOutput(struct CdbExplain_ShowStatCtx *showstatctx,
}
}
-static int
-cdbexplain_countLeafPartTables(PlanState *planstate)
-{
- Assert(IsA(planstate, DynamicSeqScanState) ||
- IsA(planstate, DynamicIndexScanState));
-
- return -1;
- /* GPDB_12_MERGE_FIXME */
-#if 0
- Scan *scan = (Scan *) planstate->plan;
-
- Oid root_oid = getrelid(scan->scanrelid, planstate->state->es_range_table);
-
- return countLeafPartTables(root_oid);
-#endif
-}
-
/*
* Show the hash and merge keys for a Motion node.
*/
diff --git a/src/backend/executor/Makefile b/src/backend/executor/Makefile
index 9403563c96..8a02584f0d 100644
--- a/src/backend/executor/Makefile
+++ b/src/backend/executor/Makefile
@@ -91,13 +91,9 @@ OBJS += nodeMotion.o \
nodeTupleSplit.o \
nodePartitionSelector.o
-OBJS += nodeDynamicSeqscan.o
-
-# GPDB_12_MERGE_FIXME: Are any of these still needed?
-#OBJS += nodeDynamicIndexscan.o \
-# nodeDynamicBitmapHeapscan.o \
-# nodeDynamicBitmapIndexscan.o \
-# nodeDynamicSeqscan.o
-# execDynamicScan.o
+OBJS += nodeDynamicSeqscan.o \
+ nodeDynamicIndexscan.o \
+ nodeDynamicBitmapHeapscan.o \
+ nodeDynamicBitmapIndexscan.o
include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index e74b10446d..55d1ff0deb 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -219,8 +219,6 @@ ExecReScan(PlanState *node)
ExecReScanIndexScan((IndexScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicSeqScanState:
ExecReScanDynamicSeqScan((DynamicSeqScanState *) node);
break;
@@ -228,7 +226,6 @@ ExecReScan(PlanState *node)
case T_DynamicIndexScanState:
ExecReScanDynamicIndex((DynamicIndexScanState *) node);
break;
-#endif
case T_IndexOnlyScanState:
ExecReScanIndexOnlyScan((IndexOnlyScanState *) node);
@@ -238,24 +235,18 @@ ExecReScan(PlanState *node)
ExecReScanBitmapIndexScan((BitmapIndexScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapIndexScanState:
ExecReScanDynamicBitmapIndex((DynamicBitmapIndexScanState *) node);
break;
-#endif
-
+
case T_BitmapHeapScanState:
ExecReScanBitmapHeapScan((BitmapHeapScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapHeapScanState:
ExecReScanDynamicBitmapHeapScan((DynamicBitmapHeapScanState *) node);
break;
-#endif
-
+
case T_TidScanState:
ExecReScanTidScan((TidScanState *) node);
break;
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 2e8a979a36..7729117381 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -2029,6 +2029,15 @@ CheckOpSlotCompatibility(ExprEvalStep *op, TupleTableSlot *slot)
if (slot->tts_ops == &TTSOpsVirtual)
return;
+ /*
+ * We think it is OK if op's fetch kind is virtual.
+ */
+ if (op->d.fetch.kind == &TTSOpsVirtual)
+ return;
+
+ // FIXME: A simple explain select * from foo join bar on foo.a=bar.b; where
+ // bar is a PT on the outer side of a HJ triggers this assert without the above
+ // if statement
Assert(op->d.fetch.kind == slot->tts_ops);
#endif
}
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c
index 015de0d73f..d18a2d2364 100644
--- a/src/backend/executor/execProcnode.c
+++ b/src/backend/executor/execProcnode.c
@@ -298,14 +298,11 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
estate, eflags);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicIndexScan:
result = (PlanState *) ExecInitDynamicIndexScan((DynamicIndexScan *) node,
estate, eflags);
break;
-#endif
-
+
case T_IndexOnlyScan:
result = (PlanState *) ExecInitIndexOnlyScan((IndexOnlyScan *) node,
estate, eflags);
@@ -316,26 +313,20 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
estate, eflags);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapIndexScan:
result = (PlanState *) ExecInitDynamicBitmapIndexScan((DynamicBitmapIndexScan *) node,
estate, eflags);
break;
-#endif
case T_BitmapHeapScan:
result = (PlanState *) ExecInitBitmapHeapScan((BitmapHeapScan *) node,
estate, eflags);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapHeapScan:
result = (PlanState *) ExecInitDynamicBitmapHeapScan((DynamicBitmapHeapScan *) node,
estate, eflags);
break;
-#endif
case T_TidScan:
result = (PlanState *) ExecInitTidScan((TidScan *) node,
@@ -750,12 +741,9 @@ MultiExecProcNode(PlanState *node)
result = MultiExecBitmapIndexScan((BitmapIndexScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapIndexScanState:
result = MultiExecDynamicBitmapIndexScan((DynamicBitmapIndexScanState *) node);
break;
-#endif
case T_BitmapAndState:
result = MultiExecBitmapAnd((BitmapAndState *) node);
@@ -887,12 +875,9 @@ ExecEndNode(PlanState *node)
ExecEndIndexScan((IndexScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicIndexScanState:
ExecEndDynamicIndexScan((DynamicIndexScanState *) node);
break;
-#endif
case T_IndexOnlyScanState:
ExecEndIndexOnlyScan((IndexOnlyScanState *) node);
@@ -902,23 +887,17 @@ ExecEndNode(PlanState *node)
ExecEndBitmapIndexScan((BitmapIndexScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapIndexScanState:
ExecEndDynamicBitmapIndexScan((DynamicBitmapIndexScanState *) node);
break;
-#endif
case T_BitmapHeapScanState:
ExecEndBitmapHeapScan((BitmapHeapScanState *) node);
break;
-/* GPDB_12_MERGE_FIXME */
-#if 0
case T_DynamicBitmapHeapScanState:
ExecEndDynamicBitmapHeapScan((DynamicBitmapHeapScanState *) node);
break;
-#endif
case T_TidScanState:
ExecEndTidScan((TidScanState *) node);
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 82dcdb1dff..d6fc4aab56 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -144,11 +144,6 @@ CreateExecutorState(void)
estate = makeNode(EState);
- /*
- * Initialize dynamicTableScanInfo.
- */
- estate->dynamicTableScanInfo = palloc0(sizeof(DynamicTableScanInfo));
-
/*
* Initialize all fields of the Executor State structure
*/
@@ -264,7 +259,6 @@ FreeExecutorState(EState *estate)
}
estate->dispatcherState = NULL;
- estate->dynamicTableScanInfo = NULL;
/* release JIT context, if allocated */
if (estate->es_jit)
@@ -2571,3 +2565,64 @@ void AssertSliceTableIsValid(SliceTable *st)
}
}
#endif
+
+/*
+ * During attribute re-mapping for heterogeneous partitions, we use
+ * this struct to identify which varno's attributes will be re-mapped.
+ * Using this struct as a *context* during expression tree walking, we
+ * can skip varattnos that do not belong to a given varno.
+ */
+typedef struct AttrMapContext
+{
+ const AttrNumber *newattno; /* The mapping table to remap the varattno */
+ Index varno; /* Which rte's varattno to re-map */
+} AttrMapContext;
+
+/*
+ * Remaps the varattno of a varattno in a Var node using an attribute map.
+ */
+static bool
+change_varattnos_varno_walker(Node *node, const AttrMapContext *attrMapCxt)
+{
+ if (node == NULL)
+ return false;
+ if (IsA(node, Var))
+ {
+ Var *var = (Var *) node;
+
+ if (var->varlevelsup == 0 && (var->varno == attrMapCxt->varno) &&
+ var->varattno > 0)
+ {
+ /*
+ * ??? the following may be a problem when the node is multiply
+ * referenced though stringToNode() doesn't create such a node
+ * currently.
+ */
+ Assert(attrMapCxt->newattno[var->varattno - 1] > 0);
+ var->varattno = var->varattnosyn = attrMapCxt->newattno[var->varattno - 1];
+ }
+ return false;
+ }
+ return expression_tree_walker(node, change_varattnos_varno_walker,
+ (void *) attrMapCxt);
+}
+
+/*
+ * Replace varattno values for a given varno RTE index in an expression
+ * tree according to the given map array, that is, varattno N is replaced
+ * by newattno[N-1]. It is caller's responsibility to ensure that the array
+ * is long enough to define values for all user varattnos present in the tree.
+ * System column attnos remain unchanged.
+ *
+ * Note that the passed node tree is modified in-place!
+ */
+void
+change_varattnos_of_a_varno(Node *node, const AttrNumber *newattno, Index varno)
+{
+ AttrMapContext attrMapCxt;
+
+ attrMapCxt.newattno = newattno;
+ attrMapCxt.varno = varno;
+
+ (void) change_varattnos_varno_walker(node, &attrMapCxt);
+}
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index 5a5e8c5e43..2993b2580e 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -793,7 +793,6 @@ ExecInitBitmapHeapScanForPartition(BitmapHeapScan *node, EState *estate, int efl
Relation currentRelation)
{
BitmapHeapScanState *scanstate;
- int io_concurrency;
/* check for unsupported flags */
Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
diff --git a/src/backend/executor/nodeDynamicBitmapHeapscan.c b/src/backend/executor/nodeDynamicBitmapHeapscan.c
index 1b5e268422..2d731223eb 100644
--- a/src/backend/executor/nodeDynamicBitmapHeapscan.c
+++ b/src/backend/executor/nodeDynamicBitmapHeapscan.c
@@ -125,7 +125,7 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
Relation lastScannedRel;
TupleDesc partTupDesc;
TupleDesc lastTupDesc;
- AttrNumber *attMap;
+ AttrMap *attMap;
Oid pid;
Relation currentRelation;
@@ -158,14 +158,14 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
* FIXME: should we use execute_attr_map_tuple instead? Seems like a
* higher level abstraction that fits the bill
*/
- attMap = convert_tuples_by_name_map_if_req(partTupDesc, lastTupDesc, "unused msg");
+ attMap = build_attrmap_by_name_if_req(partTupDesc, lastTupDesc);
table_close(lastScannedRel, AccessShareLock);
/* If attribute remapping is not necessary, then do not change the varattno */
if (attMap)
{
- change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid);
- change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap->attnums, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap->attnums, node->scanrelid);
/*
* Now that the varattno mapping has been changed, change the relation that
@@ -193,7 +193,7 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
}
if (attMap)
- pfree(attMap);
+ free_attrmap(attMap);
node->bhsState = ExecInitBitmapHeapScanForPartition(&plan->bitmapheapscan, estate, node->eflags,
currentRelation);
diff --git a/src/backend/executor/nodeDynamicBitmapIndexscan.c b/src/backend/executor/nodeDynamicBitmapIndexscan.c
index d38b8f4a61..7d1494b0cd 100644
--- a/src/backend/executor/nodeDynamicBitmapIndexscan.c
+++ b/src/backend/executor/nodeDynamicBitmapIndexscan.c
@@ -98,7 +98,7 @@ ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int
static void
BitmapIndexScan_ReMapColumns(DynamicBitmapIndexScan *dbiScan, Oid oldOid, Oid newOid)
{
- AttrNumber *attMap;
+ AttrMap *attMap;
Assert(OidIsValid(newOid));
@@ -118,7 +118,7 @@ BitmapIndexScan_ReMapColumns(DynamicBitmapIndexScan *dbiScan, Oid oldOid, Oid ne
/* A bitmap index scan has no target list or quals */
// FIXME: no quals remapping?
- pfree(attMap);
+ free_attrmap(attMap);
}
}
@@ -156,7 +156,7 @@ beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
if (!OidIsValid(node->columnLayoutOid))
{
/* Very first partition */
- node->columnLayoutOid = get_partition_parent(tableOid);
+ node->columnLayoutOid = get_partition_parent(tableOid, true /* even_if_detached */);
}
BitmapIndexScan_ReMapColumns(dbiScan, node->columnLayoutOid, tableOid);
node->columnLayoutOid = tableOid;
diff --git a/src/backend/executor/nodeDynamicIndexscan.c b/src/backend/executor/nodeDynamicIndexscan.c
index 5115fa9d9c..d341404b50 100644
--- a/src/backend/executor/nodeDynamicIndexscan.c
+++ b/src/backend/executor/nodeDynamicIndexscan.c
@@ -96,7 +96,7 @@ static void
DynamicIndexScan_ReMapColumns(DynamicIndexScan *dIndexScan, Oid oldOid, Oid newOid)
{
IndexScan *indexScan = &dIndexScan->indexscan;
- AttrNumber *attMap;
+ AttrMap *attMap;
Assert(OidIsValid(newOid));
@@ -115,15 +115,15 @@ DynamicIndexScan_ReMapColumns(DynamicIndexScan *dIndexScan, Oid oldOid, Oid newO
{
/* Also map attrnos in targetlist and quals */
change_varattnos_of_a_varno((Node *) indexScan->scan.plan.targetlist,
- attMap, indexScan->scan.scanrelid);
+ attMap->attnums, indexScan->scan.scanrelid);
change_varattnos_of_a_varno((Node *) indexScan->scan.plan.qual,
- attMap, indexScan->scan.scanrelid);
+ attMap->attnums, indexScan->scan.scanrelid);
change_varattnos_of_a_varno((Node *) indexScan->indexqual,
- attMap, indexScan->scan.scanrelid);
+ attMap->attnums, indexScan->scan.scanrelid);
change_varattnos_of_a_varno((Node *) indexScan->indexqualorig,
- attMap, indexScan->scan.scanrelid);
+ attMap->attnums, indexScan->scan.scanrelid);
- pfree(attMap);
+ free_attrmap(attMap);
}
}
@@ -159,7 +159,7 @@ beginCurrentIndexScan(DynamicIndexScanState *node, EState *estate,
{
/* Very first partition */
// Just get the direct parent, we don't support multi-level partitioning
- node->columnLayoutOid = get_partition_parent(tableOid);
+ node->columnLayoutOid = get_partition_parent(tableOid, true /* even_if_detached */);
}
DynamicIndexScan_ReMapColumns(dynamicIndexScan,
tableOid, node->columnLayoutOid);
@@ -320,13 +320,13 @@ ExecReScanDynamicIndex(DynamicIndexScanState *node)
*
* Returns NULL for identical mapping.
*/
-AttrNumber*
+AttrMap*
IndexScan_GetColumnMapping(Oid oldOid, Oid newOid)
{
if (oldOid == newOid)
return NULL;
- AttrNumber *attMap;
+ AttrMap *attMap;
Relation oldRel = heap_open(oldOid, AccessShareLock);
Relation newRel = heap_open(newOid, AccessShareLock);
@@ -334,7 +334,7 @@ IndexScan_GetColumnMapping(Oid oldOid, Oid newOid)
TupleDesc oldTupDesc = oldRel->rd_att;
TupleDesc newTupDesc = newRel->rd_att;
- attMap = convert_tuples_by_name_map_if_req(oldTupDesc, newTupDesc, "unused msg");
+ attMap = build_attrmap_by_name_if_req(oldTupDesc, newTupDesc);
heap_close(oldRel, AccessShareLock);
heap_close(newRel, AccessShareLock);
diff --git a/src/backend/executor/nodeDynamicSeqscan.c b/src/backend/executor/nodeDynamicSeqscan.c
index 717a1849a4..3e1b367172 100644
--- a/src/backend/executor/nodeDynamicSeqscan.c
+++ b/src/backend/executor/nodeDynamicSeqscan.c
@@ -115,7 +115,7 @@ initNextTableToScan(DynamicSeqScanState *node)
Relation lastScannedRel;
TupleDesc partTupDesc;
TupleDesc lastTupDesc;
- AttrNumber *attMap;
+ AttrMap *attMap;
Oid *pid;
Relation currentRelation;
@@ -146,14 +146,14 @@ initNextTableToScan(DynamicSeqScanState *node)
* FIXME: should we use execute_attr_map_tuple instead? Seems like a
* higher level abstraction that fits the bill
*/
- attMap = convert_tuples_by_name_map_if_req(partTupDesc, lastTupDesc, "unused msg");
+ attMap = build_attrmap_by_name_if_req(partTupDesc, lastTupDesc);
table_close(lastScannedRel, AccessShareLock);
/* If attribute remapping is not necessary, then do not change the varattno */
if (attMap)
{
- change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid);
- change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap->attnums, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap->attnums, node->scanrelid);
/*
* Now that the varattno mapping has been changed, change the relation that
@@ -181,7 +181,7 @@ initNextTableToScan(DynamicSeqScanState *node)
}
if (attMap)
- pfree(attMap);
+ free_attrmap(attMap);
node->seqScanState = ExecInitSeqScanForPartition(&plan->seqscan, estate,
currentRelation);
diff --git a/src/backend/gpopt/gpdbwrappers.cpp b/src/backend/gpopt/gpdbwrappers.cpp
index af87a1b7aa..8fdaf94d96 100644
--- a/src/backend/gpopt/gpdbwrappers.cpp
+++ b/src/backend/gpopt/gpdbwrappers.cpp
@@ -2052,37 +2052,6 @@ gpdb::GetRelationIndexes(Relation relation)
GP_WRAP_END;
return NIL;
}
-#if 0
-LogicalIndexes *
-gpdb::GetLogicalPartIndexes
- (
- Oid oid
- )
-{
- GP_WRAP_START;
- {
- /* catalog tables: pg_partition, pg_partition_rule, pg_index */
- return BuildLogicalIndexInfo(oid);
- }
- GP_WRAP_END;
- return NULL;
-}
-LogicalIndexInfo *
-gpdb::GetLogicalIndexInfo
- (
- Oid root_oid,
- Oid index_oid
- )
-{
- GP_WRAP_START;
- {
- /* catalog tables: pg_index */
- return logicalIndexInfoForIndexOid(root_oid, index_oid);
- }
- GP_WRAP_END;
- return NULL;
-}
-#endif
gpdb::RelationWrapper
gpdb::GetRelation(Oid rel_oid)
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index 1e9779dc29..eeb8cb41fc 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -4142,7 +4142,7 @@ CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan(
dyn_index_scan_dxlop->GetDXLTableDescr()->MDId());
RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(
dyn_index_scan_dxlop->GetDXLTableDescr(), index, &base_table_context);
- GPOS_ASSERT(NULL != rte);
+ GPOS_ASSERT(nullptr != rte);
rte->requiredPerms |= ACL_SELECT;
m_dxl_to_plstmt_context->AddRTE(rte);
@@ -4206,7 +4206,7 @@ CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan(
// translate proj list
plan->targetlist =
TranslateDXLProjList(project_list_dxlnode, &base_table_context,
- NULL /*child_contexts*/, output_context);
+ nullptr /*child_contexts*/, output_context);
// translate index filter
plan->qual = TranslateDXLIndexFilter(filter_dxlnode, output_context,
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index a942c22a15..cbd6804b9e 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -1330,8 +1330,8 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
CDistributionSpecArray *pdrgpdsBaseTables, CExpression *pexprScalarCond,
CDXLPhysicalProperties *dxl_properties)
{
- GPOS_ASSERT(NULL != pexprDTS);
- GPOS_ASSERT_IFF(NULL != pexprScalarCond, NULL != dxl_properties);
+ GPOS_ASSERT(nullptr != pexprDTS);
+ GPOS_ASSERT_IFF(nullptr != pexprScalarCond, nullptr != dxl_properties);
CPhysicalDynamicTableScan *popDTS =
CPhysicalDynamicTableScan::PopConvert(pexprDTS->Pop());
@@ -1344,7 +1344,7 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
// construct plan costs
CDXLPhysicalProperties *pdxlpropDTS = GetProperties(pexprDTS);
- if (NULL != dxl_properties)
+ if (nullptr != dxl_properties)
{
CWStringDynamic *rows_out_str = GPOS_NEW(m_mp) CWStringDynamic(
m_mp,
@@ -1384,9 +1384,9 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
CDXLNode *pdxlnDTS = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopDTS);
pdxlnDTS->SetProperties(pdxlpropDTS);
- CDXLNode *pdxlnCond = NULL;
+ CDXLNode *pdxlnCond = nullptr;
- if (NULL != pexprScalarCond)
+ if (nullptr != pexprScalarCond)
{
pdxlnCond = PdxlnScalar(pexprScalarCond);
}
@@ -1394,7 +1394,7 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
CDXLNode *filter_dxlnode = PdxlnFilter(pdxlnCond);
// construct projection list
- GPOS_ASSERT(NULL != pexprDTS->Prpp());
+ GPOS_ASSERT(nullptr != pexprDTS->Prpp());
CColRefSet *pcrsOutput = pexprDTS->Prpp()->PcrsRequired();
pdxlnDTS->AddChild(PdxlnProjList(pcrsOutput, colref_array));
@@ -1450,7 +1450,7 @@ CTranslatorExprToDXL::PdxlnDynamicBitmapTableScan(
CDistributionSpecArray *pdrgpdsBaseTables, CExpression *pexprScalar,
CDXLPhysicalProperties *dxl_properties)
{
- GPOS_ASSERT(NULL != pexprScan);
+ GPOS_ASSERT(nullptr != pexprScan);
CPhysicalDynamicBitmapTableScan *pop =
CPhysicalDynamicBitmapTableScan::PopConvert(pexprScan->Pop());
@@ -1483,15 +1483,15 @@ CTranslatorExprToDXL::PdxlnDynamicBitmapTableScan(
CDXLNode *pdxlnScan = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopScan);
// construct plan costs
- if (NULL == dxl_properties)
+ if (nullptr == dxl_properties)
{
dxl_properties = GetProperties(pexprScan);
}
pdxlnScan->SetProperties(dxl_properties);
// translate predicates into DXL filter
- CDXLNode *pdxlnCond = NULL;
- if (NULL != pexprScalar)
+ CDXLNode *pdxlnCond = nullptr;
+ if (nullptr != pexprScalar)
{
pdxlnCond = PdxlnScalar(pexprScalar);
}
@@ -1541,9 +1541,9 @@ CTranslatorExprToDXL::PdxlnDynamicIndexScan(
CExpression *pexprDIS, CColRefArray *colref_array,
CDXLPhysicalProperties *dxl_properties, CReqdPropPlan *prpp)
{
- GPOS_ASSERT(NULL != pexprDIS);
- GPOS_ASSERT(NULL != dxl_properties);
- GPOS_ASSERT(NULL != prpp);
+ GPOS_ASSERT(nullptr != pexprDIS);
+ GPOS_ASSERT(nullptr != dxl_properties);
+ GPOS_ASSERT(nullptr != prpp);
CPhysicalDynamicIndexScan *popDIS =
CPhysicalDynamicIndexScan::PopConvert(pexprDIS->Pop());
@@ -1609,7 +1609,7 @@ CTranslatorExprToDXL::PdxlnDynamicIndexScan(
}
pdrgpexprConds->Release();
- CDXLNode *pdxlnResidualCond = NULL;
+ CDXLNode *pdxlnResidualCond = nullptr;
if (2 == pexprDIS->Arity())
{
// translate residual predicates into the filter node
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h
deleted file mode 100644
index 1aa920d05e..0000000000
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h
+++ /dev/null
@@ -1,145 +0,0 @@
-//---------------------------------------------------------------------------
-// Greenplum Database
-// Copyright (C) 2010 EMC Corp.
-//
-// @filename:
-// dxlops.h
-//
-// @doc:
-// collective include file for all dxl operators
-//---------------------------------------------------------------------------
-
-
-
-#ifndef GPDXL_dxlops_H
-#define GPDXL_dxlops_H
-
-#include "naucrates/dxl/operators/CDXLColDescr.h"
-#include "naucrates/dxl/operators/CDXLColRef.h"
-#include "naucrates/dxl/operators/CDXLCtasStorageOptions.h"
-#include "naucrates/dxl/operators/CDXLIndexDescr.h"
-#include "naucrates/dxl/operators/CDXLLogicalCTAS.h"
-#include "naucrates/dxl/operators/CDXLLogicalCTEAnchor.h"
-#include "naucrates/dxl/operators/CDXLLogicalCTEConsumer.h"
-#include "naucrates/dxl/operators/CDXLLogicalCTEProducer.h"
-#include "naucrates/dxl/operators/CDXLLogicalConstTable.h"
-#include "naucrates/dxl/operators/CDXLLogicalDelete.h"
-#include "naucrates/dxl/operators/CDXLLogicalExternalGet.h"
-#include "naucrates/dxl/operators/CDXLLogicalGet.h"
-#include "naucrates/dxl/operators/CDXLLogicalGroupBy.h"
-#include "naucrates/dxl/operators/CDXLLogicalInsert.h"
-#include "naucrates/dxl/operators/CDXLLogicalJoin.h"
-#include "naucrates/dxl/operators/CDXLLogicalLimit.h"
-#include "naucrates/dxl/operators/CDXLLogicalProject.h"
-#include "naucrates/dxl/operators/CDXLLogicalSelect.h"
-#include "naucrates/dxl/operators/CDXLLogicalSetOp.h"
-#include "naucrates/dxl/operators/CDXLLogicalTVF.h"
-#include "naucrates/dxl/operators/CDXLLogicalUpdate.h"
-#include "naucrates/dxl/operators/CDXLLogicalWindow.h"
-#include "naucrates/dxl/operators/CDXLPhysicalAgg.h"
-#include "naucrates/dxl/operators/CDXLPhysicalAppend.h"
-#include "naucrates/dxl/operators/CDXLPhysicalAssert.h"
-#include "naucrates/dxl/operators/CDXLPhysicalBitmapTableScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalBroadcastMotion.h"
-#include "naucrates/dxl/operators/CDXLPhysicalCTAS.h"
-#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
-#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
-#include "naucrates/dxl/operators/CDXLPhysicalDML.h"
-#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalExternalScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
-#include "naucrates/dxl/operators/CDXLPhysicalHashJoin.h"
-#include "naucrates/dxl/operators/CDXLPhysicalIndexOnlyScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalIndexScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalLimit.h"
-#include "naucrates/dxl/operators/CDXLPhysicalMaterialize.h"
-#include "naucrates/dxl/operators/CDXLPhysicalMergeJoin.h"
-#include "naucrates/dxl/operators/CDXLPhysicalNLJoin.h"
-#include "naucrates/dxl/operators/CDXLPhysicalPartitionSelector.h"
-#include "naucrates/dxl/operators/CDXLPhysicalRandomMotion.h"
-#include "naucrates/dxl/operators/CDXLPhysicalRedistributeMotion.h"
-#include "naucrates/dxl/operators/CDXLPhysicalResult.h"
-#include "naucrates/dxl/operators/CDXLPhysicalRoutedDistributeMotion.h"
-#include "naucrates/dxl/operators/CDXLPhysicalRowTrigger.h"
-#include "naucrates/dxl/operators/CDXLPhysicalSequence.h"
-#include "naucrates/dxl/operators/CDXLPhysicalSort.h"
-#include "naucrates/dxl/operators/CDXLPhysicalSplit.h"
-#include "naucrates/dxl/operators/CDXLPhysicalSubqueryScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalTVF.h"
-#include "naucrates/dxl/operators/CDXLPhysicalTableScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalValuesScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalWindow.h"
-#include "naucrates/dxl/operators/CDXLScalarAggref.h"
-#include "naucrates/dxl/operators/CDXLScalarArray.h"
-#include "naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h"
-#include "naucrates/dxl/operators/CDXLScalarArrayComp.h"
-#include "naucrates/dxl/operators/CDXLScalarArrayRef.h"
-#include "naucrates/dxl/operators/CDXLScalarArrayRefIndexList.h"
-#include "naucrates/dxl/operators/CDXLScalarAssertConstraint.h"
-#include "naucrates/dxl/operators/CDXLScalarAssertConstraintList.h"
-#include "naucrates/dxl/operators/CDXLScalarBitmapBoolOp.h"
-#include "naucrates/dxl/operators/CDXLScalarBitmapIndexProbe.h"
-#include "naucrates/dxl/operators/CDXLScalarBoolExpr.h"
-#include "naucrates/dxl/operators/CDXLScalarBooleanTest.h"
-#include "naucrates/dxl/operators/CDXLScalarCaseTest.h"
-#include "naucrates/dxl/operators/CDXLScalarCast.h"
-#include "naucrates/dxl/operators/CDXLScalarCoalesce.h"
-#include "naucrates/dxl/operators/CDXLScalarCoerceToDomain.h"
-#include "naucrates/dxl/operators/CDXLScalarCoerceViaIO.h"
-#include "naucrates/dxl/operators/CDXLScalarComp.h"
-#include "naucrates/dxl/operators/CDXLScalarConstValue.h"
-#include "naucrates/dxl/operators/CDXLScalarDMLAction.h"
-#include "naucrates/dxl/operators/CDXLScalarDistinctComp.h"
-#include "naucrates/dxl/operators/CDXLScalarFilter.h"
-#include "naucrates/dxl/operators/CDXLScalarFuncExpr.h"
-#include "naucrates/dxl/operators/CDXLScalarHashCondList.h"
-#include "naucrates/dxl/operators/CDXLScalarHashExpr.h"
-#include "naucrates/dxl/operators/CDXLScalarHashExprList.h"
-#include "naucrates/dxl/operators/CDXLScalarIdent.h"
-#include "naucrates/dxl/operators/CDXLScalarIfStmt.h"
-#include "naucrates/dxl/operators/CDXLScalarIndexCondList.h"
-#include "naucrates/dxl/operators/CDXLScalarJoinFilter.h"
-#include "naucrates/dxl/operators/CDXLScalarLimitCount.h"
-#include "naucrates/dxl/operators/CDXLScalarLimitOffset.h"
-#include "naucrates/dxl/operators/CDXLScalarMergeCondList.h"
-#include "naucrates/dxl/operators/CDXLScalarMinMax.h"
-#include "naucrates/dxl/operators/CDXLScalarNullIf.h"
-#include "naucrates/dxl/operators/CDXLScalarNullTest.h"
-#include "naucrates/dxl/operators/CDXLScalarOneTimeFilter.h"
-#include "naucrates/dxl/operators/CDXLScalarOpExpr.h"
-#include "naucrates/dxl/operators/CDXLScalarOpList.h"
-#include "naucrates/dxl/operators/CDXLScalarPartBound.h"
-#include "naucrates/dxl/operators/CDXLScalarPartBoundInclusion.h"
-#include "naucrates/dxl/operators/CDXLScalarPartBoundOpen.h"
-#include "naucrates/dxl/operators/CDXLScalarPartDefault.h"
-#include "naucrates/dxl/operators/CDXLScalarPartListNullTest.h"
-#include "naucrates/dxl/operators/CDXLScalarPartListValues.h"
-#include "naucrates/dxl/operators/CDXLScalarPartOid.h"
-#include "naucrates/dxl/operators/CDXLScalarProjElem.h"
-#include "naucrates/dxl/operators/CDXLScalarProjList.h"
-#include "naucrates/dxl/operators/CDXLScalarRecheckCondFilter.h"
-#include "naucrates/dxl/operators/CDXLScalarSortCol.h"
-#include "naucrates/dxl/operators/CDXLScalarSortColList.h"
-#include "naucrates/dxl/operators/CDXLScalarSubPlan.h"
-#include "naucrates/dxl/operators/CDXLScalarSubquery.h"
-#include "naucrates/dxl/operators/CDXLScalarSubqueryAll.h"
-#include "naucrates/dxl/operators/CDXLScalarSubqueryAny.h"
-#include "naucrates/dxl/operators/CDXLScalarSubqueryExists.h"
-#include "naucrates/dxl/operators/CDXLScalarSubqueryNotExists.h"
-#include "naucrates/dxl/operators/CDXLScalarSwitch.h"
-#include "naucrates/dxl/operators/CDXLScalarSwitchCase.h"
-#include "naucrates/dxl/operators/CDXLScalarValuesList.h"
-#include "naucrates/dxl/operators/CDXLScalarWindowFrameEdge.h"
-#include "naucrates/dxl/operators/CDXLScalarWindowRef.h"
-#include "naucrates/dxl/operators/CDXLSpoolInfo.h"
-#include "naucrates/dxl/operators/CDXLTableDescr.h"
-#include "naucrates/dxl/operators/CDXLWindowFrame.h"
-#include "naucrates/dxl/operators/CDXLWindowKey.h"
-#include "naucrates/dxl/operators/CDXLWindowSpec.h"
-#include "naucrates/exception.h"
-
-#endif // !GPDXL_dxlops_H
-
-// EOF
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 3166706987..636553dbd2 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -264,30 +264,6 @@ CopyPlanFields(const Plan *from, Plan *newnode)
COPY_SCALAR_FIELD(operatorMemKB);
}
-/*
- * CopyLogicalIndexInfo
- *
- * This function copies the LogicalIndexInfo, which is part of
- * DynamicIndexScan node.
- */
-static LogicalIndexInfo *
-CopyLogicalIndexInfo(const LogicalIndexInfo *from)
-{
- LogicalIndexInfo *newnode = palloc(sizeof(LogicalIndexInfo));
-
- COPY_SCALAR_FIELD(logicalIndexOid);
- COPY_SCALAR_FIELD(nColumns);
- COPY_POINTER_FIELD(indexKeys, from->nColumns * sizeof(AttrNumber));
- COPY_NODE_FIELD(indPred);
- COPY_NODE_FIELD(indExprs);
- COPY_SCALAR_FIELD(indIsUnique);
- COPY_SCALAR_FIELD(indType);
- COPY_NODE_FIELD(partCons);
- COPY_NODE_FIELD(defaultLevels);
-
- return newnode;
-}
-
/*
* _copyPlan
*/
@@ -630,6 +606,8 @@ _copyDynamicSeqScan(const DynamicSeqScan *from)
CopyScanFields((Scan *) from, (Scan *) newnode);
COPY_NODE_FIELD(partOids);
+ COPY_NODE_FIELD(part_prune_info);
+ COPY_NODE_FIELD(join_prune_paramids);
return newnode;
}
@@ -717,7 +695,8 @@ _copyDynamicIndexScan(const DynamicIndexScan *from)
/* DynamicIndexScan has some content from IndexScan */
CopyIndexScanFields(&from->indexscan, &newnode->indexscan);
COPY_NODE_FIELD(partOids);
- newnode->logicalIndexInfo = CopyLogicalIndexInfo(from->logicalIndexInfo);
+ COPY_NODE_FIELD(part_prune_info);
+ COPY_NODE_FIELD(join_prune_paramids);
return newnode;
}
@@ -782,8 +761,6 @@ _copyDynamicBitmapIndexScan(const DynamicBitmapIndexScan *from)
DynamicBitmapIndexScan *newnode = makeNode(DynamicBitmapIndexScan);
CopyBitmapIndexScanFields(&from->biscan, &newnode->biscan);
- COPY_NODE_FIELD(partOids);
- newnode->logicalIndexInfo = CopyLogicalIndexInfo(from->logicalIndexInfo);
return newnode;
}
@@ -825,6 +802,8 @@ _copyDynamicBitmapHeapScan(const DynamicBitmapHeapScan *from)
CopyBitmapHeapScanFields(&from->bitmapheapscan, &newnode->bitmapheapscan);
COPY_NODE_FIELD(partOids);
+ COPY_NODE_FIELD(part_prune_info);
+ COPY_NODE_FIELD(join_prune_paramids);
return newnode;
}
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index faa089586c..025aeebceb 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -318,8 +318,6 @@ outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
#endif /* COMPILING_BINARY_FUNCS */
-static void outLogicalIndexInfo(StringInfo str, const LogicalIndexInfo *node);
-
/*
* Stuff from plannodes.h
*/
@@ -632,6 +630,8 @@ _outDynamicSeqScan(StringInfo str, const DynamicSeqScan *node)
_outScanInfo(str, (Scan *)node);
WRITE_NODE_FIELD(partOids);
+ WRITE_NODE_FIELD(part_prune_info);
+ WRITE_NODE_FIELD(join_prune_paramids);
}
static void
@@ -644,20 +644,6 @@ _outSampleScan(StringInfo str, const SampleScan *node)
WRITE_NODE_FIELD(tablesample);
}
-static void
-outLogicalIndexInfo(StringInfo str, const LogicalIndexInfo *node)
-{
- WRITE_OID_FIELD(logicalIndexOid);
- WRITE_INT_FIELD(nColumns);
- WRITE_ATTRNUMBER_ARRAY(indexKeys, node->nColumns);
- WRITE_NODE_FIELD(indPred);
- WRITE_NODE_FIELD(indExprs);
- WRITE_BOOL_FIELD(indIsUnique);
- WRITE_ENUM_FIELD(indType, LogicalIndexType);
- WRITE_NODE_FIELD(partCons);
- WRITE_NODE_FIELD(defaultLevels);
-}
-
static void
outIndexScanFields(StringInfo str, const IndexScan *node)
{
@@ -731,8 +717,6 @@ _outDynamicBitmapIndexScan(StringInfo str, const DynamicBitmapIndexScan *node)
WRITE_NODE_TYPE("DYNAMICBITMAPINDEXSCAN");
_outBitmapIndexScanFields(str, &node->biscan);
- WRITE_NODE_FIELD(partOids);
- outLogicalIndexInfo(str, node->logicalIndexInfo);
}
static void
@@ -758,6 +742,8 @@ _outDynamicBitmapHeapScan(StringInfo str, const DynamicBitmapHeapScan *node)
outBitmapHeapScanFields(str, &node->bitmapheapscan);
WRITE_NODE_FIELD(partOids);
+ WRITE_NODE_FIELD(part_prune_info);
+ WRITE_NODE_FIELD(join_prune_paramids);
}
static void
diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c
index a33404cd2a..1efa5cb33a 100644
--- a/src/backend/nodes/readfast.c
+++ b/src/backend/nodes/readfast.c
@@ -936,6 +936,8 @@ _readDynamicSeqScan(void)
ReadCommonScan(&local_node->seqscan);
READ_NODE_FIELD(partOids);
+ READ_NODE_FIELD(part_prune_info);
+ READ_NODE_FIELD(join_prune_paramids);
READ_DONE();
}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index a50bf90e15..ffbf769314 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -1936,7 +1936,6 @@ _readSampleScan(void)
*/
static void readIndexScanFields(IndexScan *local_node);
-static LogicalIndexInfo *readLogicalIndexInfo(void);
static IndexScan *
_readIndexScan(void)
@@ -1955,7 +1954,8 @@ _readDynamicIndexScan(void)
/* DynamicIndexScan has some content from IndexScan. */
readIndexScanFields(&local_node->indexscan);
READ_NODE_FIELD(partOids);
- local_node->logicalIndexInfo = readLogicalIndexInfo();
+ READ_NODE_FIELD(part_prune_info);
+ READ_NODE_FIELD(join_prune_paramids);
READ_DONE();
}
static void
@@ -1974,24 +1974,6 @@ readIndexScanFields(IndexScan *local_node)
READ_ENUM_FIELD(indexorderdir, ScanDirection);
}
-static LogicalIndexInfo *
-readLogicalIndexInfo(void)
-{
- READ_TEMP_LOCALS();
- LogicalIndexInfo *local_node = palloc(sizeof(LogicalIndexInfo));
- READ_OID_FIELD(logicalIndexOid);
- READ_INT_FIELD(nColumns);
- READ_ATTRNUMBER_ARRAY(indexKeys, local_node->nColumns);
- READ_NODE_FIELD(indPred);
- READ_NODE_FIELD(indExprs);
- READ_BOOL_FIELD(indIsUnique);
- READ_ENUM_FIELD(indType, LogicalIndexType);
- READ_NODE_FIELD(partCons);
- READ_NODE_FIELD(defaultLevels);
- /* No READ_DONE, this is "embedded" in other structs */
- return local_node;
-}
-
/*
* _readIndexOnlyScan
*/
@@ -2041,11 +2023,11 @@ _readBitmapIndexScan(void)
static DynamicBitmapIndexScan *
_readDynamicBitmapIndexScan(void)
{
- READ_LOCALS(DynamicBitmapIndexScan);
+ READ_LOCALS_NO_FIELDS(DynamicBitmapIndexScan);
+
/* DynamicBitmapIndexScan has some content from BitmapIndexScan. */
readBitmapIndexScanFields(&local_node->biscan);
- READ_NODE_FIELD(partOids);
- local_node->logicalIndexInfo = readLogicalIndexInfo();
+
READ_DONE();
}
@@ -2077,9 +2059,14 @@ static DynamicBitmapHeapScan *
_readDynamicBitmapHeapScan(void)
{
READ_LOCALS(DynamicBitmapHeapScan);
+
/* DynamicBitmapHeapScan has some content from BitmapHeapScan. */
readBitmapHeapScanFields(&local_node->bitmapheapscan);
+
READ_NODE_FIELD(partOids);
+ READ_NODE_FIELD(part_prune_info);
+ READ_NODE_FIELD(join_prune_paramids);
+
READ_DONE();
}
diff --git a/src/include/executor/nodeDynamicIndexscan.h b/src/include/executor/nodeDynamicIndexscan.h
index 64e9045423..d5495539b2 100644
--- a/src/include/executor/nodeDynamicIndexscan.h
+++ b/src/include/executor/nodeDynamicIndexscan.h
@@ -21,6 +21,6 @@ extern TupleTableSlot *ExecDynamicIndexScan(PlanState *node);
extern void ExecEndDynamicIndexScan(DynamicIndexScanState *node);
extern void ExecReScanDynamicIndex(DynamicIndexScanState *node);
-extern AttrNumber *IndexScan_GetColumnMapping(Oid oldOid, Oid newOid);
+extern AttrMap *IndexScan_GetColumnMapping(Oid oldOid, Oid newOid);
#endif
diff --git a/src/include/gpopt/gpdbwrappers.h b/src/include/gpopt/gpdbwrappers.h
index 9ddaad768e..ea5b9fd3cc 100644
--- a/src/include/gpopt/gpdbwrappers.h
+++ b/src/include/gpopt/gpdbwrappers.h
@@ -50,7 +50,6 @@ struct CdbComponentDatabases;
struct StringInfoData;
using StringInfo = StringInfoData *;
struct LogicalIndexes;
-struct LogicalIndexInfo;
struct ParseState;
struct DefElem;
struct GpPolicy;
@@ -587,14 +586,6 @@ double CdbEstimatePartitionedNumTuples(Relation rel);
// close the given relation
void CloseRelation(Relation rel);
-#if 0
- // return the logical indexes for a partitioned table
- LogicalIndexes *GetLogicalPartIndexes(Oid oid);
-
- // return the logical info structure for a given logical index oid
- LogicalIndexInfo *GetLogicalIndexInfo(Oid root_oid, Oid index_oid);
-#endif
-
// return a list of index oids for a given relation
List *GetRelationIndexes(Relation relation);
diff --git a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
index 7b2771621a..f7e1069cae 100644
--- a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
+++ b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
@@ -48,7 +48,6 @@ extern "C" {
struct RelationData;
using Relation = struct RelationData *;
struct LogicalIndexes;
-struct LogicalIndexInfo;
namespace gpdxl
{
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 1715204fc1..b7d1817b49 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -709,14 +709,6 @@ typedef struct EState
*/
bool useMppParallelMode;
- /*
- * Information relevant to dynamic table scans.
- */
- /* GPDB_12_MERGE_FIXME: This is no longer used by PartitionSelectors.
- * But it's still referenced by DynamicHeapScan etc. nodes.
- */
- DynamicTableScanInfo *dynamicTableScanInfo;
-
/* Should the executor skip past the alien plan nodes */
bool eliminateAliens;
@@ -727,6 +719,9 @@ typedef struct EState
*/
bool gp_bypass_unique_check;
+ /* partition oid that is being scanned, used by DynamicBitmapHeapScan/IndexScan */
+ int partitionOid;
+
} EState;
struct PlanState;
@@ -1666,30 +1661,20 @@ typedef struct DynamicIndexScanState
ExprContext *outer_exprContext;
/*
- * Partition id index that mantains all unique partition ids for the
- * DynamicIndexScan.
- */
- HTAB *pidxIndex;
-
- /*
- * Status of the part to retrieve (result of the sequential search in a hash table).
- */
- HASH_SEQ_STATUS pidxStatus;
-
- /* Like DynamicTableScanState, this flag is required to handle error condition.
- * This flag prevent ExecEndDynamicIndexScan from calling hash_seq_term() or
- * a NULL hash table. */
- bool shouldCallHashSeqTerm;
-
- /*
- * We will create a new copy of logicalIndexInfo in this memory context for
- * each partition. This memory context will be reset per-partition to free
- * up previous partition's logicalIndexInfo memory
+ * This memory context will be reset per-partition to free
+ * up previous partition's memory
*/
MemoryContext partitionMemoryContext;
+ int nOids; /* number of oids to scan in partitioned table */
+ Oid *partOids; /* list of oids to scan in partitioned table */
+ int whichPart; /* index of current partition in partOids */
/* The partition oid for which the current varnos are mapped */
Oid columnLayoutOid;
+
+ struct PartitionPruneState *as_prune_state; /* partition dynamic pruning state */
+ Bitmapset *as_valid_subplans; /* used to determine partitions during dynamic pruning*/
+ bool did_pruning; /* flag that is set when */
} DynamicIndexScanState;
/* ----------------
@@ -1769,19 +1754,22 @@ typedef struct DynamicBitmapIndexScanState
{
ScanState ss;
+ int scan_state; /* the stage of scanning */
+
int eflags;
BitmapIndexScanState *bitmapIndexScanState;
ExprContext *outer_exprContext;
/*
- * We will create a new copy of logicalIndexInfo in this memory context for
- * each partition. This memory context will be reset per-partition to free
- * up previous partition's logicalIndexInfo memory
+ * This memory context will be reset per-partition to free
+ * up previous partition's memory
*/
MemoryContext partitionMemoryContext;
/* The partition oid for which the current varnos are mapped */
- Oid columnLayoutOid;
+ Oid columnLayoutOid;
+
+ List *tuptable;
} DynamicBitmapIndexScanState;
/* ----------------
@@ -1886,30 +1874,9 @@ typedef struct DynamicBitmapHeapScanState
int eflags;
BitmapHeapScanState *bhsState;
-
- /*
- * Pid index that maintains all unique partition pids for this dynamic
- * table scan to scan.
- */
- HTAB *pidIndex;
-
- /*
- * The status of sequentially scan the pid index.
- */
- HASH_SEQ_STATUS pidStatus;
-
- /*
- * Should we call hash_seq_term()? This is required
- * to handle error condition, where we are required to explicitly
- * call hash_seq_term(). Also, if we don't have any partition, this
- * flag should prevent ExecEndDynamicSeqScan from calling
- * hash_seq_term() on a NULL hash table.
- */
- bool shouldCallHashSeqTerm;
-
/*
* The first partition requires initialization of expression states,
- * such as qual and targetlist, regardless of whether we need to re-map varattno
+ * such as qual, regardless of whether we need to re-map varattno
*/
bool firstPartition;
/*
@@ -1931,7 +1898,15 @@ typedef struct DynamicBitmapHeapScanState
* up previous partition's memory
*/
MemoryContext partitionMemoryContext;
-
+
+
+ int nOids; /* number of oids to scan in partitioned table */
+ Oid *partOids; /* list of oids to scan in partitioned table */
+ int whichPart; /* index of current partition in partOids */
+
+ struct PartitionPruneState *as_prune_state; /* partition dynamic pruning state */
+ Bitmapset *as_valid_subplans; /* used to determine partitions during dynamic pruning*/
+ bool did_pruning; /* flag that is set when */
} DynamicBitmapHeapScanState;
/* ----------------
@@ -2220,9 +2195,13 @@ typedef struct DynamicSeqScanState
*/
MemoryContext partitionMemoryContext;
- int nOids;
- Oid *partOids;
- int whichPart;
+ int nOids; /* number of oids to scan in partitioned table */
+ Oid *partOids; /* list of oids to scan in partitioned table */
+ int whichPart; /* index of current partition in partOids */
+
+ struct PartitionPruneState *as_prune_state; /* partition dynamic pruning state */
+ Bitmapset *as_valid_subplans; /* used to determine partitions during dynamic pruning*/
+ bool did_pruning; /* flag that is set when */
} DynamicSeqScanState;
/* ----------------
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index 0bf113a30c..bf2475033b 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -573,31 +573,6 @@ typedef struct SampleScan
struct TableSampleClause *tablesample;
} SampleScan;
-/* ----------------
- * index type information
- */
-typedef enum LogicalIndexType
-{
- INDTYPE_BTREE = 0,
- INDTYPE_BITMAP = 1,
- INDTYPE_GIST = 2,
- INDTYPE_GIN = 3
-} LogicalIndexType;
-
-typedef struct LogicalIndexInfo
-{
- Oid logicalIndexOid; /* OID of the logical index */
- int nColumns; /* Number of columns in the index */
- AttrNumber *indexKeys; /* column numbers of index keys */
- List *indPred; /* predicate if partial index, or NIL */
- List *indExprs; /* index on expressions */
- bool indIsUnique; /* unique index */
- LogicalIndexType indType; /* index type: btree or bitmap */
- Node *partCons; /* concatenated list of check constraints
- * of each partition on which this index is defined */
- List *defaultLevels; /* Used to identify a default partition */
-} LogicalIndexInfo;
-
/* ----------------
* index scan node
*
@@ -663,8 +638,15 @@ typedef struct DynamicIndexScan
*/
List *partOids;
- /* logical index to use */
- LogicalIndexInfo *logicalIndexInfo;
+ /* Info for run-time subplan pruning; NULL if we're not doing that */
+ struct PartitionPruneInfo *part_prune_info;
+
+ /*
+ * Info for run-time join pruning, using Partition Selector nodes.
+ * These param IDs contain additional Bitmapsets containing selected
+ * partitions.
+ */
+ List *join_prune_paramids;
} DynamicIndexScan;
/* ----------------
@@ -749,14 +731,6 @@ typedef struct DynamicBitmapIndexScan
{
/* Fields shared with a normal BitmapIndexScan. Must be first! */
BitmapIndexScan biscan;
-
- /*
- * List of partition OIDs to scan.
- */
- List *partOids;
-
- /* logical index to use */
- LogicalIndexInfo *logicalIndexInfo;
} DynamicBitmapIndexScan;
/* ----------------
@@ -788,6 +762,16 @@ typedef struct DynamicBitmapHeapScan
* List of partition OIDs to scan.
*/
List *partOids;
+
+ /* Info for run-time subplan pruning; NULL if we're not doing that */
+ struct PartitionPruneInfo *part_prune_info;
+
+ /*
+ * Info for run-time join pruning, using Partition Selector nodes.
+ * These param IDs contain additional Bitmapsets containing selected
+ * partitions.
+ */
+ List *join_prune_paramids;
} DynamicBitmapHeapScan;
/*
@@ -799,16 +783,21 @@ typedef struct DynamicSeqScan
/* Fields shared with a normal SeqScan. Must be first! */
SeqScan seqscan;
- /*
- * Index to arrays in EState->dynamicTableScanInfo, that contain information
- * about the partitiones that need to be scanned.
- */
- int32 partIndex;
- int32 partIndexPrintable;
/*
* List of partition OIDs to scan.
*/
List *partOids;
+
+ /* Info for run-time subplan pruning; NULL if we're not doing that */
+ struct PartitionPruneInfo *part_prune_info;
+
+ /*
+ * Info for run-time join pruning, using Partition Selector nodes.
+ * These param IDs contain additional Bitmapsets containing selected
+ * partitions.
+ */
+ List *join_prune_paramids;
+
} DynamicSeqScan;
/* ----------------
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 05/11: Adds Orca support for Dynamic Bitmap Heap/Index Scan
Posted by ma...@apache.org.
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 5f5250e70bf0a3fccc9553106c380d4c6f5e3964
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:59:33 2022 -0700
Adds Orca support for Dynamic Bitmap Heap/Index Scan
---
src/backend/executor/nodeBitmapHeapscan.c | 42 +++--
src/backend/executor/nodeDynamicBitmapHeapscan.c | 181 +++++++++++----------
src/backend/executor/nodeDynamicBitmapIndexscan.c | 77 +++++++--
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 68 ++++----
.../src/translate/CTranslatorExprToDXL.cpp | 140 ++++++----------
.../operators/CDXLPhysicalDynamicBitmapTableScan.h | 30 ++--
.../CParseHandlerPhysicalAbstractBitmapScan.h | 4 +-
.../CParseHandlerPhysicalDynamicBitmapTableScan.h | 10 +-
.../CDXLPhysicalDynamicBitmapTableScan.cpp | 30 +++-
.../CParseHandlerPhysicalAbstractBitmapScan.cpp | 41 ++++-
.../CParseHandlerPhysicalBitmapTableScan.cpp | 3 +-
...CParseHandlerPhysicalDynamicBitmapTableScan.cpp | 16 +-
src/include/executor/nodeDynamicBitmapHeapscan.h | 5 +-
src/include/executor/nodeDynamicBitmapIndexscan.h | 3 -
14 files changed, 355 insertions(+), 295 deletions(-)
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index d4caa77e77..5a5e8c5e43 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -762,8 +762,38 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node)
BitmapHeapScanState *
ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
{
- BitmapHeapScanState *scanstate;
Relation currentRelation;
+ BitmapHeapScanState *bhsState;
+
+ /* check for unsupported flags */
+ Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
+
+ /*
+ * open the scan relation
+ */
+ currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+ bhsState = ExecInitBitmapHeapScanForPartition(node, estate, eflags,
+ currentRelation);
+
+ /*
+ * initialize child nodes
+ *
+ * We do this last because the child nodes will open indexscans on our
+ * relation's indexes, and we want to be sure we have acquired a lock on
+ * the relation first.
+ */
+ outerPlanState(bhsState) = ExecInitNode(outerPlan(node), estate, eflags);
+
+ return bhsState;
+}
+
+BitmapHeapScanState *
+ExecInitBitmapHeapScanForPartition(BitmapHeapScan *node, EState *estate, int eflags,
+ Relation currentRelation)
+{
+ BitmapHeapScanState *scanstate;
+ int io_concurrency;
/* check for unsupported flags */
Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
@@ -819,16 +849,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
*/
ExecAssignExprContext(estate, &scanstate->ss.ps);
- /*
- * open the scan relation
- */
- currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
- /*
- * initialize child nodes
- */
- outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate, eflags);
-
/*
* get the scan type from the relation descriptor.
*/
diff --git a/src/backend/executor/nodeDynamicBitmapHeapscan.c b/src/backend/executor/nodeDynamicBitmapHeapscan.c
index c39a27d611..1b5e268422 100644
--- a/src/backend/executor/nodeDynamicBitmapHeapscan.c
+++ b/src/backend/executor/nodeDynamicBitmapHeapscan.c
@@ -26,15 +26,15 @@
#include "executor/executor.h"
#include "executor/instrument.h"
-#include "executor/execDynamicScan.h"
#include "executor/nodeBitmapHeapscan.h"
+#include "executor/nodeDynamicIndexscan.h"
#include "executor/nodeDynamicBitmapHeapscan.h"
+#include "executor/execPartition.h"
#include "nodes/execnodes.h"
-#include "utils/hsearch.h"
-#include "parser/parsetree.h"
+#include "utils/rel.h"
#include "utils/memutils.h"
-#include "cdb/cdbvars.h"
-#include "cdb/partitionselection.h"
+#include "access/table.h"
+#include "access/tableam.h"
static void CleanupOnePartition(DynamicBitmapHeapScanState *node);
@@ -43,6 +43,8 @@ ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int e
{
DynamicBitmapHeapScanState *state;
Oid reloid;
+ int i;
+ ListCell *lc;
Assert((eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)) == 0);
@@ -50,14 +52,28 @@ ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int e
state->eflags = eflags;
state->ss.ps.plan = (Plan *) node;
state->ss.ps.state = estate;
-
+ state->ss.ps.ExecProcNode = ExecDynamicBitmapHeapScan;
+ state->did_pruning = false;
state->scan_state = SCAN_INIT;
- /* Initialize result tuple type. */
- ExecInitResultTupleSlot(estate, &state->ss.ps);
- ExecAssignResultTypeFromTL(&state->ss.ps);
+ state->whichPart = -1;
+ state->nOids = list_length(node->partOids);
+ state->partOids = palloc(sizeof(Oid) * state->nOids);
+ foreach_with_count(lc, node->partOids, i)
+ state->partOids[i] = lfirst_oid(lc);
+
+ /*
+ * tuple table initialization
+ */
+ Relation scanRel = ExecOpenScanRelation(estate, node->bitmapheapscan.scan.scanrelid, eflags);
+ ExecInitScanTupleSlot(estate, &state->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
- reloid = getrelid(node->bitmapheapscan.scan.scanrelid, estate->es_range_table);
+ /*
+ * Initialize result tuple type and projection info.
+ */
+ ExecInitResultTypeTL(&state->ss.ps);
+
+ reloid = exec_rt_fetch(node->bitmapheapscan.scan.scanrelid, estate)->relid;
Assert(OidIsValid(reloid));
state->firstPartition = true;
@@ -77,6 +93,8 @@ ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int e
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
+ state->as_prune_state = NULL;
+
/*
* initialize child nodes.
*
@@ -108,17 +126,15 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
TupleDesc partTupDesc;
TupleDesc lastTupDesc;
AttrNumber *attMap;
- Oid currentPartitionOid;
- Oid *pid;
+ Oid pid;
Relation currentRelation;
- pid = hash_seq_search(&node->pidStatus);
- if (pid == NULL)
- {
- node->shouldCallHashSeqTerm = false;
+ if (++node->whichPart < node->nOids)
+ pid = node->partOids[node->whichPart];
+ else
return false;
- }
- currentPartitionOid = *pid;
+
+ estate->partitionOid = pid;
/* Collect number of partitions scanned in EXPLAIN ANALYZE */
if (NULL != scanState->ps.instrument)
@@ -127,14 +143,23 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
instr->numPartScanned++;
}
- CleanupOnePartition(node);
+ currentRelation = scanState->ss_currentRelation =
+ table_open(node->partOids[node->whichPart], AccessShareLock);
- currentRelation = scanState->ss_currentRelation = heap_open(currentPartitionOid, AccessShareLock);
- lastScannedRel = heap_open(node->lastRelOid, AccessShareLock);
+ if (currentRelation->rd_rel->relkind != RELKIND_RELATION)
+ {
+ /* shouldn't happen */
+ elog(ERROR, "unexpected relkind in Dynamic Scan: %c", currentRelation->rd_rel->relkind);
+ }
+ lastScannedRel = table_open(node->lastRelOid, AccessShareLock);
lastTupDesc = RelationGetDescr(lastScannedRel);
partTupDesc = RelationGetDescr(scanState->ss_currentRelation);
- attMap = varattnos_map(lastTupDesc, partTupDesc);
- heap_close(lastScannedRel, AccessShareLock);
+ /*
+ * FIXME: should we use execute_attr_map_tuple instead? Seems like a
+ * higher level abstraction that fits the bill
+ */
+ attMap = convert_tuples_by_name_map_if_req(partTupDesc, lastTupDesc, "unused msg");
+ table_close(lastScannedRel, AccessShareLock);
/* If attribute remapping is not necessary, then do not change the varattno */
if (attMap)
@@ -146,13 +171,13 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
* Now that the varattno mapping has been changed, change the relation that
* the new varnos correspond to
*/
- node->lastRelOid = currentPartitionOid;
+ node->lastRelOid = pid;
}
/*
- * For the very first partition, the targetlist of planstate is set to null. So, we must
- * initialize quals and targetlist, regardless of remapping requirements. For later
- * partitions, we only initialize quals and targetlist if a column re-mapping is necessary.
+ * For the very first partition, the qual of planstate is set to null. So, we must
+ * initialize quals, regardless of remapping requirements. For later
+ * partitions, we only initialize quals if a column re-mapping is necessary.
*/
if (attMap || node->firstPartition)
{
@@ -161,10 +186,8 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
MemoryContext oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
/* Initialize child expressions */
- scanState->ps.qual = (List *) ExecInitExpr((Expr *) scanState->ps.plan->qual,
- (PlanState *) scanState);
- scanState->ps.targetlist = (List *) ExecInitExpr((Expr *) scanState->ps.plan->targetlist,
- (PlanState *) scanState);
+ scanState->ps.qual =
+ ExecInitQual(scanState->ps.plan->qual, (PlanState *) scanState);
MemoryContextSwitchTo(oldCxt);
}
@@ -172,7 +195,6 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
if (attMap)
pfree(attMap);
- DynamicScan_SetTableOid(&node->ss, currentPartitionOid);
node->bhsState = ExecInitBitmapHeapScanForPartition(&plan->bitmapheapscan, estate, node->eflags,
currentRelation);
@@ -185,50 +207,37 @@ initNextTableToScan(DynamicBitmapHeapScanState *node)
return true;
}
-/*
- * setPidIndex
- * Set the pid index for the given dynamic table.
- */
-static void
-setPidIndex(DynamicBitmapHeapScanState *node)
-{
- Assert(node->pidIndex == NULL);
-
- ScanState *scanState = (ScanState *)node;
- EState *estate = scanState->ps.state;
- DynamicBitmapHeapScan *plan = (DynamicBitmapHeapScan *) scanState->ps.plan;
-
- Assert(estate->dynamicTableScanInfo != NULL);
-
- /*
- * Ensure that the dynahash exists even if the partition selector
- * didn't choose any partition for current scan node [MPP-24169].
- */
- InsertPidIntoDynamicTableScanInfo(estate, plan->partIndex,
- InvalidOid, InvalidPartitionSelectorId);
-
- Assert(NULL != estate->dynamicTableScanInfo->pidIndexes);
- Assert(estate->dynamicTableScanInfo->numScans >= plan->partIndex);
- node->pidIndex = estate->dynamicTableScanInfo->pidIndexes[plan->partIndex - 1];
- Assert(node->pidIndex != NULL);
-}
-
TupleTableSlot *
-ExecDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
+ExecDynamicBitmapHeapScan(PlanState *pstate)
{
+ DynamicBitmapHeapScanState *node = castNode(DynamicBitmapHeapScanState, pstate);
TupleTableSlot *slot = NULL;
- /*
- * If this is called the first time, find the pid index that contains all unique
- * partition pids for this node to scan.
- */
- if (node->pidIndex == NULL)
+ DynamicBitmapHeapScan *plan = (DynamicBitmapHeapScan *) node->ss.ps.plan;
+ node->as_valid_subplans = NULL;
+ if (NULL != plan->join_prune_paramids && !node->did_pruning)
{
- setPidIndex(node);
- Assert(node->pidIndex != NULL);
+ node->did_pruning = true;
+ node->as_valid_subplans =
+ ExecFindMatchingSubPlans(node->as_prune_state,
+ node->ss.ps.state,
+ list_length(plan->partOids),
+ plan->join_prune_paramids);
+
+ int i = 0;
+ int partOidIdx = -1;
+ List *newPartOids = NIL;
+ ListCell *lc;
+ for(i = 0; i < bms_num_members(node->as_valid_subplans); i++)
+ {
+ partOidIdx = bms_next_member(node->as_valid_subplans, partOidIdx);
+ newPartOids = lappend_oid(newPartOids, node->partOids[partOidIdx]);
+ }
- hash_seq_init(&node->pidStatus, node->pidIndex);
- node->shouldCallHashSeqTerm = true;
+ node->partOids = palloc(sizeof(Oid) * list_length(newPartOids));
+ foreach_with_count(lc, newPartOids, i)
+ node->partOids[i] = lfirst_oid(lc);
+ node->nOids = list_length(newPartOids);
}
/*
@@ -244,7 +253,7 @@ ExecDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
break;
}
- slot = ExecBitmapHeapScan(node->bhsState);
+ slot = ExecProcNode(&node->bhsState->ss.ps);
if (!TupIsNull(slot))
break;
@@ -274,11 +283,8 @@ CleanupOnePartition(DynamicBitmapHeapScanState *scanState)
outerPlanState(scanState->bhsState) = NULL;
ExecEndBitmapHeapScan(scanState->bhsState);
scanState->bhsState = NULL;
- }
- if ((scanState->scan_state & SCAN_SCAN) != 0)
- {
Assert(scanState->ss.ss_currentRelation != NULL);
- ExecCloseScanRelation(scanState->ss.ss_currentRelation);
+ table_close(scanState->ss.ss_currentRelation, NoLock);
scanState->ss.ss_currentRelation = NULL;
}
}
@@ -291,12 +297,6 @@ static void
DynamicBitmapHeapScanEndCurrentScan(DynamicBitmapHeapScanState *node)
{
CleanupOnePartition(node);
-
- if (node->shouldCallHashSeqTerm)
- {
- hash_seq_term(&node->pidStatus);
- node->shouldCallHashSeqTerm = false;
- }
}
/*
@@ -309,7 +309,8 @@ ExecEndDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
{
DynamicBitmapHeapScanEndCurrentScan(node);
- ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
+ if (node->ss.ps.ps_ResultTupleSlot)
+ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
/*
* close down subplans
@@ -326,6 +327,18 @@ ExecReScanDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
{
DynamicBitmapHeapScanEndCurrentScan(node);
- /* Force reloading the partition hash table */
- node->pidIndex = NULL;
+ // reset partition internal state
+ /*
+ * If any PARAM_EXEC Params used in pruning expressions have changed, then
+ * we'd better unset the valid subplans so that they are reselected for
+ * the new parameter values.
+ */
+ if (node->as_prune_state &&
+ bms_overlap(node->ss.ps.chgParam,
+ node->as_prune_state->execparamids))
+ {
+ bms_free(node->as_valid_subplans);
+ node->as_valid_subplans = NULL;
+ }
+ node->whichPart = -1;
}
diff --git a/src/backend/executor/nodeDynamicBitmapIndexscan.c b/src/backend/executor/nodeDynamicBitmapIndexscan.c
index 5dd5372bd2..d38b8f4a61 100644
--- a/src/backend/executor/nodeDynamicBitmapIndexscan.c
+++ b/src/backend/executor/nodeDynamicBitmapIndexscan.c
@@ -29,18 +29,17 @@
#include "postgres.h"
-#include "cdb/cdbvars.h"
-#include "cdb/partitionselection.h"
+#include "catalog/partition.h"
#include "executor/executor.h"
#include "executor/instrument.h"
#include "nodes/execnodes.h"
#include "executor/nodeBitmapIndexscan.h"
-#include "executor/execDynamicScan.h"
#include "executor/nodeDynamicIndexscan.h"
#include "executor/nodeDynamicBitmapIndexscan.h"
-#include "access/genam.h"
-#include "nodes/nodeFuncs.h"
+#include "access/table.h"
+#include "access/tableam.h"
#include "utils/memutils.h"
+#include "utils/rel.h"
/*
* Initialize ScanState in DynamicBitmapIndexScan.
@@ -56,8 +55,33 @@ ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int
dynamicBitmapIndexScanState = makeNode(DynamicBitmapIndexScanState);
dynamicBitmapIndexScanState->ss.ps.plan = (Plan *) node;
dynamicBitmapIndexScanState->ss.ps.state = estate;
+ dynamicBitmapIndexScanState->ss.ps.ExecProcNode = ExecDynamicIndexScan;
dynamicBitmapIndexScanState->eflags = eflags;
+ dynamicBitmapIndexScanState->scan_state = SCAN_INIT;
+
+ /*
+ * Initialize child expressions
+ *
+ * These are not used for anything, we rely on the child IndexScan node
+ * to do all evaluation for us. But I think this is still needed to
+ * find and process any SubPlans. See comment in ExecInitIndexScan.
+ */
+ dynamicBitmapIndexScanState->ss.ps.qual =
+ ExecInitQual(node->biscan.scan.plan.qual,
+ (PlanState *) dynamicBitmapIndexScanState);
+
+ /*
+ * tuple table initialization
+ */
+ Relation scanRel = ExecOpenScanRelation(estate, node->biscan.scan.scanrelid, eflags);
+ ExecInitScanTupleSlot(estate, &dynamicBitmapIndexScanState->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+
+ /*
+ * Initialize result tuple type and projection info.
+ */
+ ExecInitResultTypeTL(&dynamicBitmapIndexScanState->ss.ps);
+
/*
* This context will be reset per-partition to free up per-partition
* copy of LogicalIndexInfo
@@ -91,11 +115,8 @@ BitmapIndexScan_ReMapColumns(DynamicBitmapIndexScan *dbiScan, Oid oldOid, Oid ne
if (attMap)
{
- IndexScan_MapLogicalIndexInfo(dbiScan->logicalIndexInfo,
- attMap,
- dbiScan->biscan.scan.scanrelid);
-
/* A bitmap index scan has no target list or quals */
+ // FIXME: no quals remapping?
pfree(attMap);
}
@@ -114,7 +135,18 @@ beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
Relation currentRelation;
Oid indexOid;
MemoryContext oldCxt;
+ List *save_tupletable;
+
+ /*
+ * open the base relation and acquire appropriate lock on it.
+ */
+ currentRelation = table_open(tableOid, AccessShareLock);
+ node->ss.ss_currentRelation = currentRelation;
+
+ save_tupletable = estate->es_tupleTable;
+
+ estate->es_tupleTable = NIL;
oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
/*
@@ -124,7 +156,7 @@ beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
if (!OidIsValid(node->columnLayoutOid))
{
/* Very first partition */
- node->columnLayoutOid = rel_partition_get_root(tableOid);
+ node->columnLayoutOid = get_partition_parent(tableOid);
}
BitmapIndexScan_ReMapColumns(dbiScan, node->columnLayoutOid, tableOid);
node->columnLayoutOid = tableOid;
@@ -136,13 +168,13 @@ beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
* We started at table level, and now we are fetching the oid of an index
* partition.
*/
- currentRelation = heap_open(tableOid, AccessShareLock);
- indexOid = getPhysicalIndexRelid(currentRelation, dbiScan->logicalIndexInfo);
+ Oid indexOidOld = dbiScan->biscan.indexid;
+ indexOid = index_get_partition(currentRelation, dbiScan->biscan.indexid);
if (!OidIsValid(indexOid))
- elog(ERROR, "failed to find index for partition \"%s\" in dynamic index scan",
- RelationGetRelationName(currentRelation));
- ExecCloseScanRelation(currentRelation);
+ elog(ERROR, "failed to find index for partition \"%s\" for \"%d\"in dynamic index scan",
+ RelationGetRelationName(currentRelation), dbiScan->biscan.indexid);
+ table_close(currentRelation, NoLock);
/* Modify the plan node with the index ID */
dbiScan->biscan.indexid = indexOid;
@@ -150,12 +182,15 @@ beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
estate,
node->eflags);
+ dbiScan->biscan.indexid = indexOidOld;
if (node->ss.ps.instrument)
{
/* Let the BitmapIndexScan share our Instrument node */
node->bitmapIndexScanState->ss.ps.instrument = node->ss.ps.instrument;
}
+ node->tuptable = estate->es_tupleTable;
+ estate->es_tupleTable = save_tupletable;
MemoryContextSwitchTo(oldCxt);
if (node->outer_exprContext)
@@ -173,6 +208,9 @@ endCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node)
ExecEndBitmapIndexScan(node->bitmapIndexScanState);
node->bitmapIndexScanState = NULL;
}
+ ExecResetTupleTable(node->tuptable, true);
+ node->tuptable = NIL;
+ MemoryContextReset(node->partitionMemoryContext);
}
/*
@@ -191,7 +229,11 @@ MultiExecDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node)
* Fetch the OID of the current partition, and of the index on
* that partition to scan.
*/
- tableOid = DynamicScan_GetTableOid(&node->ss);
+ if (estate->partitionOid > 0) {
+ tableOid = estate->partitionOid;
+ } else {
+ return NULL;
+ }
/*
* Create the underlying regular BitmapIndexScan executor node,
@@ -214,7 +256,7 @@ void
ExecEndDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node)
{
endCurrentBitmapIndexScan(node);
-
+ node->scan_state = SCAN_END;
MemoryContextDelete(node->partitionMemoryContext);
}
@@ -231,4 +273,5 @@ ExecReScanDynamicBitmapIndex(DynamicBitmapIndexScanState *node)
ExecEndBitmapIndexScan(node->bitmapIndexScanState);
node->bitmapIndexScanState = NULL;
}
+ node->scan_state = SCAN_INIT;
}
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index 425e05f55e..1e9779dc29 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -5762,8 +5762,6 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
const CDXLNode *bitmapscan_dxlnode, CDXLTranslateContext *output_context,
CDXLTranslationContextArray *ctxt_translation_prev_siblings)
{
- ULONG part_index_id = 0;
- ULONG part_idx_printable_id = 0;
BOOL is_dynamic = false;
const CDXLTableDescr *table_descr = nullptr;
@@ -5781,9 +5779,6 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
CDXLPhysicalDynamicBitmapTableScan::Cast(dxl_operator);
table_descr = phy_dyn_bitmap_tblscan_dxlop->GetDXLTableDescr();
- part_index_id = phy_dyn_bitmap_tblscan_dxlop->GetPartIndexId();
- part_idx_printable_id =
- phy_dyn_bitmap_tblscan_dxlop->GetPartIndexIdPrintable();
is_dynamic = true;
}
@@ -5809,19 +5804,46 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
m_dxl_to_plstmt_context->AddRTE(rte);
+ DynamicBitmapHeapScan *dscan;
BitmapHeapScan *bitmap_tbl_scan;
if (is_dynamic)
{
- DynamicBitmapHeapScan *dscan = MakeNode(DynamicBitmapHeapScan);
+ dscan = MakeNode(DynamicBitmapHeapScan);
+ bitmap_tbl_scan = &dscan->bitmapheapscan;
- // GPDB_12_MERGE_FIXME: broken with the Partition Selector refactoring
-#if 0
- dscan->partIndex = part_index_id;
- dscan->partIndexPrintable = part_idx_printable_id;
-#endif
+ CDXLPhysicalDynamicBitmapTableScan *phy_dyn_bitmap_tblscan_dxlop =
+ CDXLPhysicalDynamicBitmapTableScan::Cast(dxl_operator);
- bitmap_tbl_scan = &dscan->bitmapheapscan;
+ IMdIdArray *parts = phy_dyn_bitmap_tblscan_dxlop->GetParts();
+
+ List *oids_list = NIL;
+
+ for (ULONG ul = 0; ul < parts->Size(); ul++)
+ {
+ Oid part = CMDIdGPDB::CastMdid((*parts)[ul])->Oid();
+ oids_list = gpdb::LAppendOid(oids_list, part);
+ }
+
+ dscan->partOids = oids_list;
+
+ dscan->join_prune_paramids = NIL;
+
+ OID oid_type =
+ CMDIdGPDB::CastMdid(m_md_accessor->PtMDType<IMDTypeInt4>()->MDId())
+ ->Oid();
+
+ const ULongPtrArray *selector_ids =
+ phy_dyn_bitmap_tblscan_dxlop->GetSelectorIds();
+
+ for (ULONG ul = 0; ul < selector_ids->Size(); ++ul)
+ {
+ ULONG selector_id = *(*selector_ids)[ul];
+ ULONG param_id = m_dxl_to_plstmt_context->GetParamIdForSelector(
+ oid_type, selector_id);
+ dscan->join_prune_paramids =
+ gpdb::LAppendInt(dscan->join_prune_paramids, param_id);
+ }
}
else
{
@@ -5860,6 +5882,10 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
&base_table_context, ctxt_translation_prev_siblings, bitmap_tbl_scan);
SetParamIds(plan);
+ if (is_dynamic)
+ {
+ return (Plan *) dscan;
+ }
return (Plan *) bitmap_tbl_scan;
}
@@ -5984,16 +6010,9 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe(
if (IsA(bitmap_tbl_scan, DynamicBitmapHeapScan))
{
- GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion,
- GPOS_WSZ_LIT("FIXME: dynamic bitmap index scan"));
-#if 0
/* It's a Dynamic Bitmap Index Scan */
dyn_bitmap_idx_scan = MakeNode(DynamicBitmapIndexScan);
- dyn_bitmap_idx_scan->partIndex = ((DynamicBitmapHeapScan *) bitmap_tbl_scan)->partIndex;
- dyn_bitmap_idx_scan->partIndexPrintable = ((DynamicBitmapHeapScan *) bitmap_tbl_scan)->partIndexPrintable;
-
bitmap_idx_scan = &(dyn_bitmap_idx_scan->biscan);
-#endif
}
else
{
@@ -6036,17 +6055,6 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe(
*/
SetParamIds(plan);
-#if 0
- /*
- * If it's a Dynamic Bitmap Index Scan, also fill in the information
- * about the indexes on the partitions.
- */
- if (dyn_bitmap_idx_scan)
- {
- dyn_bitmap_idx_scan->logicalIndexInfo = gpdb::GetLogicalIndexInfo(oidRel, index_oid);
- }
-#endif
-
return plan;
}
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index efc6c873a4..a942c22a15 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -1450,119 +1450,81 @@ CTranslatorExprToDXL::PdxlnDynamicBitmapTableScan(
CDistributionSpecArray *pdrgpdsBaseTables, CExpression *pexprScalar,
CDXLPhysicalProperties *dxl_properties)
{
- GPOS_ASSERT(nullptr != pexprScan);
+ GPOS_ASSERT(NULL != pexprScan);
+
CPhysicalDynamicBitmapTableScan *pop =
CPhysicalDynamicBitmapTableScan::PopConvert(pexprScan->Pop());
+ CColRefArray *pdrgpcrOutput = pop->PdrgpcrOutput();
- // construct projection list
- CColRefSet *pcrsOutput = pexprScan->Prpp()->PcrsRequired();
- CDXLNode *pdxlnPrLAppend = PdxlnProjList(pcrsOutput, colref_array);
-
- CDXLNode *pdxlnResult = GPOS_NEW(m_mp)
- CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLPhysicalAppend(m_mp, false, false));
- // GPDB_12_MERGE_FIXME: set plan costs
- pdxlnResult->SetProperties(dxl_properties);
- pdxlnResult->AddChild(pdxlnPrLAppend);
- pdxlnResult->AddChild(PdxlnFilter(nullptr));
+ CDXLTableDescr *table_descr =
+ MakeDXLTableDescr(pop->Ptabdesc(), pdrgpcrOutput, pexprScan->Prpp());
+ // construct dynamic table scan operator
IMdIdArray *part_mdids = pop->GetPartitionMdids();
+ part_mdids->AddRef();
- COptCtxt::PoctxtFromTLS()->AddDirectDispatchableFilterCandidate(pexprScan);
-
- for (ULONG ul = 0; ul < part_mdids->Size(); ++ul)
+ ULongPtrArray *selector_ids = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
+ CPartitionPropagationSpec *pps_reqd =
+ pexprScan->Prpp()->Pepp()->PppsRequired();
+ if (pps_reqd->Contains(pop->ScanId()))
{
- IMDId *part_mdid = (*part_mdids)[ul];
- const IMDRelation *part = m_pmda->RetrieveRel(part_mdid);
-
- // translate table descriptor
- CTableDescriptor *part_tabdesc =
- MakeTableDescForPart(part, pexprScan->DeriveTableDescriptor());
-
- // Create new colrefs for the child partition. The ColRefs from root
- // DTS, which may be used in any parent node, can no longer be exported
- // by a child of the Append node. Thus it is exported by the Append
- // node itself, and new colrefs are created here.
- CColRefArray *part_colrefs = GPOS_NEW(m_mp) CColRefArray(m_mp);
- for (ULONG ul = 0; ul < part_tabdesc->ColumnCount(); ++ul)
- {
- const CColumnDescriptor *cd = part_tabdesc->Pcoldesc(ul);
- CColRef *cr = m_pcf->PcrCreate(cd->RetrieveType(),
- cd->TypeModifier(), cd->Name());
- part_colrefs->Append(cr);
- }
-
- CDXLTableDescr *dxl_table_descr =
- MakeDXLTableDescr(part_tabdesc, part_colrefs, pexprScan->Prpp());
- part_tabdesc->Release();
-
- CDXLNode *pdxlnBitmapTableScan = GPOS_NEW(m_mp) CDXLNode(
- m_mp,
- GPOS_NEW(m_mp) CDXLPhysicalBitmapTableScan(m_mp, dxl_table_descr));
-
- // set properties
- // construct plan costs, if there are not passed as a parameter
- if (nullptr == dxl_properties)
+ const CBitSet *bs = pps_reqd->SelectorIds(pop->ScanId());
+ CBitSetIter bsi(*bs);
+ for (ULONG ul = 0; bsi.Advance(); ul++)
{
- dxl_properties = GetProperties(pexprScan);
+ selector_ids->Append(GPOS_NEW(m_mp) ULONG(bsi.Bit()));
}
- dxl_properties->AddRef();
- pdxlnBitmapTableScan->SetProperties(dxl_properties);
+ }
- // build projection list
- auto *root_col_mapping = (*pop->GetRootColMappingPerPart())[ul];
+ CDXLPhysicalDynamicBitmapTableScan *pdxlopScan =
+ GPOS_NEW(m_mp) CDXLPhysicalDynamicBitmapTableScan(
+ m_mp, table_descr, part_mdids, selector_ids);
- // translate scalar predicate into DXL filter only if it is not redundant
- CExpression *pexprRecheckCond = (*pexprScan)[0];
- CDXLNode *pdxlnCond = nullptr;
- if (nullptr != pexprScalar && !CUtils::FScalarConstTrue(pexprScalar) &&
- !pexprScalar->Matches(pexprRecheckCond))
- {
- pdxlnCond =
- PdxlnCondForChildPart(root_col_mapping, part_colrefs,
- pop->PdrgpcrOutput(), pexprScalar);
- }
+ CDXLNode *pdxlnScan = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopScan);
- CDXLNode *filter_dxlnode = PdxlnFilter(pdxlnCond);
+ // construct plan costs
+ if (NULL == dxl_properties)
+ {
+ dxl_properties = GetProperties(pexprScan);
+ }
+ pdxlnScan->SetProperties(dxl_properties);
- CDXLNode *pdxlnRecheckCond =
- PdxlnCondForChildPart(root_col_mapping, part_colrefs,
- pop->PdrgpcrOutput(), pexprRecheckCond);
- CDXLNode *pdxlnRecheckCondFilter = GPOS_NEW(m_mp)
- CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarRecheckCondFilter(m_mp),
- pdxlnRecheckCond);
+ // translate predicates into DXL filter
+ CDXLNode *pdxlnCond = NULL;
+ if (NULL != pexprScalar)
+ {
+ pdxlnCond = PdxlnScalar(pexprScalar);
+ }
+ CDXLNode *filter_dxlnode = PdxlnFilter(pdxlnCond);
- AddBitmapFilterColumns(m_mp, pop, pexprRecheckCond, pexprScalar,
- pcrsOutput);
+ CExpression *pexprRecheckCond = (*pexprScan)[0];
+ CDXLNode *pdxlnRecheckCond = PdxlnScalar(pexprRecheckCond);
+ CDXLNode *pdxlnRecheckCondFilter = GPOS_NEW(m_mp)
+ CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarRecheckCondFilter(m_mp));
+ pdxlnRecheckCondFilter->AddChild(pdxlnRecheckCond);
- CDXLNode *proj_list_dxlnode = PdxlnProjListForChildPart(
- root_col_mapping, part_colrefs, pcrsOutput, colref_array);
+ // translate bitmap access path
+ CDXLNode *pdxlnBitmapAccessPath = PdxlnScalar((*pexprScan)[1]);
- // translate bitmap access path
- CExpression *pexprBitmapIndexPath = (*pexprScan)[1];
+ // build projection list
+ CColRefSet *pcrsOutput = pexprScan->Prpp()->PcrsRequired();
+ CDXLNode *proj_list_dxlnode = PdxlnProjList(pcrsOutput, colref_array);
- CDXLNode *pdxlnBitmapIndexPath = PdxlnBitmapIndexPathForChildPart(
- root_col_mapping, part_colrefs, pop->PdrgpcrOutput(), part,
- pexprBitmapIndexPath);
+ pdxlnScan->AddChild(proj_list_dxlnode);
+ pdxlnScan->AddChild(filter_dxlnode);
+ pdxlnScan->AddChild(pdxlnRecheckCondFilter);
+ pdxlnScan->AddChild(pdxlnBitmapAccessPath);
- pdxlnBitmapTableScan->AddChild(proj_list_dxlnode);
- pdxlnBitmapTableScan->AddChild(filter_dxlnode);
- pdxlnBitmapTableScan->AddChild(pdxlnRecheckCondFilter);
- pdxlnBitmapTableScan->AddChild(pdxlnBitmapIndexPath);
#ifdef GPOS_DEBUG
- pdxlnBitmapTableScan->GetOperator()->AssertValid(
- pdxlnBitmapTableScan, false /*validate_children*/);
+ pdxlnScan->GetOperator()->AssertValid(pdxlnScan,
+ false /* validate_children */);
#endif
- pdxlnResult->AddChild(pdxlnBitmapTableScan);
-
- // cleanup
- part_colrefs->Release();
- }
-
CDistributionSpec *pds = pexprScan->GetDrvdPropPlan()->Pds();
pds->AddRef();
pdrgpdsBaseTables->Append(pds);
- return pdxlnResult;
+
+ return pdxlnScan;
}
//---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
index 6f8498c3b3..b615071d99 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
@@ -35,11 +35,9 @@ class CXMLSerializer;
class CDXLPhysicalDynamicBitmapTableScan : public CDXLPhysicalAbstractBitmapScan
{
private:
- // id of partition index structure
- ULONG m_part_index_id;
+ IMdIdArray *m_part_mdids;
- // printable partition index id
- ULONG m_part_index_id_printable;
+ ULongPtrArray *m_selector_ids = nullptr;
public:
CDXLPhysicalDynamicBitmapTableScan(
@@ -48,17 +46,17 @@ public:
// ctor
CDXLPhysicalDynamicBitmapTableScan(CMemoryPool *mp,
CDXLTableDescr *table_descr,
- ULONG part_idx_id,
- ULONG part_idx_id_printable)
+ IMdIdArray *part_mdids,
+ ULongPtrArray *selector_ids)
: CDXLPhysicalAbstractBitmapScan(mp, table_descr),
- m_part_index_id(part_idx_id),
- m_part_index_id_printable(part_idx_id_printable)
+ m_part_mdids(part_mdids),
+ m_selector_ids(selector_ids)
{
GPOS_ASSERT(nullptr != table_descr);
}
// dtor
- ~CDXLPhysicalDynamicBitmapTableScan() override = default;
+ ~CDXLPhysicalDynamicBitmapTableScan() override;
// operator type
Edxlopid
@@ -70,18 +68,12 @@ public:
// operator name
const CWStringConst *GetOpNameStr() const override;
- // partition index id
- ULONG
- GetPartIndexId() const
- {
- return m_part_index_id;
- }
+ IMdIdArray *GetParts() const;
- // printable partition index id
- ULONG
- GetPartIndexIdPrintable() const
+ const ULongPtrArray *
+ GetSelectorIds() const
{
- return m_part_index_id_printable;
+ return m_selector_ids;
}
// serialize operator in DXL format
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
index 4b8b4c2399..83787b2041 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
@@ -41,8 +41,8 @@ protected:
// common EndElement functionality for child classes
void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type, ULONG part_idx_id = 0,
- ULONG part_idx_id_printable = 0);
+ Edxltoken token_type,
+ ULongPtrArray *selector_ids = nullptr);
public:
CParseHandlerPhysicalAbstractBitmapScan(
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
index 43ea094a75..25c547b058 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
@@ -35,11 +35,7 @@ class CParseHandlerPhysicalDynamicBitmapTableScan
: public CParseHandlerPhysicalAbstractBitmapScan
{
private:
- // part index id
- ULONG m_part_index_id;
-
- // printable partition index id
- ULONG m_part_index_id_printable;
+ ULongPtrArray *m_selector_ids;
// process the start of an element
void StartElement(
@@ -65,9 +61,7 @@ public:
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root)
: CParseHandlerPhysicalAbstractBitmapScan(mp, parse_handler_mgr,
- parse_handler_root),
- m_part_index_id(0),
- m_part_index_id_printable(0)
+ parse_handler_root)
{
}
};
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
index d0dd3c5313..1a0e01caee 100644
--- a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
@@ -11,10 +11,12 @@
#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+#include "naucrates/dxl/CDXLUtils.h"
#include "naucrates/dxl/operators/CDXLNode.h"
#include "naucrates/dxl/operators/CDXLTableDescr.h"
#include "naucrates/dxl/xml/CXMLSerializer.h"
#include "naucrates/dxl/xml/dxltokens.h"
+#include "naucrates/md/IMDCacheObject.h"
using namespace gpdxl;
using namespace gpos;
@@ -33,6 +35,18 @@ CDXLPhysicalDynamicBitmapTableScan::GetOpNameStr() const
return CDXLTokens::GetDXLTokenStr(EdxltokenPhysicalDynamicBitmapTableScan);
}
+IMdIdArray *
+CDXLPhysicalDynamicBitmapTableScan::GetParts() const
+{
+ return m_part_mdids;
+}
+
+CDXLPhysicalDynamicBitmapTableScan::~CDXLPhysicalDynamicBitmapTableScan()
+{
+ m_part_mdids->Release();
+ CRefCount::SafeRelease(m_selector_ids);
+}
+
//---------------------------------------------------------------------------
// @function:
// CDXLPhysicalDynamicBitmapTableScan::SerializeToDXL
@@ -49,16 +63,18 @@ CDXLPhysicalDynamicBitmapTableScan::SerializeToDXL(
xml_serializer->OpenElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+ CWStringDynamic *serialized_selector_ids =
+ CDXLUtils::Serialize(m_mp, m_selector_ids);
xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
- if (m_part_index_id_printable != m_part_index_id)
- {
- xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
- m_part_index_id_printable);
- }
+ CDXLTokens::GetDXLTokenStr(EdxltokenSelectorIds),
+ serialized_selector_ids);
+ GPOS_DELETE(serialized_selector_ids);
node->SerializePropertiesToDXL(xml_serializer);
node->SerializeChildrenToDXL(xml_serializer);
+ IMDCacheObject::SerializeMDIdList(
+ xml_serializer, m_part_mdids,
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartitions),
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartition));
m_dxl_table_descr->SerializeToDXL(xml_serializer);
xml_serializer->CloseElement(
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
index 3b18e63e44..85f681c7e5 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
@@ -16,6 +16,7 @@
#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
+#include "naucrates/dxl/parser/CParseHandlerMetadataIdList.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
@@ -56,6 +57,16 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(table_descr_parse_handler);
+ CParseHandlerBase *partition_mdids_parse_handler = nullptr;
+ if (EdxltokenPhysicalDynamicBitmapTableScan == token_type)
+ {
+ partition_mdids_parse_handler = CParseHandlerFactory::GetParseHandler(
+ m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
+ m_parse_handler_mgr, this);
+ m_parse_handler_mgr->ActivateParseHandler(
+ partition_mdids_parse_handler);
+ }
+
// parse handler for the bitmap access path
CParseHandlerBase *bitmap_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -97,6 +108,10 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
this->Append(filter_parse_handler);
this->Append(recheck_cond_parse_handler);
this->Append(bitmap_parse_handler);
+ if (EdxltokenPhysicalDynamicBitmapTableScan == token_type)
+ {
+ this->Append(partition_mdids_parse_handler);
+ }
this->Append(table_descr_parse_handler);
}
@@ -111,7 +126,7 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
void
CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
const XMLCh *const element_local_name, Edxltoken token_type,
- ULONG part_idx_id, ULONG part_idx_id_printable)
+ ULongPtrArray *selector_ids)
{
if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
element_local_name))
@@ -122,19 +137,26 @@ CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
str->GetBuffer());
}
+ int i = 0;
// construct nodes from the created child nodes
CParseHandlerProperties *prop_parse_handler =
- dynamic_cast<CParseHandlerProperties *>((*this)[0]);
+ dynamic_cast<CParseHandlerProperties *>((*this)[i++]);
CParseHandlerProjList *proj_list_parse_handler =
- dynamic_cast<CParseHandlerProjList *>((*this)[1]);
+ dynamic_cast<CParseHandlerProjList *>((*this)[i++]);
CParseHandlerFilter *filter_parse_handler =
- dynamic_cast<CParseHandlerFilter *>((*this)[2]);
+ dynamic_cast<CParseHandlerFilter *>((*this)[i++]);
CParseHandlerFilter *recheck_cond_parse_handler =
- dynamic_cast<CParseHandlerFilter *>((*this)[3]);
+ dynamic_cast<CParseHandlerFilter *>((*this)[i++]);
CParseHandlerScalarOp *bitmap_parse_handler =
- dynamic_cast<CParseHandlerScalarOp *>((*this)[4]);
+ dynamic_cast<CParseHandlerScalarOp *>((*this)[i++]);
+ CParseHandlerMetadataIdList *partition_mdids_parse_handler = nullptr;
+ if (EdxltokenPhysicalDynamicBitmapTableScan == token_type)
+ {
+ partition_mdids_parse_handler =
+ dynamic_cast<CParseHandlerMetadataIdList *>((*this)[i++]);
+ }
CParseHandlerTableDescr *table_descr_parse_handler =
- dynamic_cast<CParseHandlerTableDescr *>((*this)[5]);
+ dynamic_cast<CParseHandlerTableDescr *>((*this)[i++]);
GPOS_ASSERT(nullptr != table_descr_parse_handler->GetDXLTableDescr());
@@ -150,8 +172,11 @@ CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
else
{
GPOS_ASSERT(EdxltokenPhysicalDynamicBitmapTableScan == token_type);
+ IMdIdArray *mdid_partitions_array =
+ partition_mdids_parse_handler->GetMdIdArray();
+ mdid_partitions_array->AddRef();
dxl_op = GPOS_NEW(m_mp) CDXLPhysicalDynamicBitmapTableScan(
- m_mp, table_descr, part_idx_id, part_idx_id_printable);
+ m_mp, table_descr, mdid_partitions_array, selector_ids);
}
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalBitmapTableScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalBitmapTableScan.cpp
index 9bb5fa699c..73f7c9ff9f 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalBitmapTableScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalBitmapTableScan.cpp
@@ -49,5 +49,6 @@ CParseHandlerPhysicalBitmapTableScan::EndElement(
const XMLCh *const // element_qname
)
{
- EndElementHelper(element_local_name, EdxltokenPhysicalBitmapTableScan);
+ EndElementHelper(element_local_name, EdxltokenPhysicalBitmapTableScan,
+ nullptr);
}
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp
index 49f9def6ae..17dcc49cf3 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp
@@ -32,17 +32,10 @@ CParseHandlerPhysicalDynamicBitmapTableScan::StartElement(
{
StartElementHelper(element_local_name,
EdxltokenPhysicalDynamicBitmapTableScan);
- m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
- EdxltokenPhysicalDynamicBitmapTableScan);
- m_part_index_id_printable =
- CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
- EdxltokenPartIndexIdPrintable,
- EdxltokenPhysicalDynamicBitmapTableScan,
- true, //is_optional
- m_part_index_id);
+ m_selector_ids = CDXLOperatorFactory::ExtractConvertValuesToArray(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenSelectorIds,
+ EdxltokenPhysicalDynamicTableScan);
}
//---------------------------------------------------------------------------
@@ -61,8 +54,7 @@ CParseHandlerPhysicalDynamicBitmapTableScan::EndElement(
)
{
EndElementHelper(element_local_name,
- EdxltokenPhysicalDynamicBitmapTableScan, m_part_index_id,
- m_part_index_id_printable);
+ EdxltokenPhysicalDynamicBitmapTableScan, m_selector_ids);
}
// EOF
diff --git a/src/include/executor/nodeDynamicBitmapHeapscan.h b/src/include/executor/nodeDynamicBitmapHeapscan.h
index b12954cf66..45c48ade8d 100644
--- a/src/include/executor/nodeDynamicBitmapHeapscan.h
+++ b/src/include/executor/nodeDynamicBitmapHeapscan.h
@@ -16,12 +16,9 @@
#include "nodes/execnodes.h"
-/* GPDB_12_MERGE_FIXME */
-#if 0
extern DynamicBitmapHeapScanState *ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int eflags);
-extern TupleTableSlot *ExecDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
+extern TupleTableSlot *ExecDynamicBitmapHeapScan(PlanState *pstate);
extern void ExecEndDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
extern void ExecReScanDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
-#endif
#endif
diff --git a/src/include/executor/nodeDynamicBitmapIndexscan.h b/src/include/executor/nodeDynamicBitmapIndexscan.h
index 7faa624a97..0de904ef40 100644
--- a/src/include/executor/nodeDynamicBitmapIndexscan.h
+++ b/src/include/executor/nodeDynamicBitmapIndexscan.h
@@ -16,12 +16,9 @@
#include "nodes/execnodes.h"
-/* GPDB_12_MERGE_FIXME */
-#if 0
extern DynamicBitmapIndexScanState *ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int eflags);
extern Node *MultiExecDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node);
extern void ExecEndDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node);
extern void ExecReScanDynamicBitmapIndex(DynamicBitmapIndexScanState *node);
-#endif
#endif /* NODEDYNAMICBITMAPINDEXSCAN_H */
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 03/11: Adds Orca support for Dynamic Table Scan
Posted by ma...@apache.org.
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 ef95449dba27cea8c81069f5e888c53ec1f4101b
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:47:03 2022 -0700
Adds Orca support for Dynamic Table Scan
---
src/backend/executor/execDynamicScan.c | 158 ---------------------
src/backend/executor/nodeDynamicSeqscan.c | 148 ++++++++-----------
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 33 ++++-
.../src/translate/CTranslatorExprToDXL.cpp | 154 +++-----------------
.../dxl/operators/CDXLPhysicalDynamicTableScan.h | 21 ++-
.../dxl/parser/CParseHandlerDynamicTableScan.h | 6 +-
.../src/operators/CDXLPhysicalDynamicTableScan.cpp | 57 +++-----
.../src/parser/CParseHandlerDynamicTableScan.cpp | 30 ++--
src/include/executor/execDynamicScan.h | 28 ----
9 files changed, 163 insertions(+), 472 deletions(-)
diff --git a/src/backend/executor/execDynamicScan.c b/src/backend/executor/execDynamicScan.c
deleted file mode 100644
index d0496f2e50..0000000000
--- a/src/backend/executor/execDynamicScan.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * execDynamicScan.c
- * Support routines for iterating through dynamically chosen partitions of a relation
- *
- * Portions Copyright (c) 2014-Present VMware, Inc. or its affiliates.
- *
- *
- * IDENTIFICATION
- * src/backend/executor/execDynamicScan.c
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include "cdb/partitionselection.h"
-#include "executor/executor.h"
-#include "executor/execDynamicScan.h"
-#include "parser/parsetree.h"
-
-/*
- * isDynamicScan
- * Returns true if the scan node is dynamic (i.e., determining
- * relations to scan at runtime).
- */
-bool
-isDynamicScan(const Plan *plan)
-{
- switch (nodeTag(plan))
- {
- case T_DynamicSeqScan:
- case T_DynamicIndexScan:
- case T_DynamicBitmapHeapScan:
- case T_DynamicBitmapIndexScan:
- return true;
-
- default:
- return false;
- }
-}
-
-/*
- * DynamicScan_GetDynamicScanId
- * Returns the index into EState->dynamicTableScanInfo arrays for this
- * dynamic scan node.
- */
-static int
-DynamicScan_GetDynamicScanId(Plan *plan)
-{
- switch (nodeTag(plan))
- {
- case T_DynamicSeqScan:
- return ((DynamicSeqScan *) plan)->partIndex;
-
- case T_DynamicIndexScan:
- return ((DynamicIndexScan *) plan)->partIndex;
-
- case T_DynamicBitmapHeapScan:
- return ((DynamicBitmapHeapScan *) plan)->partIndex;
-
- case T_DynamicBitmapIndexScan:
- return ((DynamicBitmapIndexScan *) plan)->partIndex;
-
- default:
- elog(ERROR, "unknown dynamic scan node type %u", nodeTag(plan));
- }
-}
-
-/*
- * DynamicScan_GetDynamicScanIdPrintable
- * Return "printable" scan id for a node, for EXPLAIN
- */
-int
-DynamicScan_GetDynamicScanIdPrintable(Plan *plan)
-{
- switch (nodeTag(plan))
- {
- case T_DynamicSeqScan:
- return ((DynamicSeqScan *) plan)->partIndexPrintable;
-
- case T_DynamicIndexScan:
- return ((DynamicIndexScan *) plan)->partIndexPrintable;
-
- case T_DynamicBitmapHeapScan:
- return ((DynamicBitmapHeapScan *) plan)->partIndexPrintable;
-
- case T_DynamicBitmapIndexScan:
- return ((DynamicBitmapIndexScan *) plan)->partIndexPrintable;
-
- default:
- elog(ERROR, "unknown dynamic scan node type %u", nodeTag(plan));
- }
-}
-
-/*
- * DynamicScan_GetTableOid
- * Returns the Oid of the table/partition to scan.
- *
- * A partition must have been selected already.
- */
-Oid
-DynamicScan_GetTableOid(ScanState *scanState)
-{
- int partIndex;
- Oid curRelOid;
-
- partIndex = DynamicScan_GetDynamicScanId(scanState->ps.plan);
-
- /* Get the oid of the current relation */
- Assert(NULL != scanState->ps.state->dynamicTableScanInfo);
- Assert(partIndex <= scanState->ps.state->dynamicTableScanInfo->numScans);
-
- curRelOid = scanState->ps.state->dynamicTableScanInfo->curRelOids[partIndex - 1];
- if (!OidIsValid(curRelOid))
- elog(ERROR, "no partition selected for dynamic scan id %d", partIndex);
-
- return curRelOid;
-}
-
-/*
- * DynamicScan_SetTableOid
- * Select a partition to scan in a dynamic scan.
- *
- * This is used to advertise the selected partition in EState->dynamicTableScanInfo.
- */
-void
-DynamicScan_SetTableOid(ScanState *scanState, Oid curRelOid)
-{
- int partIndex;
-
- partIndex = DynamicScan_GetDynamicScanId(scanState->ps.plan);
-
- Assert(NULL != scanState->ps.state->dynamicTableScanInfo);
- Assert(partIndex <= scanState->ps.state->dynamicTableScanInfo->numScans);
-
- scanState->ps.state->dynamicTableScanInfo->curRelOids[partIndex - 1] = curRelOid;
-}
-
-/*
- * DynamicScan_RemapExpression
- * Re-maps the expression using the provided attMap.
- */
-bool
-DynamicScan_RemapExpression(ScanState *scanState, AttrNumber *attMap, Node *expr)
-{
- if (!isDynamicScan(scanState->ps.plan))
- {
- return false;
- }
-
- if (NULL != attMap)
- {
- change_varattnos_of_a_varno((Node*)expr, attMap, ((Scan *)scanState->ps.plan)->scanrelid);
- return true;
- }
-
- return false;
-}
diff --git a/src/backend/executor/nodeDynamicSeqscan.c b/src/backend/executor/nodeDynamicSeqscan.c
index 9a0d31fc1a..717a1849a4 100644
--- a/src/backend/executor/nodeDynamicSeqscan.c
+++ b/src/backend/executor/nodeDynamicSeqscan.c
@@ -8,13 +8,11 @@
* DynamicSeqScan node scans each relation one after the other. For each
* relation, it opens the table, scans the tuple, and returns relevant tuples.
*
- * GPDB_12_MERGE_FIXME: This is currently disabled altogether. If it is
- * resurrected, some changes are needed to GPORCA. The way Partition
- * Selectors work has been heavily rewritten, there's no global hash table
- * of selected partitions anymore. For "static selection", there's a
- * partOids field in the DynamicSeqScan plan node that holds the selected
- * partitions; but none of the code in this file has been fixed to
- * actually work that way. Same with all the other Dynamic*Scan nodes.
+ * This has a smaller plan size than using an append with many partitions.
+ * Instead of determining the column mapping for each partition during planning,
+ * this mapping is determined during execution. When there are many partitions
+ * with many columns, the plan size improvement becomes very large, on the order of
+ * 100+ MB in some cases.
*
* Portions Copyright (c) 2012 - present, EMC/Greenplum
* Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
@@ -30,81 +28,16 @@
#include "executor/executor.h"
#include "executor/instrument.h"
#include "nodes/execnodes.h"
-#include "nodes/nodeFuncs.h"
-#include "executor/execDynamicScan.h"
+#include "executor/execPartition.h"
#include "executor/nodeDynamicSeqscan.h"
#include "executor/nodeSeqscan.h"
-#include "utils/hsearch.h"
-#include "parser/parsetree.h"
#include "utils/memutils.h"
#include "utils/rel.h"
-#include "cdb/cdbvars.h"
#include "access/table.h"
#include "access/tableam.h"
static void CleanupOnePartition(DynamicSeqScanState *node);
-/*
- * During attribute re-mapping for heterogeneous partitions, we use
- * this struct to identify which varno's attributes will be re-mapped.
- * Using this struct as a *context* during expression tree walking, we
- * can skip varattnos that do not belong to a given varno.
- */
-typedef struct AttrMapContext
-{
- const AttrNumber *newattno; /* The mapping table to remap the varattno */
- Index varno; /* Which rte's varattno to re-map */
-} AttrMapContext;
-
-/*
- * Remaps the varattno of a varattno in a Var node using an attribute map.
- */
-static bool
-change_varattnos_varno_walker(Node *node, const AttrMapContext *attrMapCxt)
-{
- if (node == NULL)
- return false;
- if (IsA(node, Var))
- {
- Var *var = (Var *) node;
-
- if (var->varlevelsup == 0 && (var->varno == attrMapCxt->varno) &&
- var->varattno > 0)
- {
- /*
- * ??? the following may be a problem when the node is multiply
- * referenced though stringToNode() doesn't create such a node
- * currently.
- */
- Assert(attrMapCxt->newattno[var->varattno - 1] > 0);
- var->varattno = var->varoattno = attrMapCxt->newattno[var->varattno - 1];
- }
- return false;
- }
- return expression_tree_walker(node, change_varattnos_varno_walker,
- (void *) attrMapCxt);
-}
-
-/*
- * Replace varattno values for a given varno RTE index in an expression
- * tree according to the given map array, that is, varattno N is replaced
- * by newattno[N-1]. It is caller's responsibility to ensure that the array
- * is long enough to define values for all user varattnos present in the tree.
- * System column attnos remain unchanged.
- *
- * Note that the passed node tree is modified in-place!
- */
-static void
-change_varattnos_of_a_varno(Node *node, const AttrNumber *newattno, Index varno)
-{
- AttrMapContext attrMapCxt;
-
- attrMapCxt.newattno = newattno;
- attrMapCxt.varno = varno;
-
- (void) change_varattnos_varno_walker(node, &attrMapCxt);
-}
-
DynamicSeqScanState *
ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
{
@@ -120,7 +53,7 @@ ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
state->ss.ps.plan = (Plan *) node;
state->ss.ps.state = estate;
state->ss.ps.ExecProcNode = ExecDynamicSeqScan;
-
+ state->did_pruning = false;
state->scan_state = SCAN_INIT;
/* Initialize child expressions. This is needed to find subplans. */
@@ -150,6 +83,8 @@ ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
state->scanrelid = node->seqscan.scanrelid;
+ state->as_prune_state = NULL;
+
/*
* This context will be reset per-partition to free up per-partition
* qual and targetlist allocations
@@ -159,7 +94,6 @@ ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
ALLOCSET_DEFAULT_MINSIZE,
ALLOCSET_DEFAULT_INITSIZE,
ALLOCSET_DEFAULT_MAXSIZE);
-
return state;
}
@@ -190,6 +124,13 @@ initNextTableToScan(DynamicSeqScanState *node)
else
return false;
+ /* Collect number of partitions scanned in EXPLAIN ANALYZE */
+ if (NULL != scanState->ps.instrument)
+ {
+ Instrumentation *instr = scanState->ps.instrument;
+ instr->numPartScanned++;
+ }
+
currentRelation = scanState->ss_currentRelation =
table_open(node->partOids[node->whichPart], AccessShareLock);
@@ -211,11 +152,6 @@ initNextTableToScan(DynamicSeqScanState *node)
/* If attribute remapping is not necessary, then do not change the varattno */
if (attMap)
{
- /*
- * FIXME: Ewww, this doesn't really belong in the executor. The optimizer
- * really should explicitly pass a qual and a tlist to us, for each
- * partition
- */
change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid);
change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid);
@@ -227,9 +163,9 @@ initNextTableToScan(DynamicSeqScanState *node)
}
/*
- * For the very first partition, the targetlist of planstate is set to null. So, we must
- * initialize quals and targetlist, regardless of remapping requirements. For later
- * partitions, we only initialize quals and targetlist if a column re-mapping is necessary.
+ * For the very first partition, the qual of planstate is set to null. So, we must
+ * initialize quals, regardless of remapping requirements. For later
+ * partitions, we only initialize quals if a column re-mapping is necessary.
*/
if (attMap || node->firstPartition)
{
@@ -247,7 +183,6 @@ initNextTableToScan(DynamicSeqScanState *node)
if (attMap)
pfree(attMap);
-// DynamicScan_SetTableOid(&node->ss, *pid);
node->seqScanState = ExecInitSeqScanForPartition(&plan->seqscan, estate,
currentRelation);
return true;
@@ -260,6 +195,33 @@ ExecDynamicSeqScan(PlanState *pstate)
DynamicSeqScanState *node = castNode(DynamicSeqScanState, pstate);
TupleTableSlot *slot = NULL;
+ DynamicSeqScan *plan = (DynamicSeqScan *) node->ss.ps.plan;
+ node->as_valid_subplans = NULL;
+ if (NULL != plan->join_prune_paramids && !node->did_pruning)
+ {
+ node->did_pruning = true;
+ node->as_valid_subplans =
+ ExecFindMatchingSubPlans(node->as_prune_state,
+ node->ss.ps.state,
+ list_length(plan->partOids),
+ plan->join_prune_paramids);
+
+ int i = 0;
+ int partOidIdx = -1;
+ List *newPartOids = NIL;
+ ListCell *lc;
+ for(i = 0; i < bms_num_members(node->as_valid_subplans); i++)
+ {
+ partOidIdx = bms_next_member(node->as_valid_subplans, partOidIdx);
+ newPartOids = lappend_oid(newPartOids, node->partOids[partOidIdx]);
+ }
+
+ node->partOids = palloc(sizeof(Oid) * list_length(newPartOids));
+ foreach_with_count(lc, newPartOids, i)
+ node->partOids[i] = lfirst_oid(lc);
+ node->nOids = list_length(newPartOids);
+ }
+
/*
* Scan the table to find next tuple to return. If the current table
* is finished, close it and open the next table for scan.
@@ -337,5 +299,21 @@ ExecReScanDynamicSeqScan(DynamicSeqScanState *node)
{
DynamicSeqScanEndCurrentScan(node);
- /* Force reloading the partition hash table */
+ // reset partition internal state
+
+ /*
+ * If any PARAM_EXEC Params used in pruning expressions have changed, then
+ * we'd better unset the valid subplans so that they are reselected for
+ * the new parameter values.
+ */
+ if (node->as_prune_state &&
+ bms_overlap(node->ss.ps.chgParam,
+ node->as_prune_state->execparamids))
+ {
+ bms_free(node->as_valid_subplans);
+ node->as_valid_subplans = NULL;
+ }
+
+ node->whichPart = -1;
+
}
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index d443c7bd19..7ddfcfccaf 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -4054,9 +4054,36 @@ CTranslatorDXLToPlStmt::TranslateDXLDynTblScan(
DynamicSeqScan *dyn_seq_scan = MakeNode(DynamicSeqScan);
dyn_seq_scan->seqscan.scanrelid = index;
- dyn_seq_scan->partIndex = dyn_tbl_scan_dxlop->GetPartIndexId();
- dyn_seq_scan->partIndexPrintable =
- dyn_tbl_scan_dxlop->GetPartIndexIdPrintable();
+
+ IMdIdArray *parts = dyn_tbl_scan_dxlop->GetParts();
+
+ List *oids_list = NIL;
+
+ for (ULONG ul = 0; ul < parts->Size(); ul++)
+ {
+ Oid part = CMDIdGPDB::CastMdid((*parts)[ul])->Oid();
+ oids_list = gpdb::LAppendOid(oids_list, part);
+ }
+
+ dyn_seq_scan->partOids = oids_list;
+
+ dyn_seq_scan->join_prune_paramids = NIL;
+
+ OID oid_type =
+ CMDIdGPDB::CastMdid(m_md_accessor->PtMDType<IMDTypeInt4>()->MDId())
+ ->Oid();
+
+ const ULongPtrArray *selector_ids = dyn_tbl_scan_dxlop->GetSelectorIds();
+
+ for (ULONG ul = 0; ul < selector_ids->Size(); ++ul)
+ {
+ ULONG selector_id = *(*selector_ids)[ul];
+ ULONG param_id = m_dxl_to_plstmt_context->GetParamIdForSelector(
+ oid_type, selector_id);
+ dyn_seq_scan->join_prune_paramids =
+ gpdb::LAppendInt(dyn_seq_scan->join_prune_paramids, param_id);
+ }
+
Plan *plan = &(dyn_seq_scan->seqscan.plan);
plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId();
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index b322ac5595..bca5ff694a 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -1358,9 +1358,26 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
}
// construct dynamic table scan operator
+ IMdIdArray *part_mdids = popDTS->GetPartitionMdids();
+ part_mdids->AddRef();
+
+ ULongPtrArray *selector_ids = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
+ CPartitionPropagationSpec *pps_reqd =
+ pexprDTS->Prpp()->Pepp()->PppsRequired();
+ if (pps_reqd->Contains(popDTS->ScanId()))
+ {
+ const CBitSet *bs = pps_reqd->SelectorIds(popDTS->ScanId());
+ CBitSetIter bsi(*bs);
+ for (ULONG ul = 0; bsi.Advance(); ul++)
+ {
+ selector_ids->Append(GPOS_NEW(m_mp) ULONG(bsi.Bit()));
+ }
+ }
+
+
CDXLPhysicalDynamicTableScan *pdxlopDTS =
- GPOS_NEW(m_mp) CDXLPhysicalDynamicTableScan(
- m_mp, table_descr, 0 /* CHRIS */, popDTS->ScanId());
+ GPOS_NEW(m_mp) CDXLPhysicalDynamicTableScan(m_mp, table_descr,
+ part_mdids, selector_ids);
CDXLNode *pdxlnDTS = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopDTS);
pdxlnDTS->SetProperties(pdxlpropDTS);
@@ -1390,139 +1407,6 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
pdrgpdsBaseTables->Append(pds);
return pdxlnDTS;
-
- /*
- GPOS_ASSERT(nullptr != pexprDTS);
- GPOS_ASSERT_IFF(nullptr != pexprScalarCond, nullptr != dxl_properties);
-
- CPhysicalDynamicTableScan *popDTS =
- CPhysicalDynamicTableScan::PopConvert(pexprDTS->Pop());
-
- ULongPtrArray *selector_ids = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
- CPartitionPropagationSpec *pps_reqd =
- pexprDTS->Prpp()->Pepp()->PppsRequired();
- if (pps_reqd->Contains(popDTS->ScanId()))
- {
- const CBitSet *bs = pps_reqd->SelectorIds(popDTS->ScanId());
- CBitSetIter bsi(*bs);
- for (ULONG ul = 0; bsi.Advance(); ul++)
- {
- selector_ids->Append(GPOS_NEW(m_mp) ULONG(bsi.Bit()));
- }
- }
-
- // construct plan costs
- CDXLPhysicalProperties *pdxlpropDTS = GetProperties(pexprDTS);
-
- if (nullptr != dxl_properties)
- {
- CWStringDynamic *rows_out_str = GPOS_NEW(m_mp) CWStringDynamic(
- m_mp,
- dxl_properties->GetDXLOperatorCost()->GetRowsOutStr()->GetBuffer());
- CWStringDynamic *pstrCost = GPOS_NEW(m_mp)
- CWStringDynamic(m_mp, dxl_properties->GetDXLOperatorCost()
- ->GetTotalCostStr()
- ->GetBuffer());
-
- pdxlpropDTS->GetDXLOperatorCost()->SetRows(rows_out_str);
- pdxlpropDTS->GetDXLOperatorCost()->SetCost(pstrCost);
- dxl_properties->Release();
- }
- GPOS_ASSERT(nullptr != pexprDTS->Prpp());
-
- // construct projection list for top-level Append node
- CColRefSet *pcrsOutput = pexprDTS->Prpp()->PcrsRequired();
- CDXLNode *pdxlnPrLAppend = PdxlnProjList(pcrsOutput, colref_array);
- CDXLTableDescr *root_dxl_table_descr = MakeDXLTableDescr(
- popDTS->Ptabdesc(), popDTS->PdrgpcrOutput(), pexprDTS->Prpp());
-
- // Construct the Append node - even when there is only one child partition.
- // This is done for two reasons:
- // * Dynamic partition pruning
- // Even if one partition is present in the statically pruned plan, we could
- // still dynamically prune it away. This needs an Append node.
- // * Col mappings issues
- // When the first selected child partition's cols have different types/order
- // than the root partition, we can no longer re-use the colrefs of the root
- // partition, since colrefs are immutable. Thus, we create new colrefs for
- // this partition. But, if there is no Append (in case of just one selected
- // partition), then we also go through update all references above the DTS
- // with the new colrefs. For simplicity, we decided to keep the Append
- // around to maintain this projection (mapping) from the old root colrefs
- // to the first selected partition colrefs.
- //
- // GPDB_12_MERGE_FIXME: An Append on a single TableScan can be removed in
- // CTranslatorDXLToPlstmt since these points do not apply there.
- CDXLNode *pdxlnAppend = GPOS_NEW(m_mp) CDXLNode(
- m_mp,
- GPOS_NEW(m_mp) CDXLPhysicalAppend(m_mp, false, false, popDTS->ScanId(),
- root_dxl_table_descr, selector_ids));
- pdxlnAppend->SetProperties(pdxlpropDTS);
- pdxlnAppend->AddChild(pdxlnPrLAppend);
- pdxlnAppend->AddChild(PdxlnFilter(nullptr));
-
- IMdIdArray *part_mdids = popDTS->GetPartitionMdids();
- for (ULONG ul = 0; ul < part_mdids->Size(); ++ul)
- {
- IMDId *part_mdid = (*part_mdids)[ul];
- const IMDRelation *part = m_pmda->RetrieveRel(part_mdid);
-
- CTableDescriptor *part_tabdesc =
- MakeTableDescForPart(part, popDTS->Ptabdesc());
-
- // Create new colrefs for the child partition. The ColRefs from root
- // DTS, which may be used in any parent node, can no longer be exported
- // by a child of the Append node. Thus it is exported by the Append
- // node itself, and new colrefs are created here.
- CColRefArray *part_colrefs = GPOS_NEW(m_mp) CColRefArray(m_mp);
- for (ULONG ul_col = 0; ul_col < part_tabdesc->ColumnCount(); ++ul_col)
- {
- const CColumnDescriptor *cd = part_tabdesc->Pcoldesc(ul_col);
- CColRef *cr = m_pcf->PcrCreate(cd->RetrieveType(),
- cd->TypeModifier(), cd->Name());
- part_colrefs->Append(cr);
- }
-
- CDXLTableDescr *dxl_table_descr =
- MakeDXLTableDescr(part_tabdesc, part_colrefs, pexprDTS->Prpp());
- part_tabdesc->Release();
-
- CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(
- m_mp, GPOS_NEW(m_mp) CDXLPhysicalTableScan(m_mp, dxl_table_descr));
-
- // GPDB_12_MERGE_FIXME: Compute stats & properties per scan
- pdxlpropDTS->AddRef();
- dxlnode->SetProperties(pdxlpropDTS);
-
- // ColRef -> index in child table desc (per partition)
- auto root_col_mapping = (*popDTS->GetRootColMappingPerPart())[ul];
-
- // construct projection list, re-ordered to match root DTS
- CDXLNode *pdxlnPrL = PdxlnProjListForChildPart(
- root_col_mapping, part_colrefs, pcrsOutput, colref_array);
- dxlnode->AddChild(pdxlnPrL); // project list
-
- // construct the filter
- CDXLNode *filter_dxlnode = PdxlnFilter(
- PdxlnCondForChildPart(root_col_mapping, part_colrefs,
- popDTS->PdrgpcrOutput(), pexprScalarCond));
- dxlnode->AddChild(filter_dxlnode); // filter
-
- // add to the other scans under the created Append node
- pdxlnAppend->AddChild(dxlnode);
-
- // cleanup
- part_colrefs->Release();
- }
-
- CDistributionSpec *pds = pexprDTS->GetDrvdPropPlan()->Pds();
- pds->AddRef();
- pdrgpdsBaseTables->Append(pds);
-
- GPOS_ASSERT(pdxlnAppend);
- return pdxlnAppend;
-
- */
}
//---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
index f0b46d9b3f..786659e3af 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
@@ -44,19 +44,17 @@ private:
// table descriptor for the scanned table
CDXLTableDescr *m_dxl_table_descr;
- // id of partition index structure
- ULONG m_part_index_id;
+ IMdIdArray *m_part_mdids;
- // printable partition index id
- ULONG m_part_index_id_printable;
+ ULongPtrArray *m_selector_ids = nullptr;
public:
CDXLPhysicalDynamicTableScan(CDXLPhysicalDynamicTableScan &) = delete;
// ctor
CDXLPhysicalDynamicTableScan(CMemoryPool *mp, CDXLTableDescr *table_descr,
- ULONG part_idx_id,
- ULONG part_idx_id_printable);
+ IMdIdArray *part_mdids,
+ ULongPtrArray *selector_ids);
// dtor
~CDXLPhysicalDynamicTableScan() override;
@@ -70,12 +68,13 @@ public:
// table descriptor
const CDXLTableDescr *GetDXLTableDescr() const;
- // partition index id
- ULONG GetPartIndexId() const;
-
- // printable partition index id
- ULONG GetPartIndexIdPrintable() const;
+ IMdIdArray *GetParts() const;
+ const ULongPtrArray *
+ GetSelectorIds() const
+ {
+ return m_selector_ids;
+ }
// serialize operator in DXL format
void SerializeToDXL(CXMLSerializer *xml_serializer,
const CDXLNode *node) const override;
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
index 8b5b1d6b4a..c3c1969451 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
@@ -36,11 +36,7 @@ class CDXLPhysicalDynamicTableScan;
class CParseHandlerDynamicTableScan : public CParseHandlerPhysicalOp
{
private:
- // the id of the partition index structure
- ULONG m_part_index_id;
-
- // printable partition index id
- ULONG m_part_index_id_printable;
+ ULongPtrArray *m_selector_ids;
// process the start of an element
void StartElement(
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
index f5dc4d0ae1..4731259db0 100644
--- a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
@@ -12,8 +12,10 @@
#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
+#include "naucrates/dxl/CDXLUtils.h"
#include "naucrates/dxl/operators/CDXLNode.h"
#include "naucrates/dxl/xml/CXMLSerializer.h"
+#include "naucrates/md/IMDCacheObject.h"
using namespace gpos;
using namespace gpdxl;
@@ -28,12 +30,13 @@ using namespace gpdxl;
//
//---------------------------------------------------------------------------
CDXLPhysicalDynamicTableScan::CDXLPhysicalDynamicTableScan(
- CMemoryPool *mp, CDXLTableDescr *table_descr, ULONG part_idx_id,
- ULONG part_idx_id_printable)
+ CMemoryPool *mp, CDXLTableDescr *table_descr, IMdIdArray *part_mdids,
+ ULongPtrArray *selector_ids)
: CDXLPhysical(mp),
m_dxl_table_descr(table_descr),
- m_part_index_id(part_idx_id),
- m_part_index_id_printable(part_idx_id_printable)
+ m_part_mdids(part_mdids),
+ m_selector_ids(selector_ids)
+
{
GPOS_ASSERT(nullptr != table_descr);
}
@@ -50,6 +53,8 @@ CDXLPhysicalDynamicTableScan::CDXLPhysicalDynamicTableScan(
CDXLPhysicalDynamicTableScan::~CDXLPhysicalDynamicTableScan()
{
m_dxl_table_descr->Release();
+ m_part_mdids->Release();
+ CRefCount::SafeRelease(m_selector_ids);
}
//---------------------------------------------------------------------------
@@ -95,32 +100,10 @@ CDXLPhysicalDynamicTableScan::GetDXLTableDescr() const
return m_dxl_table_descr;
}
-//---------------------------------------------------------------------------
-// @function:
-// CDXLPhysicalDynamicTableScan::GetPartIndexId
-//
-// @doc:
-// Id of partition index
-//
-//---------------------------------------------------------------------------
-ULONG
-CDXLPhysicalDynamicTableScan::GetPartIndexId() const
-{
- return m_part_index_id;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// CDXLPhysicalDynamicTableScan::GetPartIndexIdPrintable
-//
-// @doc:
-// Printable partition index id
-//
-//---------------------------------------------------------------------------
-ULONG
-CDXLPhysicalDynamicTableScan::GetPartIndexIdPrintable() const
+IMdIdArray *
+CDXLPhysicalDynamicTableScan::GetParts() const
{
- return m_part_index_id_printable;
+ return m_part_mdids;
}
//---------------------------------------------------------------------------
@@ -139,16 +122,18 @@ CDXLPhysicalDynamicTableScan::SerializeToDXL(CXMLSerializer *xml_serializer,
xml_serializer->OpenElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+ CWStringDynamic *serialized_selector_ids =
+ CDXLUtils::Serialize(m_mp, m_selector_ids);
xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
- if (m_part_index_id_printable != m_part_index_id)
- {
- xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
- m_part_index_id_printable);
- }
+ CDXLTokens::GetDXLTokenStr(EdxltokenSelectorIds),
+ serialized_selector_ids);
+ GPOS_DELETE(serialized_selector_ids);
node->SerializePropertiesToDXL(xml_serializer);
node->SerializeChildrenToDXL(xml_serializer);
+ IMDCacheObject::SerializeMDIdList(
+ xml_serializer, m_part_mdids,
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartitions),
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartition));
m_dxl_table_descr->SerializeToDXL(xml_serializer);
xml_serializer->CloseElement(
CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
index 8cfd57a3a4..9c78c4549e 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
@@ -16,6 +16,7 @@
#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
+#include "naucrates/dxl/parser/CParseHandlerMetadataIdList.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
#include "naucrates/dxl/parser/CParseHandlerProperties.h"
#include "naucrates/dxl/parser/CParseHandlerTableDescr.h"
@@ -67,17 +68,10 @@ CParseHandlerDynamicTableScan::StartElement(
str->GetBuffer());
}
- m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
+ m_selector_ids = CDXLOperatorFactory::ExtractConvertValuesToArray(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenSelectorIds,
EdxltokenPhysicalDynamicTableScan);
- m_part_index_id_printable =
- CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
- EdxltokenPartIndexIdPrintable, EdxltokenPhysicalDynamicTableScan,
- true, //is_optional
- m_part_index_id);
-
// create child node parsers in reverse order of their expected occurrence
// parse handler for table descriptor
@@ -87,6 +81,13 @@ CParseHandlerDynamicTableScan::StartElement(
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(table_descr_parse_handler);
+ CParseHandlerBase *partition_mdids_parse_handler =
+ CParseHandlerFactory::GetParseHandler(
+ m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
+ m_parse_handler_mgr, this);
+ m_parse_handler_mgr->ActivateParseHandler(partition_mdids_parse_handler);
+
+
// parse handler for the filter
CParseHandlerBase *filter_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -112,6 +113,7 @@ CParseHandlerDynamicTableScan::StartElement(
this->Append(prop_parse_handler);
this->Append(proj_list_parse_handler);
this->Append(filter_parse_handler);
+ this->Append(partition_mdids_parse_handler);
this->Append(table_descr_parse_handler);
}
@@ -146,16 +148,22 @@ CParseHandlerDynamicTableScan::EndElement(const XMLCh *const, // element_uri,
dynamic_cast<CParseHandlerProjList *>((*this)[1]);
CParseHandlerFilter *filter_parse_handler =
dynamic_cast<CParseHandlerFilter *>((*this)[2]);
+ CParseHandlerMetadataIdList *partition_mdids_parse_handler =
+ dynamic_cast<CParseHandlerMetadataIdList *>((*this)[3]);
CParseHandlerTableDescr *table_descr_parse_handler =
- dynamic_cast<CParseHandlerTableDescr *>((*this)[3]);
+ dynamic_cast<CParseHandlerTableDescr *>((*this)[4]);
// set table descriptor
CDXLTableDescr *table_descr = table_descr_parse_handler->GetDXLTableDescr();
table_descr->AddRef();
+
+ IMdIdArray *mdid_partitions_array =
+ partition_mdids_parse_handler->GetMdIdArray();
+ mdid_partitions_array->AddRef();
CDXLPhysicalDynamicTableScan *dxl_op =
GPOS_NEW(m_mp) CDXLPhysicalDynamicTableScan(
- m_mp, table_descr, m_part_index_id, m_part_index_id_printable);
+ m_mp, table_descr, mdid_partitions_array, m_selector_ids);
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
// set statictics and physical properties
diff --git a/src/include/executor/execDynamicScan.h b/src/include/executor/execDynamicScan.h
deleted file mode 100644
index f41ae5d34c..0000000000
--- a/src/include/executor/execDynamicScan.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*--------------------------------------------------------------------------
- *
- * execDynamicScan.h
- * Definitions and API functions for execDynamicScan.c
- *
- * Copyright (c) 2014-Present VMware, Inc. or its affiliates.
- *
- *
- * IDENTIFICATION
- * src/include/executor/execDynamicScan.h
- *
- *--------------------------------------------------------------------------
- */
-#ifndef EXECDYNAMICSCAN_H
-#define EXECDYNAMICSCAN_H
-
-#include "access/attnum.h"
-#include "nodes/execnodes.h"
-
-extern bool isDynamicScan(const Plan *p);
-extern int DynamicScan_GetDynamicScanIdPrintable(Plan *plan);
-
-extern Oid DynamicScan_GetTableOid(ScanState *scanState);
-extern void DynamicScan_SetTableOid(ScanState *scanState, Oid curRelOid);
-
-extern bool DynamicScan_RemapExpression(ScanState *scanState, AttrNumber *attMap, Node *expr);
-
-#endif /* EXECDYNAMICSCAN_H */
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 04/11: Adds Orca support for Dynamic Index Scan
Posted by ma...@apache.org.
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 2617770361b6b1c8c804dec78040e15301a0d49b
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:51:47 2022 -0700
Adds Orca support for Dynamic Index Scan
---
src/backend/executor/nodeDynamicIndexscan.c | 176 +++++++-------------
src/backend/executor/nodeIndexscan.c | 39 +++--
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 136 +++++++++++++++-
.../src/translate/CTranslatorExprToDXL.cpp | 179 ++++++++-------------
.../dxl/operators/CDXLPhysicalDynamicIndexScan.h | 29 ++--
.../dxl/parser/CParseHandlerDynamicIndexScan.h | 6 +-
.../naucrates/dxl/parser/CParseHandlerIndexScan.h | 4 +-
.../src/operators/CDXLPhysicalDynamicIndexScan.cpp | 62 +++----
.../src/operators/CDXLPhysicalIndexScan.cpp | 7 +
.../src/parser/CParseHandlerDynamicIndexScan.cpp | 15 +-
.../src/parser/CParseHandlerIndexOnlyScan.cpp | 3 +-
.../src/parser/CParseHandlerIndexScan.cpp | 24 ++-
src/include/executor/nodeDynamicIndexscan.h | 6 +-
.../gpopt/translate/CTranslatorDXLToPlStmt.h | 12 +-
14 files changed, 360 insertions(+), 338 deletions(-)
diff --git a/src/backend/executor/nodeDynamicIndexscan.c b/src/backend/executor/nodeDynamicIndexscan.c
index 2fcad60607..5115fa9d9c 100644
--- a/src/backend/executor/nodeDynamicIndexscan.c
+++ b/src/backend/executor/nodeDynamicIndexscan.c
@@ -20,17 +20,17 @@
#include "postgres.h"
-#include "cdb/cdbvars.h"
-#include "cdb/partitionselection.h"
-#include "executor/execDynamicScan.h"
+#include "catalog/partition.h"
#include "executor/executor.h"
#include "executor/instrument.h"
#include "nodes/execnodes.h"
+#include "executor/execPartition.h"
#include "executor/nodeIndexscan.h"
#include "executor/nodeDynamicIndexscan.h"
-#include "access/genam.h"
-#include "nodes/nodeFuncs.h"
+#include "access/table.h"
+#include "access/tableam.h"
#include "utils/memutils.h"
+#include "utils/rel.h"
/*
* Initialize ScanState in DynamicIndexScan.
@@ -39,6 +39,8 @@ DynamicIndexScanState *
ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags)
{
DynamicIndexScanState *dynamicIndexScanState;
+ ListCell *lc;
+ int i;
/* check for unsupported flags */
Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
@@ -46,9 +48,15 @@ ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags)
dynamicIndexScanState = makeNode(DynamicIndexScanState);
dynamicIndexScanState->ss.ps.plan = (Plan *) node;
dynamicIndexScanState->ss.ps.state = estate;
+ dynamicIndexScanState->ss.ps.ExecProcNode = ExecDynamicIndexScan;
dynamicIndexScanState->eflags = eflags;
dynamicIndexScanState->scan_state = SCAN_INIT;
+ dynamicIndexScanState->whichPart = -1;
+ dynamicIndexScanState->nOids = list_length(node->partOids);
+ dynamicIndexScanState->partOids = palloc(sizeof(Oid) * dynamicIndexScanState->nOids);
+ foreach_with_count(lc, node->partOids, i)
+ dynamicIndexScanState->partOids[i] = lfirst_oid(lc);
/*
* Initialize child expressions
@@ -57,24 +65,19 @@ ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags)
* to do all evaluation for us. But I think this is still needed to
* find and process any SubPlans. See comment in ExecInitIndexScan.
*/
- dynamicIndexScanState->ss.ps.targetlist = (List *)
- ExecInitExpr((Expr *) node->indexscan.scan.plan.targetlist,
+ dynamicIndexScanState->ss.ps.qual = ExecInitQual(node->indexscan.scan.plan.qual,
(PlanState *) dynamicIndexScanState);
- dynamicIndexScanState->ss.ps.qual = (List *)
- ExecInitExpr((Expr *) node->indexscan.scan.plan.qual,
- (PlanState *) dynamicIndexScanState);
- (void) ExecInitExpr((Expr *) node->indexscan.indexqualorig,
- (PlanState *) dynamicIndexScanState);
/*
* tuple table initialization
*/
- ExecInitResultTupleSlot(estate, &dynamicIndexScanState->ss.ps);
+ Relation scanRel = ExecOpenScanRelation(estate, node->indexscan.scan.scanrelid, eflags);
+ ExecInitScanTupleSlot(estate, &dynamicIndexScanState->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
/*
* Initialize result tuple type and projection info.
*/
- ExecAssignResultTypeFromTL(&dynamicIndexScanState->ss.ps);
+ ExecInitResultTypeTL(&dynamicIndexScanState->ss.ps);
/*
* This context will be reset per-partition to free up per-partition
@@ -110,9 +113,6 @@ DynamicIndexScan_ReMapColumns(DynamicIndexScan *dIndexScan, Oid oldOid, Oid newO
if (attMap)
{
- IndexScan_MapLogicalIndexInfo(dIndexScan->logicalIndexInfo, attMap,
- indexScan->scan.scanrelid);
-
/* Also map attrnos in targetlist and quals */
change_varattnos_of_a_varno((Node *) indexScan->scan.plan.targetlist,
attMap, indexScan->scan.scanrelid);
@@ -144,7 +144,8 @@ beginCurrentIndexScan(DynamicIndexScanState *node, EState *estate,
/*
* open the base relation and acquire appropriate lock on it.
*/
- currentRelation = heap_open(tableOid, AccessShareLock);
+ currentRelation = table_open(tableOid, AccessShareLock);
+ node->ss.ss_currentRelation = currentRelation;
save_tupletable = estate->es_tupleTable;
estate->es_tupleTable = NIL;
@@ -157,18 +158,18 @@ beginCurrentIndexScan(DynamicIndexScanState *node, EState *estate,
if (!OidIsValid(node->columnLayoutOid))
{
/* Very first partition */
- node->columnLayoutOid = rel_partition_get_root(tableOid);
+ // Just get the direct parent, we don't support multi-level partitioning
+ node->columnLayoutOid = get_partition_parent(tableOid);
}
DynamicIndexScan_ReMapColumns(dynamicIndexScan,
- node->columnLayoutOid, tableOid);
+ tableOid, node->columnLayoutOid);
node->columnLayoutOid = tableOid;
- indexOid = getPhysicalIndexRelid(currentRelation, dynamicIndexScan->logicalIndexInfo);
+ indexOid = index_get_partition(currentRelation, dynamicIndexScan->indexscan.indexid);
if (!OidIsValid(indexOid))
elog(ERROR, "failed to find index for partition \"%s\" in dynamic index scan",
RelationGetRelationName(currentRelation));
- DynamicScan_SetTableOid(&node->ss, tableOid);
node->indexScanState = ExecInitIndexScanForPartition(&dynamicIndexScan->indexscan, estate,
node->eflags,
currentRelation, indexOid);
@@ -188,6 +189,7 @@ endCurrentIndexScan(DynamicIndexScanState *node)
{
ExecEndIndexScan(node->indexScanState);
node->indexScanState = NULL;
+ table_close(node->ss.ss_currentRelation, NoLock);
}
ExecResetTupleTable(node->tuptable, true);
node->tuptable = NIL;
@@ -208,16 +210,10 @@ initNextIndexToScan(DynamicIndexScanState *node)
{
/* This is the oid of a partition of the table (*not* index) */
Oid tableOid;
- Oid *pid;
-
- pid = hash_seq_search(&node->pidxStatus);
- if (pid == NULL)
- {
- /* Return if all parts have been scanned. */
- node->shouldCallHashSeqTerm = false;
+ if (++node->whichPart < node->nOids)
+ tableOid = node->partOids[node->whichPart];
+ else
return false;
- }
- tableOid = *pid;
/* Collect number of partitions scanned in EXPLAIN ANALYZE */
if (node->ss.ps.instrument)
@@ -233,53 +229,40 @@ initNextIndexToScan(DynamicIndexScanState *node)
return true;
}
-/*
- * setPidIndex
- * Set the hash table of Oids to scan.
- */
-static void
-setPidIndex(DynamicIndexScanState *node)
-{
- IndexScanState *indexState = (IndexScanState *)node;
- DynamicIndexScan *plan = (DynamicIndexScan *) indexState->ss.ps.plan;
- EState *estate = indexState->ss.ps.state;
- int partIndex = plan->partIndex;
-
- Assert(node->pidxIndex == NULL);
- Assert(estate->dynamicTableScanInfo != NULL);
-
- /*
- * Ensure that the dynahash exists even if the partition selector
- * didn't choose any partition for current scan node [MPP-24169].
- */
- InsertPidIntoDynamicTableScanInfo(estate, partIndex,
- InvalidOid, InvalidPartitionSelectorId);
-
- Assert(NULL != estate->dynamicTableScanInfo->pidIndexes);
- Assert(estate->dynamicTableScanInfo->numScans >= partIndex);
- node->pidxIndex = estate->dynamicTableScanInfo->pidIndexes[partIndex - 1];
- Assert(node->pidxIndex != NULL);
-}
-
/*
* Execution of DynamicIndexScan
*/
TupleTableSlot *
-ExecDynamicIndexScan(DynamicIndexScanState *node)
+ExecDynamicIndexScan(PlanState *pstate)
{
+ DynamicIndexScanState *node = castNode(DynamicIndexScanState, pstate);
TupleTableSlot *slot = NULL;
- /*
- * If this is called the first time, find the pid index that contains all unique
- * partition pids for this node to scan.
- */
- if (node->pidxIndex == NULL)
+ DynamicIndexScan *plan = (DynamicIndexScan *) node->ss.ps.plan;
+ node->as_valid_subplans = NULL;
+ if (NULL != plan->join_prune_paramids && !node->did_pruning)
{
- setPidIndex(node);
- Assert(node->pidxIndex != NULL);
+ node->did_pruning = true;
+ node->as_valid_subplans =
+ ExecFindMatchingSubPlans(node->as_prune_state,
+ node->ss.ps.state,
+ list_length(plan->partOids),
+ plan->join_prune_paramids);
+
+ int i;
+ int partOidIdx = -1;
+ List *newPartOids = NIL;
+ ListCell *lc;
+ for(i = 0; i < bms_num_members(node->as_valid_subplans); i++)
+ {
+ partOidIdx = bms_next_member(node->as_valid_subplans, partOidIdx);
+ newPartOids = lappend_oid(newPartOids, node->partOids[partOidIdx]);
+ }
- hash_seq_init(&node->pidxStatus, node->pidxIndex);
- node->shouldCallHashSeqTerm = true;
+ node->partOids = palloc(sizeof(Oid) * list_length(newPartOids));
+ foreach_with_count(lc, newPartOids, i)
+ node->partOids[i] = lfirst_oid(lc);
+ node->nOids = list_length(newPartOids);
}
/*
@@ -289,7 +272,7 @@ ExecDynamicIndexScan(DynamicIndexScanState *node)
while (TupIsNull(slot) &&
initNextIndexToScan(node))
{
- slot = ExecIndexScan(node->indexScanState);
+ slot = ExecProcNode(&node->indexScanState->ss.ps);
if (TupIsNull(slot))
{
@@ -311,12 +294,6 @@ ExecEndDynamicIndexScan(DynamicIndexScanState *node)
node->scan_state = SCAN_END;
- if (node->shouldCallHashSeqTerm)
- {
- hash_seq_term(&node->pidxStatus);
- node->shouldCallHashSeqTerm = false;
- }
-
MemoryContextDelete(node->partitionMemoryContext);
}
@@ -332,47 +309,8 @@ ExecReScanDynamicIndex(DynamicIndexScanState *node)
node->indexScanState = NULL;
}
node->scan_state = SCAN_INIT;
-
- if (node->shouldCallHashSeqTerm)
- {
- hash_seq_term(&node->pidxStatus);
- node->shouldCallHashSeqTerm = false;
- }
-
- /* Force reloading the hash table */
- node->pidxIndex = NULL;
-}
-
-
-/*
- * IndexScan_MapLogicalIndexInfo
- * Remaps the columns of the expressions of a provided logicalIndexInfo
- * using attMap for a given varno.
- *
- * Returns true if mapping was done.
- */
-bool
-IndexScan_MapLogicalIndexInfo(LogicalIndexInfo *logicalIndexInfo, AttrNumber *attMap, Index varno)
-{
- if (NULL == attMap)
- {
- /* Columns are already aligned, and therefore, no mapping is necessary */
- return false;
- }
- /* map the attrnos if necessary */
- for (int i = 0; i < logicalIndexInfo->nColumns; i++)
- {
- if (logicalIndexInfo->indexKeys[i] != 0)
- {
- logicalIndexInfo->indexKeys[i] = attMap[(logicalIndexInfo->indexKeys[i]) - 1];
- }
- }
-
- /* map the attrnos in the indExprs and indPred */
- change_varattnos_of_a_varno((Node *)logicalIndexInfo->indPred, attMap, varno);
- change_varattnos_of_a_varno((Node *)logicalIndexInfo->indExprs, attMap, varno);
-
- return true;
+ // reset partition internal state
+ node->whichPart = -1;
}
/*
@@ -388,7 +326,7 @@ IndexScan_GetColumnMapping(Oid oldOid, Oid newOid)
if (oldOid == newOid)
return NULL;
- AttrNumber *attMap;
+ AttrNumber *attMap;
Relation oldRel = heap_open(oldOid, AccessShareLock);
Relation newRel = heap_open(newOid, AccessShareLock);
@@ -396,7 +334,7 @@ IndexScan_GetColumnMapping(Oid oldOid, Oid newOid)
TupleDesc oldTupDesc = oldRel->rd_att;
TupleDesc newTupDesc = newRel->rd_att;
- attMap = varattnos_map(oldTupDesc, newTupDesc);
+ attMap = convert_tuples_by_name_map_if_req(oldTupDesc, newTupDesc, "unused msg");
heap_close(oldRel, AccessShareLock);
heap_close(newRel, AccessShareLock);
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 690f80970b..77e6cee0ee 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -911,8 +911,22 @@ ExecIndexRestrPos(IndexScanState *node)
IndexScanState *
ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
{
- IndexScanState *indexstate;
Relation currentRelation;
+
+ /*
+ * open the base relation and acquire appropriate lock on it.
+ */
+ currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+ return ExecInitIndexScanForPartition(node, estate, eflags,
+ currentRelation, node->indexid);
+}
+
+IndexScanState *
+ExecInitIndexScanForPartition(IndexScan *node, EState *estate, int eflags,
+ Relation currentRelation, Oid indexid)
+{
+ IndexScanState *indexstate;
LOCKMODE lockmode;
/*
@@ -930,11 +944,6 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
*/
ExecAssignExprContext(estate, &indexstate->ss.ps);
- /*
- * open the scan relation
- */
- currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
indexstate->ss.ss_currentRelation = currentRelation;
indexstate->ss.ss_currentScanDesc = NULL; /* no heap scan here */
@@ -962,11 +971,11 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
* in the expression must be found now...)
*/
indexstate->ss.ps.qual =
- ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
+ ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
indexstate->indexqualorig =
- ExecInitQual(node->indexqualorig, (PlanState *) indexstate);
+ ExecInitQual(node->indexqualorig, (PlanState *) indexstate);
indexstate->indexorderbyorig =
- ExecInitExprList(node->indexorderbyorig, (PlanState *) indexstate);
+ ExecInitExprList(node->indexorderbyorig, (PlanState *) indexstate);
/*
* If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
@@ -978,7 +987,7 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
/* Open the index relation. */
lockmode = exec_rt_fetch(node->scan.scanrelid, estate)->rellockmode;
- indexstate->iss_RelationDesc = index_open(node->indexid, lockmode);
+ indexstate->iss_RelationDesc = index_open(indexid, lockmode);
/*
* Initialize index-specific scan state
@@ -1030,11 +1039,11 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
Assert(numOrderByKeys == list_length(node->indexorderbyops));
Assert(numOrderByKeys == list_length(node->indexorderbyorig));
indexstate->iss_SortSupport = (SortSupportData *)
- palloc0(numOrderByKeys * sizeof(SortSupportData));
+ palloc0(numOrderByKeys * sizeof(SortSupportData));
indexstate->iss_OrderByTypByVals = (bool *)
- palloc(numOrderByKeys * sizeof(bool));
+ palloc(numOrderByKeys * sizeof(bool));
indexstate->iss_OrderByTypLens = (int16 *)
- palloc(numOrderByKeys * sizeof(int16));
+ palloc(numOrderByKeys * sizeof(int16));
i = 0;
forboth(lco, node->indexorderbyops, lcx, node->indexorderbyorig)
{
@@ -1063,9 +1072,9 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
/* allocate arrays to hold the re-calculated distances */
indexstate->iss_OrderByValues = (Datum *)
- palloc(numOrderByKeys * sizeof(Datum));
+ palloc(numOrderByKeys * sizeof(Datum));
indexstate->iss_OrderByNulls = (bool *)
- palloc(numOrderByKeys * sizeof(bool));
+ palloc(numOrderByKeys * sizeof(bool));
/* and initialize the reorder queue */
indexstate->iss_ReorderQueue = pairingheap_allocate(reorderqueue_cmp,
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index 7ddfcfccaf..425e05f55e 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -66,6 +66,7 @@ extern "C" {
#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
#include "naucrates/dxl/operators/CDXLPhysicalHashJoin.h"
@@ -430,7 +431,12 @@ CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan(
ctxt_translation_prev_siblings);
break;
}
- /* case EdxlopPhysicalDynamicIndexScan: { plan = TranslateDXLDynIdxScan(dxlnode, output_context, ctxt_translation_prev_siblings); break;} */
+ case EdxlopPhysicalDynamicIndexScan:
+ {
+ plan = TranslateDXLDynIdxScan(dxlnode, output_context,
+ ctxt_translation_prev_siblings);
+ break;
+ }
case EdxlopPhysicalTVF:
{
plan = TranslateDXLTvf(dxlnode, output_context,
@@ -4106,12 +4112,130 @@ CTranslatorDXLToPlStmt::TranslateDXLDynTblScan(
&plan->targetlist, &plan->qual, output_context);
SetParamIds(plan);
- /*
- * auto *prune_result = m_dxl_to_plstmt_context->GetStaticPruneResult(
- dyn_tbl_scan_dxlop->GetPartIndexIdPrintable());
- dyn_seq_scan->partOids = prune_result;
-*/
+ return plan;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan
+//
+// @doc:
+// Translates a DXL dynamic index scan node into a DynamicIndexScan node
+//
+//---------------------------------------------------------------------------
+Plan *
+CTranslatorDXLToPlStmt::TranslateDXLDynIdxScan(
+ const CDXLNode *dyn_idx_scan_dxlnode, CDXLTranslateContext *output_context,
+ CDXLTranslationContextArray *ctxt_translation_prev_siblings)
+{
+ CDXLPhysicalDynamicIndexScan *dyn_index_scan_dxlop =
+ CDXLPhysicalDynamicIndexScan::Cast(dyn_idx_scan_dxlnode->GetOperator());
+
+ // translation context for column mappings in the base relation
+ CDXLTranslateContextBaseTable base_table_context(m_mp);
+
+ Index index =
+ gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1;
+
+ const IMDRelation *md_rel = m_md_accessor->RetrieveRel(
+ dyn_index_scan_dxlop->GetDXLTableDescr()->MDId());
+ RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(
+ dyn_index_scan_dxlop->GetDXLTableDescr(), index, &base_table_context);
+ GPOS_ASSERT(NULL != rte);
+ rte->requiredPerms |= ACL_SELECT;
+ m_dxl_to_plstmt_context->AddRTE(rte);
+
+ DynamicIndexScan *dyn_idx_scan = MakeNode(DynamicIndexScan);
+
+ dyn_idx_scan->indexscan.scan.scanrelid = index;
+
+ IMdIdArray *parts = dyn_index_scan_dxlop->GetParts();
+
+ List *oids_list = NIL;
+
+ for (ULONG ul = 0; ul < parts->Size(); ul++)
+ {
+ Oid part = CMDIdGPDB::CastMdid((*parts)[ul])->Oid();
+ oids_list = gpdb::LAppendOid(oids_list, part);
+ }
+
+ dyn_idx_scan->partOids = oids_list;
+
+ dyn_idx_scan->join_prune_paramids = NIL;
+
+ OID oid_type =
+ CMDIdGPDB::CastMdid(m_md_accessor->PtMDType<IMDTypeInt4>()->MDId())
+ ->Oid();
+ const ULongPtrArray *selector_ids = dyn_index_scan_dxlop->GetSelectorIds();
+
+ for (ULONG ul = 0; ul < selector_ids->Size(); ++ul)
+ {
+ ULONG selector_id = *(*selector_ids)[ul];
+ ULONG param_id = m_dxl_to_plstmt_context->GetParamIdForSelector(
+ oid_type, selector_id);
+ dyn_idx_scan->join_prune_paramids =
+ gpdb::LAppendInt(dyn_idx_scan->join_prune_paramids, param_id);
+ }
+
+ CMDIdGPDB *mdid_index =
+ CMDIdGPDB::CastMdid(dyn_index_scan_dxlop->GetDXLIndexDescr()->MDId());
+ const IMDIndex *md_index = m_md_accessor->RetrieveIndex(mdid_index);
+ Oid index_oid = mdid_index->Oid();
+
+ GPOS_ASSERT(InvalidOid != index_oid);
+ dyn_idx_scan->indexscan.indexid = index_oid;
+
+ Plan *plan = &(dyn_idx_scan->indexscan.scan.plan);
+ plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId();
+
+ // translate operator costs
+ TranslatePlanCosts(dyn_idx_scan_dxlnode, plan);
+
+ // an index scan node must have 3 children: projection list, filter and index condition list
+ GPOS_ASSERT(3 == dyn_idx_scan_dxlnode->Arity());
+
+ // translate proj list and filter
+ CDXLNode *project_list_dxlnode = (*dyn_idx_scan_dxlnode)
+ [CDXLPhysicalDynamicIndexScan::EdxldisIndexProjList];
+ CDXLNode *filter_dxlnode = (*dyn_idx_scan_dxlnode)
+ [CDXLPhysicalDynamicIndexScan::EdxldisIndexFilter];
+ CDXLNode *index_cond_list_dxlnode = (*dyn_idx_scan_dxlnode)
+ [CDXLPhysicalDynamicIndexScan::EdxldisIndexCondition];
+
+ // translate proj list
+ plan->targetlist =
+ TranslateDXLProjList(project_list_dxlnode, &base_table_context,
+ NULL /*child_contexts*/, output_context);
+
+ // translate index filter
+ plan->qual = TranslateDXLIndexFilter(filter_dxlnode, output_context,
+ &base_table_context,
+ ctxt_translation_prev_siblings);
+
+ dyn_idx_scan->indexscan.indexorderdir = CTranslatorUtils::GetScanDirection(
+ dyn_index_scan_dxlop->GetIndexScanDir());
+
+ // translate index condition list
+ List *index_cond = NIL;
+ List *index_orig_cond = NIL;
+ List *index_strategy_list = NIL;
+ List *index_subtype_list = NIL;
+
+ TranslateIndexConditions(
+ index_cond_list_dxlnode, dyn_index_scan_dxlop->GetDXLTableDescr(),
+ false, // is_bitmap_index_probe
+ md_index, md_rel, output_context, &base_table_context,
+ ctxt_translation_prev_siblings, &index_cond, &index_orig_cond,
+ &index_strategy_list, &index_subtype_list);
+
+
+ dyn_idx_scan->indexscan.indexqual = index_cond;
+ dyn_idx_scan->indexscan.indexqualorig = index_orig_cond;
+
+ SetParamIds(plan);
+
+ return (Plan *) dyn_idx_scan;
}
//---------------------------------------------------------------------------
// @function:
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index bca5ff694a..efc6c873a4 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -101,6 +101,8 @@
#include "naucrates/dxl/operators/CDXLPhysicalCTAS.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalExternalScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
@@ -1577,140 +1579,97 @@ CTranslatorExprToDXL::PdxlnDynamicIndexScan(
CExpression *pexprDIS, CColRefArray *colref_array,
CDXLPhysicalProperties *dxl_properties, CReqdPropPlan *prpp)
{
- GPOS_ASSERT(nullptr != pexprDIS);
- GPOS_ASSERT(nullptr != dxl_properties);
- GPOS_ASSERT(nullptr != prpp);
+ GPOS_ASSERT(NULL != pexprDIS);
+ GPOS_ASSERT(NULL != dxl_properties);
+ GPOS_ASSERT(NULL != prpp);
CPhysicalDynamicIndexScan *popDIS =
CPhysicalDynamicIndexScan::PopConvert(pexprDIS->Pop());
+ CColRefArray *pdrgpcrOutput = popDIS->PdrgpcrOutput();
- // construct projection list
- CColRefSet *pcrsOutput = prpp->PcrsRequired();
- CDXLNode *pdxlnPrLAppend = PdxlnProjList(pcrsOutput, colref_array);
-
- IMdIdArray *part_mdids = popDIS->GetPartitionMdids();
+ // translate table descriptor
+ CDXLTableDescr *table_descr =
+ MakeDXLTableDescr(popDIS->Ptabdesc(), pdrgpcrOutput, pexprDIS->Prpp());
- CDXLNode *pdxlnResult = GPOS_NEW(m_mp)
- CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLPhysicalAppend(m_mp, false, false));
- // GPDB_12_MERGE_FIXME: set plan costs
- pdxlnResult->SetProperties(dxl_properties);
- pdxlnResult->AddChild(pdxlnPrLAppend);
- pdxlnResult->AddChild(PdxlnFilter(nullptr));
+ // create index descriptor
+ CIndexDescriptor *pindexdesc = popDIS->Pindexdesc();
+ CMDName *pmdnameIndex =
+ GPOS_NEW(m_mp) CMDName(m_mp, pindexdesc->Name().Pstr());
+ IMDId *pmdidIndex = pindexdesc->MDId();
+ pmdidIndex->AddRef();
+ CDXLIndexDescr *dxl_index_descr =
+ GPOS_NEW(m_mp) CDXLIndexDescr(pmdidIndex, pmdnameIndex);
- // construct set of child indexes from parent list of child indexes
- IMDId *pmdidIndex = popDIS->Pindexdesc()->MDId();
- const IMDIndex *md_index = m_pmda->RetrieveIndex(pmdidIndex);
- IMdIdArray *child_indexes = md_index->ChildIndexMdids();
- MdidHashSet *child_index_mdids_set = GPOS_NEW(m_mp) MdidHashSet(m_mp);
- for (ULONG ul = 0; ul < child_indexes->Size(); ul++)
- {
- (*child_indexes)[ul]->AddRef();
- child_index_mdids_set->Insert((*child_indexes)[ul]);
- }
+ // construct dynamic table scan operator
+ IMdIdArray *part_mdids = popDIS->GetPartitionMdids();
+ part_mdids->AddRef();
- for (ULONG ul = 0; ul < part_mdids->Size(); ++ul)
+ ULongPtrArray *selector_ids = GPOS_NEW(m_mp) ULongPtrArray(m_mp);
+ CPartitionPropagationSpec *pps_reqd = prpp->Pepp()->PppsRequired();
+ if (pps_reqd->Contains(popDIS->ScanId()))
{
- IMDId *part_mdid = (*part_mdids)[ul];
- const IMDRelation *part = m_pmda->RetrieveRel(part_mdid);
-
- CPhysicalDynamicIndexScan *popDIS =
- CPhysicalDynamicIndexScan::PopConvert(pexprDIS->Pop());
-
- // GPDB_12_MERGE_FIXME: ideally MakeTableDescForPart(part, pexprDIS->DeriveTableDescriptor());
- // should just work, at this point all properties should've been derived, but we
- // haven't derived the table descriptor.
- CTableDescriptor *part_tabdesc =
- MakeTableDescForPart(part, popDIS->Ptabdesc());
-
- // create new colrefs for every child partition
- CColRefArray *part_colrefs = GPOS_NEW(m_mp) CColRefArray(m_mp);
- for (ULONG ul = 0; ul < part_tabdesc->ColumnCount(); ++ul)
+ const CBitSet *bs = pps_reqd->SelectorIds(popDIS->ScanId());
+ CBitSetIter bsi(*bs);
+ for (ULONG ul = 0; bsi.Advance(); ul++)
{
- const CColumnDescriptor *cd = part_tabdesc->Pcoldesc(ul);
- CColRef *cr = m_pcf->PcrCreate(cd->RetrieveType(),
- cd->TypeModifier(), cd->Name());
- part_colrefs->Append(cr);
+ selector_ids->Append(GPOS_NEW(m_mp) ULONG(bsi.Bit()));
}
+ }
- CDXLTableDescr *dxl_table_descr =
- MakeDXLTableDescr(part_tabdesc, part_colrefs, pexprDIS->Prpp());
- part_tabdesc->Release();
-
- CIndexDescriptor *pindexdesc = popDIS->Pindexdesc();
- CDXLIndexDescr *dxl_index_descr = PdxlnIndexDescForPart(
- m_mp, child_index_mdids_set, part, pindexdesc->Name().Pstr());
+ // TODO: we assume that the index are always forward access.
- // Finally create the IndexScan DXL node
- CDXLNode *dxlnode = GPOS_NEW(m_mp) CDXLNode(
- m_mp, GPOS_NEW(m_mp) CDXLPhysicalIndexScan(
- m_mp, dxl_table_descr, dxl_index_descr, EdxlisdForward));
+ CDXLNode *pdxlnDIS = GPOS_NEW(m_mp)
+ CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLPhysicalDynamicIndexScan(
+ m_mp, table_descr, dxl_index_descr, EdxlisdForward,
+ part_mdids, selector_ids));
- // GPDB_12_MERGE_FIXME: Compute stats & properties per scan
- dxl_properties->AddRef();
- dxlnode->SetProperties(dxl_properties);
+ // set plan costs
+ pdxlnDIS->SetProperties(dxl_properties);
- // construct projection list
- auto root_col_mapping = (*popDIS->GetRootColMappingPerPart())[ul];
+ // construct projection list
+ CColRefSet *pcrsOutput = prpp->PcrsRequired();
+ CDXLNode *pdxlnPrL = PdxlnProjList(pcrsOutput, colref_array);
- CDXLNode *pdxlnPrL = PdxlnProjListForChildPart(
- root_col_mapping, part_colrefs, pcrsOutput, colref_array);
- dxlnode->AddChild(pdxlnPrL); // project list
+ // translate index predicates
+ CExpression *pexprCond = (*pexprDIS)[0];
+ CDXLNode *pdxlnIndexCondList = GPOS_NEW(m_mp)
+ CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarIndexCondList(m_mp));
- CDXLNode *filter_dxlnode;
- if (2 == pexprDIS->Arity())
- {
- // translate residual predicates into the filter node
- CExpression *pexprResidualCond = (*pexprDIS)[1];
+ CExpressionArray *pdrgpexprConds =
+ CPredicateUtils::PdrgpexprConjuncts(m_mp, pexprCond);
+ const ULONG length = pdrgpexprConds->Size();
+ for (ULONG ul = 0; ul < length; ul++)
+ {
+ CExpression *pexprIndexCond = (*pdrgpexprConds)[ul];
+ CDXLNode *pdxlnIndexCond = PdxlnScalar(pexprIndexCond);
+ pdxlnIndexCondList->AddChild(pdxlnIndexCond);
+ }
+ pdrgpexprConds->Release();
- if (COperator::EopScalarConst != pexprResidualCond->Pop()->Eopid())
- {
- // construct the filter
- filter_dxlnode = PdxlnFilter(PdxlnCondForChildPart(
- root_col_mapping, part_colrefs, popDIS->PdrgpcrOutput(),
- pexprResidualCond));
- }
- else
- {
- filter_dxlnode = PdxlnFilter(nullptr);
- }
- }
- else
+ CDXLNode *pdxlnResidualCond = NULL;
+ if (2 == pexprDIS->Arity())
+ {
+ // translate residual predicates into the filter node
+ CExpression *pexprResidualCond = (*pexprDIS)[1];
+ if (COperator::EopScalarConst != pexprResidualCond->Pop()->Eopid())
{
- // construct an empty filter
- filter_dxlnode = PdxlnFilter(nullptr);
+ pdxlnResidualCond = PdxlnScalar(pexprResidualCond);
}
- dxlnode->AddChild(filter_dxlnode); // filter
-
- // translate index predicates
- CExpression *pexprCond = (*pexprDIS)[0];
- CDXLNode *pdxlnIndexCondList = GPOS_NEW(m_mp)
- CDXLNode(m_mp, GPOS_NEW(m_mp) CDXLScalarIndexCondList(m_mp));
+ }
- CExpressionArray *pdrgpexprConds =
- CPredicateUtils::PdrgpexprConjuncts(m_mp, pexprCond);
- const ULONG length = pdrgpexprConds->Size();
- for (ULONG ul = 0; ul < length; ul++)
- {
- CExpression *pexprIndexCond = (*pdrgpexprConds)[ul];
- // construct the condition as a filter
- CDXLNode *pdxlnIndexCond =
- PdxlnCondForChildPart(root_col_mapping, part_colrefs,
- popDIS->PdrgpcrOutput(), pexprIndexCond);
- pdxlnIndexCondList->AddChild(pdxlnIndexCond);
- }
- pdrgpexprConds->Release();
- dxlnode->AddChild(pdxlnIndexCondList);
+ CDXLNode *filter_dxlnode = PdxlnFilter(pdxlnResidualCond);
- // add to the other scans under the created Append node
- pdxlnResult->AddChild(dxlnode);
+ pdxlnDIS->AddChild(pdxlnPrL);
+ pdxlnDIS->AddChild(filter_dxlnode);
+ pdxlnDIS->AddChild(pdxlnIndexCondList);
- // cleanup
- part_colrefs->Release();
- }
- child_index_mdids_set->Release();
+#ifdef GPOS_DEBUG
+ pdxlnDIS->GetOperator()->AssertValid(pdxlnDIS,
+ false /* validate_children */);
+#endif
- return pdxlnResult;
+ return pdxlnDIS;
}
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
index bc1c8bf081..14d3bded7e 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
@@ -35,18 +35,16 @@ private:
// table descriptor for the scanned table
CDXLTableDescr *m_dxl_table_descr;
- // part index id
- ULONG m_part_index_id;
-
- // printable partition index id
- ULONG m_part_index_id_printable;
-
// index descriptor associated with the scanned table
CDXLIndexDescr *m_dxl_index_descr;
// scan direction of the index
EdxlIndexScanDirection m_index_scan_dir;
+ IMdIdArray *m_part_mdids;
+
+ ULongPtrArray *m_selector_ids = nullptr;
+
public:
CDXLPhysicalDynamicIndexScan(CDXLPhysicalDynamicIndexScan &) = delete;
@@ -61,9 +59,10 @@ public:
//ctor
CDXLPhysicalDynamicIndexScan(CMemoryPool *mp, CDXLTableDescr *table_descr,
- ULONG part_idx_id, ULONG part_idx_id_printable,
CDXLIndexDescr *dxl_index_descr,
- EdxlIndexScanDirection idx_scan_direction);
+ EdxlIndexScanDirection idx_scan_direction,
+ IMdIdArray *part_mdids,
+ ULongPtrArray *selector_ids);
//dtor
~CDXLPhysicalDynamicIndexScan() override;
@@ -80,15 +79,17 @@ public:
//table descriptor
const CDXLTableDescr *GetDXLTableDescr() const;
- // partition index id
- ULONG GetPartIndexId() const;
-
- // printable partition index id
- ULONG GetPartIndexIdPrintable() const;
-
// scan direction
EdxlIndexScanDirection GetIndexScanDir() const;
+ IMdIdArray *GetParts() const;
+
+ const ULongPtrArray *
+ GetSelectorIds() const
+ {
+ return m_selector_ids;
+ }
+
// serialize operator in DXL format
void SerializeToDXL(CXMLSerializer *xml_serializer,
const CDXLNode *node) const override;
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
index b5a2738e39..e173af8c8b 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
@@ -35,11 +35,7 @@ XERCES_CPP_NAMESPACE_USE
class CParseHandlerDynamicIndexScan : public CParseHandlerIndexScan
{
private:
- // part index id
- ULONG m_part_index_id;
-
- // printable partition index id
- ULONG m_part_index_id_printable;
+ ULongPtrArray *m_selector_ids;
// process the start of an element
void StartElement(
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
index e1fcba1232..3c6a873084 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
@@ -60,8 +60,8 @@ protected:
// common EndElement functionality for IndexScan and IndexOnlyScan
void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type, ULONG part_idx_id = 0,
- ULONG part_idx_id_printable = 0);
+ Edxltoken token_type,
+ ULongPtrArray *selector_ids = nullptr);
public:
CParseHandlerIndexScan(const CParseHandlerIndexScan &) = delete;
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp
index dbcb9439a1..e8e1a0ecd4 100644
--- a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp
@@ -11,8 +11,10 @@
#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
+#include "naucrates/dxl/CDXLUtils.h"
#include "naucrates/dxl/operators/CDXLNode.h"
#include "naucrates/dxl/xml/CXMLSerializer.h"
+#include "naucrates/md/IMDCacheObject.h"
using namespace gpos;
using namespace gpdxl;
@@ -27,15 +29,15 @@ using namespace gpdxl;
//
//---------------------------------------------------------------------------
CDXLPhysicalDynamicIndexScan::CDXLPhysicalDynamicIndexScan(
- CMemoryPool *mp, CDXLTableDescr *table_descr, ULONG part_idx_id,
- ULONG part_idx_id_printable, CDXLIndexDescr *dxl_index_descr,
- EdxlIndexScanDirection idx_scan_direction)
+ CMemoryPool *mp, CDXLTableDescr *table_descr,
+ CDXLIndexDescr *dxl_index_descr, EdxlIndexScanDirection idx_scan_direction,
+ IMdIdArray *part_mdids, ULongPtrArray *selector_ids)
: CDXLPhysical(mp),
m_dxl_table_descr(table_descr),
- m_part_index_id(part_idx_id),
- m_part_index_id_printable(part_idx_id_printable),
m_dxl_index_descr(dxl_index_descr),
- m_index_scan_dir(idx_scan_direction)
+ m_index_scan_dir(idx_scan_direction),
+ m_part_mdids(part_mdids),
+ m_selector_ids(selector_ids)
{
GPOS_ASSERT(nullptr != m_dxl_table_descr);
GPOS_ASSERT(nullptr != m_dxl_index_descr);
@@ -53,6 +55,8 @@ CDXLPhysicalDynamicIndexScan::~CDXLPhysicalDynamicIndexScan()
{
m_dxl_index_descr->Release();
m_dxl_table_descr->Release();
+ m_part_mdids->Release();
+ CRefCount::SafeRelease(m_selector_ids);
}
//---------------------------------------------------------------------------
@@ -125,32 +129,10 @@ CDXLPhysicalDynamicIndexScan::GetDXLTableDescr() const
return m_dxl_table_descr;
}
-//---------------------------------------------------------------------------
-// @function:
-// CDXLPhysicalDynamicIndexScan::GetPartIndexId
-//
-// @doc:
-// Part index id
-//
-//---------------------------------------------------------------------------
-ULONG
-CDXLPhysicalDynamicIndexScan::GetPartIndexId() const
-{
- return m_part_index_id;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// CDXLPhysicalDynamicIndexScan::GetPartIndexIdPrintable
-//
-// @doc:
-// Printable partition index id
-//
-//---------------------------------------------------------------------------
-ULONG
-CDXLPhysicalDynamicIndexScan::GetPartIndexIdPrintable() const
+IMdIdArray *
+CDXLPhysicalDynamicIndexScan::GetParts() const
{
- return m_part_index_id_printable;
+ return m_part_mdids;
}
//---------------------------------------------------------------------------
@@ -173,14 +155,12 @@ CDXLPhysicalDynamicIndexScan::SerializeToDXL(CXMLSerializer *xml_serializer,
CDXLTokens::GetDXLTokenStr(EdxltokenIndexScanDirection),
CDXLOperator::GetIdxScanDirectionStr(m_index_scan_dir));
+ CWStringDynamic *serialized_selector_ids =
+ CDXLUtils::Serialize(m_mp, m_selector_ids);
xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
- if (m_part_index_id_printable != m_part_index_id)
- {
- xml_serializer->AddAttribute(
- CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
- m_part_index_id_printable);
- }
+ CDXLTokens::GetDXLTokenStr(EdxltokenSelectorIds),
+ serialized_selector_ids);
+ GPOS_DELETE(serialized_selector_ids);
// serialize properties
node->SerializePropertiesToDXL(xml_serializer);
@@ -188,6 +168,12 @@ CDXLPhysicalDynamicIndexScan::SerializeToDXL(CXMLSerializer *xml_serializer,
// serialize children
node->SerializeChildrenToDXL(xml_serializer);
+ // serialize partition mdids
+ IMDCacheObject::SerializeMDIdList(
+ xml_serializer, m_part_mdids,
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartitions),
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartition));
+
// serialize index descriptor
m_dxl_index_descr->SerializeToDXL(xml_serializer);
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalIndexScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalIndexScan.cpp
index 1424fabdca..38e6308e3e 100644
--- a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalIndexScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalIndexScan.cpp
@@ -13,6 +13,7 @@
#include "naucrates/dxl/operators/CDXLNode.h"
#include "naucrates/dxl/xml/CXMLSerializer.h"
+#include "naucrates/md/IMDCacheObject.h"
using namespace gpos;
using namespace gpdxl;
@@ -148,6 +149,12 @@ CDXLPhysicalIndexScan::SerializeToDXL(CXMLSerializer *xml_serializer,
// serialize children
node->SerializeChildrenToDXL(xml_serializer);
+ // serialize partition mdids (null in this case)
+ IMdIdArray *empty = GPOS_NEW(m_mp) IMdIdArray(m_mp);
+ IMDCacheObject::SerializeMDIdList(
+ xml_serializer, empty, CDXLTokens::GetDXLTokenStr(EdxltokenPartitions),
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartition));
+ empty->Release();
// serialize index descriptor
m_dxl_index_descr->SerializeToDXL(xml_serializer);
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
index 48983c8b73..ea511e20de 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
@@ -43,9 +43,7 @@ XERCES_CPP_NAMESPACE_USE
CParseHandlerDynamicIndexScan::CParseHandlerDynamicIndexScan(
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root)
- : CParseHandlerIndexScan(mp, parse_handler_mgr, parse_handler_root),
- m_part_index_id(0),
- m_part_index_id_printable(0)
+ : CParseHandlerIndexScan(mp, parse_handler_mgr, parse_handler_root)
{
}
@@ -67,14 +65,9 @@ CParseHandlerDynamicIndexScan::StartElement(
StartElementHelper(element_local_name, attrs,
EdxltokenPhysicalDynamicIndexScan);
- m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
+ m_selector_ids = CDXLOperatorFactory::ExtractConvertValuesToArray(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenSelectorIds,
EdxltokenPhysicalDynamicIndexScan);
- m_part_index_id_printable =
- CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
- m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
- EdxltokenPartIndexIdPrintable, EdxltokenPhysicalDynamicIndexScan,
- true /*is_optional*/, m_part_index_id);
}
//---------------------------------------------------------------------------
@@ -92,7 +85,7 @@ CParseHandlerDynamicIndexScan::EndElement(const XMLCh *const, // element_uri,
)
{
EndElementHelper(element_local_name, EdxltokenPhysicalDynamicIndexScan,
- m_part_index_id, m_part_index_id_printable);
+ m_selector_ids /*m_selector_ids*/);
}
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexOnlyScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexOnlyScan.cpp
index 30fe0fc3ab..c46f789260 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexOnlyScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexOnlyScan.cpp
@@ -68,7 +68,8 @@ CParseHandlerIndexOnlyScan::EndElement(const XMLCh *const, // element_uri,
const XMLCh *const // element_qname
)
{
- EndElementHelper(element_local_name, EdxltokenPhysicalIndexOnlyScan);
+ EndElementHelper(element_local_name, EdxltokenPhysicalIndexOnlyScan,
+ nullptr);
}
// EOF
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
index b4d6282442..becb70f640 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
@@ -24,6 +24,7 @@
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
#include "naucrates/dxl/parser/CParseHandlerIndexCondList.h"
#include "naucrates/dxl/parser/CParseHandlerIndexDescr.h"
+#include "naucrates/dxl/parser/CParseHandlerMetadataIdList.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
#include "naucrates/dxl/parser/CParseHandlerProperties.h"
#include "naucrates/dxl/parser/CParseHandlerScalarOp.h"
@@ -129,6 +130,12 @@ CParseHandlerIndexScan::StartElementHelper(
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(index_descr_parse_handler);
+ CParseHandlerBase *partition_mdids_parse_handler =
+ CParseHandlerFactory::GetParseHandler(
+ m_mp, CDXLTokens::XmlstrToken(EdxltokenMetadataIdList),
+ m_parse_handler_mgr, this);
+ m_parse_handler_mgr->ActivateParseHandler(partition_mdids_parse_handler);
+
// parse handler for the index condition list
CParseHandlerBase *index_condition_list_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -163,6 +170,7 @@ CParseHandlerIndexScan::StartElementHelper(
this->Append(proj_list_parse_handler);
this->Append(filter_parse_handler);
this->Append(index_condition_list_parse_handler);
+ this->Append(partition_mdids_parse_handler);
this->Append(index_descr_parse_handler);
this->Append(table_descr_parse_handler);
}
@@ -178,8 +186,7 @@ CParseHandlerIndexScan::StartElementHelper(
void
CParseHandlerIndexScan::EndElementHelper(const XMLCh *const element_local_name,
Edxltoken token_type,
- ULONG part_idx_id,
- ULONG part_idx_id_printable)
+ ULongPtrArray *selector_ids)
{
if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
element_local_name))
@@ -199,10 +206,12 @@ CParseHandlerIndexScan::EndElementHelper(const XMLCh *const element_local_name,
dynamic_cast<CParseHandlerFilter *>((*this)[2]);
CParseHandlerIndexCondList *index_condition_list_parse_handler =
dynamic_cast<CParseHandlerIndexCondList *>((*this)[3]);
+ CParseHandlerMetadataIdList *partition_mdids_parse_handler =
+ dynamic_cast<CParseHandlerMetadataIdList *>((*this)[4]);
CParseHandlerIndexDescr *index_descr_parse_handler =
- dynamic_cast<CParseHandlerIndexDescr *>((*this)[4]);
+ dynamic_cast<CParseHandlerIndexDescr *>((*this)[5]);
CParseHandlerTableDescr *table_descr_parse_handler =
- dynamic_cast<CParseHandlerTableDescr *>((*this)[5]);
+ dynamic_cast<CParseHandlerTableDescr *>((*this)[6]);
CDXLTableDescr *dxl_table_descr =
table_descr_parse_handler->GetDXLTableDescr();
@@ -229,9 +238,12 @@ CParseHandlerIndexScan::EndElementHelper(const XMLCh *const element_local_name,
{
GPOS_ASSERT(EdxltokenPhysicalDynamicIndexScan == token_type);
+ IMdIdArray *mdid_partitions_array =
+ partition_mdids_parse_handler->GetMdIdArray();
+ mdid_partitions_array->AddRef();
dxl_op = GPOS_NEW(m_mp) CDXLPhysicalDynamicIndexScan(
- m_mp, dxl_table_descr, part_idx_id, part_idx_id_printable,
- dxl_index_descr, m_index_scan_dir);
+ m_mp, dxl_table_descr, dxl_index_descr, m_index_scan_dir,
+ mdid_partitions_array, selector_ids);
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
}
diff --git a/src/include/executor/nodeDynamicIndexscan.h b/src/include/executor/nodeDynamicIndexscan.h
index 2fdf08d594..64e9045423 100644
--- a/src/include/executor/nodeDynamicIndexscan.h
+++ b/src/include/executor/nodeDynamicIndexscan.h
@@ -16,15 +16,11 @@
#include "nodes/execnodes.h"
-/* GPDB_12_MERGE_FIXME */
-#if 0
extern DynamicIndexScanState *ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags);
-extern TupleTableSlot *ExecDynamicIndexScan(DynamicIndexScanState *node);
+extern TupleTableSlot *ExecDynamicIndexScan(PlanState *node);
extern void ExecEndDynamicIndexScan(DynamicIndexScanState *node);
extern void ExecReScanDynamicIndex(DynamicIndexScanState *node);
-extern bool IndexScan_MapLogicalIndexInfo(LogicalIndexInfo *logicalIndexInfo, AttrNumber *attMap, Index varno);
extern AttrNumber *IndexScan_GetColumnMapping(Oid oldOid, Oid newOid);
-#endif
#endif
diff --git a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
index c157850e51..dbb7662904 100644
--- a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
+++ b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
@@ -342,12 +342,12 @@ private:
);
// translate a dynamic index scan operator
- /* Plan *TranslateDXLDynIdxScan */
- /* ( */
- /* const CDXLNode *dyn_idx_scan_dxlnode, */
- /* CDXLTranslateContext *output_context, */
- /* CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings */
- /* ); */
+ Plan *TranslateDXLDynIdxScan(
+ const CDXLNode *dyn_idx_scan_dxlnode,
+ CDXLTranslateContext *output_context,
+ CDXLTranslationContextArray *
+ ctxt_translation_prev_siblings // translation contexts of previous siblings
+ );
// translate a DML operator
Plan *TranslateDXLDml(
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 09/11: Fix compiler warnings from Dynamic Scan commit
Posted by ma...@apache.org.
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 12ed1a8e82a0e0ad30cb8af7807fff3915bd2099
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Tue Jul 12 16:23:40 2022 -0700
Fix compiler warnings from Dynamic Scan commit
---
src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index eeb8cb41fc..03ec58c6fc 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -5807,9 +5807,9 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
DynamicBitmapHeapScan *dscan;
BitmapHeapScan *bitmap_tbl_scan;
+ dscan = MakeNode(DynamicBitmapHeapScan);
if (is_dynamic)
{
- dscan = MakeNode(DynamicBitmapHeapScan);
bitmap_tbl_scan = &dscan->bitmapheapscan;
CDXLPhysicalDynamicBitmapTableScan *phy_dyn_bitmap_tblscan_dxlop =
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 07/11: ICW changes
Posted by ma...@apache.org.
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 b4476faac5196e87f90dd7e19e83bd6402126ea3
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:43:18 2022 -0700
ICW changes
---
src/test/regress/expected/bfv_index_optimizer.out | 130 +-
.../expected/bfv_partition_plans_optimizer.out | 213 ++-
src/test/regress/expected/dpe_optimizer.out | 881 +++++------
.../regress/expected/explain_format_optimizer.out | 22 +-
src/test/regress/expected/gporca_optimizer.out | 526 +++----
src/test/regress/expected/inherit_optimizer.out | 105 +-
src/test/regress/expected/join_gp_optimizer.out | 15 +-
.../expected/orca_static_pruning_optimizer.out | 133 +-
src/test/regress/expected/partition_optimizer.out | 30 +-
.../regress/expected/partition_prune_optimizer.out | 721 ++++-----
.../expected/partition_pruning_optimizer.out | 1544 ++++++++------------
src/test/regress/expected/qp_dpe_optimizer.out | 26 +-
.../regress/expected/qp_dropped_cols_optimizer.out | 68 +-
.../expected/qp_gist_indexes4_optimizer.out | 17 +-
.../regress/expected/qp_misc_jiras_optimizer.out | 30 +-
.../expected/qp_targeted_dispatch_optimizer.out | 29 +-
.../regress/expected/subselect_gp_optimizer.out | 79 +-
17 files changed, 1773 insertions(+), 2796 deletions(-)
diff --git a/src/test/regress/expected/bfv_index_optimizer.out b/src/test/regress/expected/bfv_index_optimizer.out
index f89f04b854..da317532ff 100644
--- a/src/test/regress/expected/bfv_index_optimizer.out
+++ b/src/test/regress/expected/bfv_index_optimizer.out
@@ -127,89 +127,55 @@ explain SELECT count(*)
FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1
WHERE ft.wk_id = dt.wk_id
AND ft.id = dt1.id;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
- Aggregate (cost=23.80..23.81 rows=1 width=8)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=2.28..23.79 rows=3 width=0)
- -> Hash Join (cost=2.28..23.74 rows=1 width=0)
- Hash Cond: (ft.wk_id = dt.wk_id)
- -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.20..22.65 rows=2 width=2)
- Hash Key: ft.wk_id
- -> Hash Join (cost=1.20..22.60 rows=2 width=2)
- Hash Cond: (ft.id = dt1.id)
- -> Append (cost=0.00..21.32 rows=21 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..1.01 rows=1 width=6)
- -> Hash (cost=1.12..1.12 rows=7 width=4)
- -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..1.12 rows=7 width=4)
- -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.02 rows=2 width=4)
- -> Hash (cost=1.03..1.03 rows=3 width=2)
- -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.03 rows=3 width=2)
- Optimizer: Postgres query optimizer
-(36 rows)
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------------------------------------
+ Aggregate (cost=0.00..1250.34 rows=1 width=8)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1250.34 rows=7 width=1)
+ -> Hash Join (cost=0.00..1250.34 rows=3 width=1)
+ Hash Cond: (bfv_tab2_dimdate.wk_id = bfv_tab2_facttable1.wk_id)
+ -> Seq Scan on bfv_tab2_dimdate (cost=0.00..431.00 rows=4 width=2)
+ -> Hash (cost=819.34..819.34 rows=3 width=2)
+ -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..819.34 rows=3 width=2)
+ Hash Key: bfv_tab2_facttable1.wk_id
+ -> Nested Loop (cost=0.00..819.34 rows=3 width=2)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=7 width=4)
+ -> Seq Scan on bfv_tab2_dimtabl1 (cost=0.00..431.00 rows=3 width=4)
+ -> Dynamic Bitmap Heap Scan on bfv_tab2_facttable1 (cost=0.00..388.34 rows=1 width=2)
+ Number of partitions to scan: 21
+ Recheck Cond: (id = bfv_tab2_dimtabl1.id)
+ Filter: (id = bfv_tab2_dimtabl1.id)
+ -> Dynamic Bitmap Index Scan on idx_bfv_tab2_facttable1 (cost=0.00..0.00 rows=0 width=0)
+ Index Cond: (id = bfv_tab2_dimtabl1.id)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(19 rows)
explain SELECT count(*)
FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1
WHERE ft.wk_id = dt.wk_id
AND ft.id = dt1.id;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
- Aggregate (cost=23.80..23.81 rows=1 width=8)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=2.28..23.79 rows=3 width=0)
- -> Hash Join (cost=2.28..23.74 rows=1 width=0)
- Hash Cond: (ft.wk_id = dt.wk_id)
- -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.20..22.65 rows=2 width=2)
- Hash Key: ft.wk_id
- -> Hash Join (cost=1.20..22.60 rows=2 width=2)
- Hash Cond: (ft.id = dt1.id)
- -> Append (cost=0.00..21.32 rows=21 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6)
- -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..1.01 rows=1 width=6)
- -> Hash (cost=1.12..1.12 rows=7 width=4)
- -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..1.12 rows=7 width=4)
- -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.02 rows=2 width=4)
- -> Hash (cost=1.03..1.03 rows=3 width=2)
- -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.03 rows=3 width=2)
- Optimizer: Postgres query optimizer
-(36 rows)
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------------------------------------
+ Aggregate (cost=0.00..1250.34 rows=1 width=8)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1250.34 rows=7 width=1)
+ -> Hash Join (cost=0.00..1250.34 rows=3 width=1)
+ Hash Cond: (bfv_tab2_dimdate.wk_id = bfv_tab2_facttable1.wk_id)
+ -> Seq Scan on bfv_tab2_dimdate (cost=0.00..431.00 rows=4 width=2)
+ -> Hash (cost=819.34..819.34 rows=3 width=2)
+ -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..819.34 rows=3 width=2)
+ Hash Key: bfv_tab2_facttable1.wk_id
+ -> Nested Loop (cost=0.00..819.34 rows=3 width=2)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=7 width=4)
+ -> Seq Scan on bfv_tab2_dimtabl1 (cost=0.00..431.00 rows=3 width=4)
+ -> Dynamic Bitmap Heap Scan on bfv_tab2_facttable1 (cost=0.00..388.34 rows=1 width=2)
+ Number of partitions to scan: 21
+ Recheck Cond: (id = bfv_tab2_dimtabl1.id)
+ Filter: (id = bfv_tab2_dimtabl1.id)
+ -> Dynamic Bitmap Index Scan on idx_bfv_tab2_facttable1 (cost=0.00..0.00 rows=0 width=0)
+ Index Cond: (id = bfv_tab2_dimtabl1.id)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(19 rows)
-- start_ignore
create language plpython3u;
@@ -356,7 +322,7 @@ set optimizer_enable_dynamictablescan = off;
select count_index_scans('explain select * from Tbl23383_partitioned where b=''1''');
count_index_scans
-------------------
- 2
+ 1
(1 row)
select * from Tbl23383_partitioned where b='1';
@@ -368,7 +334,7 @@ select * from Tbl23383_partitioned where b='1';
select count_index_scans('explain select * from Tbl23383_partitioned where ''1''=b');
count_index_scans
-------------------
- 2
+ 1
(1 row)
select * from Tbl23383_partitioned where '1'=b;
@@ -380,7 +346,7 @@ select * from Tbl23383_partitioned where '1'=b;
select count_index_scans('explain select * from Tbl23383_partitioned where ''2''> b order by a limit 10;');
count_index_scans
-------------------
- 2
+ 1
(1 row)
select * from Tbl23383_partitioned where '2'> b order by a limit 10;
@@ -401,7 +367,7 @@ select * from Tbl23383_partitioned where '2'> b order by a limit 10;
select count_index_scans('explain select * from Tbl23383_partitioned where b between ''1'' and ''2'' order by a limit 10;');
count_index_scans
-------------------
- 2
+ 1
(1 row)
select * from Tbl23383_partitioned where b between '1' and '2' order by a limit 10;
diff --git a/src/test/regress/expected/bfv_partition_plans_optimizer.out b/src/test/regress/expected/bfv_partition_plans_optimizer.out
index 0e8e85ad18..a5bb5f0570 100644
--- a/src/test/regress/expected/bfv_partition_plans_optimizer.out
+++ b/src/test/regress/expected/bfv_partition_plans_optimizer.out
@@ -117,7 +117,7 @@ insert into mpp23195_t2 values (1);
select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan');
find_operator
---------------
- ['false']
+ ['true']
(1 row)
select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;
@@ -194,7 +194,7 @@ analyze mpp23288;
select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a;','Dynamic Seq Scan');
count_operator
----------------
- 0
+ 2
(1 row)
select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2.a =10) order by t2.a, t1.a;
@@ -214,7 +214,7 @@ select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and t2
select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a;','Dynamic Seq Scan');
count_operator
----------------
- 0
+ 2
(1 row)
select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t2.a = 10 or t2.a = 5 or t2.a = 12)) order by t2.a, t1.a;
@@ -249,7 +249,7 @@ select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on (t1.a < t2.a and (t
select count_operator('select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a;','Dynamic Seq Scan');
count_operator
----------------
- 0
+ 2
(1 row)
select t2.a, t1.a from mpp23288 as t1 join mpp23288 as t2 on t1.a < t2.a and t2.a = 1 or t2.a < 10 order by t2.a, t1.a;
@@ -490,14 +490,14 @@ set enable_parallel to false;
select count_operator('select * from (select * from p1 union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
reset enable_parallel;
select count_operator('select * from (select * from p1 union select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
select count_operator('select * from (select * from p1 except all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
@@ -509,43 +509,43 @@ select count_operator('select * from (select * from p1 except all select * from
select count_operator('select * from (select * from p1 except select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
select count_operator('select * from (select * from p1 intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
select count_operator('select * from (select * from p1 union select * from p2 union all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 6
+ 3
(1 row)
select count_operator('select * from (select * from p1 union select * from p2 union all select * from p) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
select count_operator('select * from (select * from p1 union select * from p union all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
select count_operator('select * from (select * from p1 union select * from p2 intersect all select * from p3) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 6
+ 3
(1 row)
select count_operator('select * from (select * from p1 union select * from p intersect all select * from p2) as p_all, t where p_all.b=t.b;','Partition Selector');
count_operator
----------------
- 4
+ 2
(1 row)
-- CLEANUP
@@ -583,7 +583,7 @@ create index dbs_index on dbs using bitmap(c3);
select find_operator('(select * from dts where c2 = 1) union (select * from dts where c2 = 2) union (select * from dts where c2 = 3) union (select * from dts where c2 = 4) union (select * from dts where c2 = 5) union (select * from dts where c2 = 6) union (select * from dts where c2 = 7) union (select * from dts where c2 = 8) union (select * from dts where c2 = 9) union (select * from dts where c2 = 10);', 'Dynamic Seq Scan');
find_operator
---------------
- ['false']
+ ['true']
(1 row)
(select * from dts where c2 = 1) union
@@ -604,7 +604,7 @@ set optimizer_enable_dynamictablescan = off;
select find_operator('(select * from dis where c3 = 1) union (select * from dis where c3 = 2) union (select * from dis where c3 = 3) union (select * from dis where c3 = 4) union (select * from dis where c3 = 5) union (select * from dis where c3 = 6) union (select * from dis where c3 = 7) union (select * from dis where c3 = 8) union (select * from dis where c3 = 9) union (select * from dis where c3 = 10);', 'Dynamic Index Scan');
find_operator
---------------
- ['false']
+ ['true']
(1 row)
(select * from dis where c3 = 1) union
@@ -753,7 +753,7 @@ select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id >
select count_operator('select * from ds_4 a1,ds_4 a2 where a1.month_id = a2.month_id and a1.month_id > E''200800'';','Partition Selector');
count_operator
----------------
- 2
+ 1
(1 row)
-- CLEANUP
@@ -805,16 +805,15 @@ SELECT b FROM bar GROUP BY b;
(20 rows)
EXPLAIN SELECT b FROM bar GROUP BY b;
- QUERY PLAN
----------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.05 rows=20 width=4)
-> HashAggregate (cost=0.00..431.05 rows=7 width=4)
- Group Key: bar_1_prt_1.b
- -> Append (cost=0.00..431.01 rows=334 width=4)
- -> Seq Scan on bar_1_prt_1 (cost=0.00..431.01 rows=334 width=4)
- -> Seq Scan on bar_1_prt_2 (cost=0.00..431.01 rows=334 width=4)
+ Group Key: b
+ -> Dynamic Seq Scan on bar (cost=0.00..431.01 rows=334 width=4)
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(6 rows)
-- CLEANUP
DROP TABLE IF EXISTS foo;
@@ -838,30 +837,25 @@ EVERY ('2 mons'::interval)
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'oid' as the Cloudberry 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 analyze select a.* from mpp8031 a, mpp8031 b where a.oid = b.oid;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.00 rows=1 width=16) (actual time=3.292..3.293 rows=0 loops=1)
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.00 rows=1 width=16) (actual time=2.533..2.533 rows=0 loops=1)
-> Hash Join (cost=0.00..862.00 rows=1 width=16) (never executed)
- Hash Cond: (mpp8031_1_prt_foo_1.oid = mpp8031_1_prt_foo_1_1.oid)
- -> Append (cost=0.00..431.00 rows=1 width=16) (never executed)
- -> Seq Scan on mpp8031_1_prt_foo_1 (cost=0.00..431.00 rows=1 width=16) (never executed)
- -> Seq Scan on mpp8031_1_prt_2 (cost=0.00..431.00 rows=1 width=16) (never executed)
- -> Seq Scan on mpp8031_1_prt_3 (cost=0.00..431.00 rows=1 width=16) (never executed)
- -> Seq Scan on mpp8031_1_prt_4 (cost=0.00..431.00 rows=1 width=16) (never executed)
+ Hash Cond: (mpp8031.oid = mpp8031_1.oid)
+ -> Dynamic Seq Scan on mpp8031 (cost=0.00..431.00 rows=1 width=16) (never executed)
+ Number of partitions to scan: 4
-> Hash (cost=431.00..431.00 rows=1 width=4) (never executed)
Buckets: 524288 Batches: 1 Memory Usage: 4096kB
- -> Append (cost=0.00..431.00 rows=1 width=4) (never executed)
- -> Seq Scan on mpp8031_1_prt_foo_1 mpp8031_1_prt_foo_1_1 (cost=0.00..431.00 rows=1 width=4) (never executed)
- -> Seq Scan on mpp8031_1_prt_2 mpp8031_1_prt_2_1 (cost=0.00..431.00 rows=1 width=4) (never executed)
- -> Seq Scan on mpp8031_1_prt_3 mpp8031_1_prt_3_1 (cost=0.00..431.00 rows=1 width=4) (never executed)
- -> Seq Scan on mpp8031_1_prt_4 mpp8031_1_prt_4_1 (cost=0.00..431.00 rows=1 width=4) (never executed)
- Planning Time: 8.666 ms
- (slice0) Executor memory: 51K bytes.
- (slice1) Executor memory: 4147K bytes avg x 3 workers, 4147K bytes max (seg0). Work_mem: 4096K bytes max.
+ -> Dynamic Seq Scan on mpp8031 mpp8031_1 (cost=0.00..431.00 rows=1 width=4) (never executed)
+ Number of partitions to scan: 4
+ Partitions scanned: Avg 4.0 (out of 4) x 3 workers. Max 4 parts (seg0).
+ Planning Time: 4.433 ms
+ (slice0) Executor memory: 31K bytes.
+ (slice1) Executor memory: 4156K bytes avg x 3 workers, 4156K bytes max (seg0). Work_mem: 4096K bytes max.
Memory used: 128000kB
Optimizer: Pivotal Optimizer (GPORCA)
- Execution Time: 3.539 ms
-(21 rows)
+ Execution Time: 3.231 ms
+(16 rows)
drop table mpp8031;
-- Partitioned tables with default partitions and indexes on all parts,
@@ -953,36 +947,26 @@ explain select * from r_part r1, r_part r2 where r1.a=1; -- should eliminate par
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1324032.53 rows=8 width=16)
-> Nested Loop (cost=0.00..1324032.53 rows=3 width=16)
Join Filter: true
- -> Append (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_1 r_part_1_prt_1_1 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_2 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_3 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_4 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_5 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_6 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_7 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_8 (cost=0.00..431.00 rows=3 width=8)
- -> Seq Scan on r_part_1_prt_9 (cost=0.00..431.00 rows=3 width=8)
+ -> Dynamic Seq Scan on r_part r_part_1 (cost=0.00..431.00 rows=3 width=8)
+ Number of partitions to scan: 9
-> Materialize (cost=0.00..431.00 rows=1 width=8)
-> Broadcast Motion 3:3 (slice2; segments: 3) (cost=0.00..431.00 rows=1 width=8)
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_part_1_prt_1 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 1)
+ -> Dynamic Seq Scan on r_part (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+(11 rows)
-- the numbers in the filter should be both on segment 0
explain select * from r_part where a in (7,8); -- should eliminate partitions
QUERY PLAN
------------------------------------------------------------------------------
- Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=3 width=8)
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_part_1_prt_7 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = ANY ('{7,8}'::integer[]))
- -> Seq Scan on r_part_1_prt_8 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = ANY ('{7,8}'::integer[]))
+ Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=2 width=8)
+ -> Dynamic Seq Scan on r_part (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 2
+ Filter: (a = ANY ('{7,8}'::integer[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
-- Test partition elimination in prepared statements
prepare f1(int) as select * from r_part where a = 1 order by a,b;
@@ -1006,43 +990,43 @@ execute f2(2);
(1 row)
explain select * from r_part where a = 1 order by a,b; -- should eliminate partitions
- QUERY PLAN
-----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=8)
- Merge Key: r_part_1_prt_1.a, r_part_1_prt_1.b
+ Merge Key: a, b
-> Sort (cost=0.00..431.00 rows=1 width=8)
- Sort Key: r_part_1_prt_1.a, r_part_1_prt_1.b
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_part_1_prt_1 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 1)
+ Sort Key: a, b
+ -> Dynamic Seq Scan on r_part (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
(8 rows)
--force_explain
explain execute f1(1); -- should eliminate partitions
- QUERY PLAN
-----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=8)
- Merge Key: r_part_1_prt_1.a, r_part_1_prt_1.b
+ Merge Key: a, b
-> Sort (cost=0.00..431.00 rows=1 width=8)
- Sort Key: r_part_1_prt_1.a, r_part_1_prt_1.b
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_part_1_prt_1 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 1)
+ Sort Key: a, b
+ -> Dynamic Seq Scan on r_part (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
(8 rows)
--force_explain
explain execute f2(2); -- should eliminate partitions
- QUERY PLAN
-----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=8)
- Merge Key: r_part_1_prt_2.a, r_part_1_prt_2.b
+ Merge Key: a, b
-> Sort (cost=0.00..431.00 rows=1 width=8)
- Sort Key: r_part_1_prt_2.a, r_part_1_prt_2.b
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_part_1_prt_2 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 2)
+ Sort Key: a, b
+ -> Dynamic Seq Scan on r_part (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 2)
Optimizer: Pivotal Optimizer (GPORCA)
(8 rows)
@@ -1053,9 +1037,9 @@ explain select * from r_co where a=2; -- should eliminate partitions
QUERY PLAN
------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=8)
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_co_1_prt_2 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 2)
+ -> Dynamic Seq Scan on r_co (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 2)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -1063,15 +1047,15 @@ explain select * from r_co where a=2; -- should eliminate partitions
prepare f3(int) as select * from r_co where a = $1 order by a,b;
--force_explain
explain execute f3(2); -- should eliminate partitions
- QUERY PLAN
---------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=8)
- Merge Key: r_co_1_prt_2.a, r_co_1_prt_2.b
+ Merge Key: a, b
-> Sort (cost=0.00..431.00 rows=1 width=8)
- Sort Key: r_co_1_prt_2.a, r_co_1_prt_2.b
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on r_co_1_prt_2 (cost=0.00..431.00 rows=1 width=8)
- Filter: (a = 2)
+ Sort Key: a, b
+ -> Dynamic Seq Scan on r_co (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 1
+ Filter: (a = 2)
Optimizer: Pivotal Optimizer (GPORCA)
(8 rows)
@@ -1103,9 +1087,9 @@ explain select * from fact where dd < '2009-01-02'::date; -- partitions eliminat
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on fact_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (dd < '01-02-2009'::date)
+ -> Dynamic Seq Scan on fact (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 1
+ Filter: (dd < '01-02-2009'::date)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -1113,22 +1097,21 @@ explain select * from fact where dd < to_date('2009-01-02','YYYY-MM-DD'); -- par
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on fact_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (dd < '01-02-2009'::date)
+ -> Dynamic Seq Scan on fact (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 1
+ Filter: (dd < '01-02-2009'::date)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain select * from fact where dd < current_date; --partitions eliminated
- QUERY PLAN
------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..4.10 rows=4 width=40)
- -> Append (cost=0.00..4.02 rows=2 width=40)
- Subplans Removed: 3
- -> Seq Scan on fact_1_prt_1 (cost=0.00..1.00 rows=1 width=40)
- Filter: (dd < CURRENT_DATE)
- Optimizer: Postgres query optimizer
-(6 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
+ -> Dynamic Seq Scan on fact (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 1
+ Filter: (dd < '05-09-2022'::date)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- Test partition elimination in prepared statements
prepare f1(date) as select * from fact where dd < $1;
@@ -1137,9 +1120,9 @@ explain execute f1('2009-01-02'::date); -- should eliminate partitions
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on fact_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (dd < '01-02-2009'::date)
+ -> Dynamic Seq Scan on fact (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 1
+ Filter: (dd < '01-02-2009'::date)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -1148,9 +1131,9 @@ explain execute f1(to_date('2009-01-02', 'YYYY-MM-DD')); -- should eliminate par
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on fact_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (dd < '01-02-2009'::date)
+ -> Dynamic Seq Scan on fact (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 1
+ Filter: (dd < '01-02-2009'::date)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
diff --git a/src/test/regress/expected/dpe_optimizer.out b/src/test/regress/expected/dpe_optimizer.out
index 3437f2bac7..b78f6e3172 100644
--- a/src/test/regress/expected/dpe_optimizer.out
+++ b/src/test/regress/expected/dpe_optimizer.out
@@ -77,27 +77,19 @@ analyze t1;
-- Simple positive cases
--
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(18 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -123,27 +115,19 @@ select * from t, pt where tid = ptid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid + 1 = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = (t.tid + 1))
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(18 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = (t.tid + 1))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where tid + 1 = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -169,28 +153,20 @@ select * from t, pt where tid + 1 = ptid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid and t1 = 'hello' || tid;
- QUERY PLAN
----------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- Optimizer: Postgres query optimizer
-(19 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(11 rows)
select * from t, pt where tid = ptid and t1 = 'hello' || tid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -216,27 +192,20 @@ select * from t, pt where tid = ptid and t1 = 'hello' || tid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where t1 = pt1 and ptid = tid;
- QUERY PLAN
----------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Hash Join (actual rows=2 loops=1)
- Hash Cond: ((pt.pt1 = t.t1) AND (pt.ptid = t.tid))
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(18 rows)
+ -> Nested Loop (actual rows=2 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=2)
+ Index Cond: (pt1 = t.t1)
+ Filter: ((pt1 = t.t1) AND (ptid = t.tid))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(11 rows)
select * from t, pt where t1 = pt1 and ptid = tid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -252,25 +221,28 @@ explain (costs off, timing off, summary off, analyze) select * from pt where pti
QUERY PLAN
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Semi Join (actual rows=8 loops=1)
+ -> Hash Join (actual rows=8 loops=1)
Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Dynamic Seq Scan on pt (actual rows=8 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
-> Hash (actual rows=2 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=2 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- Optimizer: Postgres query optimizer
-(19 rows)
+ -> GroupAggregate (actual rows=2 loops=1)
+ Group Key: t.tid
+ -> Sort (actual rows=2 loops=1)
+ Sort Key: t.tid
+ Sort Method: quicksort Memory: 75kB
+ Executor Memory: 178kB Segments: 3 Max: 60kB (segment 0)
+ -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ Hash Key: t.tid
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(20 rows)
select * from pt where ptid in (select tid from t where t1 = 'hello' || tid);
dist | pt1 | pt2 | pt3 | ptid
@@ -302,25 +274,28 @@ explain (costs off, timing off, summary off, analyze) select * from pt where exi
QUERY PLAN
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Semi Join (actual rows=8 loops=1)
+ -> Hash Join (actual rows=8 loops=1)
Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Dynamic Seq Scan on pt (actual rows=8 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
-> Hash (actual rows=2 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=2 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- Optimizer: Postgres query optimizer
-(19 rows)
+ -> GroupAggregate (actual rows=2 loops=1)
+ Group Key: t.tid
+ -> Sort (actual rows=2 loops=1)
+ Sort Key: t.tid
+ Sort Method: quicksort Memory: 75kB
+ Executor Memory: 76kB Segments: 3 Max: 26kB (segment 1)
+ -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ Hash Key: t.tid
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(20 rows)
select * from pt where exists (select 1 from t where tid = ptid and t1 = 'hello' || tid);
dist | pt1 | pt2 | pt3 | ptid
@@ -349,29 +324,21 @@ select * from pt where exists (select 1 from t where tid = ptid and t1 = 'hello'
-- group-by on top
--
explain (costs off, timing off, summary off, analyze) select count(*) from t, pt where tid = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 524288 Batches: 1 Memory Usage: 4097kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(20 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(12 rows)
select count(*) from t, pt where tid = ptid;
count
@@ -383,8 +350,8 @@ select count(*) from t, pt where tid = ptid;
-- window function on top
--
explain (costs off, timing off, summary off, analyze) select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
WindowAgg (actual rows=18 loops=1)
Order By: pt.ptid, pt.pt1
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
@@ -392,24 +359,17 @@ explain (costs off, timing off, summary off, analyze) select *, rank() over (ord
-> Sort (actual rows=8 loops=1)
Sort Key: pt.ptid, pt.pt1
Sort Method: quicksort Memory: 76kB
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(24 rows)
+ Executor Memory: 85kB Segments: 3 Max: 29kB (segment 1)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(16 rows)
select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid | rank
@@ -440,44 +400,28 @@ select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid
union all
select * from t, pt where tid + 2 = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=36 loops=1)
-> Append (actual rows=14 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Hash Join (actual rows=7 loops=1)
- Hash Cond: (pt_7.ptid = (t_1.tid + 2))
- Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
- -> Append (actual rows=7 loops=1)
- Partition Selectors: $1
- -> Seq Scan on pt_1_prt_2 pt_8 (never executed)
- -> Seq Scan on pt_1_prt_3 pt_9 (never executed)
- -> Seq Scan on pt_1_prt_4 pt_10 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_11 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt_12 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_13 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $1) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t t_1 (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(35 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ -> Nested Loop (actual rows=7 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t t_1 (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=4 loops=2)
+ Index Cond: (ptid = (t_1.tid + 2))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(19 rows)
select * from t, pt where tid = ptid
union all
@@ -530,48 +474,30 @@ explain (costs off, timing off, summary off, analyze) select count(*) from
union all
select * from t, pt where tid + 2 = ptid
) foo;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
-> Append (actual rows=14 loops=1)
- -> Subquery Scan on "*SELECT* 1" (actual rows=8 loops=1)
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Subquery Scan on "*SELECT* 2" (actual rows=7 loops=1)
- -> Hash Join (actual rows=7 loops=1)
- Hash Cond: (pt_7.ptid = (t_1.tid + 2))
- Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=7 loops=1)
- Partition Selectors: $1
- -> Seq Scan on pt_1_prt_2 pt_8 (never executed)
- -> Seq Scan on pt_1_prt_3 pt_9 (never executed)
- -> Seq Scan on pt_1_prt_4 pt_10 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_11 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt_12 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_13 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $1) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t t_1 (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(39 rows)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ -> Nested Loop (actual rows=7 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t t_1 (actual rows=2 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=4 loops=2)
+ Index Cond: (ptid = (t_1.tid + 2))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(21 rows)
select count(*) from
( select * from t, pt where tid = ptid
@@ -590,24 +516,20 @@ set enable_hashjoin=off;
set enable_nestloop=on;
set enable_mergejoin=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
-> Nested Loop (actual rows=8 loops=1)
Join Filter: (t.tid = pt.ptid)
Rows Removed by Join Filter: 30
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Materialize (actual rows=20 loops=2)
- -> Append (actual rows=20 loops=1)
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
- Optimizer: Postgres query optimizer
-(15 rows)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -644,30 +566,22 @@ set enable_hashjoin=off;
-- Known_opt_diff: MPP-21322
-- end_ignore
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid and pt1 = 'hello0';
- QUERY PLAN
------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (actual rows=1 loops=1)
- -> Nested Loop (actual rows=1 loops=1)
- Join Filter: (t.tid = pt.ptid)
- Rows Removed by Join Filter: 1
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Materialize (actual rows=1 loops=2)
- -> Append (actual rows=1 loops=1)
- -> Index Scan using pt_1_prt_2_pt1_idx on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- -> Index Scan using pt_1_prt_3_pt1_idx on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- -> Index Scan using pt_1_prt_4_pt1_idx on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- -> Index Scan using pt_1_prt_5_pt1_idx on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- -> Index Scan using pt_1_prt_6_pt1_idx on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- -> Index Scan using pt_1_prt_junk_data_pt1_idx on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- Optimizer: Postgres query optimizer
-(21 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------
+ Hash Join (actual rows=1 loops=1)
+ Hash Cond: (t.tid = pt.ptid)
+ Extra Text: Hash chain length 1.0 avg, 1 max, using 1 of 262144 buckets.
+ -> Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Hash (actual rows=1 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Gather Motion 3:1 (slice2; segments: 3) (actual rows=1 loops=1)
+ -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(12 rows)
select * from t, pt where tid = ptid and pt1 = 'hello0';
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -683,24 +597,20 @@ set enable_indexscan=on;
set enable_seqscan=off;
set enable_hashjoin=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
-> Nested Loop (actual rows=8 loops=1)
Join Filter: (t.tid = pt.ptid)
Rows Removed by Join Filter: 30
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Materialize (actual rows=20 loops=2)
- -> Append (actual rows=20 loops=1)
- -> Index Scan using pt_1_prt_2_ptid_idx on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Index Scan using pt_1_prt_3_ptid_idx on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Index Scan using pt_1_prt_4_ptid_idx on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Index Scan using pt_1_prt_5_ptid_idx on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
- -> Index Scan using pt_1_prt_6_ptid_idx on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
- -> Index Scan using pt_1_prt_junk_data_ptid_idx on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
- Optimizer: Postgres query optimizer
-(15 rows)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -733,25 +643,19 @@ set enable_seqscan=on;
set enable_hashjoin=on;
set enable_nestloop=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where t1 = pt1;
- QUERY PLAN
--------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Hash Join (actual rows=2 loops=1)
- Hash Cond: (pt.pt1 = t.t1)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Append (actual rows=20 loops=1)
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(16 rows)
+ -> Nested Loop (actual rows=2 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=2)
+ Index Cond: (pt1 = t.t1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where t1 = pt1;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -761,24 +665,20 @@ select * from t, pt where t1 = pt1;
(2 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid < ptid;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=81 loops=1)
-> Nested Loop (actual rows=31 loops=1)
Join Filter: (t.tid < pt.ptid)
Rows Removed by Join Filter: 9
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Materialize (actual rows=20 loops=2)
- -> Append (actual rows=20 loops=1)
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
- Optimizer: Postgres query optimizer
-(15 rows)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=16 loops=2)
+ Index Cond: (ptid > t.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
select * from t, pt where tid < ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -875,34 +775,26 @@ reset enable_nestloop;
--
-- one of the joined tables can be used for partition elimination, the other can not
explain (costs off, timing off, summary off, analyze) select * from t, t1, pt where t1.t2 = t.t2 and t1.tid = ptid;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (actual rows=36 loops=1)
- -> Hash Join (actual rows=16 loops=1)
- Hash Cond: (t1.t2 = t.t2)
- Extra Text: (seg1) Hash chain length 2.0 avg, 2 max, using 1 of 131072 buckets.
- -> Hash Join (actual rows=8 loops=1)
- Hash Cond: (pt.ptid = t1.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
- -> Append (actual rows=8 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
- -> Hash (actual rows=2 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t1 (actual rows=1 loops=1)
- -> Hash (actual rows=2 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Postgres query optimizer
-(25 rows)
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
+ Hash Join (actual rows=36 loops=1)
+ Hash Cond: (t1.t2 = t.t2)
+ Extra Text: Hash chain length 2.0 avg, 2 max, using 1 of 262144 buckets.
+ -> Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t1 (actual rows=1 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
+ Index Cond: (ptid = t1.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Gather Motion 3:1 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(16 rows)
select * from t, t1, pt where t1.t2 = t.t2 and t1.tid = ptid;
dist | tid | t1 | t2 | dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -954,35 +846,29 @@ insert into t1 select i, -100, 'dummy' from generate_series(1,10) i;
analyze t;
analyze t1;
explain (costs off, timing off, summary off, analyze) select * from t, t1, pt where t1.tid = ptid and t.tid = ptid;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=9 loops=1)
- -> Hash Join (actual rows=3 loops=1)
- Hash Cond: (pt.ptid = t1.tid)
- Extra Text: (seg0) Hash chain length 4.0 avg, 10 max, using 3 of 131072 buckets.
- -> Hash Join (actual rows=3 loops=1)
- Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg0) Hash chain length 4.0 avg, 10 max, using 3 of 131072 buckets.
- -> Append (actual rows=6 loops=1)
- Partition Selectors: $0, $1
- -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
- -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
- -> Hash (actual rows=12 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $0) (actual rows=12 loops=1)
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=12 loops=1)
- -> Seq Scan on t (actual rows=5 loops=1)
- -> Hash (actual rows=12 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $1) (actual rows=12 loops=1)
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=12 loops=1)
- -> Seq Scan on t1 (actual rows=6 loops=1)
- Optimizer: Postgres query optimizer
-(26 rows)
+ -> Hash Join (actual rows=9 loops=1)
+ Hash Cond: (t.tid = pt.ptid)
+ Extra Text: (seg1) Hash chain length 9.0 avg, 9 max, using 1 of 262144 buckets.
+ -> Redistribute Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ Hash Key: t.tid
+ -> Seq Scan on t (actual rows=5 loops=1)
+ -> Hash (actual rows=9 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=9 loops=1)
+ Hash Key: pt.ptid
+ -> Nested Loop (actual rows=8 loops=1)
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice4; segments: 3) (actual rows=12 loops=1)
+ -> Seq Scan on t1 (actual rows=6 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=1 loops=12)
+ Index Cond: (ptid = t1.tid)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers of 12 scans. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(19 rows)
select * from t, t1, pt where t1.tid = ptid and t.tid = ptid;
dist | tid | t1 | t2 | dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -1007,43 +893,26 @@ begin;
set local from_collapse_limit = 1;
set local join_collapse_limit = 1;
explain (costs off, timing off, summary off, analyze) select * from t1 inner join (select pt1.*, pt2.ptid as ptid2 from pt as pt1, pt as pt2 WHERE pt1.ptid <= pt2.ptid and pt1.dist = pt2.dist ) as ptx ON t1.dist = ptx.dist and t1.tid = ptx.ptid and t1.tid = ptx.ptid2;
- QUERY PLAN
---------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Hash Join (actual rows=1 loops=1)
- Hash Cond: ((pt1.dist = t1.dist) AND (pt1.ptid = t1.tid))
- Join Filter: ((t1.tid <= pt2.ptid) AND (pt1.ptid <= t1.tid))
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 131072 buckets.
- -> Hash Join (actual rows=3 loops=1)
- Hash Cond: ((pt1.dist = pt2.dist) AND (pt1.ptid = pt2.ptid))
- Join Filter: (pt1.ptid <= pt2.ptid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 14 of 262144 buckets.
- -> Append (actual rows=3 loops=1)
- Partition Selectors: $0, $1
- -> Seq Scan on pt_1_prt_2 pt1_1 (never executed)
- -> Seq Scan on pt_1_prt_3 pt1_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt1_3 (actual rows=2 loops=1)
- -> Seq Scan on pt_1_prt_5 pt1_4 (never executed)
- -> Seq Scan on pt_1_prt_6 pt1_5 (never executed)
- -> Seq Scan on pt_1_prt_junk_data pt1_6 (never executed)
- -> Hash (actual rows=14 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Partition Selector (selector id: $0) (actual rows=14 loops=1)
- -> Append (actual rows=14 loops=1)
- Partition Selectors: $2
- -> Seq Scan on pt_1_prt_2 pt2_1 (never executed)
- -> Seq Scan on pt_1_prt_3 pt2_2 (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_4 pt2_3 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_5 pt2_4 (actual rows=5 loops=1)
- -> Seq Scan on pt_1_prt_6 pt2_5 (actual rows=4 loops=1)
- -> Seq Scan on pt_1_prt_junk_data pt2_6 (actual rows=3 loops=1)
- -> Hash (actual rows=1 loops=1)
- Buckets: 131072 Batches: 1 Memory Usage: 1025kB
- -> Partition Selector (selector id: $2) (actual rows=1 loops=1)
- -> Partition Selector (selector id: $1) (actual rows=1 loops=1)
- -> Seq Scan on t1 (actual rows=1 loops=1)
- Optimizer: Postgres query optimizer
-(34 rows)
+ -> Nested Loop (actual rows=1 loops=1)
+ Join Filter: true
+ -> Nested Loop (actual rows=1 loops=1)
+ Join Filter: true
+ -> Seq Scan on t1 (actual rows=1 loops=1)
+ -> Dynamic Index Scan on ptid_idx on pt (actual rows=1 loops=1)
+ Index Cond: (ptid = t1.tid)
+ Filter: ((ptid = t1.tid) AND (t1.dist = dist))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 2 workers. Max 6 parts (seg0).
+ -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=1 loops=1)
+ Index Cond: ((ptid <= pt.ptid) AND (ptid = pt.ptid))
+ Filter: ((ptid <= pt.ptid) AND (ptid = pt.ptid) AND (dist = pt.dist))
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 2 workers. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(17 rows)
rollback;
--
@@ -1051,8 +920,8 @@ rollback;
-- not projection capable.
--
explain (costs off, timing off, summary off, analyze) select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt1.dist;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=9 loops=1)
Merge Key: pt1.dist
-> Sort (actual rows=5 loops=1)
@@ -1061,39 +930,19 @@ explain (costs off, timing off, summary off, analyze) select * from pt, pt1 wher
-> Hash Join (actual rows=5 loops=1)
Hash Cond: (pt1.ptid = pt.ptid)
Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 131072 buckets.
- -> Append (actual rows=5 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt1_1_prt_2 pt1_1 (actual rows=5 loops=1)
- -> Seq Scan on pt1_1_prt_3 pt1_2 (never executed)
- -> Seq Scan on pt1_1_prt_4 pt1_3 (never executed)
- -> Seq Scan on pt1_1_prt_5 pt1_4 (never executed)
- -> Seq Scan on pt1_1_prt_6 pt1_5 (never executed)
- -> Seq Scan on pt1_1_prt_junk_data pt1_6 (never executed)
+ -> Dynamic Seq Scan on pt1 (actual rows=5 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
-> Hash (actual rows=1 loops=1)
Buckets: 131072 Batches: 1 Memory Usage: 1025kB
-> Partition Selector (selector id: $0) (actual rows=1 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=1 loops=1)
- -> Append (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 4
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 3
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 2
- -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 5
- -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 4
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 3
- Optimizer: Postgres query optimizer
-(40 rows)
+ -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(19 rows)
select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt1.dist;
dist | pt1 | pt2 | pt3 | ptid | dist | pt1 | pt2 | pt3 | ptid
@@ -1110,47 +959,27 @@ select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt
(9 rows)
explain (costs off, timing off, summary off, analyze) select count(*) from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0';
- QUERY PLAN
----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
-> Hash Join (actual rows=5 loops=1)
Hash Cond: (pt1.ptid = pt.ptid)
Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 524288 buckets.
- -> Append (actual rows=5 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt1_1_prt_2 pt1_1 (actual rows=5 loops=1)
- -> Seq Scan on pt1_1_prt_3 pt1_2 (never executed)
- -> Seq Scan on pt1_1_prt_4 pt1_3 (never executed)
- -> Seq Scan on pt1_1_prt_5 pt1_4 (never executed)
- -> Seq Scan on pt1_1_prt_6 pt1_5 (never executed)
- -> Seq Scan on pt1_1_prt_junk_data pt1_6 (never executed)
+ -> Dynamic Seq Scan on pt1 (actual rows=5 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
-> Hash (actual rows=1 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=1 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=1 loops=1)
- -> Append (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 4
- -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 3
- -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 2
- -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 5
- -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 4
- -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
- Filter: (pt1 = 'hello0'::text)
- Rows Removed by Filter: 3
- Optimizer: Postgres query optimizer
-(38 rows)
+ -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
+ Optimizer: Pivotal Optimizer (GPORCA)
+(17 rows)
select count(*) from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0';
count
@@ -1180,7 +1009,7 @@ explain (costs off, timing off, summary off, analyze) select * from t, pt where
------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=5 loops=1)
-> Hash Join (actual rows=3 loops=1)
- Hash Cond: (t.a = pt_1_prt_1.b)
+ Hash Cond: (t.a = pt.b)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 3 of 524288 buckets.
-> Redistribute Motion 3:3 (slice2; segments: 3) (actual rows=3 loops=1)
Hash Key: t.a
@@ -1188,15 +1017,12 @@ explain (costs off, timing off, summary off, analyze) select * from t, pt where
-> Hash (actual rows=3 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=3 loops=1)
- Hash Key: pt_1_prt_1.b
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on pt_1_prt_1 (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_2 (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_3 (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_4 (actual rows=1 loops=1)
- -> Seq Scan on pt_1_prt_5 (actual rows=1 loops=1)
+ Hash Key: pt.b
+ -> Dynamic Seq Scan on pt (actual rows=3 loops=1)
+ Number of partitions to scan: 5
+ Partitions scanned: Avg 5.0 x 3 workers. Max 5 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+(14 rows)
select * from t, pt where a = b;
id | a | id | b
@@ -1237,21 +1063,16 @@ explain (costs off, timing off, summary off, analyze) select * from t, pt where
QUERY PLAN
--------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Hash Join (actual rows=0 loops=1)
- Hash Cond: (pt_1_prt_1.b = t.a)
- -> Append (actual rows=0 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt_1_prt_1 (never executed)
- -> Seq Scan on pt_1_prt_2 (never executed)
- -> Seq Scan on pt_1_prt_3 (never executed)
- -> Seq Scan on pt_1_prt_4 (never executed)
- -> Seq Scan on pt_1_prt_5 (never executed)
+ -> Hash Join (never executed)
+ Hash Cond: (pt.b = t.a)
+ -> Dynamic Seq Scan on pt (never executed)
+ Number of partitions to scan: 5
-> Hash (actual rows=4 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=4 loops=1)
-> Seq Scan on t (actual rows=4 loops=1)
Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+(10 rows)
select * from t, pt where a = b;
a | b
@@ -2594,18 +2415,14 @@ explain (costs off, timing off, summary off, analyze) select * from apart as a,
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=5 loops=1)
-> Hash Join (actual rows=3 loops=1)
- Hash Cond: (apart_1_prt_1.id = c.id)
+ Hash Cond: (apart.id = c.id)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 8 of 262144 buckets.
-> Hash Join (actual rows=3 loops=1)
- Hash Cond: (apart_1_prt_1.t = b.t)
+ Hash Cond: (apart.t = b.t)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 5 of 262144 buckets.
- -> Append (actual rows=70 loops=1)
- Partition Selectors: $0
- -> Seq Scan on apart_1_prt_1 (actual rows=70 loops=1)
- -> Seq Scan on apart_1_prt_2 (never executed)
- -> Seq Scan on apart_1_prt_3 (never executed)
- -> Seq Scan on apart_1_prt_4 (never executed)
- -> Seq Scan on apart_1_prt_5 (never executed)
+ -> Dynamic Seq Scan on apart (actual rows=70 loops=1)
+ Number of partitions to scan: 5
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
-> Hash (actual rows=5 loops=1)
Buckets: 262144 Batches: 1 Memory Usage: 2049kB
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=5 loops=1)
@@ -2615,7 +2432,7 @@ explain (costs off, timing off, summary off, analyze) select * from apart as a,
-> Partition Selector (selector id: $0) (actual rows=8 loops=1)
-> Seq Scan on c (actual rows=8 loops=1)
Optimizer: Pivotal Optimizer (GPORCA)
-(21 rows)
+(17 rows)
select * from apart as a, b, c where a.t = b.t and a.id = c.id;
id | t | id | t | id | t
@@ -2633,18 +2450,14 @@ explain (costs off, timing off, summary off, analyze) select * from apart as a,
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=5 loops=1)
-> Hash Join (actual rows=3 loops=1)
- Hash Cond: (apart_1_prt_1.id = c.id)
+ Hash Cond: (apart.id = c.id)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 8 of 262144 buckets.
-> Hash Join (actual rows=3 loops=1)
- Hash Cond: (apart_1_prt_1.t = b.t)
+ Hash Cond: (apart.t = b.t)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 5 of 262144 buckets.
- -> Append (actual rows=70 loops=1)
- Partition Selectors: $0
- -> Seq Scan on apart_1_prt_1 (actual rows=70 loops=1)
- -> Seq Scan on apart_1_prt_2 (never executed)
- -> Seq Scan on apart_1_prt_3 (never executed)
- -> Seq Scan on apart_1_prt_4 (never executed)
- -> Seq Scan on apart_1_prt_5 (never executed)
+ -> Dynamic Seq Scan on apart (actual rows=70 loops=1)
+ Number of partitions to scan: 5
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
-> Hash (actual rows=5 loops=1)
Buckets: 262144 Batches: 1 Memory Usage: 2049kB
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=5 loops=1)
@@ -2654,7 +2467,7 @@ explain (costs off, timing off, summary off, analyze) select * from apart as a,
-> Partition Selector (selector id: $0) (actual rows=8 loops=1)
-> Seq Scan on c (actual rows=8 loops=1)
Optimizer: Pivotal Optimizer (GPORCA)
-(23 rows)
+(17 rows)
select * from apart as a, b, c where a.t = b.t and a.id = c.id;
id | t | id | t | id | t
@@ -2688,10 +2501,10 @@ analyze jpat;
-- Known_opt_diff: MPP-21323
-- end_ignore
explain (costs off, timing off, summary off, analyze) select * from (select count(*) over (order by a rows between 1 preceding and 1 following), a, b from jpat)jpat inner join pat using(b);
- QUERY PLAN
--------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Hash Join (actual rows=1 loops=1)
- Hash Cond: (jpat.b = pat_1_prt_2.b)
+ Hash Cond: (jpat.b = pat.b)
Extra Text: Hash chain length 1.0 avg, 1 max, using 10 of 131072 buckets.
-> WindowAgg (actual rows=1 loops=1)
Order By: jpat.a
@@ -2704,14 +2517,11 @@ explain (costs off, timing off, summary off, analyze) select * from (select coun
-> Hash (actual rows=10 loops=1)
Buckets: 131072 Batches: 1 Memory Usage: 1025kB
-> Gather Motion 3:1 (slice2; segments: 3) (actual rows=10 loops=1)
- -> Append (actual rows=5 loops=1)
- -> Seq Scan on pat_1_prt_2 (actual rows=0 loops=1)
- -> Seq Scan on pat_1_prt_3 (actual rows=1 loops=1)
- -> Seq Scan on pat_1_prt_4 (actual rows=1 loops=1)
- -> Seq Scan on pat_1_prt_5 (actual rows=1 loops=1)
- -> Seq Scan on pat_1_prt_other (actual rows=4 loops=1)
+ -> Dynamic Seq Scan on pat (actual rows=5 loops=1)
+ Number of partitions to scan: 5
+ Partitions scanned: Avg 5.0 x 3 workers. Max 5 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(21 rows)
+(17 rows)
select * from (select count(*) over (order by a rows between 1 preceding and 1 following), a, b from jpat)jpat inner join pat using(b);
b | count | a | a
@@ -2876,24 +2686,19 @@ select * from pt, t where t.dist = pt.dist and t.tid < pt.ptid;
--------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=11 loops=1)
-> Hash Join (actual rows=11 loops=1)
- Hash Cond: (pt1.dist = t.dist)
- Join Filter: (t.tid < pt1.ptid)
+ Hash Cond: (pt.dist = t.dist)
+ Join Filter: (t.tid < pt.ptid)
Rows Removed by Join Filter: 3
Extra Text: (seg1) Hash chain length 2.0 avg, 2 max, using 1 of 524288 buckets.
- -> Append (actual rows=7 loops=1)
- Partition Selectors: $0
- -> Seq Scan on pt1 (never executed)
- -> Seq Scan on pt2 (never executed)
- -> Seq Scan on pt3 (actual rows=1 loops=1)
- -> Seq Scan on pt4 (actual rows=1 loops=1)
- -> Seq Scan on pt5 (actual rows=1 loops=1)
- -> Seq Scan on ptdefault (actual rows=4 loops=1)
+ -> Dynamic Seq Scan on pt (actual rows=7 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: 4 (seg1).
-> Hash (actual rows=2 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+(13 rows)
--
-- Test join pruning with a MergeAppend
@@ -2927,30 +2732,24 @@ set enable_seqscan=off;
-- force_explain
explain (analyze, timing off, summary off)
select * from pt, t where t.dist = pt.dist and t.tid = pt.ptid order by t.tid, t.sk;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000008.18..10000000014.83 rows=7 width=24) (actual rows=5 loops=1)
- Merge Key: pt.ptid, t.sk
- -> Incremental Sort (cost=10000000008.18..10000000014.74 rows=2 width=24) (actual rows=2 loops=1)
- Sort Key: pt.ptid, t.sk
- Presorted Key: pt.ptid
- Full-sort Groups: 1 Sort Method: quicksort Average Memory: 25kB Peak Memory: 25kB
- -> Merge Join (cost=10000000003.00..10000000014.64 rows=2 width=24) (actual rows=2 loops=1)
- Merge Cond: (pt.ptid = t.tid)
- Join Filter: (pt.dist = t.dist)
- -> Merge Append (cost=0.85..446.48 rows=39 width=12) (actual rows=3 loops=1)
- Sort Key: pt.ptid
- -> Index Scan using pt1_ptid_sk_idx on pt1 pt_1 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
- -> Index Scan using pt2_ptid_sk_idx on pt2 pt_2 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
- -> Index Scan using pt3_ptid_sk_idx on pt3 pt_3 (cost=0.12..8.14 rows=1 width=12) (never executed)
- -> Index Scan using pt4_ptid_sk_idx on pt4 pt_4 (cost=0.12..8.14 rows=1 width=12) (never executed)
- -> Index Scan using pt5_ptid_sk_idx on pt5 pt_5 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
- -> Index Scan using ptdefault_ptid_sk_idx on ptdefault pt_6 (cost=0.14..405.00 rows=34 width=12) (actual rows=2 loops=1)
- -> Sort (cost=10000000002.15..10000000002.23 rows=33 width=12) (actual rows=19 loops=2)
- Sort Key: t.tid
- Sort Method: quicksort Memory: 79kB
- -> Partition Selector (selector id: $0) (cost=10000000000.00..10000000001.33 rows=33 width=12) (actual rows=37 loops=1)
- -> Seq Scan on t (cost=10000000000.00..10000000001.33 rows=33 width=12) (actual rows=37 loops=1)
- Optimizer: Postgres query optimizer
-(23 rows)
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.10 rows=98 width=24) (actual rows=5 loops=1)
+ Merge Key: t.tid, t.sk
+ -> Sort (cost=0.00..862.09 rows=33 width=24) (actual rows=2 loops=1)
+ Sort Key: t.tid, t.sk
+ Sort Method: quicksort Memory: 75kB
+ Executor Memory: 76kB Segments: 3 Max: 26kB (segment 0)
+ -> Hash Join (cost=0.00..862.05 rows=33 width=24) (actual rows=2 loops=1)
+ Hash Cond: ((pt.dist = t.dist) AND (pt.ptid = t.tid))
+ Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 36 of 262144 buckets.
+ -> Dynamic Seq Scan on pt (cost=0.00..431.00 rows=33 width=12) (actual rows=36 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
+ -> Hash (cost=431.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2050kB
+ -> Partition Selector (selector id: $0) (cost=0.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
+ -> Seq Scan on t (cost=0.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(15 rows)
diff --git a/src/test/regress/expected/explain_format_optimizer.out b/src/test/regress/expected/explain_format_optimizer.out
index d3abe4256b..bfbf1a589e 100644
--- a/src/test/regress/expected/explain_format_optimizer.out
+++ b/src/test/regress/expected/explain_format_optimizer.out
@@ -509,28 +509,16 @@ QUERY PLAN
"Async Capable": false,
"Plans": [
{
- "Node Type": "Append",
+ "Node Type": "Dynamic Seq Scan",
"Parent Relationship": "Outer",
"Slice": 1,
"Segments": 1,
"Gang Type": "primary reader",
"Parallel Aware": false,
- "Async Capable": false,
- "Subplans Removed": 0,
- "Plans": [
- {
- "Node Type": "Seq Scan",
- "Parent Relationship": "Member",
- "Slice": 1,
- "Segments": 1,
- "Gang Type": "primary reader",
- "Parallel Aware": false,
- "Async Capable": false,
- "Relation Name": "jsonexplaintest_1_prt_2",
- "Alias": "jsonexplaintest_1_prt_2",
- "Filter": "(i = 2)"
- }
- ]
+ "Relation Name": "jsonexplaintest",
+ "Alias": "jsonexplaintest",
+ "Number of partitions to scan": 1,
+ "Filter": "(i = 2)"
}
]
},
diff --git a/src/test/regress/expected/gporca_optimizer.out b/src/test/regress/expected/gporca_optimizer.out
index db42c71fca..d6774aa879 100644
--- a/src/test/regress/expected/gporca_optimizer.out
+++ b/src/test/regress/expected/gporca_optimizer.out
@@ -8291,21 +8291,16 @@ select * from orca.t order by 1,2;
-- test EXPLAIN support of partition selection nodes, while we're at it.
explain select * from orca.t order by 1,2;
- QUERY PLAN
----------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=24)
- Merge Key: t_1_prt_part201203.timest, t_1_prt_part201203.user_id
+ Merge Key: timest, user_id
-> Sort (cost=0.00..431.00 rows=1 width=24)
- Sort Key: t_1_prt_part201203.timest, t_1_prt_part201203.user_id
- -> Append (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201203 (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201204 (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201205 (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201206 (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201207 (cost=0.00..431.00 rows=1 width=24)
- -> Seq Scan on t_1_prt_part201208 (cost=0.00..431.00 rows=1 width=24)
+ Sort Key: timest, user_id
+ -> Dynamic Seq Scan on t (cost=0.00..431.00 rows=1 width=24)
+ Number of partitions to scan: 6
Optimizer: Pivotal Optimizer (GPORCA)
-(12 rows)
+(7 rows)
select tag2, tag1 from orca.t order by 1, 2;;
tag2 | tag1
@@ -8374,24 +8369,14 @@ set optimizer_enable_partial_index=on;
set optimizer_enable_space_pruning=off;
set optimizer_enable_constant_expression_evaluation=on;
explain select * from orca.t_date where user_id=9;
- QUERY PLAN
---------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=2 width=20)
- -> Append (cost=0.00..431.00 rows=1 width=20)
- -> Seq Scan on t_date_1_prt_part201203 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_date_1_prt_part201204 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_date_1_prt_part201205 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_date_1_prt_part201206 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_date_1_prt_part201207 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_date_1_prt_part201208 (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
+ -> Dynamic Seq Scan on t_date (cost=0.00..431.00 rows=1 width=20)
+ Number of partitions to scan: 6
+ Filter: (user_id = '9'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+(5 rows)
select * from orca.t_date where user_id=9;
timest | user_id | tag1 | tag2
@@ -8427,18 +8412,14 @@ insert into orca.t_text values('01-03-2012'::date,9,'ugly','tag2');
set optimizer_enable_space_pruning=off;
set optimizer_enable_constant_expression_evaluation=on;
explain select * from orca.t_text where user_id=9;
- QUERY PLAN
-------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=2 width=20)
- -> Append (cost=0.00..431.00 rows=1 width=20)
- -> Seq Scan on t_text_1_prt_partbad (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_text_1_prt_partgood (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
- -> Seq Scan on t_text_1_prt_partugly (cost=0.00..431.00 rows=1 width=20)
- Filter: (user_id = '9'::numeric)
+ -> Dynamic Seq Scan on t_text (cost=0.00..431.00 rows=1 width=20)
+ Number of partitions to scan: 3
+ Filter: (user_id = '9'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
select * from orca.t_text where user_id=9;
timest | user_id | tag1 | tag2
@@ -8468,18 +8449,14 @@ set optimizer_enable_space_pruning=off;
set optimizer_enable_constant_expression_evaluation=on;
set optimizer_use_external_constant_expression_evaluation_for_ints = on;
explain select * from orca.t_ceeval_ints where user_id=4;
- QUERY PLAN
-------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=21)
- -> Append (cost=0.00..431.00 rows=1 width=21)
- -> Seq Scan on t_ceeval_ints_1_prt_part100 (cost=0.00..431.00 rows=1 width=21)
- Filter: (user_id = '4'::numeric)
- -> Seq Scan on t_ceeval_ints_1_prt_part101 (cost=0.00..431.00 rows=1 width=21)
- Filter: (user_id = '4'::numeric)
- -> Seq Scan on t_ceeval_ints_1_prt_part103 (cost=0.00..431.00 rows=1 width=21)
- Filter: (user_id = '4'::numeric)
+ -> Dynamic Seq Scan on t_ceeval_ints (cost=0.00..431.00 rows=1 width=21)
+ Number of partitions to scan: 3
+ Filter: (user_id = '4'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
select * from orca.t_ceeval_ints where user_id=4;
user_id | category_id | tag1 | tag2
@@ -10007,42 +9984,17 @@ insert into orca.bm_dyn_test values(2, 5, '2');
set optimizer_enable_bitmapscan=on;
-- gather on 1 segment because of direct dispatch
explain select * from orca.bm_dyn_test where i=2 and t='2';
- QUERY PLAN
---------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..398.03 rows=2 width=10)
- -> Append (cost=0.00..398.03 rows=1 width=10)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part0 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part0_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part1 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part1_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part2 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part2_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part3 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part3_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part4 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part4_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
- -> Bitmap Heap Scan on bm_dyn_test_1_prt_part5 (cost=0.00..398.03 rows=1 width=10)
- Recheck Cond: (i = 2)
- Filter: ((i = 2) AND (t = '2'::text))
- -> Bitmap Index Scan on bm_dyn_test_1_prt_part5_i_idx (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (i = 2)
+ -> Dynamic Bitmap Heap Scan on bm_dyn_test (cost=0.00..398.03 rows=1 width=10)
+ Number of partitions to scan: 6
+ Recheck Cond: (i = 2)
+ Filter: ((i = 2) AND (t = '2'::text))
+ -> Dynamic Bitmap Index Scan on bm_dyn_test_idx (cost=0.00..0.00 rows=0 width=0)
+ Index Cond: (i = 2)
Optimizer: Pivotal Optimizer (GPORCA)
-(33 rows)
+(8 rows)
select * from orca.bm_dyn_test where i=2 and t='2';
i | j | t
@@ -10373,9 +10325,9 @@ END;
$$ LANGUAGE plpgsql volatile;
-- start_ignore
select disable_xform('CXformInnerJoin2DynamicIndexGetApply');
- disable_xform
---------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is disabled
+ disable_xform
+--------------------------------------------------------
+ CXformInnerJoin2DynamicIndexGetApply is not recognized
(1 row)
select disable_xform('CXformInnerJoin2HashJoin');
@@ -10385,9 +10337,9 @@ select disable_xform('CXformInnerJoin2HashJoin');
(1 row)
select disable_xform('CXformInnerJoin2IndexGetApply');
- disable_xform
--------------------------------------------
- CXformInnerJoin2IndexGetApply is disabled
+ disable_xform
+-------------------------------------------------
+ CXformInnerJoin2IndexGetApply is not recognized
(1 row)
select disable_xform('CXformInnerJoin2NLJoin');
@@ -10443,9 +10395,9 @@ reset optimizer_enable_indexjoin;
reset optimizer_enable_partial_index;
-- start_ignore
select enable_xform('CXformInnerJoin2DynamicIndexGetApply');
- enable_xform
--------------------------------------------------
- CXformInnerJoin2DynamicIndexGetApply is enabled
+ enable_xform
+--------------------------------------------------------
+ CXformInnerJoin2DynamicIndexGetApply is not recognized
(1 row)
select enable_xform('CXformInnerJoin2HashJoin');
@@ -10455,9 +10407,9 @@ select enable_xform('CXformInnerJoin2HashJoin');
(1 row)
select enable_xform('CXformInnerJoin2IndexGetApply');
- enable_xform
-------------------------------------------
- CXformInnerJoin2IndexGetApply is enabled
+ enable_xform
+-------------------------------------------------
+ CXformInnerJoin2IndexGetApply is not recognized
(1 row)
select enable_xform('CXformInnerJoin2NLJoin');
@@ -11581,25 +11533,12 @@ SELECT * FROM ds_part, non_part2 WHERE ds_part.c = non_part2.e AND non_part2.f =
explain SELECT * FROM ds_part, non_part2 WHERE ds_part.c = non_part2.e AND non_part2.f = 10 AND a IN ( SELECT b + 1 FROM non_part1);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1324515.77 rows=1 width=20)
- -> Hash Join (cost=0.00..1324515.77 rows=1 width=20)
- Hash Cond: (ds_part_1_prt_2.c = non_part2.e)
- -> Result (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (SubPlan 1)
- -> Append (cost=0.00..1324084.70 rows=334 width=12)
- Partition Selectors: $0
- -> Seq Scan on ds_part_1_prt_2 (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
- -> Seq Scan on ds_part_1_prt_3 (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
- -> Seq Scan on ds_part_1_prt_4 (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
- -> Seq Scan on ds_part_1_prt_5 (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
- -> Seq Scan on ds_part_1_prt_6 (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
- -> Seq Scan on ds_part_1_prt_deflt (cost=0.00..1324084.70 rows=334 width=12)
- Filter: (a = (b + 1))
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1324481.18 rows=1 width=20)
+ -> Hash Join (cost=0.00..1324481.18 rows=1 width=20)
+ Hash Cond: (ds_part.c = non_part2.e)
+ -> Dynamic Seq Scan on ds_part (cost=0.00..1324050.11 rows=334 width=12)
+ Number of partitions to scan: 6
+ Filter: ((a = (b + 1)) AND (SubPlan 1))
SubPlan 1
-> Materialize (cost=0.00..431.00 rows=1 width=4)
-> Broadcast Motion 1:3 (slice2) (cost=0.00..431.00 rows=1 width=4)
@@ -11613,7 +11552,7 @@ explain SELECT * FROM ds_part, non_part2 WHERE ds_part.c = non_part2.e AND non_p
-> Seq Scan on non_part2 (cost=0.00..431.00 rows=1 width=8)
Filter: (f = 10)
Optimizer: Pivotal Optimizer (GPORCA)
-(32 rows)
+(19 rows)
SELECT *, a IN ( SELECT b + 1 FROM non_part1) FROM ds_part, non_part2 WHERE ds_part.c = non_part2.e AND non_part2.f = 10 AND a IN ( SELECT b FROM non_part1);
a | b | c | e | f | ?column?
@@ -12023,23 +11962,16 @@ explain select * from part1, part2 where part1.b = part2.b limit 5;
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.13 rows=5 width=16)
-> Limit (cost=0.00..862.13 rows=2 width=16)
-> Hash Join (cost=0.00..862.13 rows=334 width=16)
- Hash Cond: (part1_1_prt_1.b = part2_1_prt_1.b)
- -> Append (cost=0.00..431.01 rows=334 width=8)
- Partition Selectors: $0
- -> Seq Scan on part1_1_prt_1 (cost=0.00..431.01 rows=334 width=8)
- -> Seq Scan on part1_1_prt_2 (cost=0.00..431.01 rows=334 width=8)
- -> Seq Scan on part1_1_prt_3 (cost=0.00..431.01 rows=334 width=8)
- -> Seq Scan on part1_1_prt_4 (cost=0.00..431.01 rows=334 width=8)
+ Hash Cond: (part1.b = part2.b)
+ -> Dynamic Seq Scan on part1 (cost=0.00..431.01 rows=334 width=8)
+ Number of partitions to scan: 4
-> Hash (cost=431.02..431.02 rows=100 width=8)
-> Partition Selector (selector id: $0) (cost=0.00..431.02 rows=100 width=8)
-> Broadcast Motion 3:3 (slice2; segments: 3) (cost=0.00..431.02 rows=100 width=8)
- -> Append (cost=0.00..431.00 rows=34 width=8)
- -> Seq Scan on part2_1_prt_1 (cost=0.00..431.00 rows=34 width=8)
- -> Seq Scan on part2_1_prt_2 (cost=0.00..431.00 rows=34 width=8)
- -> Seq Scan on part2_1_prt_3 (cost=0.00..431.00 rows=34 width=8)
- -> Seq Scan on part2_1_prt_4 (cost=0.00..431.00 rows=34 width=8)
+ -> Dynamic Seq Scan on part2 (cost=0.00..431.00 rows=34 width=8)
+ Number of partitions to scan: 4
Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+(13 rows)
-- test opfamily handling in ORCA
CREATE FUNCTION abseq(int, int) RETURNS BOOL AS
@@ -12366,20 +12298,14 @@ NOTICE: CREATE TABLE will create partition "lossycastrangepart_1_prt_3" for tab
NOTICE: CREATE TABLE will create partition "lossycastrangepart_1_prt_4" for table "lossycastrangepart"
insert into lossycastrangepart (values (5.1,5.1), (9.9,9.9), (10.1,10.1), (9.1,9.1), (10.9,10.9), (11.1,11.1), (21.0,21.0));
explain select * from lossycastrangepart where b::int = 10;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on lossycastrangepart_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 10)
- -> Seq Scan on lossycastrangepart_1_prt_2 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 10)
- -> Seq Scan on lossycastrangepart_1_prt_3 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 10)
- -> Seq Scan on lossycastrangepart_1_prt_4 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 10)
+ -> Dynamic Seq Scan on lossycastrangepart (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 4
+ Filter: (int4(b) = 10)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
select * from lossycastrangepart where b::int = 10;
a | b
@@ -12389,20 +12315,14 @@ select * from lossycastrangepart where b::int = 10;
(2 rows)
explain select * from lossycastrangepart where b::int = 11;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on lossycastrangepart_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 11)
- -> Seq Scan on lossycastrangepart_1_prt_2 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 11)
- -> Seq Scan on lossycastrangepart_1_prt_3 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 11)
- -> Seq Scan on lossycastrangepart_1_prt_4 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) = 11)
+ -> Dynamic Seq Scan on lossycastrangepart (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 4
+ Filter: (int4(b) = 11)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
select * from lossycastrangepart where b::int = 11;
a | b
@@ -12412,20 +12332,14 @@ select * from lossycastrangepart where b::int = 11;
(2 rows)
explain select * from lossycastrangepart where b::int < 10;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on lossycastrangepart_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 10)
- -> Seq Scan on lossycastrangepart_1_prt_2 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 10)
- -> Seq Scan on lossycastrangepart_1_prt_3 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 10)
- -> Seq Scan on lossycastrangepart_1_prt_4 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 10)
+ -> Dynamic Seq Scan on lossycastrangepart (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 4
+ Filter: (int4(b) < 10)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
select * from lossycastrangepart where b::int < 10;
a | b
@@ -12435,20 +12349,14 @@ select * from lossycastrangepart where b::int < 10;
(2 rows)
explain select * from lossycastrangepart where b::int < 11;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=16)
- -> Append (cost=0.00..431.00 rows=1 width=16)
- -> Seq Scan on lossycastrangepart_1_prt_1 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 11)
- -> Seq Scan on lossycastrangepart_1_prt_2 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 11)
- -> Seq Scan on lossycastrangepart_1_prt_3 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 11)
- -> Seq Scan on lossycastrangepart_1_prt_4 (cost=0.00..431.00 rows=1 width=16)
- Filter: (int4(b) < 11)
+ -> Dynamic Seq Scan on lossycastrangepart (cost=0.00..431.00 rows=1 width=16)
+ Number of partitions to scan: 4
+ Filter: (int4(b) < 11)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
select * from lossycastrangepart where b::int < 11;
a | b
@@ -12467,18 +12375,14 @@ NOTICE: CREATE TABLE will create partition "lossycastlistpart_1_prt_l2" for tab
NOTICE: CREATE TABLE will create partition "lossycastlistpart_1_prt_l3" for table "lossycastlistpart"
insert into lossycastlistpart (values (1.0,2.1), (1.0,1.3), (10.1,2.1), (9.1,2.7), (10.9,1.8), (11.1,2.8), (21.0,1.7));
explain select * from lossycastlistpart where b::int < 2;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on lossycastlistpart_1_prt_l2 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) < 2)
- -> Seq Scan on lossycastlistpart_1_prt_l1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) < 2)
- -> Seq Scan on lossycastlistpart_1_prt_l3 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) < 2)
+ -> Dynamic Seq Scan on lossycastlistpart (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 3
+ Filter: (int4(b) < 2)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
select * from lossycastlistpart where b::int < 2;
a | b
@@ -12487,18 +12391,14 @@ select * from lossycastlistpart where b::int < 2;
(1 row)
explain select * from lossycastlistpart where b::int = 2;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on lossycastlistpart_1_prt_l2 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) = 2)
- -> Seq Scan on lossycastlistpart_1_prt_l1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) = 2)
- -> Seq Scan on lossycastlistpart_1_prt_l3 (cost=0.00..431.00 rows=1 width=12)
- Filter: (int4(b) = 2)
+ -> Dynamic Seq Scan on lossycastlistpart (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 3
+ Filter: (int4(b) = 2)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
select * from lossycastlistpart where b::int = 2;
a | b
@@ -13454,19 +13354,21 @@ explain (costs off) select * from tpart_dim d join t_ao_btree f on d.a=f.a where
(8 rows)
explain (costs off) select * from tpart_dim d join tpart_ao_btree f on d.a=f.a where d.b=1;
- QUERY PLAN
-----------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Hash Join
- Hash Cond: (f.a = d.a)
- -> Append
- -> Seq Scan on tpart_ao_btree_1_prt_1 f_1
- -> Seq Scan on tpart_ao_btree_1_prt_2 f_2
- -> Hash
- -> Seq Scan on tpart_dim d
- Filter: (b = 1)
- Optimizer: Postgres query optimizer
-(10 rows)
+ -> Nested Loop
+ Join Filter: true
+ -> Seq Scan on tpart_dim
+ Filter: (b = 1)
+ -> Dynamic Bitmap Heap Scan on tpart_ao_btree
+ Number of partitions to scan: 2
+ Recheck Cond: (a = tpart_dim.a)
+ Filter: (a = tpart_dim.a)
+ -> Dynamic Bitmap Index Scan on tpart_ao_btree_ix
+ Index Cond: (a = tpart_dim.a)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(12 rows)
-- negative test, make sure we don't use a btree scan on an AO table
-- start_ignore
@@ -13508,12 +13410,12 @@ explain (costs off) select * from t_ao_btree where a = 3 and b = 3;
(4 rows)
explain (costs off) select * from tpart_ao_btree where a = 3 and b = 3;
- QUERY PLAN
-------------------------------------------------
+ QUERY PLAN
+------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on tpart_ao_btree_1_prt_1
- Filter: ((a = 3) AND (b = 3))
+ -> Dynamic Seq Scan on tpart_ao_btree
+ Number of partitions to scan: 1
+ Filter: ((a = 3) AND (b = 3))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -13599,35 +13501,26 @@ from asset_records left join coverage
and asset_records.active
where upper(coalesce(vendor, 'none')::text) <> 'some_vendor' and vendor_sla is not null
group by asset_records.uid, asset_records.hostname, asset_records.asset_type, asset_records.os, asset_records.create_ts;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result
-> Gather Motion 3:1 (slice1; segments: 3)
-> GroupAggregate
- Group Key: asset_records_1_prt_1.uid, asset_records_1_prt_1.hostname, asset_records_1_prt_1.asset_type, asset_records_1_prt_1.os, asset_records_1_prt_1.create_ts
+ Group Key: asset_records.uid, asset_records.hostname, asset_records.asset_type, asset_records.os, asset_records.create_ts
-> Sort
- Sort Key: asset_records_1_prt_1.uid, asset_records_1_prt_1.hostname, asset_records_1_prt_1.asset_type, asset_records_1_prt_1.os, asset_records_1_prt_1.create_ts
+ Sort Key: asset_records.uid, asset_records.hostname, asset_records.asset_type, asset_records.os, asset_records.create_ts
-> Hash Join
- Hash Cond: ((upper((asset_records_1_prt_1.hostname)::text) = upper((coverage.hostname)::text)) AND (asset_records_1_prt_1.create_ts = coverage.date))
- -> Append
- Partition Selectors: $0
- -> Seq Scan on asset_records_1_prt_1
- Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
- -> Seq Scan on asset_records_1_prt_2
- Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
- -> Seq Scan on asset_records_1_prt_3
- Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
- -> Seq Scan on asset_records_1_prt_4
- Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
- -> Seq Scan on asset_records_1_prt_5
- Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
+ Hash Cond: ((upper((asset_records.hostname)::text) = upper((coverage.hostname)::text)) AND (asset_records.create_ts = coverage.date))
+ -> Dynamic Seq Scan on asset_records
+ Number of partitions to scan: 5
+ Filter: ((upper((COALESCE(vendor, 'none'::character varying))::text) <> 'some_vendor'::text) AND (((asset_type)::text = 'xx'::text) OR ((asset_type)::text = 'yy'::text)) AND active)
-> Hash
-> Partition Selector (selector id: $0)
-> Broadcast Motion 3:3 (slice2; segments: 3)
-> Seq Scan on coverage
Filter: (NOT (vendor_sla IS NULL))
Optimizer: Pivotal Optimizer (GPORCA)
-(26 rows)
+(17 rows)
-- IndexApply-PartResolverExpand.mdp
-- from comment
@@ -13642,32 +13535,20 @@ default partition def);
create INDEX y_idx on y (j);
set optimizer_enable_indexjoin=on;
explain (costs off) select count(*) from x, y where (x.i > y.j AND x.j <= y.i);
- QUERY PLAN
--------------------------------------------------------------------------------------
- Finalize Aggregate
+ QUERY PLAN
+---------------------------------------------------------------
+ Aggregate
-> Gather Motion 3:1 (slice1; segments: 3)
- -> Partial Aggregate
- -> Nested Loop
- -> Broadcast Motion 3:3 (slice2; segments: 3)
- -> Seq Scan on x
- -> Append
- -> Index Scan using y_1_prt_p0_j_idx on y_1_prt_p0 y_1
- Index Cond: (j < x.i)
- Filter: (x.j <= i)
- -> Index Scan using y_1_prt_p1_j_idx on y_1_prt_p1 y_2
- Index Cond: (j < x.i)
- Filter: (x.j <= i)
- -> Index Scan using y_1_prt_p2_j_idx on y_1_prt_p2 y_3
- Index Cond: (j < x.i)
- Filter: (x.j <= i)
- -> Index Scan using y_1_prt_p3_j_idx on y_1_prt_p3 y_4
- Index Cond: (j < x.i)
- Filter: (x.j <= i)
- -> Index Scan using y_1_prt_def_j_idx on y_1_prt_def y_5
- Index Cond: (j < x.i)
- Filter: (x.j <= i)
- Optimizer: Postgres query optimizer
-(23 rows)
+ -> Nested Loop
+ Join Filter: true
+ -> Broadcast Motion 3:3 (slice2; segments: 3)
+ -> Seq Scan on x
+ -> Dynamic Index Scan on y_idx on y
+ Index Cond: (j < x.i)
+ Filter: ((j < x.i) AND (x.j <= i))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(11 rows)
reset optimizer_enable_indexjoin;
-- InferPredicatesBCC-vcpart-txt.mdp
@@ -13686,22 +13567,21 @@ CREATE TABLE infer_part_vc (id int, gender varchar(1))
insert into infer_part_vc select i, substring(i::varchar, 1, 1) from generate_series(1, 1000) i;
analyze infer_part_vc;
explain (costs off) select * from infer_part_vc inner join infer_txt on (infer_part_vc.gender = infer_txt.a) and infer_txt.a = 'M';
- QUERY PLAN
-----------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Hash Join
- Hash Cond: ((infer_part_vc_1_prt_boys.gender)::text = infer_txt.a)
- -> Append
- Partition Selectors: $0
- -> Seq Scan on infer_part_vc_1_prt_boys
- Filter: ((gender)::text = 'M'::text)
+ Hash Cond: ((infer_part_vc.gender)::text = infer_txt.a)
+ -> Dynamic Seq Scan on infer_part_vc
+ Number of partitions to scan: 1
+ Filter: ((gender)::text = 'M'::text)
-> Hash
-> Partition Selector (selector id: $0)
-> Broadcast Motion 3:3 (slice2; segments: 3)
-> Seq Scan on infer_txt
Filter: (a = 'M'::text)
Optimizer: Pivotal Optimizer (GPORCA)
-(13 rows)
+(12 rows)
-- NewBtreeIndexScanCost.mdp
-- from comment
@@ -13758,16 +13638,14 @@ PARTITION BY LIST (gender)
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );
explain (costs off) select * from pt where gender in ( 'F', 'FM');
- QUERY PLAN
------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on pt_1_prt_girls
- Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
- -> Seq Scan on pt_1_prt_other
- Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
+ -> Dynamic Seq Scan on pt
+ Number of partitions to scan: 2
+ Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
-- PartTbl-List-DPE-Varchar-Predicates.mdp
-- from comment
@@ -13777,30 +13655,24 @@ select * from pt where gender = 'F' union all
select * from pt where gender <= 'M' union all
select * from pt where gender in ('F', 'FM') union all
select * from pt where gender is null;
- QUERY PLAN
------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Append
- -> Append
- -> Seq Scan on pt_1_prt_girls
- Filter: ((gender)::text = 'F'::text)
- -> Append
- -> Seq Scan on pt_1_prt_girls pt_1_prt_girls_1
- Filter: ((gender)::text <= 'M'::text)
- -> Seq Scan on pt_1_prt_boys
- Filter: ((gender)::text <= 'M'::text)
- -> Seq Scan on pt_1_prt_other
- Filter: ((gender)::text <= 'M'::text)
- -> Append
- -> Seq Scan on pt_1_prt_girls pt_1_prt_girls_2
- Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
- -> Seq Scan on pt_1_prt_other pt_1_prt_other_1
- Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
- -> Append
- -> Seq Scan on pt_1_prt_girls pt_1_prt_girls_3
- Filter: (gender IS NULL)
+ -> Dynamic Seq Scan on pt
+ Number of partitions to scan: 1
+ Filter: ((gender)::text = 'F'::text)
+ -> Dynamic Seq Scan on pt pt_1
+ Number of partitions to scan: 3
+ Filter: ((gender)::text <= 'M'::text)
+ -> Dynamic Seq Scan on pt pt_2
+ Number of partitions to scan: 2
+ Filter: ((gender)::text = ANY ('{F,FM}'::text[]))
+ -> Dynamic Seq Scan on pt pt_3
+ Number of partitions to scan: 1
+ Filter: (gender IS NULL)
Optimizer: Pivotal Optimizer (GPORCA)
-(21 rows)
+(15 rows)
-- PartTbl-RangeJoinPred.mdp
-- from comment (query) and dxl (ddl)
@@ -13830,21 +13702,20 @@ where d.msisdn=f.subscriberaddress and
f.sessioncreationtimestamp >= d.start_dtm and
f.sessioncreationtimestamp <d.end_dtm and
(mkt_model like '%IPHONE%');
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Hash Join
- Hash Cond: ((dim_customer_device.msisdn)::text = (stg_xdr_crce_cdr_1_prt_1.subscriberaddress)::text)
- Join Filter: ((stg_xdr_crce_cdr_1_prt_1.sessioncreationtimestamp >= dim_customer_device.start_dtm) AND (stg_xdr_crce_cdr_1_prt_1.sessioncreationtimestamp < dim_customer_device.end_dtm))
+ Hash Cond: ((dim_customer_device.msisdn)::text = (stg_xdr_crce_cdr.subscriberaddress)::text)
+ Join Filter: ((stg_xdr_crce_cdr.sessioncreationtimestamp >= dim_customer_device.start_dtm) AND (stg_xdr_crce_cdr.sessioncreationtimestamp < dim_customer_device.end_dtm))
-> Seq Scan on dim_customer_device
Filter: ((mkt_model)::text ~~ '%IPHONE%'::text)
-> Hash
-> Broadcast Motion 3:3 (slice2; segments: 3)
- -> Append
- -> Seq Scan on stg_xdr_crce_cdr_1_prt_1
- -> Seq Scan on stg_xdr_crce_cdr_1_prt_2
+ -> Dynamic Seq Scan on stg_xdr_crce_cdr
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(12 rows)
+(11 rows)
-- PartTbl-Relabel-Equality.mdp
-- from dxl
@@ -13859,12 +13730,12 @@ explain (costs off)
select month_id, cust_group_acc, mobile_no
from ds_4
where month_id::text = 'Apr';
- QUERY PLAN
---------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on ds_4_1_prt_2
- Filter: ((month_id)::text = 'Apr'::text)
+ -> Dynamic Seq Scan on ds_4
+ Number of partitions to scan: 1
+ Filter: ((month_id)::text = 'Apr'::text)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -13876,16 +13747,14 @@ explain (costs off)
select month_id, cust_group_acc, mobile_no
from ds_4
where month_id::text >= 'Feb' and month_id::text < 'Mar';
- QUERY PLAN
-------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on ds_4_1_prt_2
- Filter: (((month_id)::text >= 'Feb'::text) AND ((month_id)::text < 'Mar'::text))
- -> Seq Scan on ds_4_1_prt_1
- Filter: (((month_id)::text >= 'Feb'::text) AND ((month_id)::text < 'Mar'::text))
+ -> Dynamic Seq Scan on ds_4
+ Number of partitions to scan: 2
+ Filter: (((month_id)::text >= 'Feb'::text) AND ((month_id)::text < 'Mar'::text))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
-- retail_28.mdp
-- from comment (query) and dxl (ddl)
@@ -13909,32 +13778,27 @@ GROUP BY to_char(order_datetime,'YYYY-Q')
ORDER BY to_char(order_datetime,'YYYY-Q')
, item_shipment_status_code
;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Merge Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Merge Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Sort
- Sort Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Sort Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Finalize GroupAggregate
- Group Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Group Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Sort
- Sort Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Sort Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Redistribute Motion 3:3 (slice2; segments: 3)
- Hash Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Hash Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Partial GroupAggregate
- Group Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code
+ Group Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code
-> Sort
- Sort Key: (to_char(order_lineitems_1_prt_4.order_datetime, 'YYYY-Q'::text)), order_lineitems_1_prt_4.item_shipment_status_code, order_lineitems_1_prt_4.order_id
- -> Result
- -> Append
- -> Seq Scan on order_lineitems_1_prt_4
- Filter: ((order_datetime >= 'Thu Apr 01 00:00:00 2010'::timestamp without time zone) AND (order_datetime <= '06-30-2010'::date))
- -> Seq Scan on order_lineitems_1_prt_5
- Filter: ((order_datetime >= 'Thu Apr 01 00:00:00 2010'::timestamp without time zone) AND (order_datetime <= '06-30-2010'::date))
- -> Seq Scan on order_lineitems_1_prt_6
- Filter: ((order_datetime >= 'Thu Apr 01 00:00:00 2010'::timestamp without time zone) AND (order_datetime <= '06-30-2010'::date))
+ Sort Key: (to_char(order_datetime, 'YYYY-Q'::text)), item_shipment_status_code, order_id
+ -> Dynamic Seq Scan on order_lineitems
+ Number of partitions to scan: 3
+ Filter: ((order_datetime >= 'Thu Apr 01 00:00:00 2010'::timestamp without time zone) AND (order_datetime <= '06-30-2010'::date))
Optimizer: Pivotal Optimizer (GPORCA)
-(23 rows)
+(18 rows)
-- test partioned table with no partitions
create table no_part (a int, b int) partition by list (a) distributed by (b);
diff --git a/src/test/regress/expected/inherit_optimizer.out b/src/test/regress/expected/inherit_optimizer.out
index 5f2d2acfd9..a226521214 100644
--- a/src/test/regress/expected/inherit_optimizer.out
+++ b/src/test/regress/expected/inherit_optimizer.out
@@ -1881,20 +1881,18 @@ explain (costs off) select * from list_parted;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on part_ab_cd
- -> Seq Scan on part_ef_gh
- -> Seq Scan on part_null_xy
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 3
Optimizer: Pivotal Optimizer (GPORCA)
-(6 rows)
+(4 rows)
explain (costs off) select * from list_parted where a is null;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on part_null_xy
- Filter: (a IS NULL)
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 1
+ Filter: (a IS NULL)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -1902,45 +1900,39 @@ explain (costs off) select * from list_parted where a is not null;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on part_ab_cd
- Filter: (NOT (a IS NULL))
- -> Seq Scan on part_ef_gh
- Filter: (NOT (a IS NULL))
- -> Seq Scan on part_null_xy
- Filter: (NOT (a IS NULL))
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 3
+ Filter: (NOT (a IS NULL))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from list_parted where a in ('ab', 'cd', 'ef');
QUERY PLAN
-----------------------------------------------------------------
+----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on part_ab_cd
- Filter: ((a)::text = ANY ('{ab,cd,ef}'::text[]))
- -> Seq Scan on part_ef_gh
- Filter: ((a)::text = ANY ('{ab,cd,ef}'::text[]))
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 2
+ Filter: ((a)::text = ANY ('{ab,cd,ef}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from list_parted where a = 'ab' or a in (null, 'cd');
- QUERY PLAN
----------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on part_ab_cd
- Filter: (((a)::text = 'ab'::text) OR ((a)::text = ANY ('{NULL,cd}'::text[])))
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 1
+ Filter: (((a)::text = 'ab'::text) OR ((a)::text = ANY ('{NULL,cd}'::text[])))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from list_parted where a = 'ab';
QUERY PLAN
-------------------------------------------------
+------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on part_ab_cd
- Filter: ((a)::text = 'ab'::text)
+ -> Dynamic Seq Scan on list_parted
+ Number of partitions to scan: 1
+ Filter: ((a)::text = 'ab'::text)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -2205,13 +2197,13 @@ create index parted_minmax1i on parted_minmax1 (a, b);
insert into parted_minmax values (1,'12345');
explain (costs off) select min(a), max(a) from parted_minmax where b = '12345';
QUERY PLAN
----------------------------------------------------------------
+---------------------------------------------------------
Finalize Aggregate
-> Gather Motion 3:1 (slice1; segments: 3)
-> Partial Aggregate
- -> Append
- -> Seq Scan on parted_minmax1
- Filter: ((b)::text = '12345'::text)
+ -> Dynamic Seq Scan on parted_minmax
+ Number of partitions to scan: 1
+ Filter: ((b)::text = '12345'::text)
Optimizer: Pivotal Optimizer (GPORCA)
(7 rows)
@@ -2346,16 +2338,15 @@ create index on mclparted (a);
-- Ensure an Append is used for a list partition with an order by.
explain (costs off) select * from mclparted order by a;
QUERY PLAN
-------------------------------------------
+------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Merge Key: mclparted1.a
+ Merge Key: a
-> Sort
- Sort Key: mclparted1.a
- -> Append
- -> Seq Scan on mclparted1
- -> Seq Scan on mclparted2
+ Sort Key: a
+ -> Dynamic Seq Scan on mclparted
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(8 rows)
+(7 rows)
-- Ensure a MergeAppend is used when a partition exists with interleaved
-- datums in the partition bound.
@@ -2363,18 +2354,15 @@ create table mclparted3_5 partition of mclparted for values in(3,5);
create table mclparted4 partition of mclparted for values in(4);
explain (costs off) select * from mclparted order by a;
QUERY PLAN
---------------------------------------------
+------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Merge Key: mclparted1.a
+ Merge Key: a
-> Sort
- Sort Key: mclparted1.a
- -> Append
- -> Seq Scan on mclparted1
- -> Seq Scan on mclparted2
- -> Seq Scan on mclparted3_5
- -> Seq Scan on mclparted4
+ Sort Key: a
+ -> Dynamic Seq Scan on mclparted
+ Number of partitions to scan: 4
Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+(7 rows)
drop table mclparted;
-- Ensure subplans which don't have a path with the correct pathkeys get
@@ -2430,16 +2418,15 @@ create table bool_lp_false partition of bool_lp for values in(false);
create index on bool_lp (b);
explain (costs off) select * from bool_lp order by b;
QUERY PLAN
----------------------------------------------
+------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Merge Key: bool_lp_false.b
+ Merge Key: b
-> Sort
- Sort Key: bool_lp_false.b
- -> Append
- -> Seq Scan on bool_lp_false
- -> Seq Scan on bool_lp_true
+ Sort Key: b
+ -> Dynamic Seq Scan on bool_lp
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(8 rows)
+(7 rows)
drop table bool_lp;
-- Ensure const bool quals can be properly detected as redundant
diff --git a/src/test/regress/expected/join_gp_optimizer.out b/src/test/regress/expected/join_gp_optimizer.out
index 5ff64d0cb6..05d192e628 100644
--- a/src/test/regress/expected/join_gp_optimizer.out
+++ b/src/test/regress/expected/join_gp_optimizer.out
@@ -1115,26 +1115,21 @@ explain select * from (t_joinsize_1 join t_joinsize_2 on t_joinsize_1.c2 = t_joi
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Hash Join (cost=0.00..1300.54 rows=99503 width=20)
- Hash Cond: (t_joinsize_2.c2 = t_joinsize_1_1_prt_2.c2)
+ Hash Cond: (t_joinsize_2.c2 = t_joinsize_1.c2)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.04 rows=1000 width=8)
-> Seq Scan on t_joinsize_2 (cost=0.00..431.01 rows=334 width=8)
-> Hash (cost=862.13..862.13 rows=598 width=12)
-> Gather Motion 3:1 (slice2; segments: 3) (cost=0.00..862.13 rows=598 width=12)
-> Hash Join (cost=0.00..862.10 rows=200 width=12)
- Hash Cond: (t_joinsize_1_1_prt_2.c1 = t_joinsize_3.c)
- -> Append (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_2 (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_3 (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_4 (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_5 (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_6 (cost=0.00..431.01 rows=400 width=8)
- -> Seq Scan on t_joinsize_1_1_prt_extra (cost=0.00..431.01 rows=400 width=8)
+ Hash Cond: (t_joinsize_1.c1 = t_joinsize_3.c)
+ -> Dynamic Seq Scan on t_joinsize_1 (cost=0.00..431.01 rows=400 width=8)
+ Number of partitions to scan: 6
-> Hash (cost=431.00..431.00 rows=34 width=4)
-> Redistribute Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=34 width=4)
Hash Key: t_joinsize_3.c
-> Seq Scan on t_joinsize_3 (cost=0.00..431.00 rows=34 width=4)
Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+(15 rows)
drop table t_joinsize_1;
drop table t_joinsize_2;
diff --git a/src/test/regress/expected/orca_static_pruning_optimizer.out b/src/test/regress/expected/orca_static_pruning_optimizer.out
index b80154e425..a51ea2bac2 100644
--- a/src/test/regress/expected/orca_static_pruning_optimizer.out
+++ b/src/test/regress/expected/orca_static_pruning_optimizer.out
@@ -16,14 +16,14 @@ $query$ AS qry \gset
SET optimizer_trace_fallback TO on;
EXPLAIN (COSTS OFF, VERBOSE)
:qry ;
- QUERY PLAN
--------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Output: rp2.a, rp2.b, rp2.c
- -> Append
- -> Seq Scan on orca_static_pruning.rp2
- Output: rp2.a, rp2.b, rp2.c
- Filter: (rp2.b > 4200)
+ Output: a, b, c
+ -> Dynamic Seq Scan on orca_static_pruning.rp
+ Output: a, b, c
+ Number of partitions to scan: 1
+ Filter: (rp.b > 4200)
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
(8 rows)
@@ -41,14 +41,14 @@ WHERE b = 4201
$query$ AS qry \gset
EXPLAIN (COSTS OFF, VERBOSE)
:qry ;
- QUERY PLAN
--------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Output: rp2.a, rp2.b, rp2.c
- -> Append
- -> Seq Scan on orca_static_pruning.rp2
- Output: rp2.a, rp2.b, rp2.c
- Filter: (rp2.b = 4201)
+ Output: a, b, c
+ -> Dynamic Seq Scan on orca_static_pruning.rp
+ Output: a, b, c
+ Number of partitions to scan: 1
+ Filter: (rp.b = 4201)
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
(8 rows)
@@ -66,14 +66,14 @@ WHERE b IN (4201, 4200)
$query$ AS qry \gset
EXPLAIN (COSTS OFF, VERBOSE)
:qry ;
- QUERY PLAN
-----------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Output: rp2.a, rp2.b, rp2.c
- -> Append
- -> Seq Scan on orca_static_pruning.rp2
- Output: rp2.a, rp2.b, rp2.c
- Filter: (rp2.b = ANY ('{4201,4200}'::integer[]))
+ Output: a, b, c
+ -> Dynamic Seq Scan on orca_static_pruning.rp
+ Output: a, b, c
+ Number of partitions to scan: 1
+ Filter: (rp.b = ANY ('{4201,4200}'::integer[]))
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
(8 rows)
@@ -101,14 +101,14 @@ WHERE b > 42
$query$ AS qry \gset
EXPLAIN (COSTS OFF, VERBOSE)
:qry ;
- QUERY PLAN
--------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Output: lp2.a, lp2.b
- -> Append
- -> Seq Scan on orca_static_pruning.lp2
- Output: lp2.a, lp2.b
- Filter: (lp2.b > 42)
+ Output: a, b
+ -> Dynamic Seq Scan on orca_static_pruning.lp
+ Output: a, b
+ Number of partitions to scan: 1
+ Filter: (lp.b > 42)
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
(8 rows)
@@ -125,14 +125,14 @@ WHERE b = 42
$query$ AS qry \gset
EXPLAIN (COSTS OFF, VERBOSE)
:qry ;
- QUERY PLAN
--------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- Output: lp2.a, lp2.b
- -> Append
- -> Seq Scan on orca_static_pruning.lp2
- Output: lp2.a, lp2.b
- Filter: (lp2.b = 42)
+ Output: a, b
+ -> Dynamic Seq Scan on orca_static_pruning.lp
+ Output: a, b
+ Number of partitions to scan: 1
+ Filter: (lp.b = 42)
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
(8 rows)
@@ -194,25 +194,26 @@ CREATE INDEX rp_bitmap_idx ON rp_multi_inds USING bitmap(b);
SET optimizer_enable_dynamictablescan TO off;
SET optimizer_trace_fallback TO on;
EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM rp_multi_inds WHERE b = 11 AND (c = 11 OR c = 4201);
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
Output: a, b, c
- -> Append
- -> Bitmap Heap Scan on orca_static_pruning.rp_multi_inds_part2
- Output: a, b, c
- Recheck Cond: (((rp_multi_inds_part2.c = 11) OR (rp_multi_inds_part2.c = 4201)) AND (rp_multi_inds_part2.b = 11))
- -> BitmapAnd
- -> BitmapOr
- -> Bitmap Index Scan on rp_multi_inds_part2_c_idx
- Index Cond: (rp_multi_inds_part2.c = 11)
- -> Bitmap Index Scan on rp_multi_inds_part2_c_idx
- Index Cond: (rp_multi_inds_part2.c = 4201)
- -> Bitmap Index Scan on rp_multi_inds_part2_b_idx
- Index Cond: (rp_multi_inds_part2.b = 11)
+ -> Dynamic Bitmap Heap Scan on orca_static_pruning.rp_multi_inds
+ Output: a, b, c
+ Number of partitions to scan: 1
+ Recheck Cond: (((rp_multi_inds.c = 11) OR (rp_multi_inds.c = 4201)) AND (rp_multi_inds.b = 11))
+ Filter: (((rp_multi_inds.c = 11) OR (rp_multi_inds.c = 4201)) AND (rp_multi_inds.b = 11))
+ -> BitmapAnd
+ -> BitmapOr
+ -> Dynamic Bitmap Index Scan on rp_btree_idx
+ Index Cond: (rp_multi_inds.c = 11)
+ -> Dynamic Bitmap Index Scan on rp_btree_idx
+ Index Cond: (rp_multi_inds.c = 4201)
+ -> Dynamic Bitmap Index Scan on rp_bitmap_idx
+ Index Cond: (rp_multi_inds.b = 11)
Optimizer: Pivotal Optimizer (GPORCA)
- Settings: optimizer=on
-(16 rows)
+ Settings: optimizer=on, optimizer_enable_dynamictablescan=off
+(17 rows)
SELECT * FROM rp_multi_inds WHERE b = 11 AND (c = 11 OR c = 4201);
a | b | c
@@ -246,16 +247,16 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM foo JOIN bar on foo.a = bar.a AND foo
Output: foo.a, foo.b, bar.a
-> Nested Loop
Output: foo.a, foo.b, bar.a
- Join Filter: (foo.a = bar.a)
+ Join Filter: true
-> Seq Scan on orca_static_pruning.bar
Output: bar.a
- -> Materialize
+ -> Dynamic Index Scan on foo_idx on orca_static_pruning.foo
Output: foo.a, foo.b
- -> Seq Scan on orca_static_pruning.foo_part2 foo
- Output: foo.a, foo.b
- Filter: (foo.b = 11)
- Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on'
- Optimizer: Postgres query optimizer
+ Index Cond: (foo.a = bar.a)
+ Filter: ((foo.a = bar.a) AND (foo.b = 11))
+ Number of partitions to scan: 1
+ Optimizer: Pivotal Optimizer (GPORCA)
+ Settings: enable_hashjoin=off, enable_mergejoin=off, enable_nestloop=on, optimizer=on
(14 rows)
SELECT * FROM foo JOIN bar on foo.a = bar.a AND foo.b = 11;
@@ -291,19 +292,15 @@ EXPLAIN (COSTS OFF, VERBOSE) INSERT INTO rp_insert VALUES (1, 1), (3, 3);
INSERT INTO rp_insert VALUES (1, 1), (3, 3);
EXPLAIN (COSTS OFF, VERBOSE) INSERT INTO rp_insert SELECT * FROM rp_insert;
- QUERY PLAN
---------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------
Insert on orca_static_pruning.rp_insert
- -> Result
- Output: rp_insert_part_1.a, rp_insert_part_1.b
- -> Append
- -> Seq Scan on orca_static_pruning.rp_insert_part_1
- Output: rp_insert_part_1.a, rp_insert_part_1.b
- -> Seq Scan on orca_static_pruning.rp_insert_part_2
- Output: rp_insert_part_2.a, rp_insert_part_2.b
+ -> Dynamic Seq Scan on orca_static_pruning.rp_insert rp_insert_1
+ Output: rp_insert_1.a, rp_insert_1.b
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
Settings: optimizer=on
-(10 rows)
+(6 rows)
INSERT INTO rp_insert SELECT * FROM rp_insert;
SELECT * FROM rp_insert;
diff --git a/src/test/regress/expected/partition_optimizer.out b/src/test/regress/expected/partition_optimizer.out
index 3905ac4a06..805ea62439 100755
--- a/src/test/regress/expected/partition_optimizer.out
+++ b/src/test/regress/expected/partition_optimizer.out
@@ -4806,30 +4806,20 @@ analyze bar;
set optimizer_segments = 3;
set optimizer_nestloop_factor = 1.0;
explain select foo_p.b, foo_p.t from foo_p left outer join bar on foo_p.a = bar.k where foo_p.t is not null and foo_p.a = (array[1])[1];
- QUERY PLAN
---------------------------------------------------------------------------------------------
- Hash Right Join (cost=0.00..863.18 rows=2485 width=30)
- Hash Cond: (bar.k = foo_p_1_prt_2.a)
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
+ Hash Right Join (cost=0.00..863.15 rows=2237 width=30)
+ Hash Cond: (bar.k = foo_p.a)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.48 rows=2237 width=4)
-> Seq Scan on bar (cost=0.00..431.45 rows=746 width=4)
Filter: (k = 1)
- -> Hash (cost=431.04..431.04 rows=2 width=34)
- -> Gather Motion 3:1 (slice2; segments: 3) (cost=0.00..431.04 rows=2 width=34)
- -> Append (cost=0.00..431.04 rows=1 width=34)
- -> Seq Scan on foo_p_1_prt_2 (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
- -> Seq Scan on foo_p_1_prt_3 (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
- -> Seq Scan on foo_p_1_prt_4 (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
- -> Seq Scan on foo_p_1_prt_5 (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
- -> Seq Scan on foo_p_1_prt_6 (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
- -> Seq Scan on foo_p_1_prt_other (cost=0.00..431.04 rows=1 width=34)
- Filter: ((NOT (t IS NULL)) AND (a = 1))
+ -> Hash (cost=431.04..431.04 rows=1 width=34)
+ -> Gather Motion 3:1 (slice2; segments: 3) (cost=0.00..431.04 rows=1 width=34)
+ -> Dynamic Seq Scan on foo_p (cost=0.00..431.04 rows=1 width=34)
+ Number of partitions to scan: 6
+ Filter: ((NOT (t IS NULL)) AND (a = 1))
Optimizer: Pivotal Optimizer (GPORCA)
-(21 rows)
+(11 rows)
reset optimizer_segments;
drop table if exists foo_p;
diff --git a/src/test/regress/expected/partition_prune_optimizer.out b/src/test/regress/expected/partition_prune_optimizer.out
index adbb0462f6..fc684dda33 100644
--- a/src/test/regress/expected/partition_prune_optimizer.out
+++ b/src/test/regress/expected/partition_prune_optimizer.out
@@ -37,49 +37,38 @@ explain (costs off) select * from lp;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_ad
- -> Seq Scan on lp_bc
- -> Seq Scan on lp_ef
- -> Seq Scan on lp_g
- -> Seq Scan on lp_null
- -> Seq Scan on lp_default
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 6
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(4 rows)
explain (costs off) select * from lp where a > 'a' and a < 'd';
QUERY PLAN
------------------------------------------------------------------
+-----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_bc
- Filter: ((a > 'a'::bpchar) AND (a < 'd'::bpchar))
- -> Seq Scan on lp_default
- Filter: ((a > 'a'::bpchar) AND (a < 'd'::bpchar))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 2
+ Filter: ((a > 'a'::bpchar) AND (a < 'd'::bpchar))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from lp where a > 'a' and a <= 'd';
QUERY PLAN
-------------------------------------------------------------------
+------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_ad
- Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar))
- -> Seq Scan on lp_bc
- Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar))
- -> Seq Scan on lp_default
- Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 3
+ Filter: ((a > 'a'::bpchar) AND (a <= 'd'::bpchar))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from lp where a = 'a';
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on lp_ad
- Filter: (a = 'a'::bpchar)
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 1
+ Filter: (a = 'a'::bpchar)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -87,9 +76,9 @@ explain (costs off) select * from lp where 'a' = a; /* commuted */
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on lp_ad
- Filter: (a = 'a'::bpchar)
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 1
+ Filter: (a = 'a'::bpchar)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -97,101 +86,71 @@ explain (costs off) select * from lp where a is not null;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_ad
- Filter: (NOT (a IS NULL))
- -> Seq Scan on lp_bc
- Filter: (NOT (a IS NULL))
- -> Seq Scan on lp_ef
- Filter: (NOT (a IS NULL))
- -> Seq Scan on lp_g
- Filter: (NOT (a IS NULL))
- -> Seq Scan on lp_default
- Filter: (NOT (a IS NULL))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 5
+ Filter: (NOT (a IS NULL))
Optimizer: Pivotal Optimizer (GPORCA)
-(13 rows)
+(5 rows)
explain (costs off) select * from lp where a is null;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on lp_null
- Filter: (a IS NULL)
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 1
+ Filter: (a IS NULL)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from lp where a = 'a' or a = 'c';
QUERY PLAN
------------------------------------------------------
+----------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on lp_ad
- Filter: ((a = 'a'::bpchar) OR (a = 'c'::bpchar))
- -> Seq Scan on lp_bc
- Filter: ((a = 'a'::bpchar) OR (a = 'c'::bpchar))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 2
+ Filter: ((a = 'a'::bpchar) OR (a = 'c'::bpchar))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from lp where a is not null and (a = 'a' or a = 'c');
QUERY PLAN
-----------------------------------------------------------------------------------------
+----------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on lp_ad
- Filter: ((NOT (a IS NULL)) AND ((a = 'a'::bpchar) OR (a = 'c'::bpchar)))
- -> Seq Scan on lp_bc
- Filter: ((NOT (a IS NULL)) AND ((a = 'a'::bpchar) OR (a = 'c'::bpchar)))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 2
+ Filter: ((NOT (a IS NULL)) AND ((a = 'a'::bpchar) OR (a = 'c'::bpchar)))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from lp where a <> 'g';
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_ad
- Filter: (a <> 'g'::bpchar)
- -> Seq Scan on lp_bc
- Filter: (a <> 'g'::bpchar)
- -> Seq Scan on lp_ef
- Filter: (a <> 'g'::bpchar)
- -> Seq Scan on lp_default
- Filter: (a <> 'g'::bpchar)
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 4
+ Filter: (a <> 'g'::bpchar)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
explain (costs off) select * from lp where a <> 'a' and a <> 'd';
QUERY PLAN
--------------------------------------------------------------------
+-------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_bc
- Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar))
- -> Seq Scan on lp_ef
- Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar))
- -> Seq Scan on lp_g
- Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar))
- -> Seq Scan on lp_default
- Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 4
+ Filter: ((a <> 'a'::bpchar) AND (a <> 'd'::bpchar))
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
explain (costs off) select * from lp where a not in ('a', 'd');
QUERY PLAN
-------------------------------------------------------
+------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_bc
- Filter: (a <> ALL ('{a,d}'::bpchar[]))
- -> Seq Scan on lp_ef
- Filter: (a <> ALL ('{a,d}'::bpchar[]))
- -> Seq Scan on lp_g
- Filter: (a <> ALL ('{a,d}'::bpchar[]))
- -> Seq Scan on lp_default
- Filter: (a <> ALL ('{a,d}'::bpchar[]))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 4
+ Filter: (a <> ALL ('{a,d}'::bpchar[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(5 rows)
-- collation matches the partitioning collation, pruning works
create table coll_pruning (a text collate "C") partition by list (a);
@@ -1218,113 +1177,83 @@ create table boolpart_t partition of boolpart for values in ('true');
create table boolpart_f partition of boolpart for values in ('false');
explain (costs off) select * from boolpart where a in (true, false);
QUERY PLAN
-------------------------------------------------------
+------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: (a = ANY ('{t,f}'::boolean[]))
- -> Seq Scan on boolpart_t
- Filter: (a = ANY ('{t,f}'::boolean[]))
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 2
+ Filter: (a = ANY ('{t,f}'::boolean[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from boolpart where a = false;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: (NOT a)
- -> Seq Scan on boolpart_t
- Filter: (NOT a)
- -> Seq Scan on boolpart_default
- Filter: (NOT a)
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: (NOT a)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where not a = false;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: a
- -> Seq Scan on boolpart_t
- Filter: a
- -> Seq Scan on boolpart_default
- Filter: a
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: a
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where a is true or a is not true;
QUERY PLAN
---------------------------------------------------------
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: ((a IS TRUE) OR (a IS NOT TRUE))
- -> Seq Scan on boolpart_t
- Filter: ((a IS TRUE) OR (a IS NOT TRUE))
- -> Seq Scan on boolpart_default
- Filter: ((a IS TRUE) OR (a IS NOT TRUE))
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: ((a IS TRUE) OR (a IS NOT TRUE))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where a is not true;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: (a IS NOT TRUE)
- -> Seq Scan on boolpart_t
- Filter: (a IS NOT TRUE)
- -> Seq Scan on boolpart_default
- Filter: (a IS NOT TRUE)
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: (a IS NOT TRUE)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where a is not true and a is not false;
QUERY PLAN
---------------------------------------------------------------
+--------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE))
- -> Seq Scan on boolpart_t
- Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE))
- -> Seq Scan on boolpart_default
- Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE))
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where a is unknown;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: (a IS UNKNOWN)
- -> Seq Scan on boolpart_t
- Filter: (a IS UNKNOWN)
- -> Seq Scan on boolpart_default
- Filter: (a IS UNKNOWN)
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: (a IS UNKNOWN)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from boolpart where a is not unknown;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on boolpart_f
- Filter: (a IS NOT UNKNOWN)
- -> Seq Scan on boolpart_t
- Filter: (a IS NOT UNKNOWN)
- -> Seq Scan on boolpart_default
- Filter: (a IS NOT UNKNOWN)
+ -> Dynamic Seq Scan on boolpart
+ Number of partitions to scan: 3
+ Filter: (a IS NOT UNKNOWN)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
create table boolrangep (a bool, b bool, c int) partition by range (a,b,c);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Cloudberry Database data distribution key for this table.
@@ -1354,69 +1283,53 @@ create table coercepart_bc partition of coercepart for values in ('bc');
create table coercepart_cd partition of coercepart for values in ('cd');
explain (costs off) select * from coercepart where a in ('ab', to_char(125, '999'));
QUERY PLAN
------------------------------------------------------------------
+-----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ANY ('{ab," 125"}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 1
+ Filter: ((a)::text = ANY ('{ab," 125"}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from coercepart where a ~ any ('{ab}');
QUERY PLAN
-----------------------------------------------------------
+----------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text ~ ANY ('{ab}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text ~ ANY ('{ab}'::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text ~ ANY ('{ab}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text ~ ANY ('{ab}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from coercepart where a !~ all ('{ab}');
QUERY PLAN
------------------------------------------------------------
+-----------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text !~ ALL ('{ab}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text !~ ALL ('{ab}'::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text !~ ALL ('{ab}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text !~ ALL ('{ab}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from coercepart where a ~ any ('{ab,bc}');
QUERY PLAN
--------------------------------------------------------------
+-------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text ~ ANY ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text ~ ANY ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text ~ ANY ('{ab,bc}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text ~ ANY ('{ab,bc}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from coercepart where a !~ all ('{ab,bc}');
QUERY PLAN
---------------------------------------------------------------
+--------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text !~ ALL ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text !~ ALL ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text !~ ALL ('{ab,bc}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text !~ ALL ('{ab,bc}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from coercepart where a = any ('{ab,bc}');
QUERY PLAN
@@ -1657,48 +1570,32 @@ explain (costs off) select * from rp where a <> 1;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on rp0
- Filter: (a <> 1)
- -> Seq Scan on rp1
- Filter: (a <> 1)
- -> Seq Scan on rp2
- Filter: (a <> 1)
+ -> Dynamic Seq Scan on rp
+ Number of partitions to scan: 3
+ Filter: (a <> 1)
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from rp where a <> 1 and a <> 2;
QUERY PLAN
------------------------------------------------
+------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on rp0
- Filter: ((a <> 1) AND (a <> 2))
- -> Seq Scan on rp1
- Filter: ((a <> 1) AND (a <> 2))
- -> Seq Scan on rp2
- Filter: ((a <> 1) AND (a <> 2))
+ -> Dynamic Seq Scan on rp
+ Number of partitions to scan: 3
+ Filter: ((a <> 1) AND (a <> 2))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
-- null partition should be eliminated due to strict <> clause.
explain (costs off) select * from lp where a <> 'a';
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_ad
- Filter: (a <> 'a'::bpchar)
- -> Seq Scan on lp_bc
- Filter: (a <> 'a'::bpchar)
- -> Seq Scan on lp_ef
- Filter: (a <> 'a'::bpchar)
- -> Seq Scan on lp_g
- Filter: (a <> 'a'::bpchar)
- -> Seq Scan on lp_default
- Filter: (a <> 'a'::bpchar)
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 5
+ Filter: (a <> 'a'::bpchar)
Optimizer: Pivotal Optimizer (GPORCA)
-(13 rows)
+(5 rows)
-- ensure we detect contradictions in clauses; a can't be NULL and NOT NULL.
explain (costs off) select * from lp where a <> 'a' and a is null;
@@ -1711,21 +1608,13 @@ explain (costs off) select * from lp where a <> 'a' and a is null;
explain (costs off) select * from lp where (a <> 'a' and a <> 'd') or a is null;
QUERY PLAN
-------------------------------------------------------------------------------------
+------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on lp_bc
- Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
- -> Seq Scan on lp_ef
- Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
- -> Seq Scan on lp_g
- Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
- -> Seq Scan on lp_null
- Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
- -> Seq Scan on lp_default
- Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
+ -> Dynamic Seq Scan on lp
+ Number of partitions to scan: 5
+ Filter: (((a <> 'a'::bpchar) AND (a <> 'd'::bpchar)) OR (a IS NULL))
Optimizer: Pivotal Optimizer (GPORCA)
-(13 rows)
+(5 rows)
-- check that it also works for a partitioned table that's not root,
-- which in this case are partitions of rlp that are themselves
@@ -1795,15 +1684,13 @@ create table like_op_noprune1 partition of like_op_noprune for values in ('ABC')
create table like_op_noprune2 partition of like_op_noprune for values in ('BCD');
explain (costs off) select * from like_op_noprune where a like '%BC';
QUERY PLAN
-------------------------------------------
+-------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on like_op_noprune1
- Filter: (a ~~ '%BC'::text)
- -> Seq Scan on like_op_noprune2
- Filter: (a ~~ '%BC'::text)
+ -> Dynamic Seq Scan on like_op_noprune
+ Number of partitions to scan: 2
+ Filter: (a ~~ '%BC'::text)
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
--
-- tests wherein clause value requires a cross-type comparison function
@@ -1835,11 +1722,11 @@ create table rparted_by_int2_maxvalue partition of rparted_by_int2 for values fr
-- all partitions but rparted_by_int2_maxvalue pruned
explain (costs off) select * from rparted_by_int2 where a > 100000000000000;
QUERY PLAN
--------------------------------------------------------
+-------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on rparted_by_int2_maxvalue
- Filter: (a > '100000000000000'::bigint)
+ -> Dynamic Seq Scan on rparted_by_int2
+ Number of partitions to scan: 1
+ Filter: (a > '100000000000000'::bigint)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -2247,48 +2134,36 @@ explain (analyze, costs off, summary off, timing off) select * from list_part wh
QUERY PLAN
------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1) (actual rows=1 loops=1)
- -> Append (actual rows=1 loops=1)
- -> Seq Scan on list_part1 (actual rows=1 loops=1)
- Filter: (a = 1)
+ -> Dynamic Seq Scan on list_part (actual rows=1 loops=1)
+ Number of partitions to scan: 1
+ Filter: (a = 1)
+ Partitions scanned: 1 .
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(6 rows)
-- Ensure pruning does not take place when the function has a Var parameter
explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(a);
- QUERY PLAN
-------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=4 loops=1)
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on list_part1 (actual rows=1 loops=1)
- Filter: (a = list_part_fn(a))
- -> Seq Scan on list_part2 (actual rows=1 loops=1)
- Filter: (a = list_part_fn(a))
- -> Seq Scan on list_part3 (actual rows=1 loops=1)
- Filter: (a = list_part_fn(a))
- -> Seq Scan on list_part4 (actual rows=1 loops=1)
- Filter: (a = list_part_fn(a))
+ -> Dynamic Seq Scan on list_part (actual rows=3 loops=1)
+ Number of partitions to scan: 4
+ Filter: (a = list_part_fn(a))
+ Partitions scanned: Avg 4.0 x 3 workers. Max 4 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(6 rows)
-- Ensure pruning does not take place when the expression contains a Var.
explain (analyze, costs off, summary off, timing off) select * from list_part where a = list_part_fn(1) + a;
- QUERY PLAN
-------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on list_part1 (actual rows=0 loops=1)
- Filter: (a = (1 + a))
- -> Seq Scan on list_part2 (actual rows=0 loops=1)
- Filter: (a = (1 + a))
- Rows Removed by Filter: 1
- -> Seq Scan on list_part3 (actual rows=0 loops=1)
- Filter: (a = (1 + a))
- Rows Removed by Filter: 1
- -> Seq Scan on list_part4 (actual rows=0 loops=1)
- Filter: (a = (1 + a))
- Rows Removed by Filter: 1
+ -> Dynamic Seq Scan on list_part (never executed)
+ Number of partitions to scan: 4
+ Filter: (a = (1 + a))
+ Partitions scanned: Avg 4.0 x 3 workers. Max 4 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(6 rows)
rollback;
drop table list_part;
@@ -2957,44 +2832,36 @@ set enable_mergejoin = off;
set enable_seqscan=off;
explain (analyze, costs off, summary off, timing off)
select * from tbl1 join tprt on tbl1.col1 > tprt.col1;
- QUERY PLAN
----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=6 loops=1)
-> Nested Loop (actual rows=4 loops=1)
- Join Filter: (tbl1.col1 > tprt_1.col1)
+ Join Filter: (tbl1.col1 > tprt.col1)
Rows Removed by Join Filter: 3
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=7 loops=1)
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
-> Seq Scan on tbl1 (actual rows=1 loops=8)
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(10 rows)
explain (analyze, costs off, summary off, timing off)
select * from tbl1 join tprt on tbl1.col1 = tprt.col1;
- QUERY PLAN
---------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
-> Hash Join (actual rows=1 loops=1)
- Hash Cond: (tbl1.col1 = tprt_1.col1)
+ Hash Cond: (tbl1.col1 = tprt.col1)
Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 3 of 524288 buckets.
-> Seq Scan on tbl1 (actual rows=1 loops=1)
-> Hash (actual rows=3 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+(10 rows)
select tbl1.col1, tprt.col1 from tbl1
inner join tprt on tbl1.col1 > tprt.col1
@@ -3022,44 +2889,36 @@ order by tbl1.col1, tprt.col1;
insert into tbl1 values (1001), (1010), (1011);
explain (analyze, costs off, summary off, timing off)
select * from tbl1 inner join tprt on tbl1.col1 > tprt.col1;
- QUERY PLAN
----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=23 loops=1)
-> Nested Loop (actual rows=15 loops=1)
- Join Filter: (tbl1.col1 > tprt_1.col1)
+ Join Filter: (tbl1.col1 > tprt.col1)
Rows Removed by Join Filter: 6
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=7 loops=1)
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
-> Seq Scan on tbl1 (actual rows=3 loops=8)
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(10 rows)
explain (analyze, costs off, summary off, timing off)
select * from tbl1 inner join tprt on tbl1.col1 = tprt.col1;
- QUERY PLAN
---------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Hash Join (actual rows=2 loops=1)
- Hash Cond: (tbl1.col1 = tprt_1.col1)
+ Hash Cond: (tbl1.col1 = tprt.col1)
Extra Text: (seg2) Hash chain length 1.0 avg, 1 max, using 3 of 524288 buckets.
-> Seq Scan on tbl1 (actual rows=3 loops=1)
-> Hash (actual rows=3 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+(10 rows)
select tbl1.col1, tprt.col1 from tbl1
inner join tprt on tbl1.col1 > tprt.col1
@@ -3106,23 +2965,19 @@ delete from tbl1;
insert into tbl1 values (4400);
explain (analyze, costs off, summary off, timing off)
select * from tbl1 join tprt on tbl1.col1 < tprt.col1;
- QUERY PLAN
----------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=1 loops=1)
-> Nested Loop (actual rows=1 loops=1)
- Join Filter: (tbl1.col1 < tprt_1.col1)
+ Join Filter: (tbl1.col1 < tprt.col1)
Rows Removed by Join Filter: 6
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=7 loops=1)
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
-> Seq Scan on tbl1 (actual rows=1 loops=8)
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(10 rows)
select tbl1.col1, tprt.col1 from tbl1
inner join tprt on tbl1.col1 < tprt.col1
@@ -3138,23 +2993,19 @@ delete from tbl1;
insert into tbl1 values (10000);
explain (analyze, costs off, summary off, timing off)
select * from tbl1 join tprt on tbl1.col1 = tprt.col1;
- QUERY PLAN
---------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Hash Join (actual rows=0 loops=1)
- Hash Cond: (tbl1.col1 = tprt_1.col1)
+ -> Hash Join (never executed)
+ Hash Cond: (tbl1.col1 = tprt.col1)
-> Seq Scan on tbl1 (actual rows=1 loops=1)
-> Hash (actual rows=3 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
- -> Append (actual rows=3 loops=1)
- -> Seq Scan on tprt_1 (actual rows=1 loops=1)
- -> Seq Scan on tprt_2 (actual rows=2 loops=1)
- -> Seq Scan on tprt_3 (actual rows=1 loops=1)
- -> Seq Scan on tprt_4 (actual rows=0 loops=1)
- -> Seq Scan on tprt_5 (actual rows=0 loops=1)
- -> Seq Scan on tprt_6 (actual rows=1 loops=1)
+ -> Dynamic Seq Scan on tprt (actual rows=3 loops=1)
+ Number of partitions to scan: 6
+ Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(10 rows)
select tbl1.col1, tprt.col1 from tbl1
inner join tprt on tbl1.col1 = tprt.col1
@@ -3295,28 +3146,28 @@ create table stable_qual_pruning3 partition of stable_qual_pruning
-- comparison against a stable value requires run-time pruning
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning where a < localtimestamp;
- QUERY PLAN
---------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning1 (actual rows=0 loops=1)
- Filter: (a < 'Sun Oct 13 19:26:30.492983 2024'::timestamp without time zone)
- -> Seq Scan on stable_qual_pruning2 (actual rows=0 loops=1)
- Filter: (a < 'Sun Oct 13 19:26:30.492983 2024'::timestamp without time zone)
+ -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ Number of partitions to scan: 2
+ Filter: (a < 'Thu May 19 15:14:26.02528 2022'::timestamp without time zone)
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(6 rows)
-- timestamp < timestamptz comparison is only stable, not immutable
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning where a < '2000-02-01'::timestamptz;
- QUERY PLAN
---------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning1 (actual rows=0 loops=1)
- Filter: (a < 'Tue Feb 01 00:00:00 2000 PST'::timestamp with time zone)
+ -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ Number of partitions to scan: 1
+ Filter: (a < 'Tue Feb 01 00:00:00 2000 PST'::timestamp with time zone)
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(6 rows)
-- check ScalarArrayOp cases
explain (analyze, costs off, summary off, timing off)
@@ -3332,26 +3183,28 @@ select * from stable_qual_pruning
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
where a = any(array['2000-02-01', '2010-01-01']::timestamp[]);
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning2 (actual rows=0 loops=1)
- Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Fri Jan 01 00:00:00 2010"}'::timestamp without time zone[]))
+ -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ Number of partitions to scan: 1
+ Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Fri Jan 01 00:00:00 2010"}'::timestamp without time zone[]))
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(6 rows)
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
where a = any(array['2000-02-01', localtimestamp]::timestamp[]);
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning2 (actual rows=0 loops=1)
- Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Sun Oct 13 19:26:30.555441 2024"}'::timestamp without time zone[]))
+ -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ Number of partitions to scan: 1
+ Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Thu May 19 15:14:26.037645 2022"}'::timestamp without time zone[]))
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(6 rows)
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
@@ -3366,14 +3219,15 @@ select * from stable_qual_pruning
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
where a = any(array['2000-02-01', '2010-01-01']::timestamptz[]);
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning2 (actual rows=0 loops=1)
- Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000 PST","Fri Jan 01 00:00:00 2010 PST"}'::timestamp with time zone[]))
+ -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ Number of partitions to scan: 1
+ Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000 PST","Fri Jan 01 00:00:00 2010 PST"}'::timestamp with time zone[]))
+ Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(6 rows)
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
@@ -3614,27 +3468,27 @@ explain (analyze, verbose, costs off, summary off, timing off) execute mt_q2 (35
deallocate mt_q2;
-- ensure initplan params properly prune partitions
explain (analyze, costs off, summary off, timing off) select * from ma_test where a >= (select min(b) from ma_test_p2) order by b;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=20 loops=1)
- Merge Key: ma_test_p1.b
+ Merge Key: ma_test.b
-> Sort (actual rows=8 loops=1)
- Sort Key: ma_test_p1.b
- Sort Method: quicksort Memory: 75kB
+ Sort Key: ma_test.b
+ Sort Method: quicksort Memory: ###kB
+ Executor Memory: ###kB Segments: ### Max: ###kB (segment ###)
-> Nested Loop (actual rows=8 loops=1)
- Join Filter: (ma_test_p1.a >= (min(ma_test_p2_1.b)))
+ Join Filter: (ma_test.a >= (min(ma_test_p2.b)))
Rows Removed by Join Filter: 3
-> Broadcast Motion 1:3 (slice2) (actual rows=1 loops=1)
-> Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice3; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
- -> Seq Scan on ma_test_p2 ma_test_p2_1 (actual rows=5 loops=1)
- -> Append (actual rows=6 loops=2)
- -> Seq Scan on ma_test_p1 (actual rows=3 loops=2)
- -> Seq Scan on ma_test_p2 (actual rows=5 loops=1)
- -> Seq Scan on ma_test_p3 (actual rows=4 loops=1)
+ -> Seq Scan on ma_test_p2 (actual rows=5 loops=1)
+ -> Dynamic Seq Scan on ma_test (actual rows=6 loops=2)
+ Number of partitions to scan: 3
+ Partitions scanned: Avg 2.0 x 3 workers of 2 scans. Max 2 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+(17 rows)
reset enable_seqscan;
reset enable_sort;
@@ -3650,11 +3504,11 @@ create table pp_arrpart1 partition of pp_arrpart for values in ('{1}');
create table pp_arrpart2 partition of pp_arrpart for values in ('{2, 3}', '{4, 5}');
explain (costs off) select * from pp_arrpart where a = '{1}';
QUERY PLAN
-----------------------------------------------
+------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_arrpart1
- Filter: (a = '{1}'::integer[])
+ -> Dynamic Seq Scan on pp_arrpart
+ Number of partitions to scan: 1
+ Filter: (a = '{1}'::integer[])
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3667,16 +3521,14 @@ explain (costs off) select * from pp_arrpart where a = '{1, 2}';
(3 rows)
explain (costs off) select * from pp_arrpart where a in ('{4, 5}', '{1}');
- QUERY PLAN
-----------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on pp_arrpart1
- Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[]))
- -> Seq Scan on pp_arrpart2
- Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[]))
+ -> Dynamic Seq Scan on pp_arrpart
+ Number of partitions to scan: 2
+ Filter: ((a = '{4,5}'::integer[]) OR (a = '{1}'::integer[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) update pp_arrpart set a = a where a = '{1}';
QUERY PLAN
@@ -3749,12 +3601,12 @@ create table pp_enumpart (a pp_colors) partition by list (a);
create table pp_enumpart_green partition of pp_enumpart for values in ('green');
create table pp_enumpart_blue partition of pp_enumpart for values in ('blue');
explain (costs off) select * from pp_enumpart where a = 'blue';
- QUERY PLAN
------------------------------------------------
+ QUERY PLAN
+------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_enumpart_blue
- Filter: (a = 'blue'::pp_colors)
+ -> Dynamic Seq Scan on pp_enumpart
+ Number of partitions to scan: 1
+ Filter: (a = 'blue'::pp_colors)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3774,12 +3626,12 @@ create table pp_recpart (a pp_rectype) partition by list (a);
create table pp_recpart_11 partition of pp_recpart for values in ('(1,1)');
create table pp_recpart_23 partition of pp_recpart for values in ('(2,3)');
explain (costs off) select * from pp_recpart where a = '(1,1)'::pp_rectype;
- QUERY PLAN
--------------------------------------------------
- Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_recpart_11
- Filter: (a = '(1,1)'::pp_rectype)
+ QUERY PLAN
+-------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3)
+ -> Dynamic Seq Scan on pp_recpart
+ Number of partitions to scan: 1
+ Filter: (a = '(1,1)'::pp_rectype)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3798,12 +3650,12 @@ create table pp_intrangepart (a int4range) partition by list (a);
create table pp_intrangepart12 partition of pp_intrangepart for values in ('[1,2]');
create table pp_intrangepart2inf partition of pp_intrangepart for values in ('[2,)');
explain (costs off) select * from pp_intrangepart where a = '[1,2]'::int4range;
- QUERY PLAN
-------------------------------------------------
+ QUERY PLAN
+-------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_intrangepart12
- Filter: (a = '[1,3)'::int4range)
+ -> Dynamic Seq Scan on pp_intrangepart
+ Number of partitions to scan: 1
+ Filter: (a = '[1,3)'::int4range)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3826,9 +3678,9 @@ explain (costs off) select * from pp_lp where a = 1;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_lp1
- Filter: (a = 1)
+ -> Dynamic Seq Scan on pp_lp
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3858,9 +3710,9 @@ explain (costs off) select * from pp_lp where a = 1;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_lp1
- Filter: (a = 1)
+ -> Dynamic Seq Scan on pp_lp
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -3897,9 +3749,9 @@ explain (costs off) select * from pp_lp where a = 1;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_lp1
- Filter: (a = 1)
+ -> Dynamic Seq Scan on pp_lp
+ Number of partitions to scan: 1
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -4010,19 +3862,18 @@ explain (costs off) select * from pp_temp_parent where true;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on pp_temp_part_1
- -> Seq Scan on pp_temp_part_def
+ -> Dynamic Seq Scan on pp_temp_parent
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(4 rows)
explain (costs off) select * from pp_temp_parent where a = 2;
QUERY PLAN
------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
- -> Append
- -> Seq Scan on pp_temp_part_def
- Filter: (a = 2)
+ -> Dynamic Seq Scan on pp_temp_parent
+ Number of partitions to scan: 1
+ Filter: (a = 2)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
diff --git a/src/test/regress/expected/partition_pruning_optimizer.out b/src/test/regress/expected/partition_pruning_optimizer.out
index 1b0d332016..f414e70e6c 100644
--- a/src/test/regress/expected/partition_pruning_optimizer.out
+++ b/src/test/regress/expected/partition_pruning_optimizer.out
@@ -110,24 +110,24 @@ $$ language plpgsql stable;
PREPARE prep_prune AS select * from pt_lt_tab WHERE col2 = stabletestfunc();
-- The plan should only scan one partition, where col2 = 10.
EXPLAIN EXECUTE prep_prune;
- QUERY PLAN
-------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '10'::numeric)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '10'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
-- Also test that Params are const-evaluated.
PREPARE prep_prune_param AS select * from pt_lt_tab WHERE col2 = $1;
EXPLAIN EXECUTE prep_prune_param(10);
- QUERY PLAN
-------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '10'::numeric)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '10'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -144,27 +144,19 @@ SELECT * FROM pt_lt_tab WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=4 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=4 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=4 width=12)
+ Index Cond: (col1 < 10)
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -172,26 +164,18 @@ SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
(0 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=1 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col1 > 50)
+ Number of partitions to scan: 5
Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+(9 rows)
SELECT * FROM pt_lt_tab WHERE col1 = 25 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -200,26 +184,18 @@ SELECT * FROM pt_lt_tab WHERE col1 = 25 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 = 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
- Limit (cost=0.00..6.00 rows=2 width=12)
- -> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..6.00 rows=2 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
+ Limit (cost=0.00..6.00 rows=1 width=12)
+ -> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..6.00 rows=1 width=12)
+ Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 = 25)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 = 25)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 = 25)
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 = 25)
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 = 25)
- Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col1 = 25)
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(9 rows)
SELECT * FROM pt_lt_tab WHERE col1 <> 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -232,27 +208,19 @@ SELECT * FROM pt_lt_tab WHERE col1 <> 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 <> 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
- Limit (cost=50000000016.61..50000000016.72 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=50000000016.61..50000000016.72 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Limit (cost=50000000016.61..50000000016.62 rows=2 width=12)
- -> Sort (cost=50000000016.60..50000000016.71 rows=15 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=10000000000.00..50000000015.85 rows=15 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col1 <> 10)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col1 <> 10)
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col1 <> 10)
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col1 <> 10)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col1 <> 10)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=17 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=17 width=12)
+ Number of partitions to scan: 5
+ Filter: (col1 <> 10)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col1 > 10 AND col1 < 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -265,27 +233,19 @@ SELECT * FROM pt_lt_tab WHERE col1 > 10 AND col1 < 50 ORDER BY col2,col3 LIMIT 5
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 > 10 AND col1 < 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=12)
-> Sort (cost=0.00..6.01 rows=13 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=13 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=13 width=12)
- Index Cond: ((col1 > 10) AND (col1 < 50))
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=13 width=12)
- Index Cond: ((col1 > 10) AND (col1 < 50))
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=13 width=12)
- Index Cond: ((col1 > 10) AND (col1 < 50))
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=13 width=12)
- Index Cond: ((col1 > 10) AND (col1 < 50))
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=13 width=12)
- Index Cond: ((col1 > 10) AND (col1 < 50))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=13 width=12)
+ Index Cond: ((col1 > 10) AND (col1 < 50))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col1 > 10 OR col1 = 25 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -298,27 +258,19 @@ SELECT * FROM pt_lt_tab WHERE col1 > 10 OR col1 = 25 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 > 10 OR col1 = 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.00 rows=2 width=12)
-> Sort (cost=0.00..431.00 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=14 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col1 > 10) OR (col1 = 25))
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col1 > 10) OR (col1 = 25))
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col1 > 10) OR (col1 = 25))
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col1 > 10) OR (col1 = 25))
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col1 > 10) OR (col1 = 25))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=14 width=12)
+ Number of partitions to scan: 5
+ Filter: ((col1 > 10) OR (col1 = 25))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col1 between 10 AND 25 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -331,27 +283,19 @@ SELECT * FROM pt_lt_tab WHERE col1 between 10 AND 25 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 between 10 AND 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=6 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=6 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=6 width=12)
- Index Cond: ((col1 >= 10) AND (col1 <= 25))
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=6 width=12)
- Index Cond: ((col1 >= 10) AND (col1 <= 25))
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=6 width=12)
- Index Cond: ((col1 >= 10) AND (col1 <= 25))
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=6 width=12)
- Index Cond: ((col1 >= 10) AND (col1 <= 25))
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=6 width=12)
- Index Cond: ((col1 >= 10) AND (col1 <= 25))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=6 width=12)
+ Index Cond: ((col1 >= 10) AND (col1 <= 25))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
-- @description B-tree single index key = partitioning key
@@ -367,17 +311,17 @@ SELECT * FROM pt_lt_tab WHERE col2 < 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 < 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=4 width=12)
Sort Key: col2, col3
- -> Append (cost=0.00..6.00 rows=4 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col2_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col2 < '10'::numeric)
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=4 width=12)
+ Index Cond: (col2 < '10'::numeric)
+ Number of partitions to scan: 1
Optimizer: Pivotal Optimizer (GPORCA)
(10 rows)
@@ -405,16 +349,16 @@ SELECT * FROM pt_lt_tab WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=2 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=2 width=12)
Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
Sort Key: col2, col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part3_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col2 = '25'::numeric)
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col2 = '25'::numeric)
+ Number of partitions to scan: 1
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -429,27 +373,19 @@ SELECT * FROM pt_lt_tab WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
- Limit (cost=50000000016.61..50000000016.72 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=50000000016.61..50000000016.72 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Limit (cost=50000000016.61..50000000016.62 rows=2 width=12)
- -> Sort (cost=50000000016.60..50000000016.71 rows=15 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=10000000000.00..50000000015.85 rows=15 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=16 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=16 width=12)
+ Number of partitions to scan: 5
+ Filter: (col2 <> '10'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col2 < 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -462,25 +398,19 @@ SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col2 < 50 ORDER BY col2,col3 LIMIT 5
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col2 < 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=12)
- -> Sort (cost=0.00..6.01 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
- -> Append (cost=0.00..6.00 rows=14 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part2_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col2 < '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part3_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col2 < '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part4_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col2 < '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part5_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col2 < '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(16 rows)
+ -> Sort (cost=0.00..6.01 rows=12 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=13 width=12)
+ Index Cond: ((col2 > '10'::numeric) AND (col2 < '50'::numeric))
+ Number of partitions to scan: 4
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 10 OR col2 = 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -493,25 +423,19 @@ SELECT * FROM pt_lt_tab WHERE col2 > 10 OR col2 = 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 10 OR col2 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.00 rows=2 width=12)
- -> Sort (cost=0.00..431.00 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
- -> Append (cost=0.00..431.00 rows=14 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > '10'::numeric) OR (col2 = '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > '10'::numeric) OR (col2 = '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > '10'::numeric) OR (col2 = '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > '10'::numeric) OR (col2 = '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(16 rows)
+ -> Sort (cost=0.00..431.00 rows=13 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=13 width=12)
+ Number of partitions to scan: 4
+ Filter: ((col2 > '10'::numeric) OR (col2 = '50'::numeric))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -524,27 +448,19 @@ SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=12)
- -> Sort (cost=0.00..6.01 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=14 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col2_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part2_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part3_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part4_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part5_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ -> Sort (cost=0.00..6.01 rows=13 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=14 width=12)
+ Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
-- @description multiple column b-tree index
@@ -560,27 +476,19 @@ SELECT * FROM pt_lt_tab WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=4 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=4 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_col2_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=4 width=12)
+ Index Cond: (col1 < 10)
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -588,26 +496,18 @@ SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
(0 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=1 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_col2_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col1 > 50)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col1 > 50)
+ Number of partitions to scan: 5
Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+(9 rows)
SELECT * FROM pt_lt_tab WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -616,16 +516,16 @@ SELECT * FROM pt_lt_tab WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=2 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=2 width=12)
Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
Sort Key: col2, col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col2 = '25'::numeric)
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col2 = '25'::numeric)
+ Number of partitions to scan: 1
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -640,27 +540,19 @@ SELECT * FROM pt_lt_tab WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
- Limit (cost=50000000016.61..50000000016.72 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=50000000016.61..50000000016.72 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Limit (cost=50000000016.61..50000000016.62 rows=2 width=12)
- -> Sort (cost=50000000016.60..50000000016.71 rows=15 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=10000000000.00..50000000015.85 rows=15 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=16 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=16 width=12)
+ Number of partitions to scan: 5
+ Filter: (col2 <> '10'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -668,24 +560,18 @@ SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMIT 5
(0 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=1 width=12)
-> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..6.00 rows=1 width=12)
- Merge Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
+ Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
- Sort Key: pt_lt_tab_1_prt_part2.col2, pt_lt_tab_1_prt_part2.col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col1 = 10) AND (col2 > '10'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col1 = 10) AND (col2 > '10'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col1 = 10) AND (col2 > '10'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col1 = 10) AND (col2 > '10'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: ((col1 = 10) AND (col2 > '10'::numeric))
+ Number of partitions to scan: 4
+ Optimizer: Pivotal Optimizer (GPORCA)
+(9 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -698,27 +584,19 @@ SELECT * FROM pt_lt_tab WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LIMIT
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
-> Sort (cost=0.00..431.01 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=14 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=14 width=12)
+ Number of partitions to scan: 5
+ Filter: ((col2 > 10.00) OR (col1 = 50))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -731,27 +609,19 @@ SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=12)
- -> Sort (cost=0.00..6.01 rows=14 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.01 rows=14 width=12)
- -> Index Scan using pt_lt_tab_1_prt_part1_col1_col2_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part2_col1_col2_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part3_col1_col2_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part4_col1_col2_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_1_prt_part5_col1_col2_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ -> Sort (cost=0.00..6.01 rows=13 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.01 rows=14 width=12)
+ Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
-- @description multi-column unique constraint (= b-tree index). Essentially the
@@ -769,29 +639,19 @@ SELECT * FROM pt_lt_tab_df WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 < 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=4 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=4 width=12)
- -> Index Scan using pt_lt_tab_df_1_prt_part1_col2_col1_key on pt_lt_tab_df_1_prt_part1 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_df_1_prt_part2_col2_col1_key on pt_lt_tab_df_1_prt_part2 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_df_1_prt_part3_col2_col1_key on pt_lt_tab_df_1_prt_part3 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_df_1_prt_part4_col2_col1_key on pt_lt_tab_df_1_prt_part4 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_df_1_prt_part5_col2_col1_key on pt_lt_tab_df_1_prt_part5 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- -> Index Scan using pt_lt_tab_df_1_prt_def_col2_col1_key on pt_lt_tab_df_1_prt_def (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 < 10)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on col2_col1_unique on pt_lt_tab_df (cost=0.00..6.00 rows=4 width=12)
+ Index Cond: (col1 < 10)
+ Number of partitions to scan: 6
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -804,29 +664,19 @@ SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.00 rows=2 width=12)
-> Sort (cost=0.00..6.00 rows=4 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=4 width=12)
- -> Index Scan using pt_lt_tab_df_1_prt_part1_col2_col1_key on pt_lt_tab_df_1_prt_part1 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_df_1_prt_part2_col2_col1_key on pt_lt_tab_df_1_prt_part2 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_df_1_prt_part3_col2_col1_key on pt_lt_tab_df_1_prt_part3 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_df_1_prt_part4_col2_col1_key on pt_lt_tab_df_1_prt_part4 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_df_1_prt_part5_col2_col1_key on pt_lt_tab_df_1_prt_part5 (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- -> Index Scan using pt_lt_tab_df_1_prt_def_col2_col1_key on pt_lt_tab_df_1_prt_def (cost=0.00..6.00 rows=4 width=12)
- Index Cond: (col1 > 50)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on col2_col1_unique on pt_lt_tab_df (cost=0.00..6.00 rows=4 width=12)
+ Index Cond: (col1 > 50)
+ Number of partitions to scan: 6
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -835,16 +685,16 @@ SELECT * FROM pt_lt_tab_df WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 = 25 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=2 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=2 width=12)
Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
Sort Key: col2, col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_df_1_prt_part3_col2_col1_key on pt_lt_tab_df_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (col2 = '25'::numeric)
+ -> Dynamic Index Scan on col2_col1_unique on pt_lt_tab_df (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (col2 = '25'::numeric)
+ Number of partitions to scan: 1
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -859,29 +709,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
- Limit (cost=60000000019.97..60000000020.08 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=60000000019.97..60000000020.08 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Limit (cost=60000000019.97..60000000019.98 rows=2 width=12)
- -> Sort (cost=60000000019.95..60000000020.09 rows=19 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=10000000000.00..60000000019.06 rows=19 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=10000000000.00..10000000003.16 rows=4 width=12)
- Filter: (col2 <> '10'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=20 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=20 width=12)
+ Number of partitions to scan: 6
+ Filter: (col2 <> '10'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -889,26 +729,18 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMI
(0 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 10 AND col1 = 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.00 rows=1 width=12)
-> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..6.00 rows=1 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
+ Merge Key: col2, col3
-> Sort (cost=0.00..6.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using pt_lt_tab_df_1_prt_part2_col2_col1_key on pt_lt_tab_df_1_prt_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
- -> Index Scan using pt_lt_tab_df_1_prt_part3_col2_col1_key on pt_lt_tab_df_1_prt_part3 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
- -> Index Scan using pt_lt_tab_df_1_prt_part4_col2_col1_key on pt_lt_tab_df_1_prt_part4 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
- -> Index Scan using pt_lt_tab_df_1_prt_part5_col2_col1_key on pt_lt_tab_df_1_prt_part5 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
- -> Index Scan using pt_lt_tab_df_1_prt_def_col2_col1_key on pt_lt_tab_df_1_prt_def (cost=0.00..6.00 rows=1 width=12)
- Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
- Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on col2_col1_unique on pt_lt_tab_df (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: ((col2 > '10'::numeric) AND (col1 = 10))
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(9 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -921,29 +753,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LI
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 10.00 OR col1 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=18 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=18 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=18 width=12)
- Filter: ((col2 > 10.00) OR (col1 = 50))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Sort (cost=0.00..431.01 rows=17 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=17 width=12)
+ Number of partitions to scan: 6
+ Filter: ((col2 > 10.00) OR (col1 = 50))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -956,29 +778,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 between 10 AND 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=12)
-> Sort (cost=0.00..6.01 rows=14 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..6.01 rows=14 width=12)
- -> Index Scan using pt_lt_tab_df_1_prt_part1_col2_col1_key on pt_lt_tab_df_1_prt_part1 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_df_1_prt_part2_col2_col1_key on pt_lt_tab_df_1_prt_part2 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_df_1_prt_part3_col2_col1_key on pt_lt_tab_df_1_prt_part3 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_df_1_prt_part4_col2_col1_key on pt_lt_tab_df_1_prt_part4 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_df_1_prt_part5_col2_col1_key on pt_lt_tab_df_1_prt_part5 (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- -> Index Scan using pt_lt_tab_df_1_prt_def_col2_col1_key on pt_lt_tab_df_1_prt_def (cost=0.00..6.01 rows=14 width=12)
- Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on col2_col1_unique on pt_lt_tab_df (cost=0.00..6.01 rows=14 width=12)
+ Index Cond: ((col2 >= '10'::numeric) AND (col2 <= '50'::numeric))
+ Number of partitions to scan: 6
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
ALTER TABLE pt_lt_tab_df DROP CONSTRAINT col2_col1_unique;
-- @description Heterogeneous index, index on partition key, b-tree index on all partitions
@@ -998,27 +810,19 @@ SELECT * FROM pt_lt_tab WHERE col2 between 1 AND 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 between 1 AND 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=17 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=17 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=17 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=17 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=17 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=17 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=17 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ -> Sort (cost=0.00..431.01 rows=16 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=16 width=12)
+ Number of partitions to scan: 5
+ Filter: ((col2 >= '1'::numeric) AND (col2 <= '50'::numeric))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 5 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1031,27 +835,19 @@ SELECT * FROM pt_lt_tab WHERE col2 > 5 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 5 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=16 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=16 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '5'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '5'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '5'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '5'::numeric)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '5'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.00 rows=2 width=12)
+ -> Sort (cost=0.00..431.00 rows=14 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=14 width=12)
+ Number of partitions to scan: 5
+ Filter: (col2 > '5'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 = 5 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1060,16 +856,16 @@ SELECT * FROM pt_lt_tab WHERE col2 = 5 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 = 5 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-------------------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=2 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '5'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '5'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -1096,29 +892,19 @@ SELECT * FROM pt_lt_tab_df WHERE col1 between 1 AND 100 ORDER BY col1 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 between 1 AND 100 ORDER BY col1 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col1
+ Merge Key: col1
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=21 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col1
- -> Append (cost=0.00..431.00 rows=21 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col1 >= 1) AND (col1 <= 100))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Sort (cost=0.00..431.01 rows=20 width=12)
+ Sort Key: col1
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=20 width=12)
+ Number of partitions to scan: 6
+ Filter: ((col1 >= 1) AND (col1 <= 100))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col1 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1131,29 +917,19 @@ SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col1 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 > 50 ORDER BY col1 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col1
+ Merge Key: col1
-> Limit (cost=0.00..431.00 rows=2 width=12)
-> Sort (cost=0.00..431.00 rows=4 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col1
- -> Append (cost=0.00..431.00 rows=4 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=4 width=12)
- Filter: (col1 > 50)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ Sort Key: col1
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=4 width=12)
+ Number of partitions to scan: 6
+ Filter: (col1 > 50)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col1 < 50 ORDER BY col1 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1166,29 +942,19 @@ SELECT * FROM pt_lt_tab_df WHERE col1 < 50 ORDER BY col1 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 < 50 ORDER BY col1 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col1
+ Merge Key: col1
-> Limit (cost=0.00..431.01 rows=2 width=12)
-> Sort (cost=0.00..431.01 rows=17 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col1
- -> Append (cost=0.00..431.00 rows=17 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=17 width=12)
- Filter: (col1 < 50)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ Sort Key: col1
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=17 width=12)
+ Number of partitions to scan: 6
+ Filter: (col1 < 50)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
DROP INDEX idx2;
@@ -1214,29 +980,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 between 1 AND 100 ORDER BY col2,col3 LIMIT
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 between 1 AND 100 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=21 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=21 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Sort (cost=0.00..431.01 rows=20 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=20 width=12)
+ Number of partitions to scan: 6
+ Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 > 50 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1249,17 +1005,17 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 50 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
Merge Key: pt_lt_tab_df_1_prt_def.col2, pt_lt_tab_df_1_prt_def.col3
-> Limit (cost=0.00..431.00 rows=2 width=12)
-> Sort (cost=0.00..431.00 rows=4 width=12)
- Sort Key: pt_lt_tab_df_1_prt_def.col2, pt_lt_tab_df_1_prt_def.col3
- -> Append (cost=0.00..431.00 rows=4 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=4 width=12)
- Filter: (col2 > '50'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=4 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 > '50'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(10 rows)
@@ -1270,18 +1026,18 @@ SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------------------
- Limit (cost=0.00..431.00 rows=1 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.00 rows=2 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
+ Merge Key: col2, col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '50'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '50'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+(9 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1294,29 +1050,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 <> 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
- Limit (cost=60000000019.97..60000000020.08 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=60000000019.97..60000000020.08 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Limit (cost=60000000019.97..60000000019.98 rows=2 width=12)
- -> Sort (cost=60000000019.95..60000000020.09 rows=19 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=10000000000.00..60000000019.06 rows=19 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=10000000000.00..10000000003.12 rows=3 width=12)
- Filter: (col2 <> '10'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=10000000000.00..10000000003.16 rows=4 width=12)
- Filter: (col2 <> '10'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=20 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=20 width=12)
+ Number of partitions to scan: 6
+ Filter: (col2 <> '10'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 between 1 AND 100 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1329,29 +1075,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 between 1 AND 100 ORDER BY col2,col3 LIMIT
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 between 1 AND 100 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=21 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=21 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=21 width=12)
- Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Sort (cost=0.00..431.01 rows=20 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=20 width=12)
+ Number of partitions to scan: 6
+ Filter: ((col2 >= '1'::numeric) AND (col2 <= '100'::numeric))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col2 < 50 AND col1 > 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1364,29 +1100,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 < 50 AND col1 > 10 ORDER BY col2,col3 LIMI
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 < 50 AND col1 > 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=14 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=14 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=14 width=12)
- Filter: ((col2 < '50'::numeric) AND (col1 > 10))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Sort (cost=0.00..431.01 rows=17 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=17 width=12)
+ Number of partitions to scan: 6
+ Filter: ((col2 < '50'::numeric) AND (col1 > 10))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
DROP INDEX idx2;
@@ -1411,17 +1137,17 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 51 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 51 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=12)
Merge Key: pt_lt_tab_df_1_prt_def.col2, pt_lt_tab_df_1_prt_def.col3
-> Limit (cost=0.00..431.00 rows=2 width=12)
-> Sort (cost=0.00..431.00 rows=4 width=12)
- Sort Key: pt_lt_tab_df_1_prt_def.col2, pt_lt_tab_df_1_prt_def.col3
- -> Append (cost=0.00..431.00 rows=4 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=4 width=12)
- Filter: (col2 > '51'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=4 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 > '51'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(10 rows)
@@ -1432,16 +1158,16 @@ SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
- Limit (cost=0.00..431.00 rows=1 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.00 rows=2 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
+ Merge Key: col2, col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '50'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '50'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -1477,16 +1203,16 @@ SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 = 50 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
- Limit (cost=0.00..431.00 rows=1 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.00 rows=2 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
+ Merge Key: col2, col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part5.col2, pt_lt_tab_df_1_prt_part5.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '50'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '50'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -1501,27 +1227,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 10 AND col1 between 1 AND 100 ORDER BY c
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 10 AND col1 between 1 AND 100 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
Limit (cost=0.00..431.01 rows=5 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..431.01 rows=2 width=12)
- -> Sort (cost=0.00..431.01 rows=16 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
- -> Append (cost=0.00..431.00 rows=16 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=16 width=12)
- Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=16 width=12)
- Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=16 width=12)
- Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=16 width=12)
- Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=16 width=12)
- Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ -> Sort (cost=0.00..431.01 rows=17 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=17 width=12)
+ Number of partitions to scan: 5
+ Filter: ((col2 > '10'::numeric) AND (col1 >= 1) AND (col1 <= 100))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab_df WHERE col1 = 10 ORDER BY col2,col3 LIMIT 5;
col1 | col2 | col3 | col4
@@ -1530,28 +1248,18 @@ SELECT * FROM pt_lt_tab_df WHERE col1 = 10 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col1 = 10 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
- Limit (cost=0.00..431.00 rows=1 width=12)
- -> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.00 rows=2 width=12)
+ -> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=2 width=12)
+ Merge Key: col2, col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part1.col2, pt_lt_tab_df_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part1 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=1 width=12)
- Filter: (col1 = 10)
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 6
+ Filter: (col1 = 10)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(9 rows)
DROP INDEX idx1;
DROP INDEX idx2;
@@ -1570,16 +1278,16 @@ SELECT * FROM pt_lt_tab_df WHERE col2 = 35 ORDER BY col2,col3 LIMIT 5;
(1 row)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 = 35 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=2 width=12)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=2 width=12)
Merge Key: pt_lt_tab_df_1_prt_part4.col2, pt_lt_tab_df_1_prt_part4.col3
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part4.col2, pt_lt_tab_df_1_prt_part4.col3
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=0.00..431.00 rows=1 width=12)
- Filter: (col2 = '35'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 1
+ Filter: (col2 = '35'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(9 rows)
@@ -1601,27 +1309,19 @@ SELECT * FROM pt_lt_tab_df WHERE col2 > 15 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab_df WHERE col2 > 15 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
- Limit (cost=30000000725.04..30000000725.16 rows=5 width=12)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=30000000725.04..30000000725.16 rows=5 width=12)
- Merge Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
- -> Limit (cost=30000000725.04..30000000725.06 rows=2 width=12)
- -> Sort (cost=30000000725.03..30000000725.15 rows=16 width=12)
- Sort Key: pt_lt_tab_df_1_prt_part2.col2, pt_lt_tab_df_1_prt_part2.col3
- -> Append (cost=10000000000.00..30000000719.69 rows=15 width=12)
- -> Seq Scan on pt_lt_tab_df_1_prt_part2 (cost=10000000000.00..10000000001.04 rows=2 width=12)
- Filter: (col2 > '15'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part3 (cost=10000000000.00..10000000001.04 rows=3 width=12)
- Filter: (col2 > '15'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part4 (cost=10000000000.00..10000000001.04 rows=3 width=12)
- Filter: (col2 > '15'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_part5 (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '15'::numeric)
- -> Seq Scan on pt_lt_tab_df_1_prt_def (cost=0.00..431.00 rows=16 width=12)
- Filter: (col2 > '15'::numeric)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.01 rows=5 width=12)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.01 rows=5 width=12)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.01 rows=2 width=12)
+ -> Sort (cost=0.00..431.01 rows=16 width=12)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab_df (cost=0.00..431.00 rows=16 width=12)
+ Number of partitions to scan: 5
+ Filter: (col2 > '15'::numeric)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
DROP INDEX idx1;
DROP INDEX idx5;
@@ -1649,27 +1349,19 @@ SELECT * FROM pt_lt_tab WHERE col4 is False ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col4 is False ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------
- Limit (cost=1300.45..1300.56 rows=5 width=8)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=1300.45..1300.56 rows=5 width=8)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Limit (cost=1300.45..1300.46 rows=2 width=8)
- -> Sort (cost=1300.44..1300.52 rows=11 width=8)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..431.00 rows=7 width=8)
- -> Seq Scan on pt_lt_tab_1_prt_part1 (cost=0.00..431.00 rows=7 width=8)
- Filter: (col4 IS FALSE)
- -> Seq Scan on pt_lt_tab_1_prt_part2 (cost=0.00..431.00 rows=7 width=8)
- Filter: (col4 IS FALSE)
- -> Seq Scan on pt_lt_tab_1_prt_part3 (cost=0.00..431.00 rows=7 width=8)
- Filter: (col4 IS FALSE)
- -> Seq Scan on pt_lt_tab_1_prt_part4 (cost=0.00..431.00 rows=7 width=8)
- Filter: (col4 IS FALSE)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=7 width=8)
- Filter: (col4 IS FALSE)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
+ Limit (cost=0.00..431.00 rows=5 width=8)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=8)
+ Merge Key: col2, col3
+ -> Limit (cost=0.00..431.00 rows=2 width=8)
+ -> Sort (cost=0.00..431.00 rows=7 width=8)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=7 width=8)
+ Number of partitions to scan: 5
+ Filter: (col4 IS FALSE)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col4 = False ORDER BY col2,col3 LIMIT 5;
col2 | col3 | col4
@@ -1682,27 +1374,19 @@ SELECT * FROM pt_lt_tab WHERE col4 = False ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col4 = False ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Limit (cost=0.00..6.01 rows=5 width=8)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.01 rows=5 width=8)
- Merge Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
+ Merge Key: col2, col3
-> Limit (cost=0.00..6.01 rows=2 width=8)
-> Sort (cost=0.00..6.01 rows=10 width=8)
- Sort Key: pt_lt_tab_1_prt_part1.col2, pt_lt_tab_1_prt_part1.col3
- -> Append (cost=0.00..6.00 rows=10 width=8)
- -> Index Scan using pt_lt_tab_1_prt_part1_col4_idx on pt_lt_tab_1_prt_part1 (cost=0.00..6.00 rows=10 width=8)
- Index Cond: (col4 = false)
- -> Index Scan using pt_lt_tab_1_prt_part2_col4_idx on pt_lt_tab_1_prt_part2 (cost=0.00..6.00 rows=10 width=8)
- Index Cond: (col4 = false)
- -> Index Scan using pt_lt_tab_1_prt_part3_col4_idx on pt_lt_tab_1_prt_part3 (cost=0.00..6.00 rows=10 width=8)
- Index Cond: (col4 = false)
- -> Index Scan using pt_lt_tab_1_prt_part4_col4_idx on pt_lt_tab_1_prt_part4 (cost=0.00..6.00 rows=10 width=8)
- Index Cond: (col4 = false)
- -> Index Scan using pt_lt_tab_1_prt_part5_col4_idx on pt_lt_tab_1_prt_part5 (cost=0.00..6.00 rows=10 width=8)
- Index Cond: (col4 = false)
- Optimizer: Pivotal Optimizer (GPORCA)
-(18 rows)
+ Sort Key: col2, col3
+ -> Dynamic Index Scan on idx1 on pt_lt_tab (cost=0.00..6.00 rows=10 width=8)
+ Index Cond: (col4 = false)
+ Number of partitions to scan: 5
+ Optimizer: Pivotal Optimizer (GPORCA)
+(10 rows)
SELECT * FROM pt_lt_tab WHERE col2 > 41 ORDER BY col2,col3 LIMIT 5;
col2 | col3 | col4
@@ -1715,17 +1399,17 @@ SELECT * FROM pt_lt_tab WHERE col2 > 41 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 41 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=8)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=8)
Merge Key: pt_lt_tab_1_prt_part5.col2, pt_lt_tab_1_prt_part5.col3
-> Limit (cost=0.00..431.00 rows=2 width=8)
-> Sort (cost=0.00..431.00 rows=4 width=8)
- Sort Key: pt_lt_tab_1_prt_part5.col2, pt_lt_tab_1_prt_part5.col3
- -> Append (cost=0.00..431.00 rows=4 width=8)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=4 width=8)
- Filter: (col2 > '41'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=4 width=8)
+ Number of partitions to scan: 1
+ Filter: (col2 > '41'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(10 rows)
@@ -1741,17 +1425,17 @@ SELECT * FROM pt_lt_tab WHERE col2 > 41 ORDER BY col2,col3 LIMIT 5;
(5 rows)
EXPLAIN SELECT * FROM pt_lt_tab WHERE col2 > 41 ORDER BY col2,col3 LIMIT 5;
- QUERY PLAN
------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
Limit (cost=0.00..431.00 rows=5 width=7)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=5 width=7)
Merge Key: pt_lt_tab_1_prt_part5.col2, pt_lt_tab_1_prt_part5.col3
-> Limit (cost=0.00..431.00 rows=2 width=7)
-> Sort (cost=0.00..431.00 rows=4 width=7)
- Sort Key: pt_lt_tab_1_prt_part5.col2, pt_lt_tab_1_prt_part5.col3
- -> Append (cost=0.00..431.00 rows=4 width=7)
- -> Seq Scan on pt_lt_tab_1_prt_part5 (cost=0.00..431.00 rows=4 width=7)
- Filter: (col2 > '41'::numeric)
+ Sort Key: col2, col3
+ -> Dynamic Seq Scan on pt_lt_tab (cost=0.00..431.00 rows=4 width=7)
+ Number of partitions to scan: 1
+ Filter: (col2 > '41'::numeric)
Optimizer: Pivotal Optimizer (GPORCA)
(10 rows)
@@ -1834,9 +1518,9 @@ explain select * from ds_4 where month_id = '200800';
QUERY PLAN
-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
- -> Append (cost=0.00..431.00 rows=1 width=71)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=0.00..431.00 rows=1 width=71)
- Filter: ((month_id)::text = '200800'::text)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 1
+ Filter: ((month_id)::text = '200800'::text)
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
@@ -1845,157 +1529,109 @@ explain select * from ds_4 where month_id = '200800';
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where month_id::int = 200800;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000001409.44 rows=58 width=196)
- -> Append (cost=10000000000.00..40000001408.29 rows=20 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: ((month_id)::integer = 200800)
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: ((month_id)::integer = 200800)
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: ((month_id)::integer = 200800)
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: ((month_id)::integer = 200800)
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: ((month_id)::integer = 200800)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- this will be satisfied by 200800
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where month_id::int - 801 < 200000;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000002032.00 rows=19200 width=196)
- -> Append (cost=10000000000.00..40000001648.00 rows=6400 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000388.00 rows=1600 width=196)
- Filter: (((month_id)::integer - 801) < 200000)
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000388.00 rows=1600 width=196)
- Filter: (((month_id)::integer - 801) < 200000)
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000388.00 rows=1600 width=196)
- Filter: (((month_id)::integer - 801) < 200000)
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000388.00 rows=1600 width=196)
- Filter: (((month_id)::integer - 801) < 200000)
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: (((month_id)::integer - 801) < 200000)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- test OR case -- should NOT get pruning
explain select * from ds_4 where month_id::int - 801 < 200000 OR count_vas > 10;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000002496.00 rows=32000 width=196)
- -> Append (cost=10000000000.00..40000001856.00 rows=10667 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000424.00 rows=2667 width=196)
- Filter: ((((month_id)::integer - 801) < 200000) OR (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000424.00 rows=2667 width=196)
- Filter: ((((month_id)::integer - 801) < 200000) OR (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000424.00 rows=2667 width=196)
- Filter: ((((month_id)::integer - 801) < 200000) OR (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000424.00 rows=2667 width=196)
- Filter: ((((month_id)::integer - 801) < 200000) OR (count_vas > 10))
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: ((((month_id)::integer - 801) < 200000) OR (count_vas > 10))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- test AND case -- should still get pruning
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where month_id::int - 801 < 200000 AND count_vas > 10;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
- -> Append (cost=0.00..431.00 rows=1 width=71)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=0.00..431.00 rows=1 width=71)
- Filter: ((((month_id)::integer - 801) < 200000) AND (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200801 (cost=0.00..431.00 rows=1 width=71)
- Filter: ((((month_id)::integer - 801) < 200000) AND (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200802 (cost=0.00..431.00 rows=1 width=71)
- Filter: ((((month_id)::integer - 801) < 200000) AND (count_vas > 10))
- -> Seq Scan on ds_4_1_prt_p200803 (cost=0.00..431.00 rows=1 width=71)
- Filter: ((((month_id)::integer - 801) < 200000) AND (count_vas > 10))
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: ((((month_id)::integer - 801) < 200000) AND (count_vas > 10))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- test expression case : should get pruning
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where case when month_id = '200800' then 100 else 2 end = 100;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000001265.44 rows=58 width=196)
- -> Append (cost=10000000000.00..40000001264.29 rows=20 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000316.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN 100 ELSE 2 END = 100)
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000316.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN 100 ELSE 2 END = 100)
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000316.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN 100 ELSE 2 END = 100)
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000316.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN 100 ELSE 2 END = 100)
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN 100 ELSE 2 END = 100)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- test expression case : should get pruning
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where case when month_id = '200800' then NULL else 2 end IS NULL;
- QUERY PLAN
--------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000001121.44 rows=58 width=196)
- -> Append (cost=10000000000.00..40000001120.29 rows=20 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000280.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN NULL::integer ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000280.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN NULL::integer ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000280.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN NULL::integer ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000280.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN NULL::integer ELSE 2 END IS NULL)
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: (CASE WHEN ((month_id)::text = '200800'::text) THEN NULL::integer ELSE 2 END IS NULL)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- should still get pruning here -- count_vas is only used in the path for month id = 200800
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where case when month_id::int = 200800 then count_vas else 2 end IS NULL;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000001409.44 rows=58 width=196)
- -> Append (cost=10000000000.00..40000001408.29 rows=20 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::integer = 200800) THEN count_vas ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::integer = 200800) THEN count_vas ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::integer = 200800) THEN count_vas ELSE 2 END IS NULL)
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000352.00 rows=5 width=196)
- Filter: (CASE WHEN ((month_id)::integer = 200800) THEN count_vas ELSE 2 END IS NULL)
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+----------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: (CASE WHEN ((month_id)::integer = 200800) THEN count_vas ELSE 2 END IS NULL)
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- do one that matches a couple partitions
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_4 where month_id::int in (200801, 1,55,6,6,6,6,66,565,65,65,200803);
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..40000002145.28 rows=692 width=196)
- -> Append (cost=10000000000.00..40000002131.46 rows=231 width=196)
- -> Seq Scan on ds_4_1_prt_p200800 (cost=10000000000.00..10000000532.00 rows=58 width=196)
- Filter: ((month_id)::integer = ANY ('{200801,1,55,6,6,6,6,66,565,65,65,200803}'::integer[]))
- -> Seq Scan on ds_4_1_prt_p200801 (cost=10000000000.00..10000000532.00 rows=58 width=196)
- Filter: ((month_id)::integer = ANY ('{200801,1,55,6,6,6,6,66,565,65,65,200803}'::integer[]))
- -> Seq Scan on ds_4_1_prt_p200802 (cost=10000000000.00..10000000532.00 rows=58 width=196)
- Filter: ((month_id)::integer = ANY ('{200801,1,55,6,6,6,6,66,565,65,65,200803}'::integer[]))
- -> Seq Scan on ds_4_1_prt_p200803 (cost=10000000000.00..10000000532.00 rows=58 width=196)
- Filter: ((month_id)::integer = ANY ('{200801,1,55,6,6,6,6,66,565,65,65,200803}'::integer[]))
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ -> Dynamic Seq Scan on ds_4 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 4
+ Filter: ((month_id)::integer = ANY ('{200801,1,55,6,6,6,6,66,565,65,65,200803}'::integer[]))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(5 rows)
-- cleanup
drop table ds_4;
@@ -2048,69 +1684,33 @@ insert into ds_2(month_id) values('200809');
-- end_ignore
set optimizer_segments=2;
explain select * from ds_2 where month_id::int in (200808, 1315) order by month_id;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=100000003533.20..100000003539.68 rows=289 width=196)
- Merge Key: ds_2_1_prt_p200800.month_id
- -> Sort (cost=100000003533.20..100000003533.92 rows=97 width=196)
- Sort Key: ds_2_1_prt_p200800.month_id
- -> Append (cost=10000000000.00..100000003521.44 rows=97 width=196)
- -> Seq Scan on ds_2_1_prt_p200800 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200801 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200802 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200803 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200804 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200805 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200806 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200807 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200808 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200809 (cost=10000000000.00..10000000352.00 rows=10 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
- Optimizer: Pivotal Optimizer (GPORCA)
-(26 rows)
+ QUERY PLAN
+--------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ Merge Key: month_id
+ -> Sort (cost=0.00..431.00 rows=1 width=71)
+ Sort Key: month_id
+ -> Dynamic Seq Scan on ds_2 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 10
+ Filter: ((month_id)::integer = ANY ('{200808,1315}'::integer[]))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(8 rows)
-- start_ignore
-- Known_opt_diff: MPP-21316
-- end_ignore
explain select * from ds_2 where month_id::int in (200808, 200801, 2008010) order by month_id;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=100000003721.07..100000003730.79 rows=432 width=196)
- Merge Key: ds_2_1_prt_p200800.month_id
- -> Sort (cost=100000003721.07..100000003722.15 rows=144 width=196)
- Sort Key: ds_2_1_prt_p200800.month_id
- -> Append (cost=10000000000.00..100000003702.16 rows=144 width=196)
- -> Seq Scan on ds_2_1_prt_p200800 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200801 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200802 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200803 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200804 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200805 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200806 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200807 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200808 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- -> Seq Scan on ds_2_1_prt_p200809 (cost=10000000000.00..10000000370.00 rows=15 width=196)
- Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
- Optimizer: Pivotal Optimizer (GPORCA)
-(26 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=71)
+ Merge Key: month_id
+ -> Sort (cost=0.00..431.00 rows=1 width=71)
+ Sort Key: month_id
+ -> Dynamic Seq Scan on ds_2 (cost=0.00..431.00 rows=1 width=71)
+ Number of partitions to scan: 10
+ Filter: ((month_id)::integer = ANY ('{200808,200801,2008010}'::integer[]))
+ Optimizer: Pivotal Optimizer (GPORCA)
+(8 rows)
reset optimizer_segments;
select * from ds_2 where month_id::int in (200907, 1315) order by month_id;
@@ -2249,7 +1849,7 @@ analyze partprune_foo;
select get_selected_parts('explain select * from partprune_foo;');
get_selected_parts
--------------------
- [0, 0]
+ [10, 0]
(1 row)
select * from partprune_foo;
@@ -2360,7 +1960,7 @@ select * from partprune_foo;
select get_selected_parts('explain select * from partprune_foo where b = 35;');
get_selected_parts
--------------------
- [0, 0]
+ [1, 0]
(1 row)
select * from partprune_foo where b = 35;
@@ -2372,7 +1972,7 @@ select * from partprune_foo where b = 35;
select get_selected_parts('explain select * from partprune_foo where b < 35;');
get_selected_parts
--------------------
- [0, 0]
+ [4, 0]
(1 row)
select * from partprune_foo where b < 35;
@@ -2417,7 +2017,7 @@ select * from partprune_foo where b < 35;
select get_selected_parts('explain select * from partprune_foo where b in (5, 6, 14, 23);');
get_selected_parts
--------------------
- [0, 0]
+ [3, 0]
(1 row)
select * from partprune_foo where b in (5, 6, 14, 23);
@@ -2432,7 +2032,7 @@ select * from partprune_foo where b in (5, 6, 14, 23);
select get_selected_parts('explain select * from partprune_foo where b < 15 or b > 60;');
get_selected_parts
--------------------
- [0, 0]
+ [7, 0]
(1 row)
select * from partprune_foo where b < 15 or b > 60;
@@ -2508,7 +2108,7 @@ select * from partprune_foo where b = 150;
select get_selected_parts('explain select * from partprune_foo where b = a*5;');
get_selected_parts
--------------------
- [0, 0]
+ [10, 0]
(1 row)
select * from partprune_foo where b = a*5;
@@ -2523,7 +2123,7 @@ set optimizer_array_expansion_threshold = 3;
select get_selected_parts('explain select * from partprune_foo where b in (5, 6, 14, 23);');
get_selected_parts
--------------------
- [0, 0]
+ [3, 0]
(1 row)
select * from partprune_foo where b in (5, 6, 14, 23);
@@ -2540,7 +2140,7 @@ reset optimizer_array_expansion_threshold;
select get_selected_parts($$ explain select * from partprune_foo where b = ANY ('{5, 6, 14}') $$);
get_selected_parts
--------------------
- [0, 0]
+ [2, 0]
(1 row)
select * from partprune_foo where b = ANY ('{5, 6, 14}');
@@ -2554,7 +2154,7 @@ select * from partprune_foo where b = ANY ('{5, 6, 14}');
select get_selected_parts($$ explain select * from partprune_foo where b < ANY ('{12, 14, 11}') $$);
get_selected_parts
--------------------
- [0, 0]
+ [2, 0]
(1 row)
select * from partprune_foo where b < ANY ('{12, 14, 11}');
@@ -2675,7 +2275,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur
select get_selected_parts('explain analyze select * from foo where b = 1 union all select * from foo where b > 3 union all select * from foo where b in (0,1) union all select * from foo where b is null;');
get_selected_parts
--------------------
- [0, 0]
+ [6, 0]
(1 row)
drop table if exists pt;
@@ -2691,7 +2291,7 @@ PARTITION BY LIST (gender)
select get_selected_parts('explain analyze select * from pt where gender = ''F'' union all select * from pt where gender < ''M'' union all select * from pt where gender in (''F'', ''FM'') union all select * from pt where gender is null;');
get_selected_parts
--------------------
- [0, 0]
+ [6, 0]
(1 row)
-- DML
diff --git a/src/test/regress/expected/qp_dpe_optimizer.out b/src/test/regress/expected/qp_dpe_optimizer.out
index 93d342a5c3..49dd11f0dd 100644
--- a/src/test/regress/expected/qp_dpe_optimizer.out
+++ b/src/test/regress/expected/qp_dpe_optimizer.out
@@ -56,13 +56,13 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j = foo2.j;
@@ -93,13 +93,13 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j = foo2.j;
@@ -130,13 +130,13 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j = foo2.j;
@@ -167,13 +167,13 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j = foo2.j;
@@ -204,13 +204,13 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j = foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j = foo2.j;
@@ -242,19 +242,19 @@ analyze foo2;
select count_operator('select count(*) from foo1,foo2 where foo1.j =foo2.j;', 'Append') > 0;
?column?
----------
- t
+ f
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j =foo2.j;', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count_operator('select count(*) from foo1,foo2 where foo1.j =foo2.j and foo2.i <= ALL(select 1 UNION select 2);', 'Dynamic Seq Scan') > 0;
?column?
----------
- f
+ t
(1 row)
select count(*) from foo1,foo2 where foo1.j =foo2.j and foo2.i <= ALL(select 1 UNION select 2);
diff --git a/src/test/regress/expected/qp_dropped_cols_optimizer.out b/src/test/regress/expected/qp_dropped_cols_optimizer.out
index b61e7c652c..37155c9dba 100644
--- a/src/test/regress/expected/qp_dropped_cols_optimizer.out
+++ b/src/test/regress/expected/qp_dropped_cols_optimizer.out
@@ -14703,18 +14703,15 @@ ALTER TABLE table_with_leaf_partition_containing_dropped_column ALTER PARTITION
ERROR: table "prttab_leaf_containing_dropped_col_part1" is not partitioned
CREATE INDEX table_with_leaf_partition_containing_dropped_column_index ON table_with_leaf_partition_containing_dropped_column(a, b);
EXPLAIN SELECT * FROM table_with_leaf_partition_containing_dropped_column WHERE a>42 and z<42;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using prttab_leaf_containing_dropped_col_part1_a_b_idx on prttab_leaf_containing_dropped_col_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
- -> Index Scan using prttab_leaf_containing_dropped_col_part2_a_b_idx on prttab_leaf_containing_dropped_col_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
+ -> Dynamic Index Scan on table_with_leaf_partition_containing_dropped_column_index on table_with_leaf_partition_containing_dropped_column (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (a > 42)
+ Filter: ((a > 42) AND (z < 42))
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
SELECT * FROM table_with_leaf_partition_containing_dropped_column WHERE a>42 and z<42;
a | b | z
@@ -14771,18 +14768,15 @@ ALTER TABLE leaf_containing_dropped_column_between_index_columns DROP COLUMN d1;
ALTER TABLE table_with_leaf_containing_dropped_column_between_index_columns EXCHANGE PARTITION FOR ('2021-04-11'::date) WITH TABLE leaf_containing_dropped_column_between_index_columns;
CREATE INDEX table_with_leaf_partition_dropped_col_between_index_cols_index ON table_with_leaf_containing_dropped_column_between_index_columns(a, b);
EXPLAIN SELECT * FROM table_with_leaf_containing_dropped_column_between_index_columns WHERE a>42 and z<42;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using leaf_containing_dropped_col_index_part1_a_b_idx on leaf_containing_dropped_col_index_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
- -> Index Scan using leaf_containing_dropped_col_index_part2_a_b_idx on leaf_containing_dropped_col_index_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
+ -> Dynamic Index Scan on table_with_leaf_partition_dropped_col_between_index_cols_index on table_with_leaf_containing_dropped_column_between_index_columns (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (a > 42)
+ Filter: ((a > 42) AND (z < 42))
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
SELECT * FROM table_with_leaf_containing_dropped_column_between_index_columns WHERE a>42 and z<42;
a | b | z
@@ -14839,18 +14833,15 @@ ALTER TABLE table_with_root_containing_dropped_columns DROP COLUMN d1;
ALTER TABLE table_with_root_containing_dropped_columns EXCHANGE PARTITION FOR ('2021-04-11'::date) WITH TABLE leaf_containing_no_dropped_columns;
CREATE INDEX table_with_root_containing_dropped_columns_index ON table_with_root_containing_dropped_columns(a, b);
EXPLAIN SELECT * FROM table_with_root_containing_dropped_columns WHERE a>42 and z<42;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using leaf_with_root_containing_dropped_columns_part1_a_b_idx on leaf_with_root_containing_dropped_columns_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
- -> Index Scan using leaf_with_root_containing_dropped_columns_part2_a_b_idx on leaf_with_root_containing_dropped_columns_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
+ -> Dynamic Index Scan on table_with_root_containing_dropped_columns_index on table_with_root_containing_dropped_columns (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (a > 42)
+ Filter: ((a > 42) AND (z < 42))
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
SELECT * FROM table_with_root_containing_dropped_columns WHERE a>42 and z<42;
a | b | z
@@ -14908,18 +14899,15 @@ ALTER TABLE leaf_containing_dropped_columns_between_index_columns DROP COLUMN d1
ALTER TABLE table_with_both_containing_dropped_column EXCHANGE PARTITION FOR ('2021-04-11'::date) WITH TABLE leaf_containing_dropped_columns_between_index_columns;
CREATE INDEX table_with_both_containing_dropped_column_index ON table_with_both_containing_dropped_column(a, b);
EXPLAIN SELECT * FROM table_with_both_containing_dropped_column WHERE a>42 and z<42;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=12)
- -> Append (cost=0.00..6.00 rows=1 width=12)
- -> Index Scan using leaf_with_dropped_cols_index_part1_a_b_idx on leaf_with_dropped_cols_index_part1 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
- -> Index Scan using leaf_with_dropped_cols_index_part2_a_b_idx on leaf_with_dropped_cols_index_part2 (cost=0.00..6.00 rows=1 width=12)
- Index Cond: (a > 42)
- Filter: ((a > 42) AND (z < 42))
+ -> Dynamic Index Scan on table_with_both_containing_dropped_column_index on table_with_both_containing_dropped_column (cost=0.00..6.00 rows=1 width=12)
+ Index Cond: (a > 42)
+ Filter: ((a > 42) AND (z < 42))
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
SELECT * FROM table_with_both_containing_dropped_column WHERE a>42 and z<42;
a | b | z
diff --git a/src/test/regress/expected/qp_gist_indexes4_optimizer.out b/src/test/regress/expected/qp_gist_indexes4_optimizer.out
index e892215358..b8c6b3ff36 100644
--- a/src/test/regress/expected/qp_gist_indexes4_optimizer.out
+++ b/src/test/regress/expected/qp_gist_indexes4_optimizer.out
@@ -752,18 +752,15 @@ SELECT * FROM geometricTypesPartition
EXPLAIN SELECT * FROM geometricTypesPartition
WHERE c ~= SeedToCircle(101);
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..6.00 rows=1 width=68)
- -> Append (cost=0.00..6.00 rows=1 width=68)
- -> Index Scan using geometrictypespartition_1_prt_1_c_idx on geometrictypespartition_1_prt_1 (cost=0.00..6.00 rows=1 width=68)
- Index Cond: (c ~= '<(8479,-3121),8441>'::circle)
- Filter: (c ~= '<(8479,-3121),8441>'::circle)
- -> Index Scan using geometrictypespartition_1_prt_2_c_idx on geometrictypespartition_1_prt_2 (cost=0.00..6.00 rows=1 width=68)
- Index Cond: (c ~= '<(8479,-3121),8441>'::circle)
- Filter: (c ~= '<(8479,-3121),8441>'::circle)
+ -> Dynamic Index Scan on gt_index_c_part on geometrictypespartition (cost=0.00..6.00 rows=1 width=68)
+ Index Cond: (c ~= '<(8479,-3121),8441>'::circle)
+ Filter: (c ~= '<(8479,-3121),8441>'::circle)
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
DROP TABLE IF EXISTS geometricTypesPartition;
-- ----------------------------------------------------------------------
diff --git a/src/test/regress/expected/qp_misc_jiras_optimizer.out b/src/test/regress/expected/qp_misc_jiras_optimizer.out
index fa5cbcdf1e..88ae01dba0 100644
--- a/src/test/regress/expected/qp_misc_jiras_optimizer.out
+++ b/src/test/regress/expected/qp_misc_jiras_optimizer.out
@@ -2950,14 +2950,13 @@ drop table qp_misc_jiras.tbl6448;
create table qp_misc_jiras.tbl6833_anl(a int, b int, c int) distributed by (a) partition by range (b) (partition bb start (0) end (2) every (1));
analyze qp_misc_jiras.tbl6833_anl;
explain select * from qp_misc_jiras.tbl6833_anl; -- should not hit cdbRelSize();
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..20000000002.05 rows=2 width=12)
- -> Append (cost=10000000000.00..20000000002.01 rows=1 width=12)
- -> Seq Scan on tbl6833_anl_1_prt_bb_1 (cost=10000000000.00..10000000001.00 rows=1 width=12)
- -> Seq Scan on tbl6833_anl_1_prt_bb_2 (cost=10000000000.00..10000000001.00 rows=1 width=12)
- Optimizer: Postgres query optimizer
-(5 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
+ -> Dynamic Seq Scan on tbl6833_anl (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 2
+ Optimizer: Pivotal Optimizer (GPORCA)
+(4 rows)
select relname, reltuples, relpages from pg_class where relname like 'tbl6833_anl%'; -- should show relpages = 1.0
relname | reltuples | relpages
@@ -2970,14 +2969,13 @@ select relname, reltuples, relpages from pg_class where relname like 'tbl6833_an
create table qp_misc_jiras.tbl6833_vac(a int, b int, c int) distributed by (a) partition by range (b) (partition bb start (0) end (2) every (1));
vacuum qp_misc_jiras.tbl6833_vac;
explain select * from qp_misc_jiras.tbl6833_vac; -- should not hit cdbRelSize();
- QUERY PLAN
--------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=10000000000.00..20000000002.05 rows=2 width=12)
- -> Append (cost=10000000000.00..20000000002.01 rows=1 width=12)
- -> Seq Scan on tbl6833_vac_1_prt_bb_1 (cost=10000000000.00..10000000001.00 rows=1 width=12)
- -> Seq Scan on tbl6833_vac_1_prt_bb_2 (cost=10000000000.00..10000000001.00 rows=1 width=12)
- Optimizer: Postgres query optimizer
-(5 rows)
+ QUERY PLAN
+-------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=12)
+ -> Dynamic Seq Scan on tbl6833_vac (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 2
+ Optimizer: Pivotal Optimizer (GPORCA)
+(4 rows)
select relname, reltuples, relpages from pg_class where relname like 'tbl6833_vac%'; -- should show relpages = 1.0
relname | reltuples | relpages
diff --git a/src/test/regress/expected/qp_targeted_dispatch_optimizer.out b/src/test/regress/expected/qp_targeted_dispatch_optimizer.out
index 8c9b384e4a..008470335d 100644
--- a/src/test/regress/expected/qp_targeted_dispatch_optimizer.out
+++ b/src/test/regress/expected/qp_targeted_dispatch_optimizer.out
@@ -496,32 +496,15 @@ INFO: (slice 1) Dispatch command to SINGLE content
(1 row)
explain select count(*) from mpp7638 where a =1;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Aggregate (cost=0.00..431.00 rows=1 width=8)
-> Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..431.00 rows=1 width=1)
- -> Result (cost=0.00..431.00 rows=1 width=1)
- -> Append (cost=0.00..431.00 rows=1 width=4)
- -> Seq Scan on mpp7638_1_prt_1 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_2 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_3 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_4 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_5 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_6 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_7 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_8 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
- -> Seq Scan on mpp7638_1_prt_9 (cost=0.00..431.00 rows=1 width=4)
- Filter: (a = 1)
+ -> Dynamic Seq Scan on mpp7638 (cost=0.00..431.00 rows=1 width=4)
+ Number of partitions to scan: 9
+ Filter: (a = 1)
Optimizer: Pivotal Optimizer (GPORCA)
-(23 rows)
+(6 rows)
alter table mpp7638 set distributed by (a, b, c);
INFO: (slice 1) Dispatch command to ALL contents: 0 1 2
diff --git a/src/test/regress/expected/subselect_gp_optimizer.out b/src/test/regress/expected/subselect_gp_optimizer.out
index 5991016c98..2af82e2cae 100644
--- a/src/test/regress/expected/subselect_gp_optimizer.out
+++ b/src/test/regress/expected/subselect_gp_optimizer.out
@@ -78,33 +78,27 @@ partition by range (y) ( start (0) end (4) every (1))
insert into csq_t1 select * from csq_t1_base;
insert into csq_t2 select * from csq_t2_base;
explain select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.00..1293.00 rows=1 width=8)
Filter: (SubPlan 1)
-> Sort (cost=0.00..431.00 rows=1 width=8)
- Sort Key: csq_t1_1_prt_1.x
+ Sort Key: csq_t1.x
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..431.00 rows=1 width=8)
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t1_1_prt_1 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t1_1_prt_2 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t1_1_prt_3 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t1_1_prt_4 (cost=0.00..431.00 rows=1 width=8)
+ -> Dynamic Seq Scan on csq_t1 (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 4
SubPlan 1
-> Result (cost=0.00..431.00 rows=1 width=1)
- Filter: ((CASE WHEN (sum((CASE WHEN (csq_t1_1_prt_1.x <= csq_t2_1_prt_1.x) THEN 1 ELSE 0 END)) IS NULL) THEN true WHEN (sum((CASE WHEN (csq_t2_1_prt_1.x IS NULL) THEN 1 ELSE 0 END)) > '0'::bigint) THEN NULL::boolean WHEN (csq_t1_1_prt_1.x IS NULL) THEN NULL::boolean WHEN (sum((CASE WHEN (csq_t1_1_prt_1.x <= csq_t2_1_prt_1.x) THEN 1 ELSE 0 END)) = '0'::bigint) THEN true ELSE false END) = true)
+ Filter: ((CASE WHEN (sum((CASE WHEN (csq_t1.x <= csq_t2.x) THEN 1 ELSE 0 END)) IS NULL) THEN true WHEN (sum((CASE WHEN (csq_t2.x IS NULL) THEN 1 ELSE 0 END)) > '0'::bigint) THEN NULL::boolean WHEN (csq_t1.x IS NULL) THEN NULL::boolean WHEN (sum((CASE WHEN (csq_t1.x <= csq_t2.x) THEN 1 ELSE 0 END)) = '0'::bigint) THEN true ELSE false END) = true)
-> Aggregate (cost=0.00..431.00 rows=1 width=16)
-> Result (cost=0.00..431.00 rows=1 width=4)
- Filter: (csq_t2_1_prt_1.y = csq_t1_1_prt_1.y)
+ Filter: (csq_t2.y = csq_t1.y)
-> Materialize (cost=0.00..431.00 rows=1 width=8)
-> Gather Motion 3:1 (slice2; segments: 3) (cost=0.00..431.00 rows=1 width=8)
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t2_1_prt_1 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t2_1_prt_2 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t2_1_prt_3 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on csq_t2_1_prt_4 (cost=0.00..431.00 rows=1 width=8)
+ -> Dynamic Seq Scan on csq_t2 (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 4
Optimizer: Pivotal Optimizer (GPORCA)
-(24 rows)
+(18 rows)
select * from csq_t1 where csq_t1.x >ALL (select csq_t2.x from csq_t2 where csq_t2.y=csq_t1.y) order by 1; -- expected (4,2)
x | y
@@ -1265,29 +1259,27 @@ CASE
ELSE 'Q2'::text END AS cc, 1 AS nn
FROM t_mpp_20470 b;
explain SELECT cc, sum(nn) over() FROM v1_mpp_20470;
- QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------
WindowAgg (cost=0.00..862.00 rows=2 width=16)
-> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.00 rows=2 width=12)
-> Hash Left Join (cost=0.00..862.00 rows=1 width=16)
- Hash Cond: ((t_mpp_20470_ptr1.col_name)::text = (t_mpp_20470_ptr1_1.col_name)::text)
+ Hash Cond: ((t_mpp_20470.col_name)::text = (t_mpp_20470_1.col_name)::text)
-> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..431.00 rows=1 width=8)
- Hash Key: t_mpp_20470_ptr1.col_name
- -> Append (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on t_mpp_20470_ptr1 (cost=0.00..431.00 rows=1 width=8)
- -> Seq Scan on t_mpp_20470_ptr2 (cost=0.00..431.00 rows=1 width=8)
+ Hash Key: t_mpp_20470.col_name
+ -> Dynamic Seq Scan on t_mpp_20470 (cost=0.00..431.00 rows=1 width=8)
+ Number of partitions to scan: 2
-> Hash (cost=431.00..431.00 rows=1 width=16)
-> GroupAggregate (cost=0.00..431.00 rows=1 width=16)
- Group Key: t_mpp_20470_ptr1_1.col_name
+ Group Key: t_mpp_20470_1.col_name
-> Sort (cost=0.00..431.00 rows=1 width=12)
- Sort Key: t_mpp_20470_ptr1_1.col_name
+ Sort Key: t_mpp_20470_1.col_name
-> Redistribute Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=1 width=12)
- Hash Key: t_mpp_20470_ptr1_1.col_name
- -> Append (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on t_mpp_20470_ptr1 t_mpp_20470_ptr1_1 (cost=0.00..431.00 rows=1 width=12)
- -> Seq Scan on t_mpp_20470_ptr2 t_mpp_20470_ptr2_1 (cost=0.00..431.00 rows=1 width=12)
+ Hash Key: t_mpp_20470_1.col_name
+ -> Dynamic Seq Scan on t_mpp_20470 t_mpp_20470_1 (cost=0.00..431.00 rows=1 width=12)
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+(18 rows)
drop view v1_mpp_20470;
drop table t_mpp_20470;
@@ -1426,7 +1418,7 @@ explain SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz
-----------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1356273068.35 rows=1 width=4)
-> Hash Join (cost=0.00..1356273068.35 rows=1 width=4)
- Hash Cond: ((((SubPlan 1)) = foo_s_1_prt_sub_one.b) AND (((SubPlan 2)) = foo_s_1_prt_sub_one.b))
+ Hash Cond: ((((SubPlan 1)) = foo_s.b) AND (((SubPlan 2)) = foo_s.b))
-> Seq Scan on bar_s (cost=0.00..1324053.98 rows=334 width=16)
SubPlan 1
-> Aggregate (cost=0.00..431.00 rows=1 width=4)
@@ -1440,11 +1432,10 @@ explain SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz
-> Result (cost=0.00..0.00 rows=1 width=1)
-> Hash (cost=431.00..431.00 rows=1 width=4)
-> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=1 width=4)
- -> Append (cost=0.00..431.00 rows=1 width=4)
- -> Seq Scan on foo_s_1_prt_sub_one (cost=0.00..431.00 rows=1 width=4)
- -> Seq Scan on foo_s_1_prt_sub_two (cost=0.00..431.00 rows=1 width=4)
+ -> Dynamic Seq Scan on foo_s (cost=0.00..431.00 rows=1 width=4)
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+(19 rows)
SELECT bar_s.c FROM bar_s, foo_s WHERE foo_s.b = (SELECT max(i) FROM baz_s WHERE bar_s.c = 9) AND foo_s.b = (select bar_s.d::int4);
c
@@ -1808,28 +1799,28 @@ ANALYZE dedup_test3;
EXPLAIN SELECT * FROM dedup_test1 INNER JOIN dedup_test2 ON dedup_test1.a= dedup_test2.e WHERE (a) IN (SELECT a FROM dedup_test3);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1293.00 rows=2 width=16)
+ Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1293.00 rows=1 width=16)
-> Hash Join (cost=0.00..1293.00 rows=1 width=16)
Hash Cond: (dedup_test2.e = dedup_test1.a)
-> Seq Scan on dedup_test2 (cost=0.00..431.00 rows=2 width=8)
-> Hash (cost=862.00..862.00 rows=1 width=8)
-> Hash Join (cost=0.00..862.00 rows=1 width=8)
- Hash Cond: (dedup_test1.a = dedup_test3_1_prt_1.a)
+ Hash Cond: (dedup_test1.a = dedup_test3.a)
-> Seq Scan on dedup_test1 (cost=0.00..431.00 rows=2 width=8)
-> Hash (cost=431.00..431.00 rows=1 width=4)
-> GroupAggregate (cost=0.00..431.00 rows=1 width=4)
- Group Key: dedup_test3_1_prt_1.a
+ Group Key: dedup_test3.a
-> Sort (cost=0.00..431.00 rows=1 width=4)
- Sort Key: dedup_test3_1_prt_1.a
+ Sort Key: dedup_test3.a
-> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..431.00 rows=1 width=4)
- Hash Key: dedup_test3_1_prt_1.a
+ Hash Key: dedup_test3.a
-> GroupAggregate (cost=0.00..431.00 rows=1 width=4)
- Group Key: dedup_test3_1_prt_1.a
+ Group Key: dedup_test3.a
-> Sort (cost=0.00..431.00 rows=4 width=4)
- Sort Key: dedup_test3_1_prt_1.a
+ Sort Key: dedup_test3.a
-> Redistribute Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=4 width=4)
- -> Append (cost=0.00..431.00 rows=4 width=4)
- -> Seq Scan on dedup_test3_1_prt_1 (cost=0.00..431.00 rows=4 width=4)
+ -> Dynamic Seq Scan on dedup_test3 (cost=0.00..431.00 rows=4 width=4)
+ Number of partitions to scan: 1
Optimizer: Pivotal Optimizer (GPORCA)
(23 rows)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 10/11: Adapt dynamic (bitmap/index/table) scan to PG 14
Posted by ma...@apache.org.
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 5612f4b4d76a9313fbd67ec6b1bee0c35c2dc793
Author: zhoujiaqi <zh...@hashdata.cn>
AuthorDate: Fri Dec 20 14:00:13 2024 +0800
Adapt dynamic (bitmap/index/table) scan to PG 14
In PG commit 36d22dd, if the ops in tableslot which returned by
the current execution operator is fixed, the executor will simplify
the call and directly call `*virt` functions. But in the dynamic
(bitmap/index/table) scan operator, we don't know the tupleslot
ops of the subtable (it may even be different).
So the current change sets the `opsisfixed` of scan and result to
false, which can prevent the executor from directly calling `*virt`
funcstion.
---
src/backend/executor/nodeDynamicBitmapHeapscan.c | 4 ++++
src/backend/executor/nodeDynamicBitmapIndexscan.c | 4 ++++
src/backend/executor/nodeDynamicIndexscan.c | 4 ++++
src/backend/executor/nodeDynamicSeqscan.c | 7 +++++++
4 files changed, 19 insertions(+)
diff --git a/src/backend/executor/nodeDynamicBitmapHeapscan.c b/src/backend/executor/nodeDynamicBitmapHeapscan.c
index 2d731223eb..cf8c980d5d 100644
--- a/src/backend/executor/nodeDynamicBitmapHeapscan.c
+++ b/src/backend/executor/nodeDynamicBitmapHeapscan.c
@@ -68,6 +68,10 @@ ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int e
Relation scanRel = ExecOpenScanRelation(estate, node->bitmapheapscan.scan.scanrelid, eflags);
ExecInitScanTupleSlot(estate, &state->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+ /* Dynamic table/index/bitmap scan can't tell the ops of tupleslot */
+ state->ss.ps.scanopsfixed = false;
+ state->ss.ps.scanopsset = true;
+
/*
* Initialize result tuple type and projection info.
*/
diff --git a/src/backend/executor/nodeDynamicBitmapIndexscan.c b/src/backend/executor/nodeDynamicBitmapIndexscan.c
index 7d1494b0cd..d9e43351ad 100644
--- a/src/backend/executor/nodeDynamicBitmapIndexscan.c
+++ b/src/backend/executor/nodeDynamicBitmapIndexscan.c
@@ -77,6 +77,10 @@ ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int
Relation scanRel = ExecOpenScanRelation(estate, node->biscan.scan.scanrelid, eflags);
ExecInitScanTupleSlot(estate, &dynamicBitmapIndexScanState->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+ /* Dynamic table/index/bitmap scan can't tell the ops of tupleslot */
+ dynamicBitmapIndexScanState->ss.ps.scanopsfixed = false;
+ dynamicBitmapIndexScanState->ss.ps.scanopsset = true;
+
/*
* Initialize result tuple type and projection info.
*/
diff --git a/src/backend/executor/nodeDynamicIndexscan.c b/src/backend/executor/nodeDynamicIndexscan.c
index d341404b50..4d7f7ff060 100644
--- a/src/backend/executor/nodeDynamicIndexscan.c
+++ b/src/backend/executor/nodeDynamicIndexscan.c
@@ -74,6 +74,10 @@ ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags)
Relation scanRel = ExecOpenScanRelation(estate, node->indexscan.scan.scanrelid, eflags);
ExecInitScanTupleSlot(estate, &dynamicIndexScanState->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+ /* Dynamic table/index/bitmap scan can't tell the ops of tupleslot */
+ dynamicIndexScanState->ss.ps.scanopsfixed = false;
+ dynamicIndexScanState->ss.ps.scanopsset = true;
+
/*
* Initialize result tuple type and projection info.
*/
diff --git a/src/backend/executor/nodeDynamicSeqscan.c b/src/backend/executor/nodeDynamicSeqscan.c
index 3e1b367172..657aa5d056 100644
--- a/src/backend/executor/nodeDynamicSeqscan.c
+++ b/src/backend/executor/nodeDynamicSeqscan.c
@@ -63,10 +63,17 @@ ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
Relation scanRel = ExecOpenScanRelation(estate, node->seqscan.scanrelid, eflags);
ExecInitScanTupleSlot(estate, &state->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+ /* Dynamic table/index/bitmap scan can't tell the ops of tupleslot */
+ state->ss.ps.scanopsfixed = false;
+ state->ss.ps.scanopsset = true;
+
/* Initialize result tuple type. */
ExecInitResultTypeTL(&state->ss.ps);
ExecAssignScanProjectionInfo(&state->ss);
+ state->ss.ps.resultopsfixed = false;
+ state->ss.ps.resultopsset = true;
+
state->nOids = list_length(node->partOids);
state->partOids = palloc(sizeof(Oid) * state->nOids);
foreach_with_count(lc, node->partOids, i)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 08/11: MDP changes
Posted by ma...@apache.org.
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 80026068d0508f1f33f0dc043771d17c777047d0
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Mon May 23 14:43:41 2022 -0700
MDP changes
---
.../gporca/data/dxl/indexjoin/positive_04.mdp | 2 +
.../dxl/minidump/AddRedistributeBeforeInsert-3.mdp | 98 +-
.../dxl/minidump/AddRedistributeBeforeInsert-4.mdp | 178 +--
.../dxl/minidump/AddRedistributeBeforeInsert-5.mdp | 70 +-
.../gporca/data/dxl/minidump/AssertMaxOneRow.mdp | 3 +
.../minidump/BTreeIndex-Against-ScalarSubquery.mdp | 1 +
.../BitmapIndexApply-InnerSelect-PartTable.mdp | 221 +---
.../dxl/minidump/BitmapIndexApply-PartTable.mdp | 293 +----
.../dxl/minidump/BitmapIndexNLJWithProject.mdp | 339 ++---
.../minidump/BitmapIndexNLJWithProjectNoFilt.mdp | 343 +----
.../dxl/minidump/BitmapIndexNLOJWithProject.mdp | 339 ++---
.../dxl/minidump/BitmapIndexProbeMergeFilters.mdp | 139 +-
.../BitmapScan-Hetrogeneous-Partitioned.mdp | 164 +--
.../minidump/BtreeIndexNLJWithProjectNoPart.mdp | 1 +
.../dxl/minidump/BtreeIndexNLOJWithProject.mdp | 245 +---
.../FallBackToSerialAppend.mdp | 84 +-
.../data/dxl/minidump/CTE-NoPushProperties.mdp | 382 +-----
.../gporca/data/dxl/minidump/CTE-PartTbl.mdp | 174 +--
.../data/dxl/minidump/CTE-PushProperties.mdp | 382 +-----
.../dxl/minidump/CastedScalarIf-On-Index-Key.mdp | 142 +-
.../data/dxl/minidump/Coalesce-With-Subquery.mdp | 1 +
.../CorrelatedNLJ-PartSelector-Subplan.mdp | 194 ++-
src/backend/gporca/data/dxl/minidump/DPE-IN.mdp | 68 +-
.../gporca/data/dxl/minidump/DPE-NOT-IN.mdp | 140 +-
.../gporca/data/dxl/minidump/DPE-SemiJoin.mdp | 81 +-
.../dxl/minidump/DPE-with-unsupported-pred.mdp | 222 +---
.../dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp | 108 +-
.../minidump/DirectDispatch-DynamicIndexScan.mdp | 332 +----
.../data/dxl/minidump/DirectDispatch-IndexScan.mdp | 1 +
.../dxl/minidump/DonotPushPartConstThruLimit.mdp | 80 +-
.../minidump/DontAddRedistributeBeforeInsert-1.mdp | 178 +--
.../data/dxl/minidump/DynamicBitmapBoolOp.mdp | 394 +-----
.../data/dxl/minidump/DynamicBitmapIndexScan.mdp | 288 +---
.../dxl/minidump/DynamicBitmapTableScan-Basic.mdp | 97 +-
.../DynamicBitmapTableScan-Heterogeneous.mdp | 256 +---
.../dxl/minidump/DynamicBitmapTableScan-UUID.mdp | 145 +-
.../dxl/minidump/DynamicIndexScan-BoolFalse.mdp | 222 +---
.../dxl/minidump/DynamicIndexScan-BoolTrue.mdp | 222 +---
.../DynamicIndexScan-DefaultPartition-2.mdp | 222 +---
.../minidump/DynamicIndexScan-DefaultPartition.mdp | 66 +-
.../dxl/minidump/DynamicIndexScan-DroppedCols.mdp | 84 +-
...ndexScan-Heterogenous-EnabledDateConstraint.mdp | 66 +-
.../DynamicIndexScan-Heterogenous-NoDTS.mdp | 61 +-
.../DynamicIndexScan-Heterogenous-Overlapping.mdp | 61 +-
...icIndexScan-Heterogenous-PartSelectEquality.mdp | 79 +-
...namicIndexScan-Heterogenous-PartSelectRange.mdp | 215 +--
.../DynamicIndexScan-Heterogenous-Union.mdp | 698 +---------
...ndexScan-Heterogenous-UnsupportedConstraint.mdp | 72 +-
.../dxl/minidump/DynamicIndexScan-Heterogenous.mdp | 61 +-
...cIndexScan-Homogenous-EnabledDateConstraint.mdp | 66 +-
...cIndexScan-Homogenous-UnsupportedConstraint.mdp | 66 +-
.../dxl/minidump/DynamicIndexScan-Homogenous.mdp | 78 +-
.../DynamicIndexScan-OpenEndedPartitions.mdp | 61 +-
.../data/dxl/minidump/DynamicIndexScan-Relabel.mdp | 213 +--
.../data/dxl/minidump/EffectOfLocalPredOnJoin2.mdp | 677 +---------
.../data/dxl/minidump/EffectOfLocalPredOnJoin3.mdp | 876 +-----------
.../minidump/ExtractOneBindingFromScalarGroups.mdp | 1 +
.../data/dxl/minidump/ExtractPredicateFromDisj.mdp | 778 +----------
.../FullJoin-Subquery-CastedPredicates.mdp | 1 +
.../Gist-NestedLoopJoin-Lossy-IndexPlan.mdp | 1 +
.../Gist-NestedLoopJoin-Postgis-IndexPlan.mdp | 1 +
.../Gist-NonPart-Lossy-BitmapIndexPlan.mdp | 1 +
.../dxl/minidump/Gist-NonPart-Lossy-IndexPlan.mdp | 1 +
.../data/dxl/minidump/Gist-OrderBy-BitmapPlan.mdp | 1 +
.../data/dxl/minidump/Gist-OrderBy-IndexPlan.mdp | 1 +
.../minidump/Gist-PartTable-Lossy-IndexPlan.mdp | 117 +-
.../Gist-PartTable-NonLossy-BitmapIndexPlan.mdp | 75 +-
.../dxl/minidump/Gist-PartialIndex-TableScan.mdp | 150 +--
.../data/dxl/minidump/GroupingOnSameTblCol-1.mdp | 1 +
.../dxl/minidump/HJN-DPE-Bitmap-Outer-Child.mdp | 506 +------
.../minidump/Index-Join-With-Subquery-In-Pred.mdp | 1 +
...dexApply-Heterogeneous-BothSidesPartitioned.mdp | 222 +---
.../dxl/minidump/IndexApply-Heterogeneous-DTS.mdp | 3 +
.../minidump/IndexApply-Heterogeneous-NoDTS.mdp | 128 +-
.../dxl/minidump/IndexApply-InnerSelect-Basic.mdp | 1 +
.../IndexApply-InnerSelect-Heterogeneous-DTS.mdp | 160 +--
.../minidump/IndexApply-InnerSelect-PartTable.mdp | 168 +--
.../minidump/IndexApply-InnerSelect-PartTable2.mdp | 96 +-
.../dxl/minidump/IndexApply-LeftOuter-NLJoin.mdp | 2 +
.../IndexApply-MultiDistKey-WithComplexPreds.mdp | 1 +
...pply-MultiDistKeys-IncompletePDS-3-DistCols.mdp | 1 +
.../minidump/IndexApply-No-Motion-Below-Join.mdp | 1 +
.../minidump/IndexApply-PartKey-Is-IndexKey.mdp | 151 +--
.../dxl/minidump/IndexApply-PartResolverExpand.mdp | 1 +
.../data/dxl/minidump/IndexApply-PartTable.mdp | 223 +---
.../IndexApply-Redistribute-Const-Table.mdp | 1 +
.../minidump/IndexApply1-CalibratedCostModel.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply1.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply2.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply3.mdp | 1 +
.../gporca/data/dxl/minidump/IndexApply4.mdp | 1 +
.../IndexApply_NestLoopWithNestParamTrue.mdp | 1 +
.../data/dxl/minidump/IndexGet-OuterRefs.mdp | 1 +
.../dxl/minidump/IndexNLJ-IndexGet-OuterRef.mdp | 1 +
.../dxl/minidump/IndexNLJoin_Cast_NoMotion.mdp | 1 +
...itionToRootTableContainingHeterogenousIndex.mdp | 1 +
...nLeaf-AddPartitionToRootWithHomogenousIndex.mdp | 1 +
...rlappingHeterogenousIndex-ANDPredicate-HEAP.mdp | 1 +
...rlappingHeterogenousIndex-ANDPredicate-HEAP.mdp | 1 +
...-SingleColumnHeterogenousIndexOnRoot-1-HEAP.mdp | 1 +
...-SingleColumnHeterogenousIndexOnRoot-2-HEAP.mdp | 1 +
.../minidump/IndexOnlyScan-NoDistKeyInIndex.mdp | 1 +
.../data/dxl/minidump/IndexScan-BoolFalse.mdp | 1 +
.../data/dxl/minidump/IndexScan-BoolTrue.mdp | 1 +
.../data/dxl/minidump/IndexScan-DroppedColumns.mdp | 1 +
.../data/dxl/minidump/IndexScan-ORPredsAOPart.mdp | 372 +-----
.../gporca/data/dxl/minidump/IndexScan-Relabel.mdp | 1 +
.../minidump/IndexScanWithNestedCTEAndSetOp.mdp | 1 +
.../gporca/data/dxl/minidump/IndexedNLJBitmap.mdp | 201 +--
.../gporca/data/dxl/minidump/InferPredicates.mdp | 117 +-
.../data/dxl/minidump/InferPredicatesForPartSQ.mdp | 66 +-
.../dxl/minidump/InferPredicatesInnerOfLOJ.mdp | 53 +-
.../data/dxl/minidump/Join-Varchar-Equality.mdp | 174 +--
...inOptimizationLevelQuery3WayHashJoinPartTbl.mdp | 136 +-
.../gporca/data/dxl/minidump/JoinOrderDPE.mdp | 186 +--
.../data/dxl/minidump/LOJ-DynBitmapIndex.mdp | 121 +-
.../gporca/data/dxl/minidump/LOJ-DynBtreeIndex.mdp | 96 +-
.../minidump/LOJ-IndexApply-CompsiteKey-Equiv.mdp | 1 +
.../LOJ-IndexApply-CompsiteKey-NoMotion.mdp | 1 +
.../LOJ-IndexApply-DistKey-Multiple-Predicates.mdp | 1 +
.../minidump/LOJ-IndexApply-MasterOnly-Table.mdp | 2 +
...ly-MultiDistKey-MultiIndexKey-NoExtraFilter.mdp | 1 +
.../LOJ-IndexApply-MultiDistKey-MultiIndexKey.mdp | 1 +
.../LOJ-IndexApply-MultiDistKeys-IndexKeys.mdp | 1 +
...J-IndexApply-MultiDistKeys-WithComplexPreds.mdp | 1 +
.../dxl/minidump/LOJ-IndexApply-MultiIndexes.mdp | 1 +
.../dxl/minidump/LOJ-IndexApply-NonDistKey.mdp | 1 +
.../LOJ-IndexApply-WithComplexPredicates.mdp | 1 +
.../LOJ_convert_to_inner_with_and_predicate.mdp | 1 +
.../LOJ_convert_to_inner_with_or_predicate.mdp | 1 +
.../data/dxl/minidump/LargeMultiColumnInList.mdp | 1307 ++----------------
.../dxl/minidump/LogicalIndexGetDroppedCols.mdp | 1 +
.../gporca/data/dxl/minidump/MS-UnionAll-1.mdp | 1343 +++++--------------
.../gporca/data/dxl/minidump/MS-UnionAll-2.mdp | 1343 +++++--------------
.../gporca/data/dxl/minidump/MS-UnionAll-4.mdp | 1391 +++++---------------
.../gporca/data/dxl/minidump/MS-UnionAll-5.mdp | 412 ++----
.../gporca/data/dxl/minidump/MS-UnionAll-6.mdp | 408 ++----
.../gporca/data/dxl/minidump/MS-UnionAll-7.mdp | 408 ++----
.../dxl/minidump/NLJ-Broadcast-DPE-Outer-Child.mdp | 170 +--
.../data/dxl/minidump/Negative-IndexApply1.mdp | 2 +
.../data/dxl/minidump/Negative-IndexApply2.mdp | 2 +
.../dxl/minidump/NestedNLJWithBlockingSpool.mdp | 1 +
.../data/dxl/minidump/NewBtreeIndexScanCost.mdp | 1 +
.../gporca/data/dxl/minidump/NoSortPlan.mdp | 1 +
...ngHomogenousIndexesOnRoot-ANDPredicate-HEAP.mdp | 1 +
...ngHomogenousIndexesOnRoot-ANDPredicate-HEAP.mdp | 1 +
.../OverlappingHomogenousIndexesOnRoot-HEAP.mdp | 1 +
.../dxl/minidump/Part-Selection-ConstArray-1.mdp | 128 +-
.../dxl/minidump/Part-Selection-ConstArray-2.mdp | 128 +-
.../gporca/data/dxl/minidump/Part-Selection-IN.mdp | 68 +-
.../data/dxl/minidump/Part-Selection-NOT-IN.mdp | 140 +-
.../data/dxl/minidump/PartPredsWithRandom.mdp | 128 +-
.../data/dxl/minidump/PartSelectorOnJoinSide.mdp | 396 +-----
.../data/dxl/minidump/PartSelectorOnJoinSide2.mdp | 739 +----------
.../PartTbl-AggWithExistentialSubquery.mdp | 144 +-
.../gporca/data/dxl/minidump/PartTbl-ArrayIn.mdp | 132 +-
.../minidump/PartTbl-AsymmetricRangePredicate.mdp | 62 +-
.../dxl/minidump/PartTbl-AvoidRangePred-DPE.mdp | 640 +--------
.../data/dxl/minidump/PartTbl-CSQ-NonPartKey.mdp | 369 +-----
.../data/dxl/minidump/PartTbl-CSQ-PartKey.mdp | 369 +-----
.../dxl/minidump/PartTbl-ComplexPredicate1.mdp | 127 +-
.../dxl/minidump/PartTbl-ComplexPredicate2.mdp | 537 +-------
.../dxl/minidump/PartTbl-ComplexPredicate3.mdp | 603 +--------
.../dxl/minidump/PartTbl-ComplexPredicate4.mdp | 669 +---------
.../dxl/minidump/PartTbl-ComplexPredicate5.mdp | 647 +--------
.../PartTbl-ComplexRangePredicate-DefaultPart.mdp | 170 +--
...PartTbl-ComplexRangePredicate-NoDefaultPart.mdp | 152 +--
.../minidump/PartTbl-DPE-Correlated-NLOuter.mdp | 62 +-
.../data/dxl/minidump/PartTbl-DPE-GroupBy.mdp | 238 +---
.../gporca/data/dxl/minidump/PartTbl-DPE-Limit.mdp | 238 +---
.../gporca/data/dxl/minidump/PartTbl-DPE.mdp | 252 +---
.../gporca/data/dxl/minidump/PartTbl-DateTime.mdp | 396 +-----
.../dxl/minidump/PartTbl-DisablePartSelection.mdp | 128 +-
.../minidump/PartTbl-DisablePartSelectionJoin.mdp | 164 +--
.../data/dxl/minidump/PartTbl-Disjunction.mdp | 141 +-
.../minidump/PartTbl-EqPredicateWithCastRange.mdp | 136 +-
.../gporca/data/dxl/minidump/PartTbl-HJ3.mdp | 328 +----
.../gporca/data/dxl/minidump/PartTbl-HJ4.mdp | 276 +---
.../gporca/data/dxl/minidump/PartTbl-HJ5.mdp | 226 +---
.../gporca/data/dxl/minidump/PartTbl-IDFList.mdp | 183 +--
.../gporca/data/dxl/minidump/PartTbl-IDFNull.mdp | 183 +--
.../data/dxl/minidump/PartTbl-IDFWithCast.mdp | 136 +-
.../dxl/minidump/PartTbl-IndexOnDefPartOnly.mdp | 243 +---
.../dxl/minidump/PartTbl-IsNotNullPredicate.mdp | 112 +-
.../data/dxl/minidump/PartTbl-IsNullPredicate.mdp | 80 +-
.../data/dxl/minidump/PartTbl-JoinOverExcept.mdp | 324 +----
.../data/dxl/minidump/PartTbl-JoinOverGbAgg-2.mdp | 255 +---
.../data/dxl/minidump/PartTbl-JoinOverGbAgg.mdp | 328 +----
.../dxl/minidump/PartTbl-JoinOverIntersect.mdp | 328 +----
.../data/dxl/minidump/PartTbl-JoinOverUnion-1.mdp | 324 +----
.../data/dxl/minidump/PartTbl-JoinOverUnion-2.mdp | 164 +--
.../gporca/data/dxl/minidump/PartTbl-LASJ.mdp | 176 +--
.../PartTbl-LeftOuterHashJoin-DPE-IsNull.mdp | 80 +-
.../PartTbl-LeftOuterNLJoin-DPE-IsNull.mdp | 80 +-
.../minidump/PartTbl-List-DPE-Int-Predicates.mdp | 386 ++----
.../data/dxl/minidump/PartTbl-MultiWayJoin.mdp | 74 +-
.../dxl/minidump/PartTbl-MultiWayJoinWithDPE-2.mdp | 1378 ++-----------------
.../dxl/minidump/PartTbl-MultiWayJoinWithDPE.mdp | 1320 ++-----------------
.../data/dxl/minidump/PartTbl-NEqPredicate.mdp | 109 +-
.../data/dxl/minidump/PartTbl-NonConstSelect.mdp | 217 +--
.../dxl/minidump/PartTbl-PredicateWithCast.mdp | 136 +-
.../dxl/minidump/PartTbl-PredicateWithCastList.mdp | 136 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost1.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost2.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost3.mdp | 124 +-
.../PartTbl-SPE-DynamicTableScan-List-Cost4.mdp | 218 +--
.../PartTbl-SPE-DynamicTableScan-List-Cost5.mdp | 124 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost1.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost2.mdp | 127 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost3.mdp | 306 +----
.../PartTbl-SPE-DynamicTableScan-Range-Cost4.mdp | 72 +-
.../PartTbl-SPE-DynamicTableScan-Range-Cost5.mdp | 478 +------
.../gporca/data/dxl/minidump/PartTbl-SQAll.mdp | 256 +---
.../gporca/data/dxl/minidump/PartTbl-SQAny.mdp | 272 +---
.../gporca/data/dxl/minidump/PartTbl-SQExists.mdp | 252 +---
.../data/dxl/minidump/PartTbl-SQNotExists.mdp | 252 +---
.../gporca/data/dxl/minidump/PartTbl-SQScalar.mdp | 256 +---
.../data/dxl/minidump/PartTbl-SubqueryOuterRef.mdp | 385 +-----
.../data/dxl/minidump/PartTbl-VolatileFunc.mdp | 206 +--
.../data/dxl/minidump/PartTbl-WindowFunction.mdp | 136 +-
.../minidump/PushSelectWithOuterRefBelowUnion.mdp | 239 +---
...ueryMismatchedDistribution-DynamicIndexScan.mdp | 70 +-
.../dxl/minidump/QueryMismatchedDistribution.mdp | 173 +--
.../minidump/ReplicatedJoinPartitionedTable.mdp | 62 +-
.../data/dxl/minidump/RightJoinNoDPSNonDistKey.mdp | 304 +----
.../data/dxl/minidump/Select-Over-PartTbl.mdp | 423 +-----
.../data/dxl/minidump/Select-Proj-OuterJoin.mdp | 2 +
.../SingleColumnHomogenousIndexOnRoot-HEAP.mdp | 1 +
...SpoolShouldInvalidateUnresolvedDynamicScans.mdp | 108 +-
.../dxl/minidump/Stat-Derivation-Leaf-Pattern.mdp | 2 +
.../data/dxl/minidump/TPCH-Partitioned-256GB.mdp | 396 +-----
.../dxl/minidump/TimeTypeStatsNotComparable.mdp | 1 +
.../gporca/data/dxl/minidump/UnnestSQJoins.mdp | 1 +
.../gporca/data/dxl/parse_tests/q37-IndexScan.xml | 1 +
.../data/dxl/parse_tests/q48-IndexOnlyScan.xml | 1 +
235 files changed, 6760 insertions(+), 35885 deletions(-)
diff --git a/src/backend/gporca/data/dxl/indexjoin/positive_04.mdp b/src/backend/gporca/data/dxl/indexjoin/positive_04.mdp
index c495b5b18e..804714a6be 100644
--- a/src/backend/gporca/data/dxl/indexjoin/positive_04.mdp
+++ b/src/backend/gporca/data/dxl/indexjoin/positive_04.mdp
@@ -16973,6 +16973,7 @@
<dxl:Ident ColId="57" ColName="i_item_sk" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.33052182.1.0" IndexName="store_returns_pkey"/>
<dxl:TableDescriptor Mdid="0.33052156.1.1" TableName="store_returns">
<dxl:Columns>
@@ -17027,6 +17028,7 @@
<dxl:Ident ColId="57" ColName="i_item_sk" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.33052642.1.0" IndexName="store_sales_pkey"/>
<dxl:TableDescriptor Mdid="0.33052616.1.1" TableName="store_sales">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
index dd1832e7c7..4a882ec686 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-3.mdp
@@ -397,15 +397,15 @@
</dxl:ProjList>
<dxl:TableDescriptor Mdid="0.16391.1.0" TableName="t1_random">
<dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="33" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="13" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
<dxl:RandomMotion InputSegments="0,1" OutputSegments="0,1">
@@ -461,10 +461,23 @@
<dxl:Ident ColId="10" ColName="column2" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:JoinFilter>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000010" 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:Partitions>
+ <dxl:Partition Mdid="0.16467001.1.0"/>
+ <dxl:Partition Mdid="0.16467002.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16467.1.0" TableName="part_random_t1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -478,70 +491,7 @@
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="12" Alias="a">
- <dxl:Ident ColId="12" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="13" Alias="b">
- <dxl:Ident ColId="13" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467001.1.0" TableName="part_random_t1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="12" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-8" 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.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="21" Alias="a">
- <dxl:Ident ColId="21" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="b">
- <dxl:Ident ColId="22" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467002.1.0" TableName="part_random_t1_prt_2">
- <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="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="24" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.000004" Rows="1.000000" Width="4"/>
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
index 04b64143da..920ce1c839 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-4.mdp
@@ -451,15 +451,15 @@
</dxl:ProjList>
<dxl:TableDescriptor Mdid="0.16391.1.0" TableName="t1_random">
<dxl:Columns>
- <dxl:Column ColId="59" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="60" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="62" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="23" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="24" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="25" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
+ <dxl:Column ColId="26" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="27" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="28" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="29" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="30" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="31" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
<dxl:RandomMotion InputSegments="0,1" OutputSegments="0,1">
@@ -528,10 +528,23 @@
<dxl:Ident ColId="10" ColName="column2" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:JoinFilter>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000010" 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:Partitions>
+ <dxl:Partition Mdid="0.16467001.1.0"/>
+ <dxl:Partition Mdid="0.16467002.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16467.1.0" TableName="part_random_t1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -545,70 +558,7 @@
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="23" Alias="a">
- <dxl:Ident ColId="23" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="b">
- <dxl:Ident ColId="24" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467001.1.0" TableName="part_random_t1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="23" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="26" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-8" 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.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="32" Alias="a">
- <dxl:Ident ColId="32" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="33" Alias="b">
- <dxl:Ident ColId="33" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467002.1.0" TableName="part_random_t1_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="32" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="35" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.000004" Rows="1.000000" Width="4"/>
@@ -644,10 +594,23 @@
<dxl:Ident ColId="21" ColName="column2" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:JoinFilter>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="2" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="2" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="11" Alias="a">
+ <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="12" Alias="b">
+ <dxl:Ident ColId="12" ColName="b" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16467001.1.0"/>
+ <dxl:Partition Mdid="0.16467002.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16467.1.0" TableName="part_random_t1">
<dxl:Columns>
<dxl:Column ColId="11" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -661,70 +624,7 @@
<dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="11" Alias="a">
- <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="b">
- <dxl:Ident ColId="12" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="41" Alias="a">
- <dxl:Ident ColId="41" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="b">
- <dxl:Ident ColId="42" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467001.1.0" TableName="part_random_t1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="41" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" 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.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467002.1.0" TableName="part_random_t1_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="53" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.000004" Rows="1.000000" Width="4"/>
diff --git a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
index cb180af9cd..5e8d0aee2a 100644
--- a/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AddRedistributeBeforeInsert-5.mdp
@@ -317,15 +317,15 @@
</dxl:ProjList>
<dxl:TableDescriptor Mdid="0.16474.1.0" TableName="t1_random">
<dxl:Columns>
- <dxl:Column ColId="19" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="22" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
+ <dxl:Column ColId="13" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="14" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="15" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
<dxl:RandomMotion InputSegments="0,1,2" OutputSegments="0,1,2">
@@ -362,10 +362,22 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000007" 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:Partitions>
+ <dxl:Partition Mdid="0.16511001.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16511.1.0" TableName="part1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -379,43 +391,7 @@
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000007" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16511001.1.0" TableName="part1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="13" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:Result>
</dxl:RandomMotion>
</dxl:DMLInsert>
diff --git a/src/backend/gporca/data/dxl/minidump/AssertMaxOneRow.mdp b/src/backend/gporca/data/dxl/minidump/AssertMaxOneRow.mdp
index 2ca8470ccc..8cfdbb6507 100644
--- a/src/backend/gporca/data/dxl/minidump/AssertMaxOneRow.mdp
+++ b/src/backend/gporca/data/dxl/minidump/AssertMaxOneRow.mdp
@@ -1666,6 +1666,7 @@ where oid= (select reltoastrelid from pg_class where relname='fsts_alter_set_sto
<dxl:ConstValue TypeMdid="0.19.1.0" Value="ZnN0c19hbHRlcl9zZXRfc3RvcmFnZV90YWJsZQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA=="/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.2663.1.0" IndexName="pg_class_relname_nsp_index"/>
<dxl:TableDescriptor Mdid="0.1259.1.1" TableName="pg_class">
<dxl:Columns>
@@ -1705,6 +1706,7 @@ where oid= (select reltoastrelid from pg_class where relname='fsts_alter_set_sto
<dxl:Ident ColId="85" ColName="reltoastrelid" TypeMdid="0.26.1.0"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.2662.1.0" IndexName="pg_class_oid_index"/>
<dxl:TableDescriptor Mdid="0.1259.1.1" TableName="pg_class">
<dxl:Columns>
@@ -1744,6 +1746,7 @@ where oid= (select reltoastrelid from pg_class where relname='fsts_alter_set_sto
<dxl:Ident ColId="48" ColName="reltoastidxid" TypeMdid="0.26.1.0"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.2662.1.0" IndexName="pg_class_oid_index"/>
<dxl:TableDescriptor Mdid="0.1259.1.1" TableName="pg_class">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/BTreeIndex-Against-ScalarSubquery.mdp b/src/backend/gporca/data/dxl/minidump/BTreeIndex-Against-ScalarSubquery.mdp
index 0f11109084..356935e113 100644
--- a/src/backend/gporca/data/dxl/minidump/BTreeIndex-Against-ScalarSubquery.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BTreeIndex-Against-ScalarSubquery.mdp
@@ -378,6 +378,7 @@ SELECT * FROM btree_test WHERE a in (select 1);
<dxl:Ident ColId="9" ColName="?column?" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.4524693.1.0" IndexName="test_index"/>
<dxl:TableDescriptor Mdid="0.4524666.1.1" TableName="btree_test">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
index 85174c551e..fd20c5f4a9 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-InnerSelect-PartTable.mdp
@@ -862,7 +862,7 @@ select * from x, y where x.i > y.j and y.k = 10;
</dxl:TableDescriptor>
</dxl:TableScan>
</dxl:BroadcastMotion>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="391.295690" Rows="1.000000" Width="24"/>
</dxl:Properties>
@@ -880,191 +880,54 @@ select * from x, y where x.i > y.j and y.k = 10;
<dxl:Ident ColId="14" ColName="m" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="391.295690" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="i">
- <dxl:Ident ColId="22" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="j">
- <dxl:Ident ColId="23" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="k">
- <dxl:Ident ColId="24" ColName="k" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="m">
- <dxl:Ident ColId="25" ColName="m" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="23" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="24" ColName="k" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="23" ColName="j" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="12" ColName="j" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="23" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.1523097449.1.0" IndexName="y_idx_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.1522932449.1.1" TableName="y_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="k" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="m" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="391.295690" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="i">
- <dxl:Ident ColId="33" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="j">
- <dxl:Ident ColId="34" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="k">
- <dxl:Ident ColId="35" ColName="k" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="m">
- <dxl:Ident ColId="36" ColName="m" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="34" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="35" ColName="k" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="34" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="13" ColName="k" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="34" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.1523097450.1.0" IndexName="y_idx_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.1522932450.1.1" TableName="y_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="k" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="m" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="391.295690" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="i">
- <dxl:Ident ColId="44" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="j">
- <dxl:Ident ColId="45" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="k">
- <dxl:Ident ColId="46" ColName="k" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="m">
- <dxl:Ident ColId="47" ColName="m" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="45" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="46" ColName="k" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="12" ColName="j" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="45" ColName="j" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="12" ColName="j" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="45" ColName="j" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.1523097451.1.0" IndexName="y_idx_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.1522932451.1.1" TableName="y_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="k" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="m" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.53062705.1.0" IndexName="y_idx_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.1522932449.1.1"/>
+ <dxl:Partition Mdid="0.1522932450.1.1"/>
+ <dxl:Partition Mdid="0.1522932451.1.1"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.53062540.1.1" TableName="y">
+ <dxl:Columns>
+ <dxl:Column ColId="11" Attno="1" ColName="i" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="12" Attno="2" ColName="j" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="13" Attno="3" ColName="k" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="14" Attno="4" ColName="m" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="15" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="16" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="17" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="18" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="19" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="20" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="21" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:NestedLoopJoin>
</dxl:GatherMotion>
</dxl:Plan>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
index a93b74fa5d..41546d77ab 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexApply-PartTable.mdp
@@ -1889,7 +1889,7 @@ ORDER BY 1 asc ;
</dxl:TableDescriptor>
</dxl:TableScan>
</dxl:BroadcastMotion>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="457.941664" Rows="1.000000" Width="1"/>
</dxl:Properties>
@@ -1904,233 +1904,70 @@ ORDER BY 1 asc ;
<dxl:Ident ColId="15" ColName="end_ts" TypeMdid="0.20.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="457.941664" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="24" Alias="ets">
- <dxl:Ident ColId="24" ColName="ets" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="sym">
- <dxl:Ident ColId="25" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="28" Alias="end_ts">
- <dxl:Ident ColId="28" ColName="end_ts" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="24" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="28" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1054.1.0">
- <dxl:Cast TypeMdid="0.1042.1.0" FuncId="0.0.0.0">
- <dxl:Ident ColId="25" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:Cast>
- <dxl:Ident ColId="0" ColName="symbol" TypeMdid="0.1042.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="24" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="28" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="24" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="28" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1013039183.1.0" IndexName="my_tq_agg_small_ets_end_ts_ix_1_prt_p1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-1013210183.1.1" TableName="my_tq_agg_small_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="24" Attno="1" ColName="ets" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="25" Attno="2" ColName="sym" TypeMdid="0.1043.1.0" ColWidth="16"/>
- <dxl:Column ColId="26" Attno="3" ColName="bid_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="27" Attno="4" ColName="ask_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="28" Attno="5" ColName="end_ts" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="457.941664" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="36" Alias="ets">
- <dxl:Ident ColId="36" ColName="ets" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="37" Alias="sym">
- <dxl:Ident ColId="37" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="40" Alias="end_ts">
- <dxl:Ident ColId="40" ColName="end_ts" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="36" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="40" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1054.1.0">
- <dxl:Cast TypeMdid="0.1042.1.0" FuncId="0.0.0.0">
- <dxl:Ident ColId="37" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:Cast>
- <dxl:Ident ColId="0" ColName="symbol" TypeMdid="0.1042.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="36" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="40" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="36" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="40" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1013039182.1.0" IndexName="my_tq_agg_small_ets_end_ts_ix_1_prt_p1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-1013210182.1.1" TableName="my_tq_agg_small_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="36" Attno="1" ColName="ets" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="37" Attno="2" ColName="sym" TypeMdid="0.1043.1.0" ColWidth="16"/>
- <dxl:Column ColId="38" Attno="3" ColName="bid_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="39" Attno="4" ColName="ask_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="40" Attno="5" ColName="end_ts" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="41" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="42" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="44" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="457.941664" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="48" Alias="ets">
- <dxl:Ident ColId="48" ColName="ets" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="49" Alias="sym">
- <dxl:Ident ColId="49" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="end_ts">
- <dxl:Ident ColId="52" ColName="end_ts" TypeMdid="0.20.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="48" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="52" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1054.1.0">
- <dxl:Cast TypeMdid="0.1042.1.0" FuncId="0.0.0.0">
- <dxl:Ident ColId="49" ColName="sym" TypeMdid="0.1043.1.0"/>
- </dxl:Cast>
- <dxl:Ident ColId="0" ColName="symbol" TypeMdid="0.1042.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="48" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="52" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
- <dxl:Ident ColId="48" ColName="ets" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
- <dxl:Ident ColId="52" ColName="end_ts" TypeMdid="0.20.1.0"/>
- <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1013039181.1.0" IndexName="my_tq_agg_small_ets_end_ts_ix_1_prt_p1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-1013210181.1.1" TableName="my_tq_agg_small_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="48" Attno="1" ColName="ets" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="49" Attno="2" ColName="sym" TypeMdid="0.1043.1.0" ColWidth="16"/>
- <dxl:Column ColId="50" Attno="3" ColName="bid_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="51" Attno="4" ColName="ask_price" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="52" Attno="5" ColName="end_ts" TypeMdid="0.20.1.0" ColWidth="8"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ <dxl:Filter>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
+ <dxl:Ident ColId="11" ColName="ets" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
+ <dxl:Ident ColId="15" ColName="end_ts" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1054.1.0">
+ <dxl:Cast TypeMdid="0.1042.1.0" FuncId="0.0.0.0">
+ <dxl:Ident ColId="12" ColName="sym" TypeMdid="0.1043.1.0"/>
+ </dxl:Cast>
+ <dxl:Ident ColId="0" ColName="symbol" TypeMdid="0.1042.1.0"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
+ <dxl:Ident ColId="11" ColName="ets" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
+ <dxl:Ident ColId="15" ColName="end_ts" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.414.1.0">
+ <dxl:Ident ColId="11" ColName="ets" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.413.1.0">
+ <dxl:Ident ColId="15" ColName="end_ts" TypeMdid="0.20.1.0"/>
+ <dxl:Ident ColId="1" ColName="event_ts" TypeMdid="0.20.1.0"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.16166830.1.0" IndexName="my_tq_agg_small_ets_end_ts_ix_1_prt_p1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.-1013210183.1.1"/>
+ <dxl:Partition Mdid="0.-1013210182.1.1"/>
+ <dxl:Partition Mdid="0.-1013210181.1.1"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.16166659.1.1" TableName="my_tq_agg_small">
+ <dxl:Columns>
+ <dxl:Column ColId="11" Attno="1" ColName="ets" TypeMdid="0.20.1.0"/>
+ <dxl:Column ColId="12" Attno="2" ColName="sym" TypeMdid="0.1043.1.0" ColWidth="16"/>
+ <dxl:Column ColId="13" Attno="3" ColName="bid_price" TypeMdid="0.1700.1.0"/>
+ <dxl:Column ColId="15" Attno="5" ColName="end_ts" TypeMdid="0.20.1.0"/>
+ <dxl:Column ColId="16" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="17" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="18" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="19" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="20" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="21" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="22" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:NestedLoopJoin>
</dxl:Result>
</dxl:RedistributeMotion>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
index 5a5a674d8f..3aed83f28a 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProject.mdp
@@ -2016,7 +2016,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
</dxl:Properties>
@@ -2034,269 +2034,80 @@
<dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="dist_a">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="b">
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="c">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="part_d">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33012003.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32977003.1.0" TableName="foo_prt_3" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="dist_a">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="b">
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="c">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="part_d">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33012004.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32977004.1.0" TableName="foo_prt_4" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="dist_a">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="b">
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="c">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="part_d">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33012005.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32977005.1.0" TableName="foo_prt_5" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ <dxl:Filter>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.33012.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.32977003.1.0"/>
+ <dxl:Partition Mdid="0.32977004.1.0"/>
+ <dxl:Partition Mdid="0.32977005.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.32977.1.0" TableName="foo" ExecuteAsUser="10">
+ <dxl:Columns>
+ <dxl:Column ColId="10" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="13" Attno="4" ColName="part_d" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:Result>
<dxl:NLJIndexParamList>
<dxl:NLJIndexParam ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
index 6e08e2ee0f..4286be8160 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLJWithProjectNoFilt.mdp
@@ -1211,7 +1211,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
</dxl:Properties>
@@ -1229,313 +1229,56 @@
<dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="dist_a">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="b">
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="c">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="part_d">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33184001.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.33149001.1.0" TableName="foo_prt_1" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="dist_a">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="b">
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="c">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="part_d">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33184002.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.33149002.1.0" TableName="foo_prt_2" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="dist_a">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="b">
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="c">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="part_d">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33184003.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.33149003.1.0" TableName="foo_prt_3" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="55" Alias="dist_a">
- <dxl:Ident ColId="55" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="56" Alias="b">
- <dxl:Ident ColId="56" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="57" Alias="c">
- <dxl:Ident ColId="57" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="58" Alias="part_d">
- <dxl:Ident ColId="58" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="55" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="56" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="55" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="55" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33184004.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.33149004.1.0" TableName="foo_prt_4" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="55" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="60" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="62" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="10454.797600" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="66" Alias="dist_a">
- <dxl:Ident ColId="66" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="67" Alias="b">
- <dxl:Ident ColId="67" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="68" Alias="c">
- <dxl:Ident ColId="68" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="69" Alias="part_d">
- <dxl:Ident ColId="69" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="66" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="67" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="66" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="66" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33184005.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.33149005.1.0" TableName="foo_prt_5" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="66" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="68" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="70" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="71" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="72" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="73" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="74" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="75" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.33184.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.33149001.1.0"/>
+ <dxl:Partition Mdid="0.33149002.1.0"/>
+ <dxl:Partition Mdid="0.33149003.1.0"/>
+ <dxl:Partition Mdid="0.33149004.1.0"/>
+ <dxl:Partition Mdid="0.33149005.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.33149.1.0" TableName="foo" ExecuteAsUser="10">
+ <dxl:Columns>
+ <dxl:Column ColId="10" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="13" Attno="4" ColName="part_d" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:Result>
<dxl:NLJIndexParamList>
<dxl:NLJIndexParam ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
index 8fcb408a3e..3f2f1107ca 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexNLOJWithProject.mdp
@@ -2010,7 +2010,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
</dxl:Properties>
@@ -2028,269 +2028,80 @@
<dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="dist_a">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="b">
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="c">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="part_d">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.32957003.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32922003.1.0" TableName="foo_prt_3" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="dist_a">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="b">
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="c">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="part_d">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.32957004.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32922004.1.0" TableName="foo_prt_4" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="437.284732" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="dist_a">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="b">
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="c">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="part_d">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.32957005.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.32922005.1.0" TableName="foo_prt_5" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ <dxl:Filter>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.32957.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.32922003.1.0"/>
+ <dxl:Partition Mdid="0.32922004.1.0"/>
+ <dxl:Partition Mdid="0.32922005.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.32922.1.0" TableName="foo" ExecuteAsUser="10">
+ <dxl:Columns>
+ <dxl:Column ColId="10" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="13" Attno="4" ColName="part_d" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:Result>
<dxl:NLJIndexParamList>
<dxl:NLJIndexParam ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapIndexProbeMergeFilters.mdp b/src/backend/gporca/data/dxl/minidump/BitmapIndexProbeMergeFilters.mdp
index 100bf06d10..6746f0b010 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapIndexProbeMergeFilters.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapIndexProbeMergeFilters.mdp
@@ -769,7 +769,7 @@ EXPLAIN SELECT * FROM table_with_two_indices_ao WHERE b = 15 AND c BETWEEN 10000
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.061218" Rows="1.766098" Width="12"/>
</dxl:Properties>
@@ -784,77 +784,80 @@ EXPLAIN SELECT * FROM table_with_two_indices_ao WHERE b = 15 AND c BETWEEN 10000
<dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.061218" Rows="1.766098" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="6" Alias="a">
- <dxl:Ident ColId="6" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="7" Alias="b">
- <dxl:Ident ColId="7" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="8" Alias="c">
- <dxl:Ident ColId="8" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:And>
<dxl:And>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="8" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="8" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
- </dxl:Comparison>
- </dxl:And>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ </dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="15"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:And>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ </dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="15"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:RecheckCond>
+ <dxl:BitmapAnd TypeMdid="0.2283.1.0">
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.45040.1.0" IndexName="idx_c_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="7" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="15"/>
</dxl:Comparison>
- </dxl:And>
- </dxl:RecheckCond>
- <dxl:BitmapAnd TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="8" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="8" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10000"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.45040001.1.0" IndexName="idx_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="7" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="15"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.44979001.1.0" IndexName="idx_b_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapAnd>
- <dxl:TableDescriptor Mdid="0.44841001.1.0" TableName="table_with_two_indices_ao_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="6" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="7" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="8" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="9" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="10" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.44979.1.0" IndexName="idx_b_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ </dxl:BitmapAnd>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.44841001.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.44841.1.0" TableName="table_with_two_indices_ao">
+ <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="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="5" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/BitmapScan-Hetrogeneous-Partitioned.mdp b/src/backend/gporca/data/dxl/minidump/BitmapScan-Hetrogeneous-Partitioned.mdp
index 4572bd5307..e2158a6b13 100644
--- a/src/backend/gporca/data/dxl/minidump/BitmapScan-Hetrogeneous-Partitioned.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BitmapScan-Hetrogeneous-Partitioned.mdp
@@ -830,7 +830,7 @@ explain select * from t where b=3;
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="387.962211" Rows="1.000000" Width="8"/>
</dxl:Properties>
@@ -842,134 +842,46 @@ explain select * from t where b=3;
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.962211" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.181458.1.0" IndexName="idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.181437.1.0" TableName="t_1_prt_p1" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.962211" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="18" Alias="a">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="19" Alias="b">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.181462.1.0" IndexName="idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.181444.1.0" TableName="t_1_prt_p2" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.962211" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="27" Alias="a">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="28" Alias="b">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.181463.1.0" IndexName="idx"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.181451.1.0" TableName="t_1_prt_p3" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="27" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.181454.1.0" IndexName="idx"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.181437.1.0"/>
+ <dxl:Partition Mdid="0.181444.1.0"/>
+ <dxl:Partition Mdid="0.181451.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.181434.1.0" TableName="t" 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:DynamicBitmapTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
index 4e25d0c85a..f84b82f696 100644
--- a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLJWithProjectNoPart.mdp
@@ -1428,6 +1428,7 @@
<dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.33097.1.0" IndexName="t1_idx_ac"/>
<dxl:TableDescriptor Mdid="0.33087.1.0" TableName="t1" ExecuteAsUser="10">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
index 9ecef0b5b5..a18c9c938a 100644
--- a/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
+++ b/src/backend/gporca/data/dxl/minidump/BtreeIndexNLOJWithProject.mdp
@@ -825,7 +825,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000706" Rows="1.000000" Width="16"/>
</dxl:Properties>
@@ -843,215 +843,62 @@
<dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000706" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="dist_a">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="b">
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="c">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="part_d">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
<dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
<dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="25" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33144003.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- <dxl:TableDescriptor Mdid="0.33112003.1.0" TableName="foo_prt_3" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000706" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="dist_a">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="b">
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="c">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="part_d">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="36" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33144004.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- <dxl:TableDescriptor Mdid="0.33112004.1.0" TableName="foo_prt_4" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000706" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="dist_a">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="b">
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="c">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="part_d">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="f" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="dist_a" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
- <dxl:Ident ColId="47" ColName="part_d" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.33144005.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
- <dxl:TableDescriptor Mdid="0.33112005.1.0" TableName="foo_prt_5" ExecuteAsUser="10">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="part_d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="g" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="dist_a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">=" OperatorMdid="0.525.1.0">
+ <dxl:Ident ColId="13" ColName="part_d" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.33112003.1.0"/>
+ <dxl:Partition Mdid="0.33112004.1.0"/>
+ <dxl:Partition Mdid="0.33112005.1.0"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.33144.1.0" IndexName="foo_1_prt_1_dist_a_part_d_idx"/>
+ <dxl:TableDescriptor Mdid="0.33112.1.0" TableName="foo" ExecuteAsUser="10">
+ <dxl:Columns>
+ <dxl:Column ColId="10" Attno="1" ColName="dist_a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="13" Attno="4" ColName="part_d" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="16" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="17" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="18" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:Result>
<dxl:NLJIndexParamList>
<dxl:NLJIndexParam ColId="0" ColName="dist_e" TypeMdid="0.23.1.0"/>
diff --git a/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/FallBackToSerialAppend.mdp b/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/FallBackToSerialAppend.mdp
index bb7f5ed9d6..3b018d1159 100644
--- a/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/FallBackToSerialAppend.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CPhysicalParallelUnionAllTest/FallBackToSerialAppend.mdp
@@ -473,7 +473,7 @@ SELECT * FROM pp WHERE b=2 AND c=2;
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000136" Rows="1.000000" Width="12"/>
</dxl:Properties>
@@ -488,57 +488,43 @@ SELECT * FROM pp WHERE b=2 AND c=2;
<dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000136" Rows="1.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1859596295.1.0" IndexName="pp_1_prt_1_idx"/>
- <dxl:TableDescriptor Mdid="0.-1859740295.1.1" TableName="pp_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.-1859740295.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.2435371.1.0" IndexName="pp_1_prt_1_idx"/>
+ <dxl:TableDescriptor Mdid="0.2435227.1.1" TableName="pp">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/CTE-NoPushProperties.mdp b/src/backend/gporca/data/dxl/minidump/CTE-NoPushProperties.mdp
index 63bc9d6925..16d8fd9460 100644
--- a/src/backend/gporca/data/dxl/minidump/CTE-NoPushProperties.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTE-NoPushProperties.mdp
@@ -1792,10 +1792,35 @@
<dxl:Ident ColId="2" ColName="c" TypeMdid="0.1700.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.007883" Rows="1000.000000" Width="13"/>
</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.1700.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="2" Alias="c">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.1700.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16388.1.0"/>
+ <dxl:Partition Mdid="0.16394.1.0"/>
+ <dxl:Partition Mdid="0.16400.1.0"/>
+ <dxl:Partition Mdid="0.16406.1.0"/>
+ <dxl:Partition Mdid="0.16412.1.0"/>
+ <dxl:Partition Mdid="0.16418.1.0"/>
+ <dxl:Partition Mdid="0.16424.1.0"/>
+ <dxl:Partition Mdid="0.16430.1.0"/>
+ <dxl:Partition Mdid="0.16436.1.0"/>
+ <dxl:Partition Mdid="0.16442.1.0"/>
+ <dxl:Partition Mdid="0.16448.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16385.1.0" TableName="foo" LockMode="1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -1810,360 +1835,7 @@
<dxl:Column ColId="9" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="2" Alias="c">
- <dxl:Ident ColId="2" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16388.1.0" TableName="foo_1_prt_1" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="3"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16394.1.0" TableName="foo_1_prt_2" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16400.1.0" TableName="foo_1_prt_3" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="60" Alias="a">
- <dxl:Ident ColId="60" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="61" Alias="b">
- <dxl:Ident ColId="61" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="62" Alias="c">
- <dxl:Ident ColId="62" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16406.1.0" TableName="foo_1_prt_4" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="60" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="62" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="63" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="64" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="68" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="70" Alias="a">
- <dxl:Ident ColId="70" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="71" Alias="b">
- <dxl:Ident ColId="71" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="72" Alias="c">
- <dxl:Ident ColId="72" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16412.1.0" TableName="foo_1_prt_5" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="70" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="71" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="72" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="73" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="74" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="75" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="77" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="78" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="79" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="80" Alias="a">
- <dxl:Ident ColId="80" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="81" Alias="b">
- <dxl:Ident ColId="81" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="82" Alias="c">
- <dxl:Ident ColId="82" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16418.1.0" TableName="foo_1_prt_6" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="80" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="81" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="82" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="83" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="84" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="85" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="86" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="87" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="88" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="89" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="90" Alias="a">
- <dxl:Ident ColId="90" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="91" Alias="b">
- <dxl:Ident ColId="91" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="92" Alias="c">
- <dxl:Ident ColId="92" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16424.1.0" TableName="foo_1_prt_7" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="90" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="91" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="92" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="93" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="94" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="95" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="96" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="97" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="98" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="99" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="100" Alias="a">
- <dxl:Ident ColId="100" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="101" Alias="b">
- <dxl:Ident ColId="101" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="102" Alias="c">
- <dxl:Ident ColId="102" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16430.1.0" TableName="foo_1_prt_8" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="100" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="101" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="102" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="103" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="104" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="105" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="106" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="107" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="108" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="109" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="110" Alias="a">
- <dxl:Ident ColId="110" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="111" Alias="b">
- <dxl:Ident ColId="111" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="112" Alias="c">
- <dxl:Ident ColId="112" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16436.1.0" TableName="foo_1_prt_9" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="110" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="111" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="112" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="113" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="114" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="115" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="116" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="117" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="118" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="119" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="120" Alias="a">
- <dxl:Ident ColId="120" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="121" Alias="b">
- <dxl:Ident ColId="121" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="122" Alias="c">
- <dxl:Ident ColId="122" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16442.1.0" TableName="foo_1_prt_10" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="120" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="121" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="122" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="123" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="124" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="125" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="126" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="127" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="128" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="129" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="130" Alias="a">
- <dxl:Ident ColId="130" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="131" Alias="b">
- <dxl:Ident ColId="131" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="132" Alias="c">
- <dxl:Ident ColId="132" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16448.1.0" TableName="foo_1_prt_11" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="130" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="131" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="132" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="133" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="134" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="135" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="136" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="137" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="138" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="139" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:CTEProducer>
<dxl:HashJoin JoinType="Inner">
<dxl:Properties>
diff --git a/src/backend/gporca/data/dxl/minidump/CTE-PartTbl.mdp b/src/backend/gporca/data/dxl/minidump/CTE-PartTbl.mdp
index 79e56ba47d..a9ec2eb07a 100644
--- a/src/backend/gporca/data/dxl/minidump/CTE-PartTbl.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTE-PartTbl.mdp
@@ -573,10 +573,26 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000013" 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:Partitions>
+ <dxl:Partition Mdid="0.250652001.1.1"/>
+ <dxl:Partition Mdid="0.250652002.1.1"/>
+ <dxl:Partition Mdid="0.250652003.1.1"/>
+ <dxl:Partition Mdid="0.250652004.1.1"/>
+ <dxl:Partition Mdid="0.250652005.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.250652.1.1" TableName="r6756">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
@@ -590,161 +606,7 @@
<dxl:Column ColId="10" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000013" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="35" Alias="a">
- <dxl:Ident ColId="35" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="b">
- <dxl:Ident ColId="36" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.250652001.1.1" TableName="r6756_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="35" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="3" ColName="x" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="4" ColName="y" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="40" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="44" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-8" 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.000013" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="46" Alias="a">
- <dxl:Ident ColId="46" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="b">
- <dxl:Ident ColId="47" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.250652002.1.1" TableName="r6756_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="46" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="3" ColName="x" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="4" ColName="y" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="51" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-8" 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.000013" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="57" Alias="a">
- <dxl:Ident ColId="57" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="58" Alias="b">
- <dxl:Ident ColId="58" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.250652003.1.1" TableName="r6756_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="57" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="3" ColName="x" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="60" Attno="4" ColName="y" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="62" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-8" 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.000013" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="68" Alias="a">
- <dxl:Ident ColId="68" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="69" Alias="b">
- <dxl:Ident ColId="69" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.250652004.1.1" TableName="r6756_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="68" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="70" Attno="3" ColName="x" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="71" Attno="4" ColName="y" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="72" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="73" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="74" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="75" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="77" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="78" Attno="-8" 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.000013" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="79" Alias="a">
- <dxl:Ident ColId="79" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="80" Alias="b">
- <dxl:Ident ColId="80" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.250652005.1.1" TableName="r6756_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="79" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="80" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="81" Attno="3" ColName="x" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="82" Attno="4" ColName="y" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="83" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="84" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="85" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="86" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="87" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="88" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="89" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
</dxl:CTEProducer>
<dxl:Append IsTarget="false" IsZapped="false">
diff --git a/src/backend/gporca/data/dxl/minidump/CTE-PushProperties.mdp b/src/backend/gporca/data/dxl/minidump/CTE-PushProperties.mdp
index 1da2c78634..2fc1c92da7 100644
--- a/src/backend/gporca/data/dxl/minidump/CTE-PushProperties.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CTE-PushProperties.mdp
@@ -1849,10 +1849,35 @@
</dxl:OpExpr>
</dxl:HashExpr>
</dxl:HashExprList>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.007883" Rows="1000.000000" Width="13"/>
</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.1700.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="2" Alias="c">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.1700.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16388.1.0"/>
+ <dxl:Partition Mdid="0.16394.1.0"/>
+ <dxl:Partition Mdid="0.16400.1.0"/>
+ <dxl:Partition Mdid="0.16406.1.0"/>
+ <dxl:Partition Mdid="0.16412.1.0"/>
+ <dxl:Partition Mdid="0.16418.1.0"/>
+ <dxl:Partition Mdid="0.16424.1.0"/>
+ <dxl:Partition Mdid="0.16430.1.0"/>
+ <dxl:Partition Mdid="0.16436.1.0"/>
+ <dxl:Partition Mdid="0.16442.1.0"/>
+ <dxl:Partition Mdid="0.16448.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16385.1.0" TableName="foo" LockMode="1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -1867,360 +1892,7 @@
<dxl:Column ColId="9" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="2" Alias="c">
- <dxl:Ident ColId="2" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16388.1.0" TableName="foo_1_prt_1" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="3"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16394.1.0" TableName="foo_1_prt_2" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16400.1.0" TableName="foo_1_prt_3" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="60" Alias="a">
- <dxl:Ident ColId="60" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="61" Alias="b">
- <dxl:Ident ColId="61" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="62" Alias="c">
- <dxl:Ident ColId="62" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16406.1.0" TableName="foo_1_prt_4" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="60" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="62" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="63" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="64" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="68" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="70" Alias="a">
- <dxl:Ident ColId="70" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="71" Alias="b">
- <dxl:Ident ColId="71" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="72" Alias="c">
- <dxl:Ident ColId="72" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16412.1.0" TableName="foo_1_prt_5" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="70" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="71" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="72" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="73" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="74" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="75" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="77" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="78" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="79" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="80" Alias="a">
- <dxl:Ident ColId="80" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="81" Alias="b">
- <dxl:Ident ColId="81" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="82" Alias="c">
- <dxl:Ident ColId="82" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16418.1.0" TableName="foo_1_prt_6" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="80" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="81" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="82" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="83" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="84" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="85" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="86" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="87" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="88" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="89" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="90" Alias="a">
- <dxl:Ident ColId="90" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="91" Alias="b">
- <dxl:Ident ColId="91" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="92" Alias="c">
- <dxl:Ident ColId="92" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16424.1.0" TableName="foo_1_prt_7" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="90" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="91" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="92" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="93" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="94" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="95" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="96" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="97" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="98" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="99" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="100" Alias="a">
- <dxl:Ident ColId="100" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="101" Alias="b">
- <dxl:Ident ColId="101" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="102" Alias="c">
- <dxl:Ident ColId="102" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16430.1.0" TableName="foo_1_prt_8" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="100" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="101" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="102" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="103" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="104" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="105" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="106" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="107" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="108" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="109" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="110" Alias="a">
- <dxl:Ident ColId="110" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="111" Alias="b">
- <dxl:Ident ColId="111" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="112" Alias="c">
- <dxl:Ident ColId="112" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16436.1.0" TableName="foo_1_prt_9" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="110" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="111" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="112" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="113" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="114" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="115" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="116" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="117" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="118" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="119" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="120" Alias="a">
- <dxl:Ident ColId="120" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="121" Alias="b">
- <dxl:Ident ColId="121" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="122" Alias="c">
- <dxl:Ident ColId="122" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16442.1.0" TableName="foo_1_prt_10" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="120" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="121" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="122" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="123" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="124" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="125" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="126" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="127" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="128" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="129" 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.007883" Rows="1000.000000" Width="13"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="130" Alias="a">
- <dxl:Ident ColId="130" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="131" Alias="b">
- <dxl:Ident ColId="131" ColName="b" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="132" Alias="c">
- <dxl:Ident ColId="132" ColName="c" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16448.1.0" TableName="foo_1_prt_11" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="130" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="131" Attno="2" ColName="b" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="132" Attno="3" ColName="c" TypeMdid="0.1700.1.0" ColWidth="5"/>
- <dxl:Column ColId="133" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="134" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="135" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="136" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="137" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="138" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="139" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:RedistributeMotion>
</dxl:CTEProducer>
<dxl:HashJoin JoinType="Inner">
diff --git a/src/backend/gporca/data/dxl/minidump/CastedScalarIf-On-Index-Key.mdp b/src/backend/gporca/data/dxl/minidump/CastedScalarIf-On-Index-Key.mdp
index ff5342145f..326b865c0d 100644
--- a/src/backend/gporca/data/dxl/minidump/CastedScalarIf-On-Index-Key.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CastedScalarIf-On-Index-Key.mdp
@@ -363,21 +363,10 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000045" Rows="1.000000" Width="24"/>
</dxl:Properties>
- <dxl:TableDescriptor Mdid="0.49155.1.0" TableName="pt">
- <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.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="3" Attno="4" ColName="pk" 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="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="6" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
<dxl:ProjList>
<dxl:ProjElem ColId="0" Alias="a">
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
@@ -392,102 +381,39 @@
<dxl:Ident ColId="3" ColName="pk" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000045" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="7" Alias="a">
- <dxl:Ident ColId="7" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="8" Alias="b">
- <dxl:Ident ColId="8" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="9" Alias="c">
- <dxl:Ident ColId="9" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="pk">
- <dxl:Ident ColId="10" ColName="pk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
- <dxl:If TypeMdid="0.1043.1.0">
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAB2FiYw==" LintValue="578839396"/>
- <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
- <dxl:Ident ColId="9" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:Cast>
- </dxl:Comparison>
- <dxl:Ident ColId="8" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABmNk" LintValue="538477356"/>
- </dxl:If>
- </dxl:Cast>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABWE=" LintValue="160440876"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.49155001.1.0" TableName="pt_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="7" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="8" Attno="2" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="9" Attno="3" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="10" Attno="4" ColName="pk" 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="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-8" 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.000045" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="14" Alias="a">
- <dxl:Ident ColId="14" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="15" Alias="b">
- <dxl:Ident ColId="15" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="16" Alias="c">
- <dxl:Ident ColId="16" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="17" Alias="pk">
- <dxl:Ident ColId="17" ColName="pk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
- <dxl:If TypeMdid="0.1043.1.0">
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAB2FiYw==" LintValue="578839396"/>
- <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
- <dxl:Ident ColId="16" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- </dxl:Cast>
- </dxl:Comparison>
- <dxl:Ident ColId="15" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14"/>
- <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABmNk" LintValue="538477356"/>
- </dxl:If>
- </dxl:Cast>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABWE=" LintValue="160440876"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.49155002.1.0" TableName="pt_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="14" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="2" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="16" Attno="3" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
- <dxl:Column ColId="17" Attno="4" ColName="pk" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="19" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
+ <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
+ <dxl:If TypeMdid="0.1043.1.0">
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
+ <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAAB2FiYw==" LintValue="578839396"/>
+ <dxl:Cast TypeMdid="0.25.1.0" FuncId="0.0.0.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14"/>
+ </dxl:Cast>
+ </dxl:Comparison>
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.1043.1.0" TypeModifier="14"/>
+ <dxl:ConstValue TypeMdid="0.1043.1.0" Value="AAAABmNk" LintValue="538477356"/>
+ </dxl:If>
+ </dxl:Cast>
+ <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABWE=" LintValue="160440876"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.49155001.1.0"/>
+ <dxl:Partition Mdid="0.49155002.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.49155.1.0" TableName="pt">
+ <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.1043.1.0" TypeModifier="14" ColWidth="10"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.1043.1.0" TypeModifier="14" ColWidth="10"/>
+ <dxl:Column ColId="3" Attno="4" ColName="pk" 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="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="6" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/Coalesce-With-Subquery.mdp b/src/backend/gporca/data/dxl/minidump/Coalesce-With-Subquery.mdp
index f2f82b252e..3a34aa22a8 100644
--- a/src/backend/gporca/data/dxl/minidump/Coalesce-With-Subquery.mdp
+++ b/src/backend/gporca/data/dxl/minidump/Coalesce-With-Subquery.mdp
@@ -1227,6 +1227,7 @@
<dxl:ConstValue TypeMdid="0.19.1.0" Value="dGVtcGxhdGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA=="/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.2671.1.0" IndexName="pg_database_datname_index"/>
<dxl:TableDescriptor Mdid="0.1262.1.1" TableName="pg_database">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/CorrelatedNLJ-PartSelector-Subplan.mdp b/src/backend/gporca/data/dxl/minidump/CorrelatedNLJ-PartSelector-Subplan.mdp
index 07aecff07d..70db8a963f 100644
--- a/src/backend/gporca/data/dxl/minidump/CorrelatedNLJ-PartSelector-Subplan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/CorrelatedNLJ-PartSelector-Subplan.mdp
@@ -445,9 +445,9 @@ EXPLAIN SELECT pk from partitioned_table WHERE a > (select d from other_table wh
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Result>
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="1293.000962" Rows="3.000000" Width="4"/>
+ <dxl:Cost StartupCost="0" TotalCost="1293.000962" Rows="3.000000" Width="8"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="1" Alias="pk">
@@ -458,45 +458,37 @@ EXPLAIN SELECT pk from partitioned_table WHERE a > (select d from other_table wh
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:SubPlan TypeMdid="0.23.1.0" SubPlanType="ScalarSubPlan">
- <dxl:TestExpr/>
- <dxl:ParamList>
- <dxl:Param ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ParamList>
- <dxl:Result>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000671" Rows="1.000000" Width="4"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="d">
- <dxl:Ident ColId="10" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:OneTimeFilter/>
- <dxl:Materialize Eager="false">
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
+ <dxl:Ident ColId="1" ColName="pk" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="12"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:SubPlan TypeMdid="0.23.1.0" SubPlanType="ScalarSubPlan">
+ <dxl:TestExpr/>
+ <dxl:ParamList>
+ <dxl:Param ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ </dxl:ParamList>
+ <dxl:Result>
<dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000473" Rows="3.000000" Width="8"/>
+ <dxl:Cost StartupCost="0" TotalCost="431.000671" Rows="1.000000" Width="4"/>
</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:BroadcastMotion InputSegments="0,1,2" OutputSegments="0,1,2">
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="9" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:OneTimeFilter/>
+ <dxl:Materialize Eager="false">
<dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000465" Rows="3.000000" Width="8"/>
+ <dxl:Cost StartupCost="0" TotalCost="431.000473" Rows="3.000000" Width="8"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="9" Alias="c">
@@ -507,10 +499,9 @@ EXPLAIN SELECT pk from partitioned_table WHERE a > (select d from other_table wh
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:SortingColumnList/>
- <dxl:TableScan>
+ <dxl:BroadcastMotion InputSegments="0,1,2" OutputSegments="0,1,2">
<dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="1.000000" Width="8"/>
+ <dxl:Cost StartupCost="0" TotalCost="431.000465" Rows="3.000000" Width="8"/>
</dxl:Properties>
<dxl:ProjList>
<dxl:ProjElem ColId="9" Alias="c">
@@ -521,87 +512,58 @@ EXPLAIN SELECT pk from partitioned_table WHERE a > (select d from other_table wh
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.24663.1.0" TableName="other_table">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:Column ColId="10" Attno="2" ColName="d" TypeMdid="0.23.1.0"/>
- <dxl:Column ColId="11" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
- <dxl:Column ColId="12" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:BroadcastMotion>
- </dxl:Materialize>
- </dxl:Result>
- </dxl:SubPlan>
- </dxl:Comparison>
+ <dxl:SortingColumnList/>
+ <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.24663.1.0" TableName="other_table">
+ <dxl:Columns>
+ <dxl:Column ColId="9" Attno="1" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="10" Attno="2" ColName="d" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="11" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="12" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:TableScan>
+ </dxl:BroadcastMotion>
+ </dxl:Materialize>
+ </dxl:Result>
+ </dxl:SubPlan>
+ </dxl:Comparison>
+ </dxl:And>
</dxl:Filter>
- <dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="1293.000962" Rows="3.000000" Width="8"/>
- </dxl:Properties>
- <dxl:TableDescriptor Mdid="0.24627.1.0" TableName="partitioned_table">
- <dxl:Columns>
- <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:Column ColId="1" Attno="2" ColName="pk" TypeMdid="0.23.1.0"/>
- <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
- <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
- <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
- <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
- <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
- <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
- <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="1" Alias="pk">
- <dxl:Ident ColId="1" ColName="pk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="0" Alias="a">
- <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="1293.000962" Rows="3.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="19" Alias="pk">
- <dxl:Ident ColId="19" ColName="pk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="18" Alias="a">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="<" OperatorMdid="0.97.1.0">
- <dxl:Ident ColId="19" ColName="pk" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="12"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.24627002.1.0" TableName="partitioned_table_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="pk" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
- </dxl:Result>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.24627002.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.24627.1.0" TableName="partitioned_table">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="pk" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicTableScan>
</dxl:Result>
</dxl:GatherMotion>
</dxl:Plan>
diff --git a/src/backend/gporca/data/dxl/minidump/DPE-IN.mdp b/src/backend/gporca/data/dxl/minidump/DPE-IN.mdp
index 5e5e8ec118..7f86ffd921 100644
--- a/src/backend/gporca/data/dxl/minidump/DPE-IN.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DPE-IN.mdp
@@ -1071,10 +1071,30 @@ select * from P,X where P.a=X.a and X.a in (1,2);
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:HashExpr>
</dxl:HashExprList>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000034" 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:ArrayComp OperatorName="=" OperatorMdid="0.96.1.0" OperatorType="Any">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Array>
+ </dxl:ArrayComp>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.2035084633.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.36394823.1.1" TableName="p">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
@@ -1088,51 +1108,7 @@ select * from P,X where P.a=X.a and X.a in (1,2);
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000034" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="17" Alias="a">
- <dxl:Ident ColId="17" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="18" Alias="b">
- <dxl:Ident ColId="18" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:ArrayComp OperatorName="=" OperatorMdid="0.96.1.0" OperatorType="Any">
- <dxl:Ident ColId="17" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Array>
- </dxl:ArrayComp>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.2035084633.1.1" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="17" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="20" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:RedistributeMotion>
</dxl:HashJoin>
</dxl:GatherMotion>
diff --git a/src/backend/gporca/data/dxl/minidump/DPE-NOT-IN.mdp b/src/backend/gporca/data/dxl/minidump/DPE-NOT-IN.mdp
index 766867e014..c8aacc0c6e 100644
--- a/src/backend/gporca/data/dxl/minidump/DPE-NOT-IN.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DPE-NOT-IN.mdp
@@ -1063,10 +1063,32 @@ select * from P,X where P.a=X.a and X.a not in (1,2);
<dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
</dxl:HashExpr>
</dxl:HashExprList>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000034" 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:ArrayComp OperatorName="<>" OperatorMdid="0.518.1.0" OperatorType="All">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Array>
+ </dxl:ArrayComp>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.2035084633.1.1"/>
+ <dxl:Partition Mdid="0.2035084634.1.1"/>
+ <dxl:Partition Mdid="0.2035084635.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.36394823.1.1" TableName="p">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
@@ -1080,121 +1102,7 @@ select * from P,X where P.a=X.a and X.a not in (1,2);
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000034" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="17" Alias="a">
- <dxl:Ident ColId="17" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="18" Alias="b">
- <dxl:Ident ColId="18" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:ArrayComp OperatorName="<>" OperatorMdid="0.518.1.0" OperatorType="All">
- <dxl:Ident ColId="17" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Array>
- </dxl:ArrayComp>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.2035084633.1.1" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="17" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="20" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-8" 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.000034" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="26" Alias="a">
- <dxl:Ident ColId="26" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="27" Alias="b">
- <dxl:Ident ColId="27" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:ArrayComp OperatorName="<>" OperatorMdid="0.518.1.0" OperatorType="All">
- <dxl:Ident ColId="26" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Array>
- </dxl:ArrayComp>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.2035084634.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="26" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="29" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-8" 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.000034" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="35" Alias="a">
- <dxl:Ident ColId="35" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="b">
- <dxl:Ident ColId="36" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:ArrayComp OperatorName="<>" OperatorMdid="0.518.1.0" OperatorType="All">
- <dxl:Ident ColId="35" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:Array ArrayType="0.1007.1.0" ElementType="0.23.1.0" MultiDimensional="false">
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Array>
- </dxl:ArrayComp>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.2035084635.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="35" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:RedistributeMotion>
</dxl:HashJoin>
</dxl:GatherMotion>
diff --git a/src/backend/gporca/data/dxl/minidump/DPE-SemiJoin.mdp b/src/backend/gporca/data/dxl/minidump/DPE-SemiJoin.mdp
index 9fd7034c6c..3fa512c726 100644
--- a/src/backend/gporca/data/dxl/minidump/DPE-SemiJoin.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DPE-SemiJoin.mdp
@@ -1366,10 +1366,21 @@ Select * from X where X.a < ANY (select a from P);
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.038266" Rows="6324.987350" Width="4"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="8" Alias="a">
+ <dxl:Ident ColId="8" ColName="a" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.1478028633.1.1"/>
+ <dxl:Partition Mdid="0.1478028634.1.1"/>
+ <dxl:Partition Mdid="0.1478028635.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.35837767.1.1" TableName="p">
<dxl:Columns>
<dxl:Column ColId="8" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
@@ -1378,73 +1389,7 @@ Select * from X where X.a < ANY (select a from P);
<dxl:Column ColId="12" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="8" Alias="a">
- <dxl:Ident ColId="8" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.038266" Rows="6324.987350" Width="4"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="17" Alias="a">
- <dxl:Ident ColId="17" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.1478028633.1.1" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="17" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="20" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="-8" 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.038266" Rows="6324.987350" Width="4"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="a">
- <dxl:Ident ColId="22" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.1478028634.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" 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="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-8" 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.038266" Rows="6324.987350" Width="4"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="27" Alias="a">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.1478028635.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="27" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:BroadcastMotion>
</dxl:Materialize>
</dxl:SubPlan>
diff --git a/src/backend/gporca/data/dxl/minidump/DPE-with-unsupported-pred.mdp b/src/backend/gporca/data/dxl/minidump/DPE-with-unsupported-pred.mdp
index 6751ff60a8..06acdea9e5 100644
--- a/src/backend/gporca/data/dxl/minidump/DPE-with-unsupported-pred.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DPE-with-unsupported-pred.mdp
@@ -2571,10 +2571,30 @@
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:HashExpr>
</dxl:HashExprList>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.077000" Rows="10000.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:Partitions>
+ <dxl:Partition Mdid="0.57344001.1.0"/>
+ <dxl:Partition Mdid="0.57344002.1.0"/>
+ <dxl:Partition Mdid="0.57344003.1.0"/>
+ <dxl:Partition Mdid="0.57344004.1.0"/>
+ <dxl:Partition Mdid="0.57344005.1.0"/>
+ <dxl:Partition Mdid="0.57344006.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.57344.1.0" TableName="part">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -2589,205 +2609,7 @@
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="28" Alias="a">
- <dxl:Ident ColId="28" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="29" Alias="b">
- <dxl:Ident ColId="29" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="30" Alias="c">
- <dxl:Ident ColId="30" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344001.1.0" TableName="part_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="28" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="32" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-8" 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.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="38" Alias="a">
- <dxl:Ident ColId="38" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="39" Alias="b">
- <dxl:Ident ColId="39" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="40" Alias="c">
- <dxl:Ident ColId="40" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344002.1.0" TableName="part_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="38" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="42" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="44" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-8" 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.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="48" Alias="a">
- <dxl:Ident ColId="48" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="49" Alias="b">
- <dxl:Ident ColId="49" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="50" Alias="c">
- <dxl:Ident ColId="50" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344003.1.0" TableName="part_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="48" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="52" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-8" 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.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="58" Alias="a">
- <dxl:Ident ColId="58" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="59" Alias="b">
- <dxl:Ident ColId="59" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="60" Alias="c">
- <dxl:Ident ColId="60" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344004.1.0" TableName="part_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="58" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="60" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="62" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-8" 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.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="68" Alias="a">
- <dxl:Ident ColId="68" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="69" Alias="b">
- <dxl:Ident ColId="69" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="70" Alias="c">
- <dxl:Ident ColId="70" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344005.1.0" TableName="part_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="68" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="70" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="71" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="72" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="73" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="74" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="75" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="77" Attno="-8" 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.077000" Rows="10000.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="78" Alias="a">
- <dxl:Ident ColId="78" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="79" Alias="b">
- <dxl:Ident ColId="79" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="80" Alias="c">
- <dxl:Ident ColId="80" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.57344006.1.0" TableName="part_prt_deflt">
- <dxl:Columns>
- <dxl:Column ColId="78" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="79" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="80" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="81" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="82" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="83" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="84" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="85" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="86" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="87" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:RedistributeMotion>
</dxl:HashJoin>
</dxl:GatherMotion>
diff --git a/src/backend/gporca/data/dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp b/src/backend/gporca/data/dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp
index 4c94940730..cf1a3cfb4c 100644
--- a/src/backend/gporca/data/dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DTS-Hetrogeneous-Partitioned.mdp
@@ -362,10 +362,24 @@ explain select * from t;
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000007" 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:Partitions>
+ <dxl:Partition Mdid="0.181413.1.0"/>
+ <dxl:Partition Mdid="0.181420.1.0"/>
+ <dxl:Partition Mdid="0.181427.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.181410.1.0" TableName="t" LockMode="1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -379,97 +393,7 @@ explain select * from t;
<dxl:Column ColId="8" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000007" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.181413.1.0" TableName="t_1_prt_p1" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000007" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="18" Alias="a">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="19" Alias="b">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.181420.1.0" TableName="t_1_prt_p2" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" 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.000007" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="27" Alias="a">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="28" Alias="b">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.181427.1.0" TableName="t_1_prt_p3" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="27" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-2" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-3" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-4" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-5" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-6" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-7" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DirectDispatch-DynamicIndexScan.mdp b/src/backend/gporca/data/dxl/minidump/DirectDispatch-DynamicIndexScan.mdp
index d1f8ed464b..843fbcac41 100644
--- a/src/backend/gporca/data/dxl/minidump/DirectDispatch-DynamicIndexScan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DirectDispatch-DynamicIndexScan.mdp
@@ -1088,7 +1088,7 @@ where a=1 and b>0;
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -1103,302 +1103,48 @@ where a=1 and b>0;
<dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327295.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553001.1.1" TableName="dd_singlecol_part_idx_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="a">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="b">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="c">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327294.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553002.1.1" TableName="dd_singlecol_part_idx_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327293.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553003.1.1" TableName="dd_singlecol_part_idx_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327292.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553004.1.1" TableName="dd_singlecol_part_idx_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327291.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553005.1.1" TableName="dd_singlecol_part_idx_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000403" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="60" Alias="a">
- <dxl:Ident ColId="60" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="61" Alias="b">
- <dxl:Ident ColId="61" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="62" Alias="c">
- <dxl:Ident ColId="62" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="61" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="60" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
- <dxl:Ident ColId="61" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-2139327290.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
- <dxl:TableDescriptor Mdid="0.21553006.1.1" TableName="dd_singlecol_part_idx_prt_extra">
- <dxl:Columns>
- <dxl:Column ColId="60" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="62" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="64" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="68" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator=">" OperatorMdid="0.521.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="0"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.21553001.1.1"/>
+ <dxl:Partition Mdid="0.21553002.1.1"/>
+ <dxl:Partition Mdid="0.21553003.1.1"/>
+ <dxl:Partition Mdid="0.21553004.1.1"/>
+ <dxl:Partition Mdid="0.21553005.1.1"/>
+ <dxl:Partition Mdid="0.21553006.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.2155640.1.0" IndexName="sc_part_idx_b_1_prt_extra"/>
+ <dxl:TableDescriptor Mdid="0.21553.1.1" TableName="dd_singlecol_part_idx">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
<dxl:DirectDispatchInfo>
<dxl:KeyValue>
diff --git a/src/backend/gporca/data/dxl/minidump/DirectDispatch-IndexScan.mdp b/src/backend/gporca/data/dxl/minidump/DirectDispatch-IndexScan.mdp
index e918a4441e..1ec4a02560 100644
--- a/src/backend/gporca/data/dxl/minidump/DirectDispatch-IndexScan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DirectDispatch-IndexScan.mdp
@@ -466,6 +466,7 @@ where a=1 and b=0;
<dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
</dxl:Comparison>
</dxl:IndexCondList>
+ <dxl:Partitions/>
<dxl:IndexDescriptor Mdid="0.1962926.1.0" IndexName="sc_idx_b"/>
<dxl:TableDescriptor Mdid="0.1962900.1.1" TableName="dd_singlecol_idx">
<dxl:Columns>
diff --git a/src/backend/gporca/data/dxl/minidump/DonotPushPartConstThruLimit.mdp b/src/backend/gporca/data/dxl/minidump/DonotPushPartConstThruLimit.mdp
index 29d789dece..d28bb7b6b9 100644
--- a/src/backend/gporca/data/dxl/minidump/DonotPushPartConstThruLimit.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DonotPushPartConstThruLimit.mdp
@@ -438,10 +438,23 @@ select * from (select * from h order by j limit 2) x where j = 2;
</dxl:SortingColumnList>
<dxl:LimitCount/>
<dxl:LimitOffset/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="3.000000" Width="8"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="0" Alias="j">
+ <dxl:Ident ColId="0" ColName="j" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="1" Alias="i">
+ <dxl:Ident ColId="1" ColName="i" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16527001.1.1"/>
+ <dxl:Partition Mdid="0.16527002.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16527.1.1" TableName="h">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="j" TypeMdid="0.23.1.0"/>
@@ -455,70 +468,7 @@ select * from (select * from h order by j limit 2) x where j = 2;
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="0" Alias="j">
- <dxl:Ident ColId="0" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="1" Alias="i">
- <dxl:Ident ColId="1" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="3.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="j">
- <dxl:Ident ColId="9" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="i">
- <dxl:Ident ColId="10" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16527001.1.1" TableName="h_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="i" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" 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="3.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="18" Alias="j">
- <dxl:Ident ColId="18" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="19" Alias="i">
- <dxl:Ident ColId="19" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16527002.1.1" TableName="h_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:Sort>
<dxl:LimitCount>
<dxl:ConstValue TypeMdid="0.20.1.0" Value="2"/>
diff --git a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
index d552add4fa..58e9c7458c 100644
--- a/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DontAddRedistributeBeforeInsert-1.mdp
@@ -471,15 +471,15 @@ Physical plan:
</dxl:ProjList>
<dxl:TableDescriptor Mdid="0.16391.1.0" TableName="t1_random">
<dxl:Columns>
- <dxl:Column ColId="59" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="60" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="62" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="23" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="24" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="25" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
+ <dxl:Column ColId="26" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="27" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="28" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
+ <dxl:Column ColId="29" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
+ <dxl:Column ColId="30" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
+ <dxl:Column ColId="31" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
<dxl:Result>
@@ -639,10 +639,23 @@ Physical plan:
<dxl:Ident ColId="10" ColName="column2" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:JoinFilter>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000010" 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:Partitions>
+ <dxl:Partition Mdid="0.16467001.1.0"/>
+ <dxl:Partition Mdid="0.16467002.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16467.1.0" TableName="part_random_t1">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -656,70 +669,7 @@ Physical plan:
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="23" Alias="a">
- <dxl:Ident ColId="23" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="b">
- <dxl:Ident ColId="24" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467001.1.0" TableName="part_random_t1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="23" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="26" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-8" 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.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="32" Alias="a">
- <dxl:Ident ColId="32" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="33" Alias="b">
- <dxl:Ident ColId="33" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467002.1.0" TableName="part_random_t1_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="32" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="35" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.000004" Rows="1.000000" Width="4"/>
@@ -755,10 +705,23 @@ Physical plan:
<dxl:Ident ColId="21" ColName="column2" TypeMdid="0.23.1.0"/>
</dxl:Comparison>
</dxl:JoinFilter>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="2" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="2" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="11" Alias="a">
+ <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="12" Alias="b">
+ <dxl:Ident ColId="12" ColName="b" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter/>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16467001.1.0"/>
+ <dxl:Partition Mdid="0.16467002.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.16467.1.0" TableName="part_random_t1">
<dxl:Columns>
<dxl:Column ColId="11" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
@@ -772,70 +735,7 @@ Physical plan:
<dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="11" Alias="a">
- <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="b">
- <dxl:Ident ColId="12" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="41" Alias="a">
- <dxl:Ident ColId="41" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="b">
- <dxl:Ident ColId="42" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467001.1.0" TableName="part_random_t1_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="41" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" 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.000010" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.16467002.1.0" TableName="part_random_t1_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="53" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
<dxl:Result>
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="0.000004" Rows="1.000000" Width="4"/>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapBoolOp.mdp b/src/backend/gporca/data/dxl/minidump/DynamicBitmapBoolOp.mdp
index 523bf6d36c..805875ed80 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapBoolOp.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapBoolOp.mdp
@@ -983,7 +983,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
</dxl:Properties>
@@ -1001,343 +1001,73 @@
<dxl:Ident ColId="3" ColName="d" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="11" Alias="a">
- <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="b">
- <dxl:Ident ColId="12" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="13" Alias="c">
- <dxl:Ident ColId="13" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="14" Alias="d">
- <dxl:Ident ColId="14" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Or>
+ <dxl:Filter>
+ <dxl:Or>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:Or>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Or>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ </dxl:Or>
+ </dxl:RecheckCond>
+ <dxl:BitmapOr TypeMdid="0.2283.1.0">
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
</dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.672348.1.0" IndexName="p_a_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="13" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
</dxl:Comparison>
- </dxl:Or>
- </dxl:RecheckCond>
- <dxl:BitmapOr TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672348001.1.0" IndexName="p_a_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="13" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672810001.1.0" IndexName="p_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapOr>
- <dxl:TableDescriptor Mdid="0.671910001.1.1" TableName="p_prt_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="4" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="16" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="22" Alias="a">
- <dxl:Ident ColId="22" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="23" Alias="b">
- <dxl:Ident ColId="23" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="24" Alias="c">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="25" Alias="d">
- <dxl:Ident ColId="25" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Or>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:Or>
- </dxl:RecheckCond>
- <dxl:BitmapOr TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672348002.1.0" IndexName="p_a_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="24" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672810002.1.0" IndexName="p_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapOr>
- <dxl:TableDescriptor Mdid="0.671910002.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="22" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="4" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="27" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="30" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="33" Alias="a">
- <dxl:Ident ColId="33" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="34" Alias="b">
- <dxl:Ident ColId="34" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="35" Alias="c">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="36" Alias="d">
- <dxl:Ident ColId="36" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Or>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:Or>
- </dxl:RecheckCond>
- <dxl:BitmapOr TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="33" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672348003.1.0" IndexName="p_a_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="35" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672810003.1.0" IndexName="p_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapOr>
- <dxl:TableDescriptor Mdid="0.671910003.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="33" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="4" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="38" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="44" Alias="a">
- <dxl:Ident ColId="44" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="45" Alias="b">
- <dxl:Ident ColId="45" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="c">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="d">
- <dxl:Ident ColId="47" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Or>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:Or>
- </dxl:RecheckCond>
- <dxl:BitmapOr TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="44" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672348004.1.0" IndexName="p_a_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="46" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672810004.1.0" IndexName="p_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapOr>
- <dxl:TableDescriptor Mdid="0.671910004.1.1" TableName="p_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="44" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="4" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="49" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="54" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.064048" Rows="1.000000" Width="24"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="55" Alias="a">
- <dxl:Ident ColId="55" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="56" Alias="b">
- <dxl:Ident ColId="56" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="57" Alias="c">
- <dxl:Ident ColId="57" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="58" Alias="d">
- <dxl:Ident ColId="58" ColName="d" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Or>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="55" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="57" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:Or>
- </dxl:RecheckCond>
- <dxl:BitmapOr TypeMdid="0.2283.1.0">
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="55" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672348005.1.0" IndexName="p_a_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="57" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.672810005.1.0" IndexName="p_c_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- </dxl:BitmapOr>
- <dxl:TableDescriptor Mdid="0.671910005.1.1" TableName="p_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="55" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="4" ColName="d" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="60" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="62" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="63" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.672810.1.0" IndexName="p_c_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ </dxl:BitmapOr>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.671910001.1.1"/>
+ <dxl:Partition Mdid="0.671910002.1.1"/>
+ <dxl:Partition Mdid="0.671910003.1.1"/>
+ <dxl:Partition Mdid="0.671910004.1.1"/>
+ <dxl:Partition Mdid="0.671910005.1.1"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.671910.1.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="4" ColName="d" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="4" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="5" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="8" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="9" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="10" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp b/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
index 460e8e92dc..3458371513 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapIndexScan.mdp
@@ -820,7 +820,7 @@ see sql/DynamicBitmapIndexScan.sql
</dxl:TableScan>
</dxl:NestedLoopJoin>
</dxl:RedistributeMotion>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
</dxl:Properties>
@@ -832,263 +832,51 @@ see sql/DynamicBitmapIndexScan.sql
<dxl:Ident ColId="1" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="32" Alias="flex_value_set_id">
- <dxl:Ident ColId="32" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="33" Alias="flex_value_id">
- <dxl:Ident ColId="33" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="33" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="32" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="33" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="33" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.17270001.1.0" IndexName="inner_table_idx_1_prt_other"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.16959001.1.1" TableName="inner_table_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="32" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="33" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0" ColWidth="9"/>
- <dxl:Column ColId="34" Attno="3" ColName="flex_value" TypeMdid="0.1043.1.0" ColWidth="150"/>
- <dxl:Column ColId="35" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="37" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="39" Alias="flex_value_set_id">
- <dxl:Ident ColId="39" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="40" Alias="flex_value_id">
- <dxl:Ident ColId="40" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="40" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="39" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="40" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="40" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.17270002.1.0" IndexName="inner_table_idx_1_prt_other"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.16959002.1.1" TableName="inner_table_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="39" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="40" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0" ColWidth="9"/>
- <dxl:Column ColId="41" Attno="3" ColName="flex_value" TypeMdid="0.1043.1.0" ColWidth="150"/>
- <dxl:Column ColId="42" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="46" Alias="flex_value_set_id">
- <dxl:Ident ColId="46" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="47" Alias="flex_value_id">
- <dxl:Ident ColId="47" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="47" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="46" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="47" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Ident ColId="1" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
<dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="47" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.17270003.1.0" IndexName="inner_table_idx_1_prt_other"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.16959003.1.1" TableName="inner_table_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="46" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="47" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0" ColWidth="9"/>
- <dxl:Column ColId="48" Attno="3" ColName="flex_value" TypeMdid="0.1043.1.0" ColWidth="150"/>
- <dxl:Column ColId="49" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="51" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="53" Alias="flex_value_set_id">
- <dxl:Ident ColId="53" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="54" Alias="flex_value_id">
- <dxl:Ident ColId="54" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="54" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="53" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="54" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
+ <dxl:Ident ColId="0" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="54" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.17270004.1.0" IndexName="inner_table_idx_1_prt_other"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.16959004.1.1" TableName="inner_table_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="53" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="54" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0" ColWidth="9"/>
- <dxl:Column ColId="55" Attno="3" ColName="flex_value" TypeMdid="0.1043.1.0" ColWidth="150"/>
- <dxl:Column ColId="56" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="397.966888" Rows="1.000000" Width="1"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="60" Alias="flex_value_set_id">
- <dxl:Ident ColId="60" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="61" Alias="flex_value_id">
- <dxl:Ident ColId="61" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="61" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="24" ColName="fid" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="60" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
+ <dxl:Ident ColId="1" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="61" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Ident ColId="1" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
<dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1752.1.0">
- <dxl:Ident ColId="61" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- <dxl:Ident ColId="7" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.17270005.1.0" IndexName="inner_table_idx_1_prt_other"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.16959005.1.1" TableName="inner_table_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="60" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0" ColWidth="8"/>
- <dxl:Column ColId="61" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0" ColWidth="9"/>
- <dxl:Column ColId="62" Attno="3" ColName="flex_value" TypeMdid="0.1043.1.0" ColWidth="150"/>
- <dxl:Column ColId="63" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="65" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="66" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.17270.1.0" IndexName="inner_table_idx_1_prt_other"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.16959001.1.1"/>
+ <dxl:Partition Mdid="0.16959002.1.1"/>
+ <dxl:Partition Mdid="0.16959003.1.1"/>
+ <dxl:Partition Mdid="0.16959004.1.1"/>
+ <dxl:Partition Mdid="0.16959005.1.1"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.16959.1.1" TableName="inner_table">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="flex_value_set_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="flex_value_id" TypeMdid="0.1700.1.0"/>
+ <dxl:Column ColId="3" Attno="4" ColName="flex_partition" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="4" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="5" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="6" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:NestedLoopJoin>
</dxl:GatherMotion>
</dxl:Plan>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Basic.mdp b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Basic.mdp
index ee807b182b..a02d052ddc 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Basic.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Basic.mdp
@@ -827,7 +827,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:OneTimeFilter/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="391.295555" Rows="1.000000" Width="4"/>
</dxl:Properties>
@@ -839,62 +839,51 @@
<dxl:Ident ColId="2" ColName="x3" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="391.295555" Rows="1.000000" Width="4"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="11" Alias="x2">
- <dxl:Ident ColId="11" ColName="x2" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="x3">
- <dxl:Ident ColId="12" ColName="x3" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="x2" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="12" ColName="x3" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="54"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="x2" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="x2" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="x2" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571172286.1.0" IndexName="x2_ind_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571364286.1.0" TableName="foobar_prt_10">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="x1" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="x2" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="x3" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="x3" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="54"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="x2" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="x2" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="10"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.3723795.1.0" IndexName="x2_ind_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.-571364286.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.3723603.1.0" TableName="foobar">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="x1" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="x2" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="x3" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:Result>
</dxl:GatherMotion>
</dxl:Plan>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Heterogeneous.mdp b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Heterogeneous.mdp
index e5f008386e..52a0a5ccaf 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Heterogeneous.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-Heterogeneous.mdp
@@ -920,10 +920,40 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000110" Rows="1.000000" Width="20"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="0" Alias="i">
+ <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="1" Alias="j">
+ <dxl:Ident ColId="1" ColName="j" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="2" Alias="t">
+ <dxl:Ident ColId="2" ColName="t" TypeMdid="0.25.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter>
+ <dxl:And>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
+ </dxl:Comparison>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
+ <dxl:Ident ColId="2" ColName="t" TypeMdid="0.25.1.0"/>
+ <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.816512001.1.1"/>
+ <dxl:Partition Mdid="0.816512002.1.1"/>
+ <dxl:Partition Mdid="0.816512003.1.1"/>
+ <dxl:Partition Mdid="0.816512004.1.1"/>
+ <dxl:Partition Mdid="0.816512005.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.816512.1.1" TableName="bm_dyn_test_onepart">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="i" TypeMdid="0.23.1.0"/>
@@ -938,229 +968,7 @@
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="0" Alias="i">
- <dxl:Ident ColId="0" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="1" Alias="j">
- <dxl:Ident ColId="1" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="2" Alias="t">
- <dxl:Ident ColId="2" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000110" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="i">
- <dxl:Ident ColId="10" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="j">
- <dxl:Ident ColId="11" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="t">
- <dxl:Ident ColId="12" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="i" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Ident ColId="12" ColName="t" TypeMdid="0.25.1.0"/>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.816512001.1.1" TableName="bm_dyn_test_onepart_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="3" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="4" ColName="t" TypeMdid="0.25.1.0" ColWidth="8"/>
- <dxl:Column ColId="13" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="14" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" 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.000110" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="i">
- <dxl:Ident ColId="20" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="j">
- <dxl:Ident ColId="21" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="t">
- <dxl:Ident ColId="22" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="20" ColName="i" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Ident ColId="22" ColName="t" TypeMdid="0.25.1.0"/>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.816512002.1.1" TableName="bm_dyn_test_onepart_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="3" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="4" ColName="t" TypeMdid="0.25.1.0" ColWidth="8"/>
- <dxl:Column ColId="23" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="24" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" 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.000110" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="i">
- <dxl:Ident ColId="30" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="j">
- <dxl:Ident ColId="31" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="t">
- <dxl:Ident ColId="32" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="30" ColName="i" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Ident ColId="32" ColName="t" TypeMdid="0.25.1.0"/>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.816512003.1.1" TableName="bm_dyn_test_onepart_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="3" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="4" ColName="t" TypeMdid="0.25.1.0" ColWidth="8"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-8" 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.000110" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="i">
- <dxl:Ident ColId="40" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="j">
- <dxl:Ident ColId="41" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="t">
- <dxl:Ident ColId="42" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="40" ColName="i" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Ident ColId="42" ColName="t" TypeMdid="0.25.1.0"/>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.816512004.1.1" TableName="bm_dyn_test_onepart_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="3" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="4" ColName="t" TypeMdid="0.25.1.0" ColWidth="8"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" 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.000110" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="i">
- <dxl:Ident ColId="50" ColName="i" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="j">
- <dxl:Ident ColId="51" ColName="j" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="t">
- <dxl:Ident ColId="52" ColName="t" TypeMdid="0.25.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="50" ColName="i" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="2"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.98.1.0">
- <dxl:Ident ColId="52" ColName="t" TypeMdid="0.25.1.0"/>
- <dxl:ConstValue TypeMdid="0.25.1.0" Value="AAAABTI=" LintValue="161104428"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.816512005.1.1" TableName="bm_dyn_test_onepart_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="i" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="3" ColName="j" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="4" ColName="t" TypeMdid="0.25.1.0" ColWidth="8"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
<dxl:DirectDispatchInfo>
<dxl:KeyValue>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-UUID.mdp b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-UUID.mdp
index 743f92957a..0aa3aaa0dc 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-UUID.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicBitmapTableScan-UUID.mdp
@@ -426,10 +426,30 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="432.843876" Rows="9990.000000" Width="20"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="0" Alias="a">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.2950.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.2972.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.2950.1.0"/>
+ <dxl:ConstValue TypeMdid="0.2950.1.0" Value="An6J9DnRTROsv3WhVjnmNQ==" LintValue="4123921962"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.20355001.1.0"/>
+ <dxl:Partition Mdid="0.20355002.1.0"/>
+ <dxl:Partition Mdid="0.20355003.1.0"/>
+ <dxl:Partition Mdid="0.20355004.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.20355.1.0" TableName="test">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.2950.1.0" ColWidth="16"/>
@@ -439,128 +459,7 @@
<dxl:Column ColId="4" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="0" Alias="a">
- <dxl:Ident ColId="0" ColName="a" TypeMdid="0.2950.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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="432.843876" Rows="9990.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="5" Alias="a">
- <dxl:Ident ColId="5" ColName="a" TypeMdid="0.2950.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="6" Alias="b">
- <dxl:Ident ColId="6" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.2972.1.0">
- <dxl:Ident ColId="5" ColName="a" TypeMdid="0.2950.1.0"/>
- <dxl:ConstValue TypeMdid="0.2950.1.0" Value="An6J9DnRTROsv3WhVjnmNQ==" LintValue="4123921962"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.20355001.1.0" TableName="test_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="5" Attno="1" ColName="a" TypeMdid="0.2950.1.0" ColWidth="16"/>
- <dxl:Column ColId="6" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="7" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="9" Attno="-8" 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="432.843876" Rows="9990.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.2950.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.2972.1.0">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.2950.1.0"/>
- <dxl:ConstValue TypeMdid="0.2950.1.0" Value="An6J9DnRTROsv3WhVjnmNQ==" LintValue="4123921962"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.20355002.1.0" TableName="test_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.2950.1.0" ColWidth="16"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="13" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-8" 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="432.843876" Rows="9990.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="15" Alias="a">
- <dxl:Ident ColId="15" ColName="a" TypeMdid="0.2950.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="16" Alias="b">
- <dxl:Ident ColId="16" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.2972.1.0">
- <dxl:Ident ColId="15" ColName="a" TypeMdid="0.2950.1.0"/>
- <dxl:ConstValue TypeMdid="0.2950.1.0" Value="An6J9DnRTROsv3WhVjnmNQ==" LintValue="4123921962"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.20355003.1.0" TableName="test_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="15" Attno="1" ColName="a" TypeMdid="0.2950.1.0" ColWidth="16"/>
- <dxl:Column ColId="16" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" 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="432.843876" Rows="9990.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="a">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.2950.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="b">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.2972.1.0">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.2950.1.0"/>
- <dxl:ConstValue TypeMdid="0.2950.1.0" Value="An6J9DnRTROsv3WhVjnmNQ==" LintValue="4123921962"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.20355004.1.0" TableName="test_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.2950.1.0" ColWidth="16"/>
- <dxl:Column ColId="21" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="23" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolFalse.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolFalse.mdp
index 91c2156ab4..8b6f413954 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolFalse.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolFalse.mdp
@@ -854,7 +854,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -870,197 +870,35 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845001.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682001.1.1" TableName="pp_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="13" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="14" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="a">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="b">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="c">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845002.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682002.1.1" TableName="pp_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="23" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="24" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845003.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682003.1.1" TableName="pp_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845004.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682004.1.1" TableName="pp_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845005.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682005.1.1" TableName="pp_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.16.1.0"/>
+ <dxl:ConstValue TypeMdid="0.16.1.0" Value="false"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.296682001.1.1"/>
+ <dxl:Partition Mdid="0.296682002.1.1"/>
+ <dxl:Partition Mdid="0.296682003.1.1"/>
+ <dxl:Partition Mdid="0.296682004.1.1"/>
+ <dxl:Partition Mdid="0.296682005.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.296845.1.0" IndexName="pp_c_1_prt_1"/>
+ <dxl:TableDescriptor Mdid="0.296682.1.1" TableName="pp">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.16.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolTrue.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolTrue.mdp
index db08fb64fb..a992050abf 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolTrue.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-BoolTrue.mdp
@@ -852,7 +852,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -868,197 +868,35 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845001.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682001.1.1" TableName="pp_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="13" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="14" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="a">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="b">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="c">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845002.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682002.1.1" TableName="pp_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="23" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="24" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845003.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682003.1.1" TableName="pp_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845004.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682004.1.1" TableName="pp_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000154" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.16.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.16.1.0"/>
- <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.296845005.1.0" IndexName="pp_c_1_prt_1"/>
- <dxl:TableDescriptor Mdid="0.296682005.1.1" TableName="pp_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.16.1.0" ColWidth="1"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.91.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.16.1.0"/>
+ <dxl:ConstValue TypeMdid="0.16.1.0" Value="true"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.296682001.1.1"/>
+ <dxl:Partition Mdid="0.296682002.1.1"/>
+ <dxl:Partition Mdid="0.296682003.1.1"/>
+ <dxl:Partition Mdid="0.296682004.1.1"/>
+ <dxl:Partition Mdid="0.296682005.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.296845.1.0" IndexName="pp_c_1_prt_1"/>
+ <dxl:TableDescriptor Mdid="0.296682.1.1" TableName="pp">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.16.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition-2.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition-2.mdp
index 5432aece42..eda7eb9e94 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition-2.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition-2.mdp
@@ -878,7 +878,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
</dxl:Properties>
@@ -894,197 +894,35 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.274813001.1.0" IndexName="p_1_prt_3_ind_bc"/>
- <dxl:TableDescriptor Mdid="0.266602001.1.1" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="20" Alias="a">
- <dxl:Ident ColId="20" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="21" Alias="b">
- <dxl:Ident ColId="21" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="22" Alias="c">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="22" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.274813002.1.0" IndexName="p_1_prt_3_ind_bc"/>
- <dxl:TableDescriptor Mdid="0.266602002.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="20" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="21" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="27" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="30" Alias="a">
- <dxl:Ident ColId="30" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="31" Alias="b">
- <dxl:Ident ColId="31" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="32" Alias="c">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="32" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.274813003.1.0" IndexName="p_1_prt_3_ind_bc"/>
- <dxl:TableDescriptor Mdid="0.266602003.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="30" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="34" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="36" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="39" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="40" Alias="a">
- <dxl:Ident ColId="40" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="41" Alias="b">
- <dxl:Ident ColId="41" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="42" Alias="c">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="42" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.274813004.1.0" IndexName="p_1_prt_3_ind_bc"/>
- <dxl:TableDescriptor Mdid="0.266602004.1.1" TableName="p_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="40" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="44" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="45" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="48" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.004742" Rows="19.607843" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="50" Alias="a">
- <dxl:Ident ColId="50" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="51" Alias="b">
- <dxl:Ident ColId="51" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="52" Alias="c">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="52" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.274813005.1.0" IndexName="p_1_prt_3_ind_bc"/>
- <dxl:TableDescriptor Mdid="0.266602005.1.1" TableName="p_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="50" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="3" ColName="c" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="54" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="57" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.266602001.1.1"/>
+ <dxl:Partition Mdid="0.266602002.1.1"/>
+ <dxl:Partition Mdid="0.266602003.1.1"/>
+ <dxl:Partition Mdid="0.266602004.1.1"/>
+ <dxl:Partition Mdid="0.266602005.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.274813.1.0" IndexName="p_1_prt_3_ind_bc"/>
+ <dxl:TableDescriptor Mdid="0.266602.1.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition.mdp
index 7dd94d5ee9..3bc5509549 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DefaultPartition.mdp
@@ -553,7 +553,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000159" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -569,45 +569,31 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000159" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="a">
- <dxl:Ident ColId="10" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="b">
- <dxl:Ident ColId="11" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="c">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="12" ColName="c" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.275094002.1.0" IndexName="ppp_1_prt_extra_ind_c"/>
- <dxl:TableDescriptor Mdid="0.274855002.1.1" TableName="ppp_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="3" ColName="c" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.274855002.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.275094.1.0" IndexName="ppp_1_prt_extra_ind_c"/>
+ <dxl:TableDescriptor Mdid="0.274855.1.1" TableName="ppp">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="c" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DroppedCols.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DroppedCols.mdp
index 0588351fa0..ff516de2f2 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DroppedCols.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-DroppedCols.mdp
@@ -817,7 +817,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000136" Rows="1.000000" Width="12"/>
</dxl:Properties>
@@ -832,57 +832,43 @@
<dxl:Ident ColId="2" ColName="ik" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000136" Rows="1.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="12" Alias="dk">
- <dxl:Ident ColId="12" ColName="dk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="pk">
- <dxl:Ident ColId="10" ColName="pk" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="ik">
- <dxl:Ident ColId="11" ColName="ik" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="ik" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="pk" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="9"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="11" ColName="ik" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="2" ColName="ik" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.32967.1.0" IndexName="idx"/>
- <dxl:TableDescriptor Mdid="0.32964.1.0" TableName="foo_part2" LockMode="1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="pk" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="3" ColName="ik" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="12" Attno="4" ColName="dk" 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:IndexScan>
- </dxl:Append>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="pk" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="9"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="2" ColName="ik" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.32964.1.0"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.32962.1.0" IndexName="idx"/>
+ <dxl:TableDescriptor Mdid="0.32956.1.0" TableName="foo" LockMode="1">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="2" ColName="dk" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="1" Attno="3" ColName="pk" TypeMdid="0.23.1.0" ColWidth="4"/>
+ <dxl:Column ColId="2" Attno="4" ColName="ik" 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:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-EnabledDateConstraint.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-EnabledDateConstraint.mdp
index ef2a9fe1d9..3f58b6b5e0 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-EnabledDateConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-EnabledDateConstraint.mdp
@@ -516,7 +516,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -532,45 +532,31 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="id">
- <dxl:Ident ColId="10" ColName="id" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="ship_date">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="amount">
- <dxl:Ident ColId="12" ColName="amount" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.318973003.1.0" IndexName="test_orders_2_1_prt_orders_1_ind"/>
- <dxl:TableDescriptor Mdid="0.318877003.1.1" TableName="test_orders_2_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="id" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0" ColWidth="8"/>
- <dxl:Column ColId="12" Attno="3" ColName="amount" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
+ <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.318877003.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.318973.1.0" IndexName="test_orders_2_1_prt_orders_1_ind"/>
+ <dxl:TableDescriptor Mdid="0.318877.1.1" TableName="test_orders_2">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="id" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="amount" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-NoDTS.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-NoDTS.mdp
index 644d12797e..c705422c3b 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-NoDTS.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-NoDTS.mdp
@@ -547,7 +547,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000487" Rows="3.200000" Width="16"/>
</dxl:Properties>
@@ -560,41 +560,30 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000487" Rows="3.200000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1562644294.15.0" IndexName="p2_ind"/>
- <dxl:TableDescriptor Mdid="0.27119002.15.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.27119002.15.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.2732323.15.0" IndexName="p2_ind"/>
+ <dxl:TableDescriptor Mdid="0.27119.15.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Overlapping.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Overlapping.mdp
index 36122aee04..be60720ce2 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Overlapping.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Overlapping.mdp
@@ -547,7 +547,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000487" Rows="3.200000" Width="16"/>
</dxl:Properties>
@@ -560,41 +560,30 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000487" Rows="3.200000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1562644294.25.0" IndexName="p2_ind"/>
- <dxl:TableDescriptor Mdid="0.27119002.25.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.27119002.25.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.2732323.25.0" IndexName="p2_ind"/>
+ <dxl:TableDescriptor Mdid="0.27119.25.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectEquality.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectEquality.mdp
index 7fe69d8a36..c0b293d371 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectEquality.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectEquality.mdp
@@ -1050,7 +1050,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
</dxl:Properties>
@@ -1062,53 +1062,42 @@
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.303004003.1.0" IndexName="p_1_a"/>
- <dxl:TableDescriptor Mdid="0.161992003.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="3"/>
+ </dxl:Comparison>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.161992003.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.303004.1.0" IndexName="p_1_a"/>
+ <dxl:TableDescriptor Mdid="0.161992.1.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
<dxl:DirectDispatchInfo>
<dxl:KeyValue>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectRange.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectRange.mdp
index e9261ed883..4e0f3e4123 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectRange.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-PartSelectRange.mdp
@@ -1050,7 +1050,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
</dxl:Properties>
@@ -1062,188 +1062,45 @@
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="500"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
+ <dxl:Filter>
+ <dxl:And>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.303004001.1.0" IndexName="p_1_a"/>
- <dxl:TableDescriptor Mdid="0.161992001.1.1" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="18" Alias="a">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="19" Alias="b">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="500"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.303004002.1.0" IndexName="p_1_a"/>
- <dxl:TableDescriptor Mdid="0.161992002.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="27" Alias="a">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="28" Alias="b">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="500"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.303004003.1.0" IndexName="p_1_a"/>
- <dxl:TableDescriptor Mdid="0.161992003.1.1" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="27" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000377" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="36" Alias="a">
- <dxl:Ident ColId="36" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="37" Alias="b">
- <dxl:Ident ColId="37" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:And>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="36" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
- </dxl:Comparison>
- <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
- <dxl:Ident ColId="37" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="500"/>
- </dxl:Comparison>
- </dxl:And>
- </dxl:Filter>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="36" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
+ <dxl:Comparison ComparisonOperator="<=" OperatorMdid="0.523.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="500"/>
</dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.303004004.1.0" IndexName="p_1_a"/>
- <dxl:TableDescriptor Mdid="0.161992004.1.1" TableName="p_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="36" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="39" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="44" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ </dxl:And>
+ </dxl:Filter>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="5"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.161992001.1.1"/>
+ <dxl:Partition Mdid="0.161992002.1.1"/>
+ <dxl:Partition Mdid="0.161992003.1.1"/>
+ <dxl:Partition Mdid="0.161992004.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.303004.1.0" IndexName="p_1_a"/>
+ <dxl:TableDescriptor Mdid="0.161992.1.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
<dxl:DirectDispatchInfo>
<dxl:KeyValue>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Union.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Union.mdp
index 99d2073f9c..091ae7a973 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Union.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-Union.mdp
@@ -760,10 +760,30 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<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:Partitions>
+ <dxl:Partition Mdid="0.-571843295.1.0"/>
+ <dxl:Partition Mdid="0.-571843294.1.0"/>
+ <dxl:Partition Mdid="0.-571843293.1.0"/>
+ <dxl:Partition Mdid="0.-571843292.1.0"/>
+ <dxl:Partition Mdid="0.-571843291.1.0"/>
+ <dxl:Partition Mdid="0.-571843290.1.0"/>
+ <dxl:Partition Mdid="0.-571843289.1.0"/>
+ <dxl:Partition Mdid="0.-571843288.1.0"/>
+ <dxl:Partition Mdid="0.-571843287.1.0"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.3723124.1.0" TableName="p">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
@@ -777,260 +797,8 @@
<dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <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:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000021" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="18" Alias="a">
- <dxl:Ident ColId="18" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="19" Alias="b">
- <dxl:Ident ColId="19" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843295.1.0" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="18" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="20" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="21" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="22" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="23" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="24" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="25" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="26" Attno="-8" 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="27" Alias="a">
- <dxl:Ident ColId="27" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="28" Alias="b">
- <dxl:Ident ColId="28" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843294.1.0" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="27" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="28" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="29" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="30" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="31" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="32" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="33" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="34" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="35" Attno="-8" 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="36" Alias="a">
- <dxl:Ident ColId="36" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="37" Alias="b">
- <dxl:Ident ColId="37" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843293.1.0" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="36" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="37" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="38" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="39" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="40" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="41" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="42" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="43" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="44" Attno="-8" 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="45" Alias="a">
- <dxl:Ident ColId="45" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="46" Alias="b">
- <dxl:Ident ColId="46" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843292.1.0" TableName="p_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="45" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="46" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="47" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="48" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="49" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="50" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="51" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="52" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="53" Attno="-8" 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="54" Alias="a">
- <dxl:Ident ColId="54" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="55" Alias="b">
- <dxl:Ident ColId="55" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843291.1.0" TableName="p_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="54" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="55" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="56" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="57" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="58" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="59" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="60" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="61" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="62" Attno="-8" 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="63" Alias="a">
- <dxl:Ident ColId="63" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="64" Alias="b">
- <dxl:Ident ColId="64" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843290.1.0" TableName="p_prt_6">
- <dxl:Columns>
- <dxl:Column ColId="63" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="64" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="65" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="66" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="67" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="68" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="69" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="70" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="71" Attno="-8" 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="72" Alias="a">
- <dxl:Ident ColId="72" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="73" Alias="b">
- <dxl:Ident ColId="73" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843289.1.0" TableName="p_prt_7">
- <dxl:Columns>
- <dxl:Column ColId="72" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="73" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="74" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="75" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="76" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="77" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="78" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="79" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="80" Attno="-8" 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="81" Alias="a">
- <dxl:Ident ColId="81" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="82" Alias="b">
- <dxl:Ident ColId="82" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843288.1.0" TableName="p_prt_8">
- <dxl:Columns>
- <dxl:Column ColId="81" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="82" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="83" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="84" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="85" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="86" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="87" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="88" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="89" Attno="-8" 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="90" Alias="a">
- <dxl:Ident ColId="90" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="91" Alias="b">
- <dxl:Ident ColId="91" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableDescriptor Mdid="0.-571843287.1.0" TableName="p_prt_9">
- <dxl:Columns>
- <dxl:Column ColId="90" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="91" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="92" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="93" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="94" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="95" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="96" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="97" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="98" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
- <dxl:Append IsTarget="false" IsZapped="false">
+ </dxl:DynamicTableScan>
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="2" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
</dxl:Properties>
@@ -1042,386 +810,52 @@
<dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="99" Alias="a">
- <dxl:Ident ColId="99" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="100" Alias="b">
- <dxl:Ident ColId="100" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="100" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="100" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684295.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843295.1.0" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="99" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="100" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="101" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="102" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="103" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="104" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="105" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="106" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="107" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="108" Alias="a">
- <dxl:Ident ColId="108" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="109" Alias="b">
- <dxl:Ident ColId="109" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="109" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="109" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684294.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843294.1.0" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="108" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="109" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="110" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="111" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="112" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="113" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="114" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="115" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="116" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="117" Alias="a">
- <dxl:Ident ColId="117" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="118" Alias="b">
- <dxl:Ident ColId="118" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="118" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="118" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684293.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843293.1.0" TableName="p_prt_3">
- <dxl:Columns>
- <dxl:Column ColId="117" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="118" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="119" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="120" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="121" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="122" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="123" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="124" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="125" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="126" Alias="a">
- <dxl:Ident ColId="126" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="127" Alias="b">
- <dxl:Ident ColId="127" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="127" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="127" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684292.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843292.1.0" TableName="p_prt_4">
- <dxl:Columns>
- <dxl:Column ColId="126" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="127" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="128" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="129" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="130" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="131" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="132" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="133" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="134" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="135" Alias="a">
- <dxl:Ident ColId="135" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="136" Alias="b">
- <dxl:Ident ColId="136" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="136" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="136" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684291.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843291.1.0" TableName="p_prt_5">
- <dxl:Columns>
- <dxl:Column ColId="135" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="136" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="137" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="138" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="139" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="140" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="141" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="142" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="143" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="144" Alias="a">
- <dxl:Ident ColId="144" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="145" Alias="b">
- <dxl:Ident ColId="145" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="145" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="145" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684290.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843290.1.0" TableName="p_prt_6">
- <dxl:Columns>
- <dxl:Column ColId="144" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="145" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="146" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="147" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="148" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="149" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="150" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="151" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="152" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="153" Alias="a">
- <dxl:Ident ColId="153" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="154" Alias="b">
- <dxl:Ident ColId="154" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="154" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="154" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684289.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843289.1.0" TableName="p_prt_7">
- <dxl:Columns>
- <dxl:Column ColId="153" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="154" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="155" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="156" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="157" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="158" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="159" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="160" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="161" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="162" Alias="a">
- <dxl:Ident ColId="162" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="163" Alias="b">
- <dxl:Ident ColId="163" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="163" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="163" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684288.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843288.1.0" TableName="p_prt_8">
- <dxl:Columns>
- <dxl:Column ColId="162" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="163" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="164" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="165" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="166" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="167" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="168" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="169" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="170" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="387.966633" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="171" Alias="a">
- <dxl:Ident ColId="171" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="172" Alias="b">
- <dxl:Ident ColId="172" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="172" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="172" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571684287.1.0" IndexName="p_ind"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-571843287.1.0" TableName="p_prt_9">
- <dxl:Columns>
- <dxl:Column ColId="171" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="172" Attno="2" ColName="b" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="173" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0" ColWidth="6"/>
- <dxl:Column ColId="174" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="175" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="176" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="177" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="178" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="179" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.3723283.1.0" IndexName="p_ind"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.-571843295.1.0"/>
+ <dxl:Partition Mdid="0.-571843294.1.0"/>
+ <dxl:Partition Mdid="0.-571843293.1.0"/>
+ <dxl:Partition Mdid="0.-571843292.1.0"/>
+ <dxl:Partition Mdid="0.-571843291.1.0"/>
+ <dxl:Partition Mdid="0.-571843290.1.0"/>
+ <dxl:Partition Mdid="0.-571843289.1.0"/>
+ <dxl:Partition Mdid="0.-571843288.1.0"/>
+ <dxl:Partition Mdid="0.-571843287.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.3723124.1.0" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="10" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="11" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="12" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:Append>
</dxl:GatherMotion>
</dxl:Plan>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-UnsupportedConstraint.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-UnsupportedConstraint.mdp
index b5a55308b3..a89bf9e2ad 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-UnsupportedConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous-UnsupportedConstraint.mdp
@@ -379,10 +379,30 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false" PartIndexId="1" SelectorIds="">
+ <dxl:DynamicTableScan PartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="431.000048" Rows="1.000000" Width="20"/>
</dxl:Properties>
+ <dxl:ProjList>
+ <dxl:ProjElem ColId="0" Alias="id">
+ <dxl:Ident ColId="0" ColName="id" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="1" Alias="ship_date">
+ <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ </dxl:ProjElem>
+ <dxl:ProjElem ColId="2" Alias="amount">
+ <dxl:Ident ColId="2" ColName="amount" TypeMdid="0.23.1.0"/>
+ </dxl:ProjElem>
+ </dxl:ProjList>
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
+ <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.318877001.1.1"/>
+ </dxl:Partitions>
<dxl:TableDescriptor Mdid="0.318877.1.1" TableName="test_orders_2">
<dxl:Columns>
<dxl:Column ColId="0" Attno="1" ColName="id" TypeMdid="0.23.1.0"/>
@@ -397,55 +417,7 @@
<dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
</dxl:Columns>
</dxl:TableDescriptor>
- <dxl:ProjList>
- <dxl:ProjElem ColId="0" Alias="id">
- <dxl:Ident ColId="0" ColName="id" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="1" Alias="ship_date">
- <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="2" Alias="amount">
- <dxl:Ident ColId="2" ColName="amount" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:TableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="431.000048" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="id">
- <dxl:Ident ColId="10" ColName="id" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="ship_date">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="amount">
- <dxl:Ident ColId="12" ColName="amount" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
- </dxl:Comparison>
- </dxl:Filter>
- <dxl:TableDescriptor Mdid="0.318877001.1.1" TableName="test_orders_2_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="id" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0" ColWidth="8"/>
- <dxl:Column ColId="12" Attno="3" ColName="amount" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:TableScan>
- </dxl:Append>
+ </dxl:DynamicTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous.mdp
index 764beaf3af..67b5f4c809 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Heterogenous.mdp
@@ -547,7 +547,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000152" Rows="1.000000" Width="16"/>
</dxl:Properties>
@@ -560,41 +560,30 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000152" Rows="1.000000" Width="16"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-1562644294.1.0" IndexName="p2_ind"/>
- <dxl:TableDescriptor Mdid="0.27119002.1.1" TableName="p_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.27119002.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.2732323.1.0" IndexName="p2_ind"/>
+ <dxl:TableDescriptor Mdid="0.27119.1.1" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-EnabledDateConstraint.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-EnabledDateConstraint.mdp
index 06fd79e54d..6f1b645c10 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-EnabledDateConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-EnabledDateConstraint.mdp
@@ -417,7 +417,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -433,45 +433,31 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="id">
- <dxl:Ident ColId="10" ColName="id" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="ship_date">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="amount">
- <dxl:Ident ColId="12" ColName="amount" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.310765001.1.0" IndexName="ord_ind_1_prt_orders_1"/>
- <dxl:TableDescriptor Mdid="0.310650001.1.1" TableName="test_orders_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="id" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0" ColWidth="8"/>
- <dxl:Column ColId="12" Attno="3" ColName="amount" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
+ <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.310650001.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.310765.1.0" IndexName="ord_ind_1_prt_orders_1"/>
+ <dxl:TableDescriptor Mdid="0.310650.1.1" TableName="test_orders">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="id" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="amount" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-UnsupportedConstraint.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-UnsupportedConstraint.mdp
index 80082e5309..68e1327151 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-UnsupportedConstraint.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous-UnsupportedConstraint.mdp
@@ -400,7 +400,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
</dxl:Properties>
@@ -416,45 +416,31 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000167" Rows="1.000000" Width="20"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="10" Alias="id">
- <dxl:Ident ColId="10" ColName="id" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="11" Alias="ship_date">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="12" Alias="amount">
- <dxl:Ident ColId="12" ColName="amount" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
- <dxl:Ident ColId="11" ColName="ship_date" TypeMdid="0.1082.1.0"/>
- <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.310765001.1.0" IndexName="ord_ind_1_prt_orders_1"/>
- <dxl:TableDescriptor Mdid="0.310650001.1.1" TableName="test_orders_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="10" Attno="1" ColName="id" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="11" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0" ColWidth="8"/>
- <dxl:Column ColId="12" Attno="3" ColName="amount" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="18" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="19" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.1093.1.0">
+ <dxl:Ident ColId="1" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:ConstValue TypeMdid="0.1082.1.0" Value="PxEAAA==" LintValue="4415"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.310650001.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.310765.1.0" IndexName="ord_ind_1_prt_orders_1"/>
+ <dxl:TableDescriptor Mdid="0.310650.1.1" TableName="test_orders">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="id" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="ship_date" TypeMdid="0.1082.1.0"/>
+ <dxl:Column ColId="2" Attno="3" ColName="amount" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="3" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="4" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="5" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="6" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="7" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="8" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="9" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous.mdp
index 836320bc37..f5a4ac0f21 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Homogenous.mdp
@@ -726,7 +726,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicBitmapTableScan PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="391.295544" Rows="1.000000" Width="8"/>
</dxl:Properties>
@@ -738,50 +738,44 @@
<dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
</dxl:ProjElem>
</dxl:ProjList>
- <dxl:Filter/>
- <dxl:BitmapTableScan>
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="391.295544" Rows="1.000000" Width="8"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:RecheckCond>
+ <dxl:Filter>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:Filter>
+ <dxl:RecheckCond>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:RecheckCond>
+ <dxl:BitmapIndexProbe>
+ <dxl:IndexCondList>
<dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Ident ColId="1" ColName="b" TypeMdid="0.23.1.0"/>
<dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
</dxl:Comparison>
- </dxl:RecheckCond>
- <dxl:BitmapIndexProbe>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.-571983295.1.0" IndexName="p_ind_1_prt_1"/>
- </dxl:BitmapIndexProbe>
- <dxl:TableDescriptor Mdid="0.-572159295.1.0" TableName="p_prt_1">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:BitmapTableScan>
- </dxl:Append>
+ </dxl:IndexCondList>
+ <dxl:IndexDescriptor Mdid="0.3722984.1.0" IndexName="p_ind_1_prt_1"/>
+ </dxl:BitmapIndexProbe>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.-572159295.1.0"/>
+ </dxl:Partitions>
+ <dxl:TableDescriptor Mdid="0.3722808.1.0" TableName="p">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicBitmapTableScan>
</dxl:GatherMotion>
</dxl:Plan>
</dxl:Thread>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-OpenEndedPartitions.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-OpenEndedPartitions.mdp
index fa6f32029f..7a02cedf45 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-OpenEndedPartitions.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-OpenEndedPartitions.mdp
@@ -834,7 +834,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.000304" Rows="1.000000" Width="12"/>
</dxl:Properties>
@@ -847,41 +847,30 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
- <dxl:Properties>
- <dxl:Cost StartupCost="0" TotalCost="6.000304" Rows="1.000000" Width="12"/>
- </dxl:Properties>
- <dxl:ProjList>
- <dxl:ProjElem ColId="9" Alias="a">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- <dxl:ProjElem ColId="10" Alias="b">
- <dxl:Ident ColId="10" ColName="b" TypeMdid="0.23.1.0"/>
- </dxl:ProjElem>
- </dxl:ProjList>
- <dxl:Filter/>
- <dxl:IndexCondList>
- <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
- <dxl:Ident ColId="9" ColName="a" TypeMdid="0.23.1.0"/>
- <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
- </dxl:Comparison>
- </dxl:IndexCondList>
- <dxl:IndexDescriptor Mdid="0.1122360002.1.0" IndexName="t2_pfirst_ind"/>
- <dxl:TableDescriptor Mdid="0.1122228002.1.1" TableName="t2_part_prt_2">
- <dxl:Columns>
- <dxl:Column ColId="9" Attno="1" ColName="a" TypeMdid="0.23.1.0" ColWidth="4"/>
- <dxl:Column ColId="10" Attno="2" ColName="b" 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="-3" ColName="xmin" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="13" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="14" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0" ColWidth="4"/>
- <dxl:Column ColId="15" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0" ColWidth="4"/>
- <dxl:Column ColId="16" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0" ColWidth="4"/>
- <dxl:Column ColId="17" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0" ColWidth="4"/>
- </dxl:Columns>
- </dxl:TableDescriptor>
- </dxl:IndexScan>
- </dxl:Append>
+ <dxl:IndexCondList>
+ <dxl:Comparison ComparisonOperator="=" OperatorMdid="0.96.1.0">
+ <dxl:Ident ColId="0" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:ConstValue TypeMdid="0.23.1.0" Value="1"/>
+ </dxl:Comparison>
+ </dxl:IndexCondList>
+ <dxl:Partitions>
+ <dxl:Partition Mdid="0.1122228002.1.1"/>
+ </dxl:Partitions>
+ <dxl:IndexDescriptor Mdid="0.1122360.1.0" IndexName="t2_pfirst_ind"/>
+ <dxl:TableDescriptor Mdid="0.1122228.1.1" TableName="t2_part">
+ <dxl:Columns>
+ <dxl:Column ColId="0" Attno="1" ColName="a" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="1" Attno="2" ColName="b" TypeMdid="0.23.1.0"/>
+ <dxl:Column ColId="2" Attno="-1" ColName="ctid" TypeMdid="0.27.1.0"/>
+ <dxl:Column ColId="3" Attno="-3" ColName="xmin" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="4" Attno="-4" ColName="cmin" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="5" Attno="-5" ColName="xmax" TypeMdid="0.28.1.0"/>
+ <dxl:Column ColId="6" Attno="-6" ColName="cmax" TypeMdid="0.29.1.0"/>
+ <dxl:Column ColId="7" Attno="-7" ColName="tableoid" TypeMdid="0.26.1.0"/>
+ <dxl:Column ColId="8" Attno="-8" ColName="gp_segment_id" TypeMdid="0.23.1.0"/>
+ </dxl:Columns>
+ </dxl:TableDescriptor>
+ </dxl:DynamicIndexScan>
</dxl:GatherMotion>
<dxl:DirectDispatchInfo>
<dxl:KeyValue>
diff --git a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Relabel.mdp b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Relabel.mdp
index 5bfafee2e5..28f342d2d5 100644
--- a/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Relabel.mdp
+++ b/src/backend/gporca/data/dxl/minidump/DynamicIndexScan-Relabel.mdp
@@ -1264,7 +1264,7 @@
</dxl:ProjList>
<dxl:Filter/>
<dxl:SortingColumnList/>
- <dxl:Append IsTarget="false" IsZapped="false">
+ <dxl:DynamicIndexScan IndexScanDirection="Forward" PartIndexId="0" PrintablePartIndexId="1" SelectorIds="">
<dxl:Properties>
<dxl:Cost StartupCost="0" TotalCost="6.003869" Rows="7.575000" Width="9"/>
</dxl:Properties>
@@ -1277,187 +1277,36 @@
</dxl:ProjElem>
</dxl:ProjList>
<dxl:Filter/>
- <dxl:IndexScan IndexScanDirection="Forward">
... 38847 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 02/11: Revert "Remove unused Dynamic (bitmap/index/table) Scan code"
Posted by ma...@apache.org.
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 38c560f90bcabcf11bba67a5627737ae7adae5f8
Author: Chris Hajas <ch...@vmware.com>
AuthorDate: Wed Apr 6 16:48:36 2022 -0700
Revert "Remove unused Dynamic (bitmap/index/table) Scan code"
This reverts commit 806fc86bc12d181b3f870da9e393296bc4e01030.
Previously, we added support in ORCA for the postgres 10 style of
partitioning and utilized the postgres seq/index/bitmap executor nodes.
However, for plans with many partitions and many columns, this resulted
in large plan sizes (on the order of 100MB+). When combined with many
slices, this would cause increased memory utilization, sometimes going
OOM.
This series of commits reverts to using the Dynamic executor scan nodes.
We are keeping the logic to read from the GPDB7 catalog and the internal
Orca changes to handle static partition elimination within Orca. The
only intention of these changes is to use Dynamic executor nodes and
reduce the plan size. The plan shapes are the same.
For some numbers, we found that for tables with 1k+ partitions and 1k+
columns, the dispatch plan size for a single `select * from foo` was
100MB vs 300KB with this new approach. By itself, 100MB may not seem
like a lot, but if there are multiple partitioned tables with multiple
joins and slices, this can quickly become quite a bit.
---
src/backend/cdb/cdbplan.c | 52 ++-
src/backend/commands/explain.c | 72 ++++
src/backend/commands/explain_gp.c | 110 ++++++
src/backend/executor/Makefile | 9 +
src/backend/executor/execAmi.c | 33 ++
src/backend/executor/execDynamicScan.c | 158 ++++++++
src/backend/executor/execProcnode.c | 65 ++++
src/backend/executor/execUtils.c | 6 +
src/backend/executor/nodeDynamicBitmapHeapscan.c | 331 +++++++++++++++++
src/backend/executor/nodeDynamicBitmapIndexscan.c | 234 ++++++++++++
src/backend/executor/nodeDynamicIndexscan.c | 405 +++++++++++++++++++++
src/backend/executor/nodeDynamicSeqscan.c | 341 +++++++++++++++++
src/backend/gpopt/gpdbwrappers.cpp | 31 ++
.../gpopt/translate/CTranslatorDXLToPlStmt.cpp | 150 +++++++-
.../src/translate/CTranslatorExprToDXL.cpp | 74 ++++
.../include/naucrates/dxl/operators/CDXLOperator.h | 3 +
.../operators/CDXLPhysicalDynamicBitmapTableScan.h | 107 ++++++
.../dxl/operators/CDXLPhysicalDynamicIndexScan.h | 115 ++++++
.../dxl/operators/CDXLPhysicalDynamicTableScan.h | 102 ++++++
.../include/naucrates/dxl/operators/dxlops.h | 145 ++++++++
...IndexScan.h => CParseHandlerDynamicIndexScan.h} | 43 +--
...IndexScan.h => CParseHandlerDynamicTableScan.h} | 46 ++-
.../naucrates/dxl/parser/CParseHandlerFactory.h | 15 +
.../naucrates/dxl/parser/CParseHandlerIndexScan.h | 3 +-
.../CParseHandlerPhysicalAbstractBitmapScan.h | 3 +-
.../CParseHandlerPhysicalDynamicBitmapTableScan.h | 78 ++++
.../include/naucrates/dxl/parser/parsehandlers.h | 3 +
.../include/naucrates/dxl/xml/dxltokens.h | 3 +
.../CDXLPhysicalDynamicBitmapTableScan.cpp | 68 ++++
.../src/operators/CDXLPhysicalDynamicIndexScan.cpp | 247 +++++++++++++
.../src/operators/CDXLPhysicalDynamicTableScan.cpp | 180 +++++++++
.../gporca/libnaucrates/src/operators/Makefile | 3 +
.../src/parser/CParseHandlerDynamicIndexScan.cpp | 99 +++++
...pScan.cpp => CParseHandlerDynamicTableScan.cpp} | 113 +++---
.../src/parser/CParseHandlerFactory.cpp | 34 ++
.../src/parser/CParseHandlerIndexScan.cpp | 16 +-
.../CParseHandlerPhysicalAbstractBitmapScan.cpp | 21 +-
...CParseHandlerPhysicalDynamicBitmapTableScan.cpp | 68 ++++
.../src/parser/CParseHandlerSequence.cpp | 1 +
.../gporca/libnaucrates/src/parser/Makefile | 3 +
.../gporca/libnaucrates/src/xml/dxltokens.cpp | 4 +
src/backend/nodes/copyfuncs.c | 92 +++++
src/backend/nodes/outfast.c | 12 +
src/backend/nodes/outfuncs.c | 99 ++++-
src/backend/nodes/readfast.c | 23 ++
src/backend/nodes/readfuncs.c | 106 +++++-
src/backend/optimizer/util/walkers.c | 5 +-
src/include/executor/execDynamicScan.h | 28 ++
src/include/executor/nodeDynamicBitmapHeapscan.h | 27 ++
src/include/executor/nodeDynamicBitmapIndexscan.h | 27 ++
src/include/executor/nodeDynamicIndexscan.h | 30 ++
src/include/executor/nodeDynamicSeqscan.h | 24 ++
src/include/gpopt/gpdbwrappers.h | 9 +
.../gpopt/translate/CTranslatorDXLToPlStmt.h | 22 +-
.../gpopt/translate/CTranslatorRelcacheToDXL.h | 1 +
src/include/nodes/execnodes.h | 170 +++++++++
src/include/nodes/nodes.h | 8 +
src/include/nodes/plannodes.h | 101 +++++
58 files changed, 4236 insertions(+), 142 deletions(-)
diff --git a/src/backend/cdb/cdbplan.c b/src/backend/cdb/cdbplan.c
index 3db2ec5449..af05bfd778 100644
--- a/src/backend/cdb/cdbplan.c
+++ b/src/backend/cdb/cdbplan.c
@@ -357,12 +357,38 @@ plan_tree_mutator(Node *node,
}
break;
+ case T_DynamicSeqScan:
+ {
+ DynamicSeqScan *dynamicSeqScan = (DynamicSeqScan *) node;
+ DynamicSeqScan *newDynamicSeqScan = NULL;
+
+ FLATCOPY(newDynamicSeqScan, dynamicSeqScan, DynamicSeqScan);
+ SCANMUTATE(newDynamicSeqScan, dynamicSeqScan);
+ return (Node *) newDynamicSeqScan;
+ }
+ break;
+
case T_IndexScan:
+ case T_DynamicIndexScan:
{
IndexScan *idxscan = (IndexScan *) node;
IndexScan *newidxscan;
- FLATCOPY(newidxscan, idxscan, IndexScan);
+ if (IsA(node, DynamicIndexScan))
+ {
+ /*
+ * A DynamicIndexScan is identical to IndexScan, except for
+ * additional fields. This convoluted coding is to avoid
+ * copy-pasting this code and risking bugs of omission if
+ * new fields are added to IndexScan in upstream.
+ */
+ DynamicIndexScan *newdiscan;
+
+ FLATCOPY(newdiscan, idxscan, DynamicIndexScan);
+ newidxscan = (IndexScan *) newdiscan;
+ }
+ else
+ FLATCOPY(newidxscan, idxscan, IndexScan);
SCANMUTATE(newidxscan, idxscan);
newidxscan->indexid = idxscan->indexid;
/* MUTATE(newidxscan->indexid, idxscan->indexid, List *); */
@@ -390,11 +416,21 @@ plan_tree_mutator(Node *node,
break;
case T_BitmapIndexScan:
+ case T_DynamicBitmapIndexScan:
{
BitmapIndexScan *idxscan = (BitmapIndexScan *) node;
BitmapIndexScan *newidxscan;
- FLATCOPY(newidxscan, idxscan, BitmapIndexScan);
+ if (IsA(node, DynamicBitmapIndexScan))
+ {
+ /* see comment above on DynamicIndexScan */
+ DynamicBitmapIndexScan *newdbiscan;
+
+ FLATCOPY(newdbiscan, idxscan, DynamicBitmapIndexScan);
+ newidxscan = (BitmapIndexScan *) newdbiscan;
+ }
+ else
+ FLATCOPY(newidxscan, idxscan, BitmapIndexScan);
SCANMUTATE(newidxscan, idxscan);
newidxscan->indexid = idxscan->indexid;
@@ -406,11 +442,21 @@ plan_tree_mutator(Node *node,
break;
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
{
BitmapHeapScan *bmheapscan = (BitmapHeapScan *) node;
BitmapHeapScan *newbmheapscan;
- FLATCOPY(newbmheapscan, bmheapscan, BitmapHeapScan);
+ if (IsA(node, DynamicBitmapHeapScan))
+ {
+ /* see comment above on DynamicIndexScan */
+ DynamicBitmapHeapScan *newdbhscan;
+
+ FLATCOPY(newdbhscan, bmheapscan, DynamicBitmapHeapScan);
+ newbmheapscan = (BitmapHeapScan *) newdbhscan;
+ }
+ else
+ FLATCOPY(newbmheapscan, bmheapscan, BitmapHeapScan);
SCANMUTATE(newbmheapscan, bmheapscan);
MUTATE(newbmheapscan->bitmapqualorig, bmheapscan->bitmapqualorig, List *);
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 340b682192..b68c81c062 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -50,6 +50,7 @@
#include "utils/xml.h"
#include "cdb/cdbgang.h"
+#include "executor/execDynamicScan.h"
#include "optimizer/tlist.h"
#include "optimizer/optimizer.h"
@@ -1394,6 +1395,7 @@ ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used)
case T_IndexScan:
case T_IndexOnlyScan:
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
case T_TidScan:
case T_TidRangeScan:
case T_SubqueryScan:
@@ -1403,6 +1405,8 @@ ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used)
case T_CteScan:
case T_NamedTuplestoreScan:
case T_WorkTableScan:
+ case T_DynamicSeqScan:
+ case T_DynamicIndexScan:
case T_ShareInputScan:
*rels_used = bms_add_member(*rels_used,
((Scan *) plan)->scanrelid);
@@ -1579,6 +1583,9 @@ ExplainNode(PlanState *planstate, List *ancestors,
case T_SeqScan:
pname = sname = "Seq Scan";
break;
+ case T_DynamicSeqScan:
+ pname = sname = "Dynamic Seq Scan";
+ break;
case T_SampleScan:
pname = sname = "Sample Scan";
break;
@@ -1591,12 +1598,18 @@ ExplainNode(PlanState *planstate, List *ancestors,
case T_IndexScan:
pname = sname = "Index Scan";
break;
+ case T_DynamicIndexScan:
+ pname = sname = "Dynamic Index Scan";
+ break;
case T_IndexOnlyScan:
pname = sname = "Index Only Scan";
break;
case T_BitmapIndexScan:
pname = sname = "Bitmap Index Scan";
break;
+ case T_DynamicBitmapIndexScan:
+ pname = sname = "Dynamic Bitmap Index Scan";
+ break;
case T_BitmapHeapScan:
/*
* We print "Bitmap Heap Scan", even for AO tables. It's a bit
@@ -1605,6 +1618,9 @@ ExplainNode(PlanState *planstate, List *ancestors,
*/
pname = sname = "Bitmap Heap Scan";
break;
+ case T_DynamicBitmapHeapScan:
+ pname = sname = "Dynamic Bitmap Heap Scan";
+ break;
case T_TidScan:
pname = sname = "Tid Scan";
break;
@@ -1903,8 +1919,11 @@ ExplainNode(PlanState *planstate, List *ancestors,
switch (nodeTag(plan))
{
case T_SeqScan:
+ case T_DynamicSeqScan:
+ case T_DynamicIndexScan:
case T_SampleScan:
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
case T_TidScan:
case T_TidRangeScan:
case T_SubqueryScan:
@@ -1954,6 +1973,29 @@ ExplainNode(PlanState *planstate, List *ancestors,
ExplainPropertyText("Index Name", indexname, es);
}
break;
+ case T_DynamicBitmapIndexScan:
+ {
+ /* GPDB_12_MERGE_FIXME */
+#if 0
+ BitmapIndexScan *bitmapindexscan = (BitmapIndexScan *) plan;
+ Oid indexoid = bitmapindexscan->indexid;
+ Oid parentOid = rel_partition_get_root(indexoid);
+ while (parentOid != InvalidOid)
+ {
+ indexoid = parentOid;
+ parentOid = rel_partition_get_root(indexoid);
+ }
+
+ const char *indexname =
+ explain_get_index_name(indexoid);
+
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ appendStringInfo(es->str, " on %s", indexname);
+ else
+ ExplainPropertyText("Index Name", indexname, es);
+#endif
+ }
+ break;
case T_ModifyTable:
ExplainModifyTarget((ModifyTable *) plan, es);
break;
@@ -2240,6 +2282,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
switch (nodeTag(plan))
{
case T_IndexScan:
+ case T_DynamicIndexScan:
show_scan_qual(((IndexScan *) plan)->indexqualorig,
"Index Cond", planstate, ancestors, es);
if (((IndexScan *) plan)->indexqualorig)
@@ -2269,10 +2312,12 @@ ExplainNode(PlanState *planstate, List *ancestors,
planstate->instrument->ntuples2, 0, es);
break;
case T_BitmapIndexScan:
+ case T_DynamicBitmapIndexScan:
show_scan_qual(((BitmapIndexScan *) plan)->indexqualorig,
"Index Cond", planstate, ancestors, es);
break;
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
{
List *bitmapqualorig;
@@ -2298,11 +2343,26 @@ ExplainNode(PlanState *planstate, List *ancestors,
/* fall through to print additional fields the same as SeqScan */
/* FALLTHROUGH */
case T_SeqScan:
+ case T_DynamicSeqScan:
case T_ValuesScan:
case T_CteScan:
case T_NamedTuplestoreScan:
case T_WorkTableScan:
case T_SubqueryScan:
+ /*
+ * GPDB_12_MERGE_FIXME: we used to show something along the lines of
+ * "Partitions selected: 1 (out of 5)" under the partition selector.
+ * By eleminating the (static) partition selector during translation,
+ * we only get the survivor count, and lose the size of the universe
+ * temporarily. However, if we manage to shift the static pruning
+ * information sufficiently adjacent to (or better, into) a DXL Dynamic
+ * Table Scan, we should be able to get that information back.
+ */
+ if (IsA(plan, DynamicSeqScan))
+ ExplainPropertyInteger(
+ "Number of partitions to scan", "",
+ list_length(((DynamicSeqScan *) plan)->partOids), es);
+
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
if (plan->qual)
show_instrumentation_count("Rows Removed by Filter", 1,
@@ -4492,10 +4552,13 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
switch (nodeTag(plan))
{
case T_SeqScan:
+ case T_DynamicSeqScan:
case T_SampleScan:
case T_IndexScan:
+ case T_DynamicIndexScan:
case T_IndexOnlyScan:
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
case T_TidScan:
case T_TidRangeScan:
case T_ForeignScan:
@@ -4508,6 +4571,15 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
namespace = get_namespace_name(get_rel_namespace(rte->relid));
objecttag = "Relation Name";
+ /* Print dynamic scan id for dynamic scan operators */
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ if (isDynamicScan(plan))
+ {
+ dynamicScanId = DynamicScan_GetDynamicScanIdPrintable(plan);
+ }
+#endif
+
break;
case T_FunctionScan:
{
diff --git a/src/backend/commands/explain_gp.c b/src/backend/commands/explain_gp.c
index 73dc1d1363..559ec16c93 100644
--- a/src/backend/commands/explain_gp.c
+++ b/src/backend/commands/explain_gp.c
@@ -286,6 +286,7 @@ static void cdbexplain_depositStatsToNode(PlanState *planstate,
CdbExplain_RecvStatCtx *ctx);
static int cdbexplain_collectExtraText(PlanState *planstate,
StringInfo notebuf);
+static int cdbexplain_countLeafPartTables(PlanState *planstate);
static void show_motion_keys(PlanState *planstate, List *hashExpr, int nkeys,
AttrNumber *keycols, const char *qlabel,
@@ -1652,6 +1653,98 @@ cdbexplain_showExecStats(struct PlanState *planstate, ExplainState *es)
}
}
+ /*
+ * Print number of partitioned tables scanned for dynamic scans.
+ */
+ if (0 <= ns->totalPartTableScanned.vcnt && (T_DynamicSeqScanState == planstate->type
+ || T_DynamicIndexScanState == planstate->type))
+ {
+ /*
+ * FIXME: Only displayed in TEXT format
+ * [#159443692]
+ */
+ if (es->format == EXPLAIN_FORMAT_TEXT)
+ {
+ double nPartTableScanned_avg = cdbexplain_agg_avg(&ns->totalPartTableScanned);
+
+ if (0 == nPartTableScanned_avg)
+ {
+ if (T_DynamicBitmapHeapScanState == planstate->type)
+ {
+ int numTotalLeafParts = cdbexplain_countLeafPartTables(planstate);
+
+ appendStringInfoSpaces(es->str, es->indent * 2);
+ appendStringInfo(es->str,
+ "Partitions scanned: 0 (out of %d).\n",
+ numTotalLeafParts);
+ }
+ }
+ else
+ {
+ cdbexplain_formatSeg(segbuf, sizeof(segbuf), ns->totalPartTableScanned.imax, ns->ninst);
+ int numTotalLeafParts = cdbexplain_countLeafPartTables(planstate);
+
+ appendStringInfoSpaces(es->str, es->indent * 2);
+
+ /* only 1 segment scans partitions */
+ if (1 == ns->totalPartTableScanned.vcnt)
+ {
+ /* rescan */
+ if (1 < instr->nloops)
+ {
+ double totalPartTableScannedPerRescan = ns->totalPartTableScanned.vmax / instr->nloops;
+
+ appendStringInfo(es->str,
+ "Partitions scanned: %.0f (out of %d) %s of %ld scans.\n",
+ totalPartTableScannedPerRescan,
+ numTotalLeafParts,
+ segbuf,
+ instr->nloops);
+ }
+ else
+ {
+ appendStringInfo(es->str,
+ "Partitions scanned: %.0f (out of %d) %s.\n",
+ ns->totalPartTableScanned.vmax,
+ numTotalLeafParts,
+ segbuf);
+ }
+ }
+ else
+ {
+ /* rescan */
+ if (1 < instr->nloops)
+ {
+ double totalPartTableScannedPerRescan = nPartTableScanned_avg / instr->nloops;
+ double maxPartTableScannedPerRescan = ns->totalPartTableScanned.vmax / instr->nloops;
+
+ appendStringInfo(es->str,
+ "Partitions scanned: Avg %.1f (out of %d) x %d workers of %ld scans."
+ " Max %.0f parts%s.\n",
+ totalPartTableScannedPerRescan,
+ numTotalLeafParts,
+ ns->totalPartTableScanned.vcnt,
+ instr->nloops,
+ maxPartTableScannedPerRescan,
+ segbuf
+ );
+ }
+ else
+ {
+ appendStringInfo(es->str,
+ "Partitions scanned: Avg %.1f (out of %d) x %d workers."
+ " Max %.0f parts%s.\n",
+ nPartTableScanned_avg,
+ numTotalLeafParts,
+ ns->totalPartTableScanned.vcnt,
+ ns->totalPartTableScanned.vmax,
+ segbuf);
+ }
+ }
+ }
+ }
+ }
+
bool haveExtraText = false;
StringInfoData extraData;
@@ -2133,6 +2226,23 @@ gpexplain_formatSlicesOutput(struct CdbExplain_ShowStatCtx *showstatctx,
}
}
+static int
+cdbexplain_countLeafPartTables(PlanState *planstate)
+{
+ Assert(IsA(planstate, DynamicSeqScanState) ||
+ IsA(planstate, DynamicIndexScanState));
+
+ return -1;
+ /* GPDB_12_MERGE_FIXME */
+#if 0
+ Scan *scan = (Scan *) planstate->plan;
+
+ Oid root_oid = getrelid(scan->scanrelid, planstate->state->es_range_table);
+
+ return countLeafPartTables(root_oid);
+#endif
+}
+
/*
* Show the hash and merge keys for a Motion node.
*/
diff --git a/src/backend/executor/Makefile b/src/backend/executor/Makefile
index ceb05d1180..9403563c96 100644
--- a/src/backend/executor/Makefile
+++ b/src/backend/executor/Makefile
@@ -91,4 +91,13 @@ OBJS += nodeMotion.o \
nodeTupleSplit.o \
nodePartitionSelector.o
+OBJS += nodeDynamicSeqscan.o
+
+# GPDB_12_MERGE_FIXME: Are any of these still needed?
+#OBJS += nodeDynamicIndexscan.o \
+# nodeDynamicBitmapHeapscan.o \
+# nodeDynamicBitmapIndexscan.o \
+# nodeDynamicSeqscan.o
+# execDynamicScan.o
+
include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c
index c92c478178..e74b10446d 100644
--- a/src/backend/executor/execAmi.c
+++ b/src/backend/executor/execAmi.c
@@ -21,6 +21,8 @@
#include "executor/nodeBitmapAnd.h"
#include "executor/nodeBitmapHeapscan.h"
#include "executor/nodeBitmapIndexscan.h"
+#include "executor/nodeDynamicBitmapHeapscan.h"
+#include "executor/nodeDynamicBitmapIndexscan.h"
#include "executor/nodeBitmapOr.h"
#include "executor/nodeCtescan.h"
#include "executor/nodeCustom.h"
@@ -62,6 +64,8 @@
#include "executor/nodeWindowAgg.h"
#include "executor/nodeWorktablescan.h"
#include "executor/nodeAssertOp.h"
+#include "executor/nodeDynamicSeqscan.h"
+#include "executor/nodeDynamicIndexscan.h"
#include "executor/nodeMotion.h"
#include "executor/nodeSequence.h"
#include "executor/nodeTableFunction.h"
@@ -215,6 +219,17 @@ ExecReScan(PlanState *node)
ExecReScanIndexScan((IndexScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicSeqScanState:
+ ExecReScanDynamicSeqScan((DynamicSeqScanState *) node);
+ break;
+
+ case T_DynamicIndexScanState:
+ ExecReScanDynamicIndex((DynamicIndexScanState *) node);
+ break;
+#endif
+
case T_IndexOnlyScanState:
ExecReScanIndexOnlyScan((IndexOnlyScanState *) node);
break;
@@ -223,10 +238,24 @@ ExecReScan(PlanState *node)
ExecReScanBitmapIndexScan((BitmapIndexScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapIndexScanState:
+ ExecReScanDynamicBitmapIndex((DynamicBitmapIndexScanState *) node);
+ break;
+#endif
+
case T_BitmapHeapScanState:
ExecReScanBitmapHeapScan((BitmapHeapScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapHeapScanState:
+ ExecReScanDynamicBitmapHeapScan((DynamicBitmapHeapScanState *) node);
+ break;
+#endif
+
case T_TidScanState:
ExecReScanTidScan((TidScanState *) node);
break;
@@ -776,6 +805,7 @@ ExecSquelchNode(PlanState *node, bool force)
case T_BitmapAndState:
case T_BitmapOrState:
case T_RuntimeFilterState:
+ case T_DynamicBitmapHeapScanState:
case T_LimitState:
case T_LockRowsState:
case T_NestLoopState:
@@ -797,7 +827,10 @@ ExecSquelchNode(PlanState *node, bool force)
*/
case T_SeqScanState:
case T_IndexScanState:
+ case T_DynamicSeqScanState:
+ case T_DynamicIndexScanState:
case T_IndexOnlyScanState:
+ case T_DynamicBitmapIndexScanState:
case T_BitmapIndexScanState:
case T_TableFuncScanState:
case T_ValuesScanState:
diff --git a/src/backend/executor/execDynamicScan.c b/src/backend/executor/execDynamicScan.c
new file mode 100644
index 0000000000..d0496f2e50
--- /dev/null
+++ b/src/backend/executor/execDynamicScan.c
@@ -0,0 +1,158 @@
+/*-------------------------------------------------------------------------
+ *
+ * execDynamicScan.c
+ * Support routines for iterating through dynamically chosen partitions of a relation
+ *
+ * Portions Copyright (c) 2014-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/executor/execDynamicScan.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "cdb/partitionselection.h"
+#include "executor/executor.h"
+#include "executor/execDynamicScan.h"
+#include "parser/parsetree.h"
+
+/*
+ * isDynamicScan
+ * Returns true if the scan node is dynamic (i.e., determining
+ * relations to scan at runtime).
+ */
+bool
+isDynamicScan(const Plan *plan)
+{
+ switch (nodeTag(plan))
+ {
+ case T_DynamicSeqScan:
+ case T_DynamicIndexScan:
+ case T_DynamicBitmapHeapScan:
+ case T_DynamicBitmapIndexScan:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+/*
+ * DynamicScan_GetDynamicScanId
+ * Returns the index into EState->dynamicTableScanInfo arrays for this
+ * dynamic scan node.
+ */
+static int
+DynamicScan_GetDynamicScanId(Plan *plan)
+{
+ switch (nodeTag(plan))
+ {
+ case T_DynamicSeqScan:
+ return ((DynamicSeqScan *) plan)->partIndex;
+
+ case T_DynamicIndexScan:
+ return ((DynamicIndexScan *) plan)->partIndex;
+
+ case T_DynamicBitmapHeapScan:
+ return ((DynamicBitmapHeapScan *) plan)->partIndex;
+
+ case T_DynamicBitmapIndexScan:
+ return ((DynamicBitmapIndexScan *) plan)->partIndex;
+
+ default:
+ elog(ERROR, "unknown dynamic scan node type %u", nodeTag(plan));
+ }
+}
+
+/*
+ * DynamicScan_GetDynamicScanIdPrintable
+ * Return "printable" scan id for a node, for EXPLAIN
+ */
+int
+DynamicScan_GetDynamicScanIdPrintable(Plan *plan)
+{
+ switch (nodeTag(plan))
+ {
+ case T_DynamicSeqScan:
+ return ((DynamicSeqScan *) plan)->partIndexPrintable;
+
+ case T_DynamicIndexScan:
+ return ((DynamicIndexScan *) plan)->partIndexPrintable;
+
+ case T_DynamicBitmapHeapScan:
+ return ((DynamicBitmapHeapScan *) plan)->partIndexPrintable;
+
+ case T_DynamicBitmapIndexScan:
+ return ((DynamicBitmapIndexScan *) plan)->partIndexPrintable;
+
+ default:
+ elog(ERROR, "unknown dynamic scan node type %u", nodeTag(plan));
+ }
+}
+
+/*
+ * DynamicScan_GetTableOid
+ * Returns the Oid of the table/partition to scan.
+ *
+ * A partition must have been selected already.
+ */
+Oid
+DynamicScan_GetTableOid(ScanState *scanState)
+{
+ int partIndex;
+ Oid curRelOid;
+
+ partIndex = DynamicScan_GetDynamicScanId(scanState->ps.plan);
+
+ /* Get the oid of the current relation */
+ Assert(NULL != scanState->ps.state->dynamicTableScanInfo);
+ Assert(partIndex <= scanState->ps.state->dynamicTableScanInfo->numScans);
+
+ curRelOid = scanState->ps.state->dynamicTableScanInfo->curRelOids[partIndex - 1];
+ if (!OidIsValid(curRelOid))
+ elog(ERROR, "no partition selected for dynamic scan id %d", partIndex);
+
+ return curRelOid;
+}
+
+/*
+ * DynamicScan_SetTableOid
+ * Select a partition to scan in a dynamic scan.
+ *
+ * This is used to advertise the selected partition in EState->dynamicTableScanInfo.
+ */
+void
+DynamicScan_SetTableOid(ScanState *scanState, Oid curRelOid)
+{
+ int partIndex;
+
+ partIndex = DynamicScan_GetDynamicScanId(scanState->ps.plan);
+
+ Assert(NULL != scanState->ps.state->dynamicTableScanInfo);
+ Assert(partIndex <= scanState->ps.state->dynamicTableScanInfo->numScans);
+
+ scanState->ps.state->dynamicTableScanInfo->curRelOids[partIndex - 1] = curRelOid;
+}
+
+/*
+ * DynamicScan_RemapExpression
+ * Re-maps the expression using the provided attMap.
+ */
+bool
+DynamicScan_RemapExpression(ScanState *scanState, AttrNumber *attMap, Node *expr)
+{
+ if (!isDynamicScan(scanState->ps.plan))
+ {
+ return false;
+ }
+
+ if (NULL != attMap)
+ {
+ change_varattnos_of_a_varno((Node*)expr, attMap, ((Scan *)scanState->ps.plan)->scanrelid);
+ return true;
+ }
+
+ return false;
+}
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c
index 5a1a45a600..015de0d73f 100644
--- a/src/backend/executor/execProcnode.c
+++ b/src/backend/executor/execProcnode.c
@@ -81,6 +81,8 @@
#include "executor/nodeBitmapAnd.h"
#include "executor/nodeBitmapHeapscan.h"
#include "executor/nodeBitmapIndexscan.h"
+#include "executor/nodeDynamicBitmapHeapscan.h"
+#include "executor/nodeDynamicBitmapIndexscan.h"
#include "executor/nodeBitmapOr.h"
#include "executor/nodeCtescan.h"
#include "executor/nodeCustom.h"
@@ -127,6 +129,8 @@
#include "cdb/cdbvars.h"
#include "cdb/ml_ipc.h" /* interconnect context */
#include "executor/nodeAssertOp.h"
+#include "executor/nodeDynamicIndexscan.h"
+#include "executor/nodeDynamicSeqscan.h"
#include "executor/nodeMotion.h"
#include "executor/nodePartitionSelector.h"
#include "executor/nodeSequence.h"
@@ -279,6 +283,11 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
estate, eflags);
break;
+ case T_DynamicSeqScan:
+ result = (PlanState *) ExecInitDynamicSeqScan((DynamicSeqScan *) node,
+ estate, eflags);
+ break;
+
case T_SampleScan:
result = (PlanState *) ExecInitSampleScan((SampleScan *) node,
estate, eflags);
@@ -289,6 +298,14 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
estate, eflags);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicIndexScan:
+ result = (PlanState *) ExecInitDynamicIndexScan((DynamicIndexScan *) node,
+ estate, eflags);
+ break;
+#endif
+
case T_IndexOnlyScan:
result = (PlanState *) ExecInitIndexOnlyScan((IndexOnlyScan *) node,
estate, eflags);
@@ -299,11 +316,27 @@ ExecInitNode(Plan *node, EState *estate, int eflags)
estate, eflags);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapIndexScan:
+ result = (PlanState *) ExecInitDynamicBitmapIndexScan((DynamicBitmapIndexScan *) node,
+ estate, eflags);
+ break;
+#endif
+
case T_BitmapHeapScan:
result = (PlanState *) ExecInitBitmapHeapScan((BitmapHeapScan *) node,
estate, eflags);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapHeapScan:
+ result = (PlanState *) ExecInitDynamicBitmapHeapScan((DynamicBitmapHeapScan *) node,
+ estate, eflags);
+ break;
+#endif
+
case T_TidScan:
result = (PlanState *) ExecInitTidScan((TidScan *) node,
estate, eflags);
@@ -717,6 +750,13 @@ MultiExecProcNode(PlanState *node)
result = MultiExecBitmapIndexScan((BitmapIndexScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapIndexScanState:
+ result = MultiExecDynamicBitmapIndexScan((DynamicBitmapIndexScanState *) node);
+ break;
+#endif
+
case T_BitmapAndState:
result = MultiExecBitmapAnd((BitmapAndState *) node);
break;
@@ -827,6 +867,10 @@ ExecEndNode(PlanState *node)
ExecEndSeqScan((SeqScanState *) node);
break;
+ case T_DynamicSeqScanState:
+ ExecEndDynamicSeqScan((DynamicSeqScanState *) node);
+ break;
+
case T_SampleScanState:
ExecEndSampleScan((SampleScanState *) node);
break;
@@ -843,6 +887,13 @@ ExecEndNode(PlanState *node)
ExecEndIndexScan((IndexScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicIndexScanState:
+ ExecEndDynamicIndexScan((DynamicIndexScanState *) node);
+ break;
+#endif
+
case T_IndexOnlyScanState:
ExecEndIndexOnlyScan((IndexOnlyScanState *) node);
break;
@@ -851,10 +902,24 @@ ExecEndNode(PlanState *node)
ExecEndBitmapIndexScan((BitmapIndexScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapIndexScanState:
+ ExecEndDynamicBitmapIndexScan((DynamicBitmapIndexScanState *) node);
+ break;
+#endif
+
case T_BitmapHeapScanState:
ExecEndBitmapHeapScan((BitmapHeapScanState *) node);
break;
+/* GPDB_12_MERGE_FIXME */
+#if 0
+ case T_DynamicBitmapHeapScanState:
+ ExecEndDynamicBitmapHeapScan((DynamicBitmapHeapScanState *) node);
+ break;
+#endif
+
case T_TidScanState:
ExecEndTidScan((TidScanState *) node);
break;
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 59537345a3..82dcdb1dff 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -144,6 +144,11 @@ CreateExecutorState(void)
estate = makeNode(EState);
+ /*
+ * Initialize dynamicTableScanInfo.
+ */
+ estate->dynamicTableScanInfo = palloc0(sizeof(DynamicTableScanInfo));
+
/*
* Initialize all fields of the Executor State structure
*/
@@ -259,6 +264,7 @@ FreeExecutorState(EState *estate)
}
estate->dispatcherState = NULL;
+ estate->dynamicTableScanInfo = NULL;
/* release JIT context, if allocated */
if (estate->es_jit)
diff --git a/src/backend/executor/nodeDynamicBitmapHeapscan.c b/src/backend/executor/nodeDynamicBitmapHeapscan.c
new file mode 100644
index 0000000000..c39a27d611
--- /dev/null
+++ b/src/backend/executor/nodeDynamicBitmapHeapscan.c
@@ -0,0 +1,331 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicBitmapHeapscan.c
+ * Routines to support bitmapped scans of relations
+ *
+ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2008-2009, Greenplum Inc.
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/executor/nodeDynamicBitmapHeapscan.c
+ *
+ *-------------------------------------------------------------------------
+ */
+/*
+ * INTERFACE ROUTINES
+ * ExecDynamicBitmapHeapScan scans a relation using bitmap info
+ * ExecDynamicBitmapHeapNext workhorse for above
+ * ExecInitDynamicBitmapHeapScan creates and initializes state info.
+ * ExecReScanDynamicBitmapHeapScan prepares to rescan the plan.
+ * ExecEndDynamicBitmapHeapScan releases all storage.
+ */
+#include "postgres.h"
+
+#include "executor/executor.h"
+#include "executor/instrument.h"
+#include "executor/execDynamicScan.h"
+#include "executor/nodeBitmapHeapscan.h"
+#include "executor/nodeDynamicBitmapHeapscan.h"
+#include "nodes/execnodes.h"
+#include "utils/hsearch.h"
+#include "parser/parsetree.h"
+#include "utils/memutils.h"
+#include "cdb/cdbvars.h"
+#include "cdb/partitionselection.h"
+
+static void CleanupOnePartition(DynamicBitmapHeapScanState *node);
+
+DynamicBitmapHeapScanState *
+ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int eflags)
+{
+ DynamicBitmapHeapScanState *state;
+ Oid reloid;
+
+ Assert((eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)) == 0);
+
+ state = makeNode(DynamicBitmapHeapScanState);
+ state->eflags = eflags;
+ state->ss.ps.plan = (Plan *) node;
+ state->ss.ps.state = estate;
+
+ state->scan_state = SCAN_INIT;
+
+ /* Initialize result tuple type. */
+ ExecInitResultTupleSlot(estate, &state->ss.ps);
+ ExecAssignResultTypeFromTL(&state->ss.ps);
+
+ reloid = getrelid(node->bitmapheapscan.scan.scanrelid, estate->es_range_table);
+ Assert(OidIsValid(reloid));
+
+ state->firstPartition = true;
+
+ /* lastRelOid is used to remap varattno for heterogeneous partitions */
+ state->lastRelOid = reloid;
+
+ state->scanrelid = node->bitmapheapscan.scan.scanrelid;
+
+ /*
+ * This context will be reset per-partition to free up per-partition
+ * qual and targetlist allocations
+ */
+ state->partitionMemoryContext = AllocSetContextCreate(CurrentMemoryContext,
+ "DynamicBitmapHeapScanPerPartition",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+
+ /*
+ * initialize child nodes.
+ *
+ * We will initialize the "sidecar" BitmapHeapScan for each partition, but
+ * the child nodes, (i.e. Dynamic Bitmap Index Scan or a BitmapAnd/Or node)
+ * we only rescan.
+ */
+ outerPlanState(state) = ExecInitNode(outerPlan(node), estate, eflags);
+
+ return state;
+}
+
+/*
+ * initNextTableToScan
+ * Find the next table to scan and initiate the scan if the previous table
+ * is finished.
+ *
+ * If scanning on the current table is not finished, or a new table is found,
+ * this function returns true.
+ * If no more table is found, this function returns false.
+ */
+static bool
+initNextTableToScan(DynamicBitmapHeapScanState *node)
+{
+ ScanState *scanState = (ScanState *)node;
+ DynamicBitmapHeapScan *plan = (DynamicBitmapHeapScan *) scanState->ps.plan;
+ EState *estate = scanState->ps.state;
+ Relation lastScannedRel;
+ TupleDesc partTupDesc;
+ TupleDesc lastTupDesc;
+ AttrNumber *attMap;
+ Oid currentPartitionOid;
+ Oid *pid;
+ Relation currentRelation;
+
+ pid = hash_seq_search(&node->pidStatus);
+ if (pid == NULL)
+ {
+ node->shouldCallHashSeqTerm = false;
+ return false;
+ }
+ currentPartitionOid = *pid;
+
+ /* Collect number of partitions scanned in EXPLAIN ANALYZE */
+ if (NULL != scanState->ps.instrument)
+ {
+ Instrumentation *instr = scanState->ps.instrument;
+ instr->numPartScanned++;
+ }
+
+ CleanupOnePartition(node);
+
+ currentRelation = scanState->ss_currentRelation = heap_open(currentPartitionOid, AccessShareLock);
+ lastScannedRel = heap_open(node->lastRelOid, AccessShareLock);
+ lastTupDesc = RelationGetDescr(lastScannedRel);
+ partTupDesc = RelationGetDescr(scanState->ss_currentRelation);
+ attMap = varattnos_map(lastTupDesc, partTupDesc);
+ heap_close(lastScannedRel, AccessShareLock);
+
+ /* If attribute remapping is not necessary, then do not change the varattno */
+ if (attMap)
+ {
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid);
+
+ /*
+ * Now that the varattno mapping has been changed, change the relation that
+ * the new varnos correspond to
+ */
+ node->lastRelOid = currentPartitionOid;
+ }
+
+ /*
+ * For the very first partition, the targetlist of planstate is set to null. So, we must
+ * initialize quals and targetlist, regardless of remapping requirements. For later
+ * partitions, we only initialize quals and targetlist if a column re-mapping is necessary.
+ */
+ if (attMap || node->firstPartition)
+ {
+ node->firstPartition = false;
+ MemoryContextReset(node->partitionMemoryContext);
+ MemoryContext oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
+
+ /* Initialize child expressions */
+ scanState->ps.qual = (List *) ExecInitExpr((Expr *) scanState->ps.plan->qual,
+ (PlanState *) scanState);
+ scanState->ps.targetlist = (List *) ExecInitExpr((Expr *) scanState->ps.plan->targetlist,
+ (PlanState *) scanState);
+
+ MemoryContextSwitchTo(oldCxt);
+ }
+
+ if (attMap)
+ pfree(attMap);
+
+ DynamicScan_SetTableOid(&node->ss, currentPartitionOid);
+ node->bhsState = ExecInitBitmapHeapScanForPartition(&plan->bitmapheapscan, estate, node->eflags,
+ currentRelation);
+
+ /*
+ * Rescan the child node, and attach it to the sidecar BitmapHeapScan.
+ */
+ ExecReScan(outerPlanState(node));
+ outerPlanState(node->bhsState) = outerPlanState(node);
+
+ return true;
+}
+
+/*
+ * setPidIndex
+ * Set the pid index for the given dynamic table.
+ */
+static void
+setPidIndex(DynamicBitmapHeapScanState *node)
+{
+ Assert(node->pidIndex == NULL);
+
+ ScanState *scanState = (ScanState *)node;
+ EState *estate = scanState->ps.state;
+ DynamicBitmapHeapScan *plan = (DynamicBitmapHeapScan *) scanState->ps.plan;
+
+ Assert(estate->dynamicTableScanInfo != NULL);
+
+ /*
+ * Ensure that the dynahash exists even if the partition selector
+ * didn't choose any partition for current scan node [MPP-24169].
+ */
+ InsertPidIntoDynamicTableScanInfo(estate, plan->partIndex,
+ InvalidOid, InvalidPartitionSelectorId);
+
+ Assert(NULL != estate->dynamicTableScanInfo->pidIndexes);
+ Assert(estate->dynamicTableScanInfo->numScans >= plan->partIndex);
+ node->pidIndex = estate->dynamicTableScanInfo->pidIndexes[plan->partIndex - 1];
+ Assert(node->pidIndex != NULL);
+}
+
+TupleTableSlot *
+ExecDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
+{
+ TupleTableSlot *slot = NULL;
+
+ /*
+ * If this is called the first time, find the pid index that contains all unique
+ * partition pids for this node to scan.
+ */
+ if (node->pidIndex == NULL)
+ {
+ setPidIndex(node);
+ Assert(node->pidIndex != NULL);
+
+ hash_seq_init(&node->pidStatus, node->pidIndex);
+ node->shouldCallHashSeqTerm = true;
+ }
+
+ /*
+ * Scan the table to find next tuple to return. If the current table
+ * is finished, close it and open the next table for scan.
+ */
+ for (;;)
+ {
+ if (!node->bhsState)
+ {
+ /* No partition open. Open the next one, if any. */
+ if (!initNextTableToScan(node))
+ break;
+ }
+
+ slot = ExecBitmapHeapScan(node->bhsState);
+
+ if (!TupIsNull(slot))
+ break;
+
+ /* No more tuples from this partition. Move to next one. */
+ CleanupOnePartition(node);
+ }
+
+ return slot;
+}
+
+/*
+ * CleanupOnePartition
+ * Cleans up a partition's relation and releases all locks.
+ */
+static void
+CleanupOnePartition(DynamicBitmapHeapScanState *scanState)
+{
+ Assert(NULL != scanState);
+
+ if (scanState->bhsState)
+ {
+ /*
+ * Detach the child node, so that we end just the bitmap heap scan,
+ * not the children.
+ */
+ outerPlanState(scanState->bhsState) = NULL;
+ ExecEndBitmapHeapScan(scanState->bhsState);
+ scanState->bhsState = NULL;
+ }
+ if ((scanState->scan_state & SCAN_SCAN) != 0)
+ {
+ Assert(scanState->ss.ss_currentRelation != NULL);
+ ExecCloseScanRelation(scanState->ss.ss_currentRelation);
+ scanState->ss.ss_currentRelation = NULL;
+ }
+}
+
+/*
+ * DynamicBitmapHeapScanEndCurrentScan
+ * Cleans up any ongoing scan.
+ */
+static void
+DynamicBitmapHeapScanEndCurrentScan(DynamicBitmapHeapScanState *node)
+{
+ CleanupOnePartition(node);
+
+ if (node->shouldCallHashSeqTerm)
+ {
+ hash_seq_term(&node->pidStatus);
+ node->shouldCallHashSeqTerm = false;
+ }
+}
+
+/*
+ * ExecEndDynamicBitmapHeapScan
+ * Ends the scanning of this DynamicBitmapHeapScanNode and frees
+ * up all the resources.
+ */
+void
+ExecEndDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
+{
+ DynamicBitmapHeapScanEndCurrentScan(node);
+
+ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
+
+ /*
+ * close down subplans
+ */
+ ExecEndNode(outerPlanState(node));
+}
+
+/*
+ * ExecReScanDynamicBitmapHeapScan
+ * Prepares the internal states for a rescan.
+ */
+void
+ExecReScanDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node)
+{
+ DynamicBitmapHeapScanEndCurrentScan(node);
+
+ /* Force reloading the partition hash table */
+ node->pidIndex = NULL;
+}
diff --git a/src/backend/executor/nodeDynamicBitmapIndexscan.c b/src/backend/executor/nodeDynamicBitmapIndexscan.c
new file mode 100644
index 0000000000..5dd5372bd2
--- /dev/null
+++ b/src/backend/executor/nodeDynamicBitmapIndexscan.c
@@ -0,0 +1,234 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicBitmapIndexscan.c
+ * Support routines for bitmap-scanning a partition of a table, where
+ * the partition is determined at runtime.
+ *
+ * This is a thin wrapper around a regular non-dynamic Bitmap Index Scan
+ * executor node. The Begin function doesn't do much. But when
+ * MultiExecDynamicBitmapIndexScan() is called, to get the result,
+ * we initialize a BitmapIndexScanState executor node for the currently
+ * open partition, and call MultiExecBitmapIndexScan() on it. On rescan,
+ * the underlying BitmapIndexScanState is destroyed.
+ *
+ * This is somewhat different from a Dynamic Index Scan. While a Dynamic
+ * Index Scan needs to iterate through all the active partitions, a Dynamic
+ * Bitmap Index Scan works as a slave of a dynamic Bitmap Heap Scan node
+ * above it. It scans only one partition at a time, but the partition
+ * can change at a rescan.
+ *
+ * Portions Copyright (c) 2013 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/executor/nodeDynamicBitmapIndexscan.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "cdb/cdbvars.h"
+#include "cdb/partitionselection.h"
+#include "executor/executor.h"
+#include "executor/instrument.h"
+#include "nodes/execnodes.h"
+#include "executor/nodeBitmapIndexscan.h"
+#include "executor/execDynamicScan.h"
+#include "executor/nodeDynamicIndexscan.h"
+#include "executor/nodeDynamicBitmapIndexscan.h"
+#include "access/genam.h"
+#include "nodes/nodeFuncs.h"
+#include "utils/memutils.h"
+
+/*
+ * Initialize ScanState in DynamicBitmapIndexScan.
+ */
+DynamicBitmapIndexScanState *
+ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int eflags)
+{
+ DynamicBitmapIndexScanState *dynamicBitmapIndexScanState;
+
+ /* check for unsupported flags */
+ Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
+
+ dynamicBitmapIndexScanState = makeNode(DynamicBitmapIndexScanState);
+ dynamicBitmapIndexScanState->ss.ps.plan = (Plan *) node;
+ dynamicBitmapIndexScanState->ss.ps.state = estate;
+ dynamicBitmapIndexScanState->eflags = eflags;
+
+ /*
+ * This context will be reset per-partition to free up per-partition
+ * copy of LogicalIndexInfo
+ */
+ dynamicBitmapIndexScanState->partitionMemoryContext = AllocSetContextCreate(CurrentMemoryContext,
+ "DynamicBitmapIndexScanPerPartition",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+
+ return dynamicBitmapIndexScanState;
+}
+
+static void
+BitmapIndexScan_ReMapColumns(DynamicBitmapIndexScan *dbiScan, Oid oldOid, Oid newOid)
+{
+ AttrNumber *attMap;
+
+ Assert(OidIsValid(newOid));
+
+ if (oldOid == newOid)
+ {
+ /*
+ * If we have only one partition and we are rescanning
+ * then we can have this scenario.
+ */
+ return;
+ }
+
+ attMap = IndexScan_GetColumnMapping(oldOid, newOid);
+
+ if (attMap)
+ {
+ IndexScan_MapLogicalIndexInfo(dbiScan->logicalIndexInfo,
+ attMap,
+ dbiScan->biscan.scan.scanrelid);
+
+ /* A bitmap index scan has no target list or quals */
+
+ pfree(attMap);
+ }
+}
+
+
+/*
+ * Find the correct index in the given partition, and create a BitmapIndexScan executor
+ * node to scan it.
+ */
+static void
+beginCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node, EState *estate,
+ Oid tableOid)
+{
+ DynamicBitmapIndexScan *dbiScan = (DynamicBitmapIndexScan *) node->ss.ps.plan;
+ Relation currentRelation;
+ Oid indexOid;
+ MemoryContext oldCxt;
+
+ oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
+
+ /*
+ * Re-map the index columns, per the new partition, and find the correct
+ * index.
+ */
+ if (!OidIsValid(node->columnLayoutOid))
+ {
+ /* Very first partition */
+ node->columnLayoutOid = rel_partition_get_root(tableOid);
+ }
+ BitmapIndexScan_ReMapColumns(dbiScan, node->columnLayoutOid, tableOid);
+ node->columnLayoutOid = tableOid;
+
+ /*
+ * The is the oid of the partition of an *index*. Note: a partitioned table
+ * has a root and a set of partitions (may be multi-level). An index
+ * on a partitioned table also has a root and a set of index partitions.
+ * We started at table level, and now we are fetching the oid of an index
+ * partition.
+ */
+ currentRelation = heap_open(tableOid, AccessShareLock);
+ indexOid = getPhysicalIndexRelid(currentRelation, dbiScan->logicalIndexInfo);
+ if (!OidIsValid(indexOid))
+ elog(ERROR, "failed to find index for partition \"%s\" in dynamic index scan",
+ RelationGetRelationName(currentRelation));
+ ExecCloseScanRelation(currentRelation);
+
+ /* Modify the plan node with the index ID */
+ dbiScan->biscan.indexid = indexOid;
+
+ node->bitmapIndexScanState = ExecInitBitmapIndexScan(&dbiScan->biscan,
+ estate,
+ node->eflags);
+
+ if (node->ss.ps.instrument)
+ {
+ /* Let the BitmapIndexScan share our Instrument node */
+ node->bitmapIndexScanState->ss.ps.instrument = node->ss.ps.instrument;
+ }
+
+ MemoryContextSwitchTo(oldCxt);
+
+ if (node->outer_exprContext)
+ ExecReScanBitmapIndexScan(node->bitmapIndexScanState);
+}
+
+/*
+ * End the currently open BitmapIndexScan executor node, if any.
+ */
+static void
+endCurrentBitmapIndexScan(DynamicBitmapIndexScanState *node)
+{
+ if (node->bitmapIndexScanState)
+ {
+ ExecEndBitmapIndexScan(node->bitmapIndexScanState);
+ node->bitmapIndexScanState = NULL;
+ }
+}
+
+/*
+ * Execution of DynamicBitmapIndexScan
+ */
+Node *
+MultiExecDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node)
+{
+ EState *estate = node->ss.ps.state;
+ Oid tableOid;
+
+ /* close previously open scan, if any. */
+ endCurrentBitmapIndexScan(node);
+
+ /*
+ * Fetch the OID of the current partition, and of the index on
+ * that partition to scan.
+ */
+ tableOid = DynamicScan_GetTableOid(&node->ss);
+
+ /*
+ * Create the underlying regular BitmapIndexScan executor node,
+ * for the current partition, and call it.
+ *
+ * Note: don't close the BitmapIndexScan executor node yet,
+ * because it might return a streaming bitmap, which still needs
+ * the underlying scan if more tuples are pulled from it after
+ * we return.
+ */
+ beginCurrentBitmapIndexScan(node, estate, tableOid);
+
+ return MultiExecBitmapIndexScan(node->bitmapIndexScanState);
+}
+
+/*
+ * Release resources of DynamicBitmapIndexScan
+ */
+void
+ExecEndDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node)
+{
+ endCurrentBitmapIndexScan(node);
+
+ MemoryContextDelete(node->partitionMemoryContext);
+}
+
+/*
+ * Allow rescanning an index.
+ *
+ * The current partition might've changed.
+ */
+void
+ExecReScanDynamicBitmapIndex(DynamicBitmapIndexScanState *node)
+{
+ if (node->bitmapIndexScanState)
+ {
+ ExecEndBitmapIndexScan(node->bitmapIndexScanState);
+ node->bitmapIndexScanState = NULL;
+ }
+}
diff --git a/src/backend/executor/nodeDynamicIndexscan.c b/src/backend/executor/nodeDynamicIndexscan.c
new file mode 100644
index 0000000000..2fcad60607
--- /dev/null
+++ b/src/backend/executor/nodeDynamicIndexscan.c
@@ -0,0 +1,405 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicIndexscan.c
+ * Support routines for scanning one or more indexes that are
+ * determined at runtime.
+ *
+ * DynamicIndexScan node scans each index one after the other. For each
+ * index, it creates a regular IndexScan executor node, scans, and returns
+ * the relevant tuples.
+ *
+ * Portions Copyright (c) 2013 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/executor/nodeDynamicIndexscan.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "cdb/cdbvars.h"
+#include "cdb/partitionselection.h"
+#include "executor/execDynamicScan.h"
+#include "executor/executor.h"
+#include "executor/instrument.h"
+#include "nodes/execnodes.h"
+#include "executor/nodeIndexscan.h"
+#include "executor/nodeDynamicIndexscan.h"
+#include "access/genam.h"
+#include "nodes/nodeFuncs.h"
+#include "utils/memutils.h"
+
+/*
+ * Initialize ScanState in DynamicIndexScan.
+ */
+DynamicIndexScanState *
+ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags)
+{
+ DynamicIndexScanState *dynamicIndexScanState;
+
+ /* check for unsupported flags */
+ Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
+
+ dynamicIndexScanState = makeNode(DynamicIndexScanState);
+ dynamicIndexScanState->ss.ps.plan = (Plan *) node;
+ dynamicIndexScanState->ss.ps.state = estate;
+ dynamicIndexScanState->eflags = eflags;
+
+ dynamicIndexScanState->scan_state = SCAN_INIT;
+
+ /*
+ * Initialize child expressions
+ *
+ * These are not used for anything, we rely on the child IndexScan node
+ * to do all evaluation for us. But I think this is still needed to
+ * find and process any SubPlans. See comment in ExecInitIndexScan.
+ */
+ dynamicIndexScanState->ss.ps.targetlist = (List *)
+ ExecInitExpr((Expr *) node->indexscan.scan.plan.targetlist,
+ (PlanState *) dynamicIndexScanState);
+ dynamicIndexScanState->ss.ps.qual = (List *)
+ ExecInitExpr((Expr *) node->indexscan.scan.plan.qual,
+ (PlanState *) dynamicIndexScanState);
+ (void) ExecInitExpr((Expr *) node->indexscan.indexqualorig,
+ (PlanState *) dynamicIndexScanState);
+
+ /*
+ * tuple table initialization
+ */
+ ExecInitResultTupleSlot(estate, &dynamicIndexScanState->ss.ps);
+
+ /*
+ * Initialize result tuple type and projection info.
+ */
+ ExecAssignResultTypeFromTL(&dynamicIndexScanState->ss.ps);
+
+ /*
+ * This context will be reset per-partition to free up per-partition
+ * copy of LogicalIndexInfo
+ */
+ dynamicIndexScanState->partitionMemoryContext = AllocSetContextCreate(CurrentMemoryContext,
+ "DynamicIndexScanPerPartition",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+
+ return dynamicIndexScanState;
+}
+
+static void
+DynamicIndexScan_ReMapColumns(DynamicIndexScan *dIndexScan, Oid oldOid, Oid newOid)
+{
+ IndexScan *indexScan = &dIndexScan->indexscan;
+ AttrNumber *attMap;
+
+ Assert(OidIsValid(newOid));
+
+ if (oldOid == newOid)
+ {
+ /*
+ * If we have only one partition and we are rescanning then we can
+ * have this scenario.
+ */
+ return;
+ }
+
+ attMap = IndexScan_GetColumnMapping(oldOid, newOid);
+
+ if (attMap)
+ {
+ IndexScan_MapLogicalIndexInfo(dIndexScan->logicalIndexInfo, attMap,
+ indexScan->scan.scanrelid);
+
+ /* Also map attrnos in targetlist and quals */
+ change_varattnos_of_a_varno((Node *) indexScan->scan.plan.targetlist,
+ attMap, indexScan->scan.scanrelid);
+ change_varattnos_of_a_varno((Node *) indexScan->scan.plan.qual,
+ attMap, indexScan->scan.scanrelid);
+ change_varattnos_of_a_varno((Node *) indexScan->indexqual,
+ attMap, indexScan->scan.scanrelid);
+ change_varattnos_of_a_varno((Node *) indexScan->indexqualorig,
+ attMap, indexScan->scan.scanrelid);
+
+ pfree(attMap);
+ }
+}
+
+/*
+ * Find the correct index in the given partition, and create a IndexScan executor
+ * node to scan it.
+ */
+static void
+beginCurrentIndexScan(DynamicIndexScanState *node, EState *estate,
+ Oid tableOid)
+{
+ DynamicIndexScan *dynamicIndexScan = (DynamicIndexScan *) node->ss.ps.plan;
+ Relation currentRelation;
+ Oid indexOid;
+ List *save_tupletable;
+ MemoryContext oldCxt;
+
+ /*
+ * open the base relation and acquire appropriate lock on it.
+ */
+ currentRelation = heap_open(tableOid, AccessShareLock);
+
+ save_tupletable = estate->es_tupleTable;
+ estate->es_tupleTable = NIL;
+ oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
+
+ /*
+ * Re-map the index columns, per the new partition, and find the correct
+ * index.
+ */
+ if (!OidIsValid(node->columnLayoutOid))
+ {
+ /* Very first partition */
+ node->columnLayoutOid = rel_partition_get_root(tableOid);
+ }
+ DynamicIndexScan_ReMapColumns(dynamicIndexScan,
+ node->columnLayoutOid, tableOid);
+ node->columnLayoutOid = tableOid;
+
+ indexOid = getPhysicalIndexRelid(currentRelation, dynamicIndexScan->logicalIndexInfo);
+ if (!OidIsValid(indexOid))
+ elog(ERROR, "failed to find index for partition \"%s\" in dynamic index scan",
+ RelationGetRelationName(currentRelation));
+
+ DynamicScan_SetTableOid(&node->ss, tableOid);
+ node->indexScanState = ExecInitIndexScanForPartition(&dynamicIndexScan->indexscan, estate,
+ node->eflags,
+ currentRelation, indexOid);
+ /* The IndexScan node takes ownership of currentRelation, and will close it when done */
+ node->tuptable = estate->es_tupleTable;
+ estate->es_tupleTable = save_tupletable;
+ MemoryContextSwitchTo(oldCxt);
+
+ if (node->outer_exprContext)
+ ExecReScanIndexScan(node->indexScanState);
+}
+
+static void
+endCurrentIndexScan(DynamicIndexScanState *node)
+{
+ if (node->indexScanState)
+ {
+ ExecEndIndexScan(node->indexScanState);
+ node->indexScanState = NULL;
+ }
+ ExecResetTupleTable(node->tuptable, true);
+ node->tuptable = NIL;
+ MemoryContextReset(node->partitionMemoryContext);
+}
+
+/*
+ * This function initializes a part and returns true if a new index has been prepared for scanning.
+ */
+static bool
+initNextIndexToScan(DynamicIndexScanState *node)
+{
+ EState *estate = node->ss.ps.state;
+
+ /* Load new index when the scanning of the previous index is done. */
+ if (node->scan_state == SCAN_INIT ||
+ node->scan_state == SCAN_DONE)
+ {
+ /* This is the oid of a partition of the table (*not* index) */
+ Oid tableOid;
+ Oid *pid;
+
+ pid = hash_seq_search(&node->pidxStatus);
+ if (pid == NULL)
+ {
+ /* Return if all parts have been scanned. */
+ node->shouldCallHashSeqTerm = false;
+ return false;
+ }
+ tableOid = *pid;
+
+ /* Collect number of partitions scanned in EXPLAIN ANALYZE */
+ if (node->ss.ps.instrument)
+ node->ss.ps.instrument->numPartScanned ++;
+
+ endCurrentIndexScan(node);
+
+ beginCurrentIndexScan(node, estate, tableOid);
+
+ node->scan_state = SCAN_SCAN;
+ }
+
+ return true;
+}
+
+/*
+ * setPidIndex
+ * Set the hash table of Oids to scan.
+ */
+static void
+setPidIndex(DynamicIndexScanState *node)
+{
+ IndexScanState *indexState = (IndexScanState *)node;
+ DynamicIndexScan *plan = (DynamicIndexScan *) indexState->ss.ps.plan;
+ EState *estate = indexState->ss.ps.state;
+ int partIndex = plan->partIndex;
+
+ Assert(node->pidxIndex == NULL);
+ Assert(estate->dynamicTableScanInfo != NULL);
+
+ /*
+ * Ensure that the dynahash exists even if the partition selector
+ * didn't choose any partition for current scan node [MPP-24169].
+ */
+ InsertPidIntoDynamicTableScanInfo(estate, partIndex,
+ InvalidOid, InvalidPartitionSelectorId);
+
+ Assert(NULL != estate->dynamicTableScanInfo->pidIndexes);
+ Assert(estate->dynamicTableScanInfo->numScans >= partIndex);
+ node->pidxIndex = estate->dynamicTableScanInfo->pidIndexes[partIndex - 1];
+ Assert(node->pidxIndex != NULL);
+}
+
+/*
+ * Execution of DynamicIndexScan
+ */
+TupleTableSlot *
+ExecDynamicIndexScan(DynamicIndexScanState *node)
+{
+ TupleTableSlot *slot = NULL;
+
+ /*
+ * If this is called the first time, find the pid index that contains all unique
+ * partition pids for this node to scan.
+ */
+ if (node->pidxIndex == NULL)
+ {
+ setPidIndex(node);
+ Assert(node->pidxIndex != NULL);
+
+ hash_seq_init(&node->pidxStatus, node->pidxIndex);
+ node->shouldCallHashSeqTerm = true;
+ }
+
+ /*
+ * Scan index to find next tuple to return. If the current index
+ * is exhausted, close it and open the next index for scan.
+ */
+ while (TupIsNull(slot) &&
+ initNextIndexToScan(node))
+ {
+ slot = ExecIndexScan(node->indexScanState);
+
+ if (TupIsNull(slot))
+ {
+ endCurrentIndexScan(node);
+
+ node->scan_state = SCAN_INIT;
+ }
+ }
+ return slot;
+}
+
+/*
+ * Release resources of DynamicIndexScan
+ */
+void
+ExecEndDynamicIndexScan(DynamicIndexScanState *node)
+{
+ endCurrentIndexScan(node);
+
+ node->scan_state = SCAN_END;
+
+ if (node->shouldCallHashSeqTerm)
+ {
+ hash_seq_term(&node->pidxStatus);
+ node->shouldCallHashSeqTerm = false;
+ }
+
+ MemoryContextDelete(node->partitionMemoryContext);
+}
+
+/*
+ * Allow rescanning an index.
+ */
+void
+ExecReScanDynamicIndex(DynamicIndexScanState *node)
+{
+ if (node->indexScanState)
+ {
+ ExecEndIndexScan(node->indexScanState);
+ node->indexScanState = NULL;
+ }
+ node->scan_state = SCAN_INIT;
+
+ if (node->shouldCallHashSeqTerm)
+ {
+ hash_seq_term(&node->pidxStatus);
+ node->shouldCallHashSeqTerm = false;
+ }
+
+ /* Force reloading the hash table */
+ node->pidxIndex = NULL;
+}
+
+
+/*
+ * IndexScan_MapLogicalIndexInfo
+ * Remaps the columns of the expressions of a provided logicalIndexInfo
+ * using attMap for a given varno.
+ *
+ * Returns true if mapping was done.
+ */
+bool
+IndexScan_MapLogicalIndexInfo(LogicalIndexInfo *logicalIndexInfo, AttrNumber *attMap, Index varno)
+{
+ if (NULL == attMap)
+ {
+ /* Columns are already aligned, and therefore, no mapping is necessary */
+ return false;
+ }
+ /* map the attrnos if necessary */
+ for (int i = 0; i < logicalIndexInfo->nColumns; i++)
+ {
+ if (logicalIndexInfo->indexKeys[i] != 0)
+ {
+ logicalIndexInfo->indexKeys[i] = attMap[(logicalIndexInfo->indexKeys[i]) - 1];
+ }
+ }
+
+ /* map the attrnos in the indExprs and indPred */
+ change_varattnos_of_a_varno((Node *)logicalIndexInfo->indPred, attMap, varno);
+ change_varattnos_of_a_varno((Node *)logicalIndexInfo->indExprs, attMap, varno);
+
+ return true;
+}
+
+/*
+ * IndexScan_GetColumnMapping
+ * Returns the mapping of columns between two relation Oids because of
+ * dropped attributes.
+ *
+ * Returns NULL for identical mapping.
+ */
+AttrNumber*
+IndexScan_GetColumnMapping(Oid oldOid, Oid newOid)
+{
+ if (oldOid == newOid)
+ return NULL;
+
+ AttrNumber *attMap;
+
+ Relation oldRel = heap_open(oldOid, AccessShareLock);
+ Relation newRel = heap_open(newOid, AccessShareLock);
+
+ TupleDesc oldTupDesc = oldRel->rd_att;
+ TupleDesc newTupDesc = newRel->rd_att;
+
+ attMap = varattnos_map(oldTupDesc, newTupDesc);
+
+ heap_close(oldRel, AccessShareLock);
+ heap_close(newRel, AccessShareLock);
+
+ return attMap;
+}
diff --git a/src/backend/executor/nodeDynamicSeqscan.c b/src/backend/executor/nodeDynamicSeqscan.c
new file mode 100644
index 0000000000..9a0d31fc1a
--- /dev/null
+++ b/src/backend/executor/nodeDynamicSeqscan.c
@@ -0,0 +1,341 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicSeqscan.c
+ * Support routines for scanning one or more relations that are
+ * determined at run time. The relations could be Heap, AppendOnly Row,
+ * AppendOnly Columnar.
+ *
+ * DynamicSeqScan node scans each relation one after the other. For each
+ * relation, it opens the table, scans the tuple, and returns relevant tuples.
+ *
+ * GPDB_12_MERGE_FIXME: This is currently disabled altogether. If it is
+ * resurrected, some changes are needed to GPORCA. The way Partition
+ * Selectors work has been heavily rewritten, there's no global hash table
+ * of selected partitions anymore. For "static selection", there's a
+ * partOids field in the DynamicSeqScan plan node that holds the selected
+ * partitions; but none of the code in this file has been fixed to
+ * actually work that way. Same with all the other Dynamic*Scan nodes.
+ *
+ * Portions Copyright (c) 2012 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/backend/executor/nodeDynamicSeqscan.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres.h"
+
+#include "executor/executor.h"
+#include "executor/instrument.h"
+#include "nodes/execnodes.h"
+#include "nodes/nodeFuncs.h"
+#include "executor/execDynamicScan.h"
+#include "executor/nodeDynamicSeqscan.h"
+#include "executor/nodeSeqscan.h"
+#include "utils/hsearch.h"
+#include "parser/parsetree.h"
+#include "utils/memutils.h"
+#include "utils/rel.h"
+#include "cdb/cdbvars.h"
+#include "access/table.h"
+#include "access/tableam.h"
+
+static void CleanupOnePartition(DynamicSeqScanState *node);
+
+/*
+ * During attribute re-mapping for heterogeneous partitions, we use
+ * this struct to identify which varno's attributes will be re-mapped.
+ * Using this struct as a *context* during expression tree walking, we
+ * can skip varattnos that do not belong to a given varno.
+ */
+typedef struct AttrMapContext
+{
+ const AttrNumber *newattno; /* The mapping table to remap the varattno */
+ Index varno; /* Which rte's varattno to re-map */
+} AttrMapContext;
+
+/*
+ * Remaps the varattno of a varattno in a Var node using an attribute map.
+ */
+static bool
+change_varattnos_varno_walker(Node *node, const AttrMapContext *attrMapCxt)
+{
+ if (node == NULL)
+ return false;
+ if (IsA(node, Var))
+ {
+ Var *var = (Var *) node;
+
+ if (var->varlevelsup == 0 && (var->varno == attrMapCxt->varno) &&
+ var->varattno > 0)
+ {
+ /*
+ * ??? the following may be a problem when the node is multiply
+ * referenced though stringToNode() doesn't create such a node
+ * currently.
+ */
+ Assert(attrMapCxt->newattno[var->varattno - 1] > 0);
+ var->varattno = var->varoattno = attrMapCxt->newattno[var->varattno - 1];
+ }
+ return false;
+ }
+ return expression_tree_walker(node, change_varattnos_varno_walker,
+ (void *) attrMapCxt);
+}
+
+/*
+ * Replace varattno values for a given varno RTE index in an expression
+ * tree according to the given map array, that is, varattno N is replaced
+ * by newattno[N-1]. It is caller's responsibility to ensure that the array
+ * is long enough to define values for all user varattnos present in the tree.
+ * System column attnos remain unchanged.
+ *
+ * Note that the passed node tree is modified in-place!
+ */
+static void
+change_varattnos_of_a_varno(Node *node, const AttrNumber *newattno, Index varno)
+{
+ AttrMapContext attrMapCxt;
+
+ attrMapCxt.newattno = newattno;
+ attrMapCxt.varno = varno;
+
+ (void) change_varattnos_varno_walker(node, &attrMapCxt);
+}
+
+DynamicSeqScanState *
+ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags)
+{
+ DynamicSeqScanState *state;
+ Oid reloid;
+ ListCell *lc;
+ int i;
+
+ Assert((eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)) == 0);
+
+ state = makeNode(DynamicSeqScanState);
+ state->eflags = eflags;
+ state->ss.ps.plan = (Plan *) node;
+ state->ss.ps.state = estate;
+ state->ss.ps.ExecProcNode = ExecDynamicSeqScan;
+
+ state->scan_state = SCAN_INIT;
+
+ /* Initialize child expressions. This is needed to find subplans. */
+ state->ss.ps.qual =
+ ExecInitQual(node->seqscan.plan.qual, (PlanState *) state);
+
+ Relation scanRel = ExecOpenScanRelation(estate, node->seqscan.scanrelid, eflags);
+ ExecInitScanTupleSlot(estate, &state->ss, RelationGetDescr(scanRel), table_slot_callbacks(scanRel));
+
+ /* Initialize result tuple type. */
+ ExecInitResultTypeTL(&state->ss.ps);
+ ExecAssignScanProjectionInfo(&state->ss);
+
+ state->nOids = list_length(node->partOids);
+ state->partOids = palloc(sizeof(Oid) * state->nOids);
+ foreach_with_count(lc, node->partOids, i)
+ state->partOids[i] = lfirst_oid(lc);
+ state->whichPart = -1;
+
+ reloid = exec_rt_fetch(node->seqscan.scanrelid, estate)->relid;
+ Assert(OidIsValid(reloid));
+
+ state->firstPartition = true;
+
+ /* lastRelOid is used to remap varattno for heterogeneous partitions */
+ state->lastRelOid = reloid;
+
+ state->scanrelid = node->seqscan.scanrelid;
+
+ /*
+ * This context will be reset per-partition to free up per-partition
+ * qual and targetlist allocations
+ */
+ state->partitionMemoryContext = AllocSetContextCreate(CurrentMemoryContext,
+ "DynamicSeqScanPerPartition",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+
+ return state;
+}
+
+/*
+ * initNextTableToScan
+ * Find the next table to scan and initiate the scan if the previous table
+ * is finished.
+ *
+ * If scanning on the current table is not finished, or a new table is found,
+ * this function returns true.
+ * If no more table is found, this function returns false.
+ */
+static bool
+initNextTableToScan(DynamicSeqScanState *node)
+{
+ ScanState *scanState = (ScanState *) node;
+ DynamicSeqScan *plan = (DynamicSeqScan *) scanState->ps.plan;
+ EState *estate = scanState->ps.state;
+ Relation lastScannedRel;
+ TupleDesc partTupDesc;
+ TupleDesc lastTupDesc;
+ AttrNumber *attMap;
+ Oid *pid;
+ Relation currentRelation;
+
+ if (++node->whichPart < node->nOids)
+ pid = &node->partOids[node->whichPart];
+ else
+ return false;
+
+ currentRelation = scanState->ss_currentRelation =
+ table_open(node->partOids[node->whichPart], AccessShareLock);
+
+ if (currentRelation->rd_rel->relkind != RELKIND_RELATION)
+ {
+ /* shouldn't happen */
+ elog(ERROR, "unexpected relkind in Dynamic Scan: %c", currentRelation->rd_rel->relkind);
+ }
+ lastScannedRel = table_open(node->lastRelOid, AccessShareLock);
+ lastTupDesc = RelationGetDescr(lastScannedRel);
+ partTupDesc = RelationGetDescr(scanState->ss_currentRelation);
+ /*
+ * FIXME: should we use execute_attr_map_tuple instead? Seems like a
+ * higher level abstraction that fits the bill
+ */
+ attMap = convert_tuples_by_name_map_if_req(partTupDesc, lastTupDesc, "unused msg");
+ table_close(lastScannedRel, AccessShareLock);
+
+ /* If attribute remapping is not necessary, then do not change the varattno */
+ if (attMap)
+ {
+ /*
+ * FIXME: Ewww, this doesn't really belong in the executor. The optimizer
+ * really should explicitly pass a qual and a tlist to us, for each
+ * partition
+ */
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->qual, attMap, node->scanrelid);
+ change_varattnos_of_a_varno((Node*)scanState->ps.plan->targetlist, attMap, node->scanrelid);
+
+ /*
+ * Now that the varattno mapping has been changed, change the relation that
+ * the new varnos correspond to
+ */
+ node->lastRelOid = *pid;
+ }
+
+ /*
+ * For the very first partition, the targetlist of planstate is set to null. So, we must
+ * initialize quals and targetlist, regardless of remapping requirements. For later
+ * partitions, we only initialize quals and targetlist if a column re-mapping is necessary.
+ */
+ if (attMap || node->firstPartition)
+ {
+ node->firstPartition = false;
+ MemoryContextReset(node->partitionMemoryContext);
+ MemoryContext oldCxt = MemoryContextSwitchTo(node->partitionMemoryContext);
+
+ /* Initialize child expressions */
+ scanState->ps.qual =
+ ExecInitQual(scanState->ps.plan->qual, (PlanState *) scanState);
+
+ MemoryContextSwitchTo(oldCxt);
+ }
+
+ if (attMap)
+ pfree(attMap);
+
+// DynamicScan_SetTableOid(&node->ss, *pid);
+ node->seqScanState = ExecInitSeqScanForPartition(&plan->seqscan, estate,
+ currentRelation);
+ return true;
+}
+
+
+TupleTableSlot *
+ExecDynamicSeqScan(PlanState *pstate)
+{
+ DynamicSeqScanState *node = castNode(DynamicSeqScanState, pstate);
+ TupleTableSlot *slot = NULL;
+
+ /*
+ * Scan the table to find next tuple to return. If the current table
+ * is finished, close it and open the next table for scan.
+ */
+ for (;;)
+ {
+ if (!node->seqScanState)
+ {
+ /* No partition open. Open the next one, if any. */
+ if (!initNextTableToScan(node))
+ break;
+ }
+
+ slot = ExecProcNode(&node->seqScanState->ss.ps);
+
+ if (!TupIsNull(slot))
+ break;
+
+ /* No more tuples from this partition. Move to next one. */
+ CleanupOnePartition(node);
+ }
+
+ return slot;
+}
+
+/*
+ * CleanupOnePartition
+ * Cleans up a partition's relation and releases all locks.
+ */
+static void
+CleanupOnePartition(DynamicSeqScanState *scanState)
+{
+ Assert(NULL != scanState);
+
+ if (scanState->seqScanState)
+ {
+ ExecEndSeqScan(scanState->seqScanState);
+ scanState->seqScanState = NULL;
+ Assert(scanState->ss.ss_currentRelation != NULL);
+ table_close(scanState->ss.ss_currentRelation, NoLock);
+ scanState->ss.ss_currentRelation = NULL;
+ }
+}
+
+/*
+ * DynamicSeqScanEndCurrentScan
+ * Cleans up any ongoing scan.
+ */
+static void
+DynamicSeqScanEndCurrentScan(DynamicSeqScanState *node)
+{
+ CleanupOnePartition(node);
+}
+
+/*
+ * ExecEndDynamicSeqScan
+ * Ends the scanning of this DynamicSeqScanNode and frees
+ * up all the resources.
+ */
+void
+ExecEndDynamicSeqScan(DynamicSeqScanState *node)
+{
+ DynamicSeqScanEndCurrentScan(node);
+
+ if (node->ss.ps.ps_ResultTupleSlot)
+ ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
+}
+
+/*
+ * ExecReScanDynamicSeqScan
+ * Prepares the internal states for a rescan.
+ */
+void
+ExecReScanDynamicSeqScan(DynamicSeqScanState *node)
+{
+ DynamicSeqScanEndCurrentScan(node);
+
+ /* Force reloading the partition hash table */
+}
diff --git a/src/backend/gpopt/gpdbwrappers.cpp b/src/backend/gpopt/gpdbwrappers.cpp
index 8fdaf94d96..af87a1b7aa 100644
--- a/src/backend/gpopt/gpdbwrappers.cpp
+++ b/src/backend/gpopt/gpdbwrappers.cpp
@@ -2052,6 +2052,37 @@ gpdb::GetRelationIndexes(Relation relation)
GP_WRAP_END;
return NIL;
}
+#if 0
+LogicalIndexes *
+gpdb::GetLogicalPartIndexes
+ (
+ Oid oid
+ )
+{
+ GP_WRAP_START;
+ {
+ /* catalog tables: pg_partition, pg_partition_rule, pg_index */
+ return BuildLogicalIndexInfo(oid);
+ }
+ GP_WRAP_END;
+ return NULL;
+}
+LogicalIndexInfo *
+gpdb::GetLogicalIndexInfo
+ (
+ Oid root_oid,
+ Oid index_oid
+ )
+{
+ GP_WRAP_START;
+ {
+ /* catalog tables: pg_index */
+ return logicalIndexInfoForIndexOid(root_oid, index_oid);
+ }
+ GP_WRAP_END;
+ return NULL;
+}
+#endif
gpdb::RelationWrapper
gpdb::GetRelation(Oid rel_oid)
diff --git a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
index eaf18c5821..d443c7bd19 100644
--- a/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
+++ b/src/backend/gpopt/translate/CTranslatorDXLToPlStmt.cpp
@@ -65,6 +65,8 @@ extern "C" {
#include "naucrates/dxl/operators/CDXLPhysicalCTAS.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
#include "naucrates/dxl/operators/CDXLPhysicalHashJoin.h"
#include "naucrates/dxl/operators/CDXLPhysicalIndexOnlyScan.h"
@@ -422,6 +424,12 @@ CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan(
ctxt_translation_prev_siblings);
break;
}
+ case EdxlopPhysicalDynamicTableScan:
+ {
+ plan = TranslateDXLDynTblScan(dxlnode, output_context,
+ ctxt_translation_prev_siblings);
+ break;
+ }
/* case EdxlopPhysicalDynamicIndexScan: { plan = TranslateDXLDynIdxScan(dxlnode, output_context, ctxt_translation_prev_siblings); break;} */
case EdxlopPhysicalTVF:
{
@@ -460,6 +468,7 @@ CTranslatorDXLToPlStmt::TranslateDXLOperatorToPlan(
break;
}
case EdxlopPhysicalBitmapTableScan:
+ case EdxlopPhysicalDynamicBitmapTableScan:
{
plan = TranslateDXLBitmapTblScan(dxlnode, output_context,
ctxt_translation_prev_siblings);
@@ -4010,6 +4019,73 @@ CTranslatorDXLToPlStmt::TranslateDXLSequence(
return (Plan *) psequence;
}
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorDXLToPlStmt::TranslateDXLDynTblScan
+//
+// @doc:
+// Translates a DXL dynamic table scan node into a DynamicSeqScan node
+//
+//---------------------------------------------------------------------------
+Plan *
+CTranslatorDXLToPlStmt::TranslateDXLDynTblScan(
+ const CDXLNode *dyn_tbl_scan_dxlnode, CDXLTranslateContext *output_context,
+ CDXLTranslationContextArray *ctxt_translation_prev_siblings)
+{
+ // translate table descriptor into a range table entry
+ CDXLPhysicalDynamicTableScan *dyn_tbl_scan_dxlop =
+ CDXLPhysicalDynamicTableScan::Cast(dyn_tbl_scan_dxlnode->GetOperator());
+
+ // translation context for column mappings in the base relation
+ CDXLTranslateContextBaseTable base_table_context(m_mp);
+
+ // add the new range table entry as the last element of the range table
+ Index index =
+ gpdb::ListLength(m_dxl_to_plstmt_context->GetRTableEntriesList()) + 1;
+
+ RangeTblEntry *rte = TranslateDXLTblDescrToRangeTblEntry(
+ dyn_tbl_scan_dxlop->GetDXLTableDescr(), index, &base_table_context);
+ GPOS_ASSERT(nullptr != rte);
+ rte->requiredPerms |= ACL_SELECT;
+
+ m_dxl_to_plstmt_context->AddRTE(rte);
+
+ // create dynamic scan node
+ DynamicSeqScan *dyn_seq_scan = MakeNode(DynamicSeqScan);
+
+ dyn_seq_scan->seqscan.scanrelid = index;
+ dyn_seq_scan->partIndex = dyn_tbl_scan_dxlop->GetPartIndexId();
+ dyn_seq_scan->partIndexPrintable =
+ dyn_tbl_scan_dxlop->GetPartIndexIdPrintable();
+
+ Plan *plan = &(dyn_seq_scan->seqscan.plan);
+ plan->plan_node_id = m_dxl_to_plstmt_context->GetNextPlanId();
+ //plan->nMotionNodes = 0;
+
+ // translate operator costs
+ TranslatePlanCosts(dyn_tbl_scan_dxlnode, plan);
+
+ GPOS_ASSERT(2 == dyn_tbl_scan_dxlnode->Arity());
+
+ // translate proj list and filter
+ CDXLNode *project_list_dxlnode =
+ (*dyn_tbl_scan_dxlnode)[EdxltsIndexProjList];
+ CDXLNode *filter_dxlnode = (*dyn_tbl_scan_dxlnode)[EdxltsIndexFilter];
+
+ TranslateProjListAndFilter(
+ project_list_dxlnode, filter_dxlnode,
+ &base_table_context, // translate context for the base table
+ nullptr, // translate_ctxt_left and pdxltrctxRight,
+ &plan->targetlist, &plan->qual, output_context);
+
+ SetParamIds(plan);
+ /*
+ * auto *prune_result = m_dxl_to_plstmt_context->GetStaticPruneResult(
+ dyn_tbl_scan_dxlop->GetPartIndexIdPrintable());
+
+ dyn_seq_scan->partOids = prune_result;
+*/
+}
//---------------------------------------------------------------------------
// @function:
// CTranslatorDXLToPlStmt::TranslateDXLDml
@@ -5535,13 +5611,30 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
const CDXLNode *bitmapscan_dxlnode, CDXLTranslateContext *output_context,
CDXLTranslationContextArray *ctxt_translation_prev_siblings)
{
+ ULONG part_index_id = 0;
+ ULONG part_idx_printable_id = 0;
+ BOOL is_dynamic = false;
const CDXLTableDescr *table_descr = nullptr;
CDXLOperator *dxl_operator = bitmapscan_dxlnode->GetOperator();
-
- table_descr =
- CDXLPhysicalBitmapTableScan::Cast(dxl_operator)->GetDXLTableDescr();
-
+ if (EdxlopPhysicalBitmapTableScan == dxl_operator->GetDXLOperator())
+ {
+ table_descr =
+ CDXLPhysicalBitmapTableScan::Cast(dxl_operator)->GetDXLTableDescr();
+ }
+ else
+ {
+ GPOS_ASSERT(EdxlopPhysicalDynamicBitmapTableScan ==
+ dxl_operator->GetDXLOperator());
+ CDXLPhysicalDynamicBitmapTableScan *phy_dyn_bitmap_tblscan_dxlop =
+ CDXLPhysicalDynamicBitmapTableScan::Cast(dxl_operator);
+ table_descr = phy_dyn_bitmap_tblscan_dxlop->GetDXLTableDescr();
+
+ part_index_id = phy_dyn_bitmap_tblscan_dxlop->GetPartIndexId();
+ part_idx_printable_id =
+ phy_dyn_bitmap_tblscan_dxlop->GetPartIndexIdPrintable();
+ is_dynamic = true;
+ }
// translation context for column mappings in the base relation
CDXLTranslateContextBaseTable base_table_context(m_mp);
@@ -5567,9 +5660,22 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
BitmapHeapScan *bitmap_tbl_scan;
+ if (is_dynamic)
+ {
+ DynamicBitmapHeapScan *dscan = MakeNode(DynamicBitmapHeapScan);
+ // GPDB_12_MERGE_FIXME: broken with the Partition Selector refactoring
+#if 0
+ dscan->partIndex = part_index_id;
+ dscan->partIndexPrintable = part_idx_printable_id;
+#endif
- bitmap_tbl_scan = MakeNode(BitmapHeapScan);
+ bitmap_tbl_scan = &dscan->bitmapheapscan;
+ }
+ else
+ {
+ bitmap_tbl_scan = MakeNode(BitmapHeapScan);
+ }
bitmap_tbl_scan->scan.scanrelid = index;
Plan *plan = &(bitmap_tbl_scan->scan.plan);
@@ -5612,7 +5718,7 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapTblScan(
//
// @doc:
// Translate the tree of bitmap index operators that are under the given
-// bitmap table scan.
+// (dynamic) bitmap table scan.
//
//---------------------------------------------------------------------------
Plan *
@@ -5706,6 +5812,7 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapBoolOp(
//
// @doc:
// Translate CDXLScalarBitmapIndexProbe into a BitmapIndexScan
+// or a DynamicBitmapIndexScan
//
//---------------------------------------------------------------------------
Plan *
@@ -5722,8 +5829,26 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe(
bitmap_index_probe_dxlnode->GetOperator());
BitmapIndexScan *bitmap_idx_scan;
+ DynamicBitmapIndexScan *dyn_bitmap_idx_scan;
+
+ if (IsA(bitmap_tbl_scan, DynamicBitmapHeapScan))
+ {
+ GPOS_RAISE(gpdxl::ExmaDXL, gpdxl::ExmiDXL2PlStmtConversion,
+ GPOS_WSZ_LIT("FIXME: dynamic bitmap index scan"));
+#if 0
+ /* It's a Dynamic Bitmap Index Scan */
+ dyn_bitmap_idx_scan = MakeNode(DynamicBitmapIndexScan);
+ dyn_bitmap_idx_scan->partIndex = ((DynamicBitmapHeapScan *) bitmap_tbl_scan)->partIndex;
+ dyn_bitmap_idx_scan->partIndexPrintable = ((DynamicBitmapHeapScan *) bitmap_tbl_scan)->partIndexPrintable;
- bitmap_idx_scan = MakeNode(BitmapIndexScan);
+ bitmap_idx_scan = &(dyn_bitmap_idx_scan->biscan);
+#endif
+ }
+ else
+ {
+ dyn_bitmap_idx_scan = nullptr;
+ bitmap_idx_scan = MakeNode(BitmapIndexScan);
+ }
bitmap_idx_scan->scan.scanrelid = bitmap_tbl_scan->scan.scanrelid;
CMDIdGPDB *mdid_index = CMDIdGPDB::CastMdid(
@@ -5760,6 +5885,17 @@ CTranslatorDXLToPlStmt::TranslateDXLBitmapIndexProbe(
*/
SetParamIds(plan);
+#if 0
+ /*
+ * If it's a Dynamic Bitmap Index Scan, also fill in the information
+ * about the indexes on the partitions.
+ */
+ if (dyn_bitmap_idx_scan)
+ {
+ dyn_bitmap_idx_scan->logicalIndexInfo = gpdb::GetLogicalIndexInfo(oidRel, index_oid);
+ }
+#endif
+
return plan;
}
diff --git a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
index 150b2eb7c2..b322ac5595 100644
--- a/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
+++ b/src/backend/gporca/libgpopt/src/translate/CTranslatorExprToDXL.cpp
@@ -101,6 +101,7 @@
#include "naucrates/dxl/operators/CDXLPhysicalCTAS.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalExternalScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
#include "naucrates/dxl/operators/CDXLPhysicalHashJoin.h"
@@ -1327,6 +1328,70 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
CDistributionSpecArray *pdrgpdsBaseTables, CExpression *pexprScalarCond,
CDXLPhysicalProperties *dxl_properties)
{
+ GPOS_ASSERT(NULL != pexprDTS);
+ GPOS_ASSERT_IFF(NULL != pexprScalarCond, NULL != dxl_properties);
+
+ CPhysicalDynamicTableScan *popDTS =
+ CPhysicalDynamicTableScan::PopConvert(pexprDTS->Pop());
+ CColRefArray *pdrgpcrOutput = popDTS->PdrgpcrOutput();
+
+ // translate table descriptor
+ CDXLTableDescr *table_descr =
+ MakeDXLTableDescr(popDTS->Ptabdesc(), pdrgpcrOutput, pexprDTS->Prpp());
+
+ // construct plan costs
+ CDXLPhysicalProperties *pdxlpropDTS = GetProperties(pexprDTS);
+
+ if (NULL != dxl_properties)
+ {
+ CWStringDynamic *rows_out_str = GPOS_NEW(m_mp) CWStringDynamic(
+ m_mp,
+ dxl_properties->GetDXLOperatorCost()->GetRowsOutStr()->GetBuffer());
+ CWStringDynamic *pstrCost = GPOS_NEW(m_mp)
+ CWStringDynamic(m_mp, dxl_properties->GetDXLOperatorCost()
+ ->GetTotalCostStr()
+ ->GetBuffer());
+
+ pdxlpropDTS->GetDXLOperatorCost()->SetRows(rows_out_str);
+ pdxlpropDTS->GetDXLOperatorCost()->SetCost(pstrCost);
+ dxl_properties->Release();
+ }
+
+ // construct dynamic table scan operator
+ CDXLPhysicalDynamicTableScan *pdxlopDTS =
+ GPOS_NEW(m_mp) CDXLPhysicalDynamicTableScan(
+ m_mp, table_descr, 0 /* CHRIS */, popDTS->ScanId());
+
+ CDXLNode *pdxlnDTS = GPOS_NEW(m_mp) CDXLNode(m_mp, pdxlopDTS);
+ pdxlnDTS->SetProperties(pdxlpropDTS);
+
+ CDXLNode *pdxlnCond = NULL;
+
+ if (NULL != pexprScalarCond)
+ {
+ pdxlnCond = PdxlnScalar(pexprScalarCond);
+ }
+
+ CDXLNode *filter_dxlnode = PdxlnFilter(pdxlnCond);
+
+ // construct projection list
+ GPOS_ASSERT(NULL != pexprDTS->Prpp());
+
+ CColRefSet *pcrsOutput = pexprDTS->Prpp()->PcrsRequired();
+ pdxlnDTS->AddChild(PdxlnProjList(pcrsOutput, colref_array));
+ pdxlnDTS->AddChild(filter_dxlnode);
+
+#ifdef GPOS_DEBUG
+ pdxlnDTS->GetOperator()->AssertValid(pdxlnDTS, false);
+#endif
+
+ CDistributionSpec *pds = pexprDTS->GetDrvdPropPlan()->Pds();
+ pds->AddRef();
+ pdrgpdsBaseTables->Append(pds);
+
+ return pdxlnDTS;
+
+ /*
GPOS_ASSERT(nullptr != pexprDTS);
GPOS_ASSERT_IFF(nullptr != pexprScalarCond, nullptr != dxl_properties);
@@ -1456,6 +1521,8 @@ CTranslatorExprToDXL::PdxlnDynamicTableScan(
GPOS_ASSERT(pdxlnAppend);
return pdxlnAppend;
+
+ */
}
//---------------------------------------------------------------------------
@@ -4055,8 +4122,12 @@ UlIndexFilter(Edxlopid edxlopid)
case EdxlopPhysicalExternalScan:
return EdxltsIndexFilter;
case EdxlopPhysicalBitmapTableScan:
+ case EdxlopPhysicalDynamicBitmapTableScan:
return EdxlbsIndexFilter;
+ case EdxlopPhysicalDynamicTableScan:
+ return EdxldtsIndexFilter;
case EdxlopPhysicalIndexScan:
+ case EdxlopPhysicalDynamicIndexScan:
return EdxlisIndexFilter;
case EdxlopPhysicalResult:
return EdxlresultIndexFilter;
@@ -4096,7 +4167,10 @@ CTranslatorExprToDXL::PdxlnResultFromNLJoinOuter(
case EdxlopPhysicalTableScan:
case EdxlopPhysicalExternalScan:
case EdxlopPhysicalBitmapTableScan:
+ case EdxlopPhysicalDynamicTableScan:
case EdxlopPhysicalIndexScan:
+ case EdxlopPhysicalDynamicIndexScan:
+ case EdxlopPhysicalDynamicBitmapTableScan:
case EdxlopPhysicalResult:
{
// if the scalar join condition is a constant TRUE, just translate the child, no need to create an AND expression
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLOperator.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLOperator.h
index 11d3859c90..ed43a52373 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLOperator.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLOperator.h
@@ -131,6 +131,7 @@ enum Edxlopid
EdxlopPhysicalProjection,
EdxlopPhysicalTableScan,
EdxlopPhysicalBitmapTableScan,
+ EdxlopPhysicalDynamicBitmapTableScan,
EdxlopPhysicalExternalScan,
EdxlopPhysicalIndexScan,
EdxlopPhysicalIndexOnlyScan,
@@ -151,6 +152,8 @@ enum Edxlopid
EdxlopPhysicalAppend,
EdxlopPhysicalMaterialize,
EdxlopPhysicalSequence,
+ EdxlopPhysicalDynamicTableScan,
+ EdxlopPhysicalDynamicIndexScan,
EdxlopPhysicalPartitionSelector,
EdxlopPhysicalTVF,
EdxlopPhysicalWindow,
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
new file mode 100644
index 0000000000..6f8498c3b3
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h
@@ -0,0 +1,107 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2014 VMware, Inc. or its affiliates.
+//
+// @filename:
+// CDXLPhysicalDynamicBitmapTableScan.h
+//
+// @doc:
+// Class for representing dynamic DXL bitmap table scan operators.
+//---------------------------------------------------------------------------
+
+#ifndef GPDXL_CDXLPhysicalDynamicBitmapTableScan_H
+#define GPDXL_CDXLPhysicalDynamicBitmapTableScan_H
+
+#include "gpos/base.h"
+
+#include "naucrates/dxl/operators/CDXLPhysicalAbstractBitmapScan.h"
+
+namespace gpdxl
+{
+using namespace gpos;
+
+// fwd declarations
+class CDXLTableDescr;
+class CXMLSerializer;
+
+//---------------------------------------------------------------------------
+// @class:
+// CDXLPhysicalDynamicBitmapTableScan
+//
+// @doc:
+// Class for representing DXL bitmap table scan operators
+//
+//---------------------------------------------------------------------------
+class CDXLPhysicalDynamicBitmapTableScan : public CDXLPhysicalAbstractBitmapScan
+{
+private:
+ // id of partition index structure
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
+
+public:
+ CDXLPhysicalDynamicBitmapTableScan(
+ const CDXLPhysicalDynamicBitmapTableScan &) = delete;
+
+ // ctor
+ CDXLPhysicalDynamicBitmapTableScan(CMemoryPool *mp,
+ CDXLTableDescr *table_descr,
+ ULONG part_idx_id,
+ ULONG part_idx_id_printable)
+ : CDXLPhysicalAbstractBitmapScan(mp, table_descr),
+ m_part_index_id(part_idx_id),
+ m_part_index_id_printable(part_idx_id_printable)
+ {
+ GPOS_ASSERT(nullptr != table_descr);
+ }
+
+ // dtor
+ ~CDXLPhysicalDynamicBitmapTableScan() override = default;
+
+ // operator type
+ Edxlopid
+ GetDXLOperator() const override
+ {
+ return EdxlopPhysicalDynamicBitmapTableScan;
+ }
+
+ // operator name
+ const CWStringConst *GetOpNameStr() const override;
+
+ // partition index id
+ ULONG
+ GetPartIndexId() const
+ {
+ return m_part_index_id;
+ }
+
+ // printable partition index id
+ ULONG
+ GetPartIndexIdPrintable() const
+ {
+ return m_part_index_id_printable;
+ }
+
+ // serialize operator in DXL format
+ void SerializeToDXL(CXMLSerializer *xml_serializer,
+ const CDXLNode *node) const override;
+
+ // conversion function
+ static CDXLPhysicalDynamicBitmapTableScan *
+ Cast(CDXLOperator *dxl_op)
+ {
+ GPOS_ASSERT(nullptr != dxl_op);
+ GPOS_ASSERT(EdxlopPhysicalDynamicBitmapTableScan ==
+ dxl_op->GetDXLOperator());
+
+ return dynamic_cast<CDXLPhysicalDynamicBitmapTableScan *>(dxl_op);
+ }
+
+}; // class CDXLPhysicalDynamicBitmapTableScan
+} // namespace gpdxl
+
+#endif // !GPDXL_CDXLPhysicalDynamicBitmapTableScan_H
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
new file mode 100644
index 0000000000..bc1c8bf081
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h
@@ -0,0 +1,115 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2013 EMC Corp.
+//
+// @filename:
+// CDXLPhysicalDynamicIndexScan.h
+//
+// @doc:
+// Class for representing DXL dynamic index scan operators
+//---------------------------------------------------------------------------
+
+#ifndef GPDXL_CDXLPhysicalDynamicIndexScan_H
+#define GPDXL_CDXLPhysicalDynamicIndexScan_H
+
+#include "gpos/base.h"
+
+#include "naucrates/dxl/operators/CDXLIndexDescr.h"
+#include "naucrates/dxl/operators/CDXLNode.h"
+#include "naucrates/dxl/operators/CDXLPhysical.h"
+#include "naucrates/dxl/operators/CDXLTableDescr.h"
+
+namespace gpdxl
+{
+//---------------------------------------------------------------------------
+// @class:
+// CDXLPhysicalDynamicIndexScan
+//
+// @doc:
+// Class for representing DXL dynamic index scan operators
+//
+//---------------------------------------------------------------------------
+class CDXLPhysicalDynamicIndexScan : public CDXLPhysical
+{
+private:
+ // table descriptor for the scanned table
+ CDXLTableDescr *m_dxl_table_descr;
+
+ // part index id
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
+
+ // index descriptor associated with the scanned table
+ CDXLIndexDescr *m_dxl_index_descr;
+
+ // scan direction of the index
+ EdxlIndexScanDirection m_index_scan_dir;
+
+public:
+ CDXLPhysicalDynamicIndexScan(CDXLPhysicalDynamicIndexScan &) = delete;
+
+ // indices of dynamic index scan elements in the children array
+ enum Edxldis
+ {
+ EdxldisIndexProjList = 0,
+ EdxldisIndexFilter,
+ EdxldisIndexCondition,
+ EdxldisSentinel
+ };
+
+ //ctor
+ CDXLPhysicalDynamicIndexScan(CMemoryPool *mp, CDXLTableDescr *table_descr,
+ ULONG part_idx_id, ULONG part_idx_id_printable,
+ CDXLIndexDescr *dxl_index_descr,
+ EdxlIndexScanDirection idx_scan_direction);
+
+ //dtor
+ ~CDXLPhysicalDynamicIndexScan() override;
+
+ // operator type
+ Edxlopid GetDXLOperator() const override;
+
+ // operator name
+ const CWStringConst *GetOpNameStr() const override;
+
+ // index descriptor
+ const CDXLIndexDescr *GetDXLIndexDescr() const;
+
+ //table descriptor
+ const CDXLTableDescr *GetDXLTableDescr() const;
+
+ // partition index id
+ ULONG GetPartIndexId() const;
+
+ // printable partition index id
+ ULONG GetPartIndexIdPrintable() const;
+
+ // scan direction
+ EdxlIndexScanDirection GetIndexScanDir() const;
+
+ // serialize operator in DXL format
+ void SerializeToDXL(CXMLSerializer *xml_serializer,
+ const CDXLNode *node) const override;
+
+ // conversion function
+ static CDXLPhysicalDynamicIndexScan *
+ Cast(CDXLOperator *dxl_op)
+ {
+ GPOS_ASSERT(nullptr != dxl_op);
+ GPOS_ASSERT(EdxlopPhysicalDynamicIndexScan == dxl_op->GetDXLOperator());
+
+ return dynamic_cast<CDXLPhysicalDynamicIndexScan *>(dxl_op);
+ }
+
+#ifdef GPOS_DEBUG
+ // checks whether the operator has valid structure, i.e. number and
+ // types of child nodes
+ void AssertValid(const CDXLNode *, BOOL validate_children) const override;
+#endif // GPOS_DEBUG
+};
+} // namespace gpdxl
+#endif // !GPDXL_CDXLPhysicalDynamicIndexScan_H
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
new file mode 100644
index 0000000000..f0b46d9b3f
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h
@@ -0,0 +1,102 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2012 EMC Corp.
+//
+// @filename:
+// CDXLPhysicalDynamicTableScan.h
+//
+// @doc:
+// Class for representing DXL dynamic table scan operators
+//---------------------------------------------------------------------------
+
+
+
+#ifndef GPDXL_CDXLPhysicalDynamicTableScan_H
+#define GPDXL_CDXLPhysicalDynamicTableScan_H
+
+#include "gpos/base.h"
+
+#include "naucrates/dxl/operators/CDXLPhysical.h"
+#include "naucrates/dxl/operators/CDXLTableDescr.h"
+
+
+namespace gpdxl
+{
+// indices of dynamic table scan elements in the children array
+enum Edxldts
+{
+ EdxldtsIndexProjList = 0,
+ EdxldtsIndexFilter,
+ EdxldtsSentinel
+};
+
+//---------------------------------------------------------------------------
+// @class:
+// CDXLPhysicalDynamicTableScan
+//
+// @doc:
+// Class for representing DXL dynamic table scan operators
+//
+//---------------------------------------------------------------------------
+class CDXLPhysicalDynamicTableScan : public CDXLPhysical
+{
+private:
+ // table descriptor for the scanned table
+ CDXLTableDescr *m_dxl_table_descr;
+
+ // id of partition index structure
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
+
+public:
+ CDXLPhysicalDynamicTableScan(CDXLPhysicalDynamicTableScan &) = delete;
+
+ // ctor
+ CDXLPhysicalDynamicTableScan(CMemoryPool *mp, CDXLTableDescr *table_descr,
+ ULONG part_idx_id,
+ ULONG part_idx_id_printable);
+
+ // dtor
+ ~CDXLPhysicalDynamicTableScan() override;
+
+ // operator type
+ Edxlopid GetDXLOperator() const override;
+
+ // operator name
+ const CWStringConst *GetOpNameStr() const override;
+
+ // table descriptor
+ const CDXLTableDescr *GetDXLTableDescr() const;
+
+ // partition index id
+ ULONG GetPartIndexId() const;
+
+ // printable partition index id
+ ULONG GetPartIndexIdPrintable() const;
+
+ // serialize operator in DXL format
+ void SerializeToDXL(CXMLSerializer *xml_serializer,
+ const CDXLNode *node) const override;
+
+ // conversion function
+ static CDXLPhysicalDynamicTableScan *
+ Cast(CDXLOperator *dxl_op)
+ {
+ GPOS_ASSERT(nullptr != dxl_op);
+ GPOS_ASSERT(EdxlopPhysicalDynamicTableScan == dxl_op->GetDXLOperator());
+
+ return dynamic_cast<CDXLPhysicalDynamicTableScan *>(dxl_op);
+ }
+
+#ifdef GPOS_DEBUG
+ // checks whether the operator has valid structure, i.e. number and
+ // types of child nodes
+ void AssertValid(const CDXLNode *, BOOL validate_children) const override;
+#endif // GPOS_DEBUG
+};
+} // namespace gpdxl
+#endif // !GPDXL_CDXLPhysicalDynamicTableScan_H
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h
new file mode 100644
index 0000000000..1aa920d05e
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/operators/dxlops.h
@@ -0,0 +1,145 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2010 EMC Corp.
+//
+// @filename:
+// dxlops.h
+//
+// @doc:
+// collective include file for all dxl operators
+//---------------------------------------------------------------------------
+
+
+
+#ifndef GPDXL_dxlops_H
+#define GPDXL_dxlops_H
+
+#include "naucrates/dxl/operators/CDXLColDescr.h"
+#include "naucrates/dxl/operators/CDXLColRef.h"
+#include "naucrates/dxl/operators/CDXLCtasStorageOptions.h"
+#include "naucrates/dxl/operators/CDXLIndexDescr.h"
+#include "naucrates/dxl/operators/CDXLLogicalCTAS.h"
+#include "naucrates/dxl/operators/CDXLLogicalCTEAnchor.h"
+#include "naucrates/dxl/operators/CDXLLogicalCTEConsumer.h"
+#include "naucrates/dxl/operators/CDXLLogicalCTEProducer.h"
+#include "naucrates/dxl/operators/CDXLLogicalConstTable.h"
+#include "naucrates/dxl/operators/CDXLLogicalDelete.h"
+#include "naucrates/dxl/operators/CDXLLogicalExternalGet.h"
+#include "naucrates/dxl/operators/CDXLLogicalGet.h"
+#include "naucrates/dxl/operators/CDXLLogicalGroupBy.h"
+#include "naucrates/dxl/operators/CDXLLogicalInsert.h"
+#include "naucrates/dxl/operators/CDXLLogicalJoin.h"
+#include "naucrates/dxl/operators/CDXLLogicalLimit.h"
+#include "naucrates/dxl/operators/CDXLLogicalProject.h"
+#include "naucrates/dxl/operators/CDXLLogicalSelect.h"
+#include "naucrates/dxl/operators/CDXLLogicalSetOp.h"
+#include "naucrates/dxl/operators/CDXLLogicalTVF.h"
+#include "naucrates/dxl/operators/CDXLLogicalUpdate.h"
+#include "naucrates/dxl/operators/CDXLLogicalWindow.h"
+#include "naucrates/dxl/operators/CDXLPhysicalAgg.h"
+#include "naucrates/dxl/operators/CDXLPhysicalAppend.h"
+#include "naucrates/dxl/operators/CDXLPhysicalAssert.h"
+#include "naucrates/dxl/operators/CDXLPhysicalBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalBroadcastMotion.h"
+#include "naucrates/dxl/operators/CDXLPhysicalCTAS.h"
+#include "naucrates/dxl/operators/CDXLPhysicalCTEConsumer.h"
+#include "naucrates/dxl/operators/CDXLPhysicalCTEProducer.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDML.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalExternalScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalGatherMotion.h"
+#include "naucrates/dxl/operators/CDXLPhysicalHashJoin.h"
+#include "naucrates/dxl/operators/CDXLPhysicalIndexOnlyScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalIndexScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalLimit.h"
+#include "naucrates/dxl/operators/CDXLPhysicalMaterialize.h"
+#include "naucrates/dxl/operators/CDXLPhysicalMergeJoin.h"
+#include "naucrates/dxl/operators/CDXLPhysicalNLJoin.h"
+#include "naucrates/dxl/operators/CDXLPhysicalPartitionSelector.h"
+#include "naucrates/dxl/operators/CDXLPhysicalRandomMotion.h"
+#include "naucrates/dxl/operators/CDXLPhysicalRedistributeMotion.h"
+#include "naucrates/dxl/operators/CDXLPhysicalResult.h"
+#include "naucrates/dxl/operators/CDXLPhysicalRoutedDistributeMotion.h"
+#include "naucrates/dxl/operators/CDXLPhysicalRowTrigger.h"
+#include "naucrates/dxl/operators/CDXLPhysicalSequence.h"
+#include "naucrates/dxl/operators/CDXLPhysicalSort.h"
+#include "naucrates/dxl/operators/CDXLPhysicalSplit.h"
+#include "naucrates/dxl/operators/CDXLPhysicalSubqueryScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalTVF.h"
+#include "naucrates/dxl/operators/CDXLPhysicalTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalValuesScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalWindow.h"
+#include "naucrates/dxl/operators/CDXLScalarAggref.h"
+#include "naucrates/dxl/operators/CDXLScalarArray.h"
+#include "naucrates/dxl/operators/CDXLScalarArrayCoerceExpr.h"
+#include "naucrates/dxl/operators/CDXLScalarArrayComp.h"
+#include "naucrates/dxl/operators/CDXLScalarArrayRef.h"
+#include "naucrates/dxl/operators/CDXLScalarArrayRefIndexList.h"
+#include "naucrates/dxl/operators/CDXLScalarAssertConstraint.h"
+#include "naucrates/dxl/operators/CDXLScalarAssertConstraintList.h"
+#include "naucrates/dxl/operators/CDXLScalarBitmapBoolOp.h"
+#include "naucrates/dxl/operators/CDXLScalarBitmapIndexProbe.h"
+#include "naucrates/dxl/operators/CDXLScalarBoolExpr.h"
+#include "naucrates/dxl/operators/CDXLScalarBooleanTest.h"
+#include "naucrates/dxl/operators/CDXLScalarCaseTest.h"
+#include "naucrates/dxl/operators/CDXLScalarCast.h"
+#include "naucrates/dxl/operators/CDXLScalarCoalesce.h"
+#include "naucrates/dxl/operators/CDXLScalarCoerceToDomain.h"
+#include "naucrates/dxl/operators/CDXLScalarCoerceViaIO.h"
+#include "naucrates/dxl/operators/CDXLScalarComp.h"
+#include "naucrates/dxl/operators/CDXLScalarConstValue.h"
+#include "naucrates/dxl/operators/CDXLScalarDMLAction.h"
+#include "naucrates/dxl/operators/CDXLScalarDistinctComp.h"
+#include "naucrates/dxl/operators/CDXLScalarFilter.h"
+#include "naucrates/dxl/operators/CDXLScalarFuncExpr.h"
+#include "naucrates/dxl/operators/CDXLScalarHashCondList.h"
+#include "naucrates/dxl/operators/CDXLScalarHashExpr.h"
+#include "naucrates/dxl/operators/CDXLScalarHashExprList.h"
+#include "naucrates/dxl/operators/CDXLScalarIdent.h"
+#include "naucrates/dxl/operators/CDXLScalarIfStmt.h"
+#include "naucrates/dxl/operators/CDXLScalarIndexCondList.h"
+#include "naucrates/dxl/operators/CDXLScalarJoinFilter.h"
+#include "naucrates/dxl/operators/CDXLScalarLimitCount.h"
+#include "naucrates/dxl/operators/CDXLScalarLimitOffset.h"
+#include "naucrates/dxl/operators/CDXLScalarMergeCondList.h"
+#include "naucrates/dxl/operators/CDXLScalarMinMax.h"
+#include "naucrates/dxl/operators/CDXLScalarNullIf.h"
+#include "naucrates/dxl/operators/CDXLScalarNullTest.h"
+#include "naucrates/dxl/operators/CDXLScalarOneTimeFilter.h"
+#include "naucrates/dxl/operators/CDXLScalarOpExpr.h"
+#include "naucrates/dxl/operators/CDXLScalarOpList.h"
+#include "naucrates/dxl/operators/CDXLScalarPartBound.h"
+#include "naucrates/dxl/operators/CDXLScalarPartBoundInclusion.h"
+#include "naucrates/dxl/operators/CDXLScalarPartBoundOpen.h"
+#include "naucrates/dxl/operators/CDXLScalarPartDefault.h"
+#include "naucrates/dxl/operators/CDXLScalarPartListNullTest.h"
+#include "naucrates/dxl/operators/CDXLScalarPartListValues.h"
+#include "naucrates/dxl/operators/CDXLScalarPartOid.h"
+#include "naucrates/dxl/operators/CDXLScalarProjElem.h"
+#include "naucrates/dxl/operators/CDXLScalarProjList.h"
+#include "naucrates/dxl/operators/CDXLScalarRecheckCondFilter.h"
+#include "naucrates/dxl/operators/CDXLScalarSortCol.h"
+#include "naucrates/dxl/operators/CDXLScalarSortColList.h"
+#include "naucrates/dxl/operators/CDXLScalarSubPlan.h"
+#include "naucrates/dxl/operators/CDXLScalarSubquery.h"
+#include "naucrates/dxl/operators/CDXLScalarSubqueryAll.h"
+#include "naucrates/dxl/operators/CDXLScalarSubqueryAny.h"
+#include "naucrates/dxl/operators/CDXLScalarSubqueryExists.h"
+#include "naucrates/dxl/operators/CDXLScalarSubqueryNotExists.h"
+#include "naucrates/dxl/operators/CDXLScalarSwitch.h"
+#include "naucrates/dxl/operators/CDXLScalarSwitchCase.h"
+#include "naucrates/dxl/operators/CDXLScalarValuesList.h"
+#include "naucrates/dxl/operators/CDXLScalarWindowFrameEdge.h"
+#include "naucrates/dxl/operators/CDXLScalarWindowRef.h"
+#include "naucrates/dxl/operators/CDXLSpoolInfo.h"
+#include "naucrates/dxl/operators/CDXLTableDescr.h"
+#include "naucrates/dxl/operators/CDXLWindowFrame.h"
+#include "naucrates/dxl/operators/CDXLWindowKey.h"
+#include "naucrates/dxl/operators/CDXLWindowSpec.h"
+#include "naucrates/exception.h"
+
+#endif // !GPDXL_dxlops_H
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
similarity index 55%
copy from src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
copy to src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
index c5fd666f3a..b5a2738e39 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h
@@ -1,21 +1,21 @@
//---------------------------------------------------------------------------
// Greenplum Database
-// Copyright (C) 2012 EMC Corp.
+// Copyright (C) 2013 EMC Corp.
//
// @filename:
-// CParseHandlerIndexScan.h
+// CParseHandlerDynamicIndexScan.h
//
// @doc:
-// SAX parse handler class for parsing index scan operator nodes
+// SAX parse handler class for parsing dynamic index scan operator nodes
//---------------------------------------------------------------------------
-#ifndef GPDXL_CParseHandlerIndexScan_H
-#define GPDXL_CParseHandlerIndexScan_H
+#ifndef GPDXL_CParseHandlerDynamicIndexScan_H
+#define GPDXL_CParseHandlerDynamicIndexScan_H
#include "gpos/base.h"
#include "naucrates/dxl/operators/CDXLPhysicalIndexScan.h"
-#include "naucrates/dxl/parser/CParseHandlerPhysicalOp.h"
+#include "naucrates/dxl/parser/CParseHandlerIndexScan.h"
#include "naucrates/dxl/xml/dxltokens.h"
namespace gpdxl
@@ -26,17 +26,20 @@ XERCES_CPP_NAMESPACE_USE
//---------------------------------------------------------------------------
// @class:
-// CParseHandlerIndexScan
+// CParseHandlerDynamicIndexScan
//
// @doc:
// Parse handler for index scan operator nodes
//
//---------------------------------------------------------------------------
-class CParseHandlerIndexScan : public CParseHandlerPhysicalOp
+class CParseHandlerDynamicIndexScan : public CParseHandlerIndexScan
{
private:
- // index scan direction
- EdxlIndexScanDirection m_index_scan_dir;
+ // part index id
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
// process the start of an element
void StartElement(
@@ -53,25 +56,17 @@ private:
const XMLCh *const element_qname // element's qname
) override;
-protected:
- // common StartElement functionality for IndexScan and IndexOnlyScan
- void StartElementHelper(const XMLCh *const element_local_name,
- const Attributes &attrs, Edxltoken token_type);
-
- // common EndElement functionality for IndexScan and IndexOnlyScan
- void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type);
-
public:
- CParseHandlerIndexScan(const CParseHandlerIndexScan &) = delete;
+ CParseHandlerDynamicIndexScan(const CParseHandlerDynamicIndexScan &) =
+ delete;
// ctor
- CParseHandlerIndexScan(CMemoryPool *mp,
- CParseHandlerManager *parse_handler_mgr,
- CParseHandlerBase *parse_handler_root);
+ CParseHandlerDynamicIndexScan(CMemoryPool *mp,
+ CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root);
};
} // namespace gpdxl
-#endif // !GPDXL_CParseHandlerIndexScan_H
+#endif // !GPDXL_CParseHandlerDynamicIndexScan_H
// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
similarity index 52%
copy from src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
copy to src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
index c5fd666f3a..8b5b1d6b4a 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerDynamicTableScan.h
@@ -3,20 +3,18 @@
// Copyright (C) 2012 EMC Corp.
//
// @filename:
-// CParseHandlerIndexScan.h
+// CParseHandlerDynamicTableScan.h
//
// @doc:
-// SAX parse handler class for parsing index scan operator nodes
+// SAX parse handler class for parsing dynamic table scan operator nodes
//---------------------------------------------------------------------------
-#ifndef GPDXL_CParseHandlerIndexScan_H
-#define GPDXL_CParseHandlerIndexScan_H
+#ifndef GPDXL_CParseHandlerDynamicTableScan_H
+#define GPDXL_CParseHandlerDynamicTableScan_H
#include "gpos/base.h"
-#include "naucrates/dxl/operators/CDXLPhysicalIndexScan.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalOp.h"
-#include "naucrates/dxl/xml/dxltokens.h"
namespace gpdxl
{
@@ -24,19 +22,25 @@ using namespace gpos;
XERCES_CPP_NAMESPACE_USE
+// fwd decl
+class CDXLPhysicalDynamicTableScan;
+
//---------------------------------------------------------------------------
// @class:
-// CParseHandlerIndexScan
+// CParseHandlerDynamicTableScan
//
// @doc:
-// Parse handler for index scan operator nodes
+// Parse handler for parsing a dynamic table scan operator
//
//---------------------------------------------------------------------------
-class CParseHandlerIndexScan : public CParseHandlerPhysicalOp
+class CParseHandlerDynamicTableScan : public CParseHandlerPhysicalOp
{
private:
- // index scan direction
- EdxlIndexScanDirection m_index_scan_dir;
+ // the id of the partition index structure
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
// process the start of an element
void StartElement(
@@ -53,25 +57,17 @@ private:
const XMLCh *const element_qname // element's qname
) override;
-protected:
- // common StartElement functionality for IndexScan and IndexOnlyScan
- void StartElementHelper(const XMLCh *const element_local_name,
- const Attributes &attrs, Edxltoken token_type);
-
- // common EndElement functionality for IndexScan and IndexOnlyScan
- void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type);
-
public:
- CParseHandlerIndexScan(const CParseHandlerIndexScan &) = delete;
+ CParseHandlerDynamicTableScan(const CParseHandlerDynamicTableScan &) =
+ delete;
// ctor
- CParseHandlerIndexScan(CMemoryPool *mp,
- CParseHandlerManager *parse_handler_mgr,
- CParseHandlerBase *parse_handler_root);
+ CParseHandlerDynamicTableScan(CMemoryPool *mp,
+ CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *pph);
};
} // namespace gpdxl
-#endif // !GPDXL_CParseHandlerIndexScan_H
+#endif // !GPDXL_CParseHandlerDynamicTableScan_H
// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerFactory.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerFactory.h
index 45f73f65f9..30c7a12dc6 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerFactory.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerFactory.h
@@ -266,6 +266,11 @@ private:
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root);
+ // construct a dynamic bitmap table scan parse handler
+ static CParseHandlerBase *CreateDynBitmapTableScanParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root);
+
// construct an external scan parse handler
static CParseHandlerBase *CreateExternalScanParseHandler(
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
@@ -311,6 +316,16 @@ private:
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
CParseHandlerBase *parse_handler_root);
+ // construct a dynamic table scan parse handler
+ static CParseHandlerBase *CreateDTSParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root);
+
+ // construct a dynamic index scan parse handler
+ static CParseHandlerBase *CreateDynamicIdxScanParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root);
+
// construct a partition selector parse handler
static CParseHandlerBase *CreatePartitionSelectorParseHandler(
CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
index c5fd666f3a..e1fcba1232 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerIndexScan.h
@@ -60,7 +60,8 @@ protected:
// common EndElement functionality for IndexScan and IndexOnlyScan
void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type);
+ Edxltoken token_type, ULONG part_idx_id = 0,
+ ULONG part_idx_id_printable = 0);
public:
CParseHandlerIndexScan(const CParseHandlerIndexScan &) = delete;
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
index 10e1a21028..4b8b4c2399 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h
@@ -41,7 +41,8 @@ protected:
// common EndElement functionality for child classes
void EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type);
+ Edxltoken token_type, ULONG part_idx_id = 0,
+ ULONG part_idx_id_printable = 0);
public:
CParseHandlerPhysicalAbstractBitmapScan(
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
new file mode 100644
index 0000000000..43ea094a75
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h
@@ -0,0 +1,78 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2014 VMware, Inc. or its affiliates.
+//
+// @filename:
+// CParseHandlerPhysicalDynamicBitmapTableScan.h
+//
+// @doc:
+// SAX parse handler class for parsing dynamic bitmap table scan operator nodes
+//---------------------------------------------------------------------------
+
+#ifndef GPDXL_CParseHandlerPhysicalDynamicBitmapTableScan_H
+#define GPDXL_CParseHandlerPhysicalDynamicBitmapTableScan_H
+
+#include "gpos/base.h"
+
+#include "naucrates/dxl/operators/CDXLOperatorFactory.h"
+#include "naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h"
+
+namespace gpdxl
+{
+using namespace gpos;
+
+XERCES_CPP_NAMESPACE_USE
+
+//---------------------------------------------------------------------------
+// @class:
+// CParseHandlerPhysicalDynamicBitmapTableScan
+//
+// @doc:
+// Parse handler for parsing dynamic bitmap table scan operator
+//
+//---------------------------------------------------------------------------
+class CParseHandlerPhysicalDynamicBitmapTableScan
+ : public CParseHandlerPhysicalAbstractBitmapScan
+{
+private:
+ // part index id
+ ULONG m_part_index_id;
+
+ // printable partition index id
+ ULONG m_part_index_id_printable;
+
+ // process the start of an element
+ void StartElement(
+ const XMLCh *const element_uri, // URI of element's namespace
+ const XMLCh *const element_local_name, // local part of element's name
+ const XMLCh *const element_qname, // element's qname
+ const Attributes &attr // element's attributes
+ ) override;
+
+ // process the end of an element
+ void EndElement(
+ const XMLCh *const element_uri, // URI of element's namespace
+ const XMLCh *const element_local_name, // local part of element's name
+ const XMLCh *const element_qname // element's qname
+ ) override;
+
+public:
+ CParseHandlerPhysicalDynamicBitmapTableScan(
+ const CParseHandlerPhysicalDynamicBitmapTableScan &) = delete;
+
+ // ctor
+ CParseHandlerPhysicalDynamicBitmapTableScan(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+ : CParseHandlerPhysicalAbstractBitmapScan(mp, parse_handler_mgr,
+ parse_handler_root),
+ m_part_index_id(0),
+ m_part_index_id_printable(0)
+ {
+ }
+};
+} // namespace gpdxl
+
+#endif // !GPDXL_CParseHandlerPhysicalDynamicBitmapTableScan_H
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/parsehandlers.h b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/parsehandlers.h
index 0a63737ca8..3883e85ad8 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/parsehandlers.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/parser/parsehandlers.h
@@ -32,6 +32,8 @@
#include "naucrates/dxl/parser/CParseHandlerDefaultValueExpr.h"
#include "naucrates/dxl/parser/CParseHandlerDirectDispatchInfo.h"
#include "naucrates/dxl/parser/CParseHandlerDistinctComp.h"
+#include "naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h"
+#include "naucrates/dxl/parser/CParseHandlerDynamicTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerEnumeratorConfig.h"
#include "naucrates/dxl/parser/CParseHandlerExternalScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
@@ -97,6 +99,7 @@
#include "naucrates/dxl/parser/CParseHandlerPhysicalCTEConsumer.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalCTEProducer.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalDML.h"
+#include "naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalOp.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalRowTrigger.h"
#include "naucrates/dxl/parser/CParseHandlerPhysicalSplit.h"
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 3c5d2fd3c6..21b5752e38 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/dxl/xml/dxltokens.h
@@ -86,6 +86,7 @@ enum Edxltoken
EdxltokenPhysicalTableScan,
EdxltokenPhysicalBitmapTableScan,
+ EdxltokenPhysicalDynamicBitmapTableScan,
EdxltokenPhysicalExternalScan,
EdxltokenPhysicalIndexScan,
EdxltokenPhysicalIndexOnlyScan,
@@ -106,6 +107,8 @@ enum Edxltoken
EdxltokenPhysicalAppend,
EdxltokenPhysicalMaterialize,
EdxltokenPhysicalSequence,
+ EdxltokenPhysicalDynamicTableScan,
+ EdxltokenPhysicalDynamicIndexScan,
EdxltokenPhysicalTVF,
EdxltokenPhysicalWindow,
EdxltokenPhysicalPartitionSelector,
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
new file mode 100644
index 0000000000..d0dd3c5313
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicBitmapTableScan.cpp
@@ -0,0 +1,68 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2014 VMware, Inc. or its affiliates.
+//
+// @filename:
+// CDXLPhysicalDynamicBitmapTableScan.cpp
+//
+// @doc:
+// Class for representing DXL bitmap table scan operators.
+//---------------------------------------------------------------------------
+
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
+
+#include "naucrates/dxl/operators/CDXLNode.h"
+#include "naucrates/dxl/operators/CDXLTableDescr.h"
+#include "naucrates/dxl/xml/CXMLSerializer.h"
+#include "naucrates/dxl/xml/dxltokens.h"
+
+using namespace gpdxl;
+using namespace gpos;
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicBitmapTableScan::GetOpNameStr
+//
+// @doc:
+// Operator name
+//
+//---------------------------------------------------------------------------
+const CWStringConst *
+CDXLPhysicalDynamicBitmapTableScan::GetOpNameStr() const
+{
+ return CDXLTokens::GetDXLTokenStr(EdxltokenPhysicalDynamicBitmapTableScan);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicBitmapTableScan::SerializeToDXL
+//
+// @doc:
+// Serialize operator in DXL format
+//
+//---------------------------------------------------------------------------
+void
+CDXLPhysicalDynamicBitmapTableScan::SerializeToDXL(
+ CXMLSerializer *xml_serializer, const CDXLNode *node) const
+{
+ const CWStringConst *element_name = GetOpNameStr();
+ xml_serializer->OpenElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
+ if (m_part_index_id_printable != m_part_index_id)
+ {
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
+ m_part_index_id_printable);
+ }
+ node->SerializePropertiesToDXL(xml_serializer);
+ node->SerializeChildrenToDXL(xml_serializer);
+ m_dxl_table_descr->SerializeToDXL(xml_serializer);
+
+ xml_serializer->CloseElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+}
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp
new file mode 100644
index 0000000000..dbcb9439a1
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicIndexScan.cpp
@@ -0,0 +1,247 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2013 EMC Corp.
+//
+// @filename:
+// CDXLPhysicalDynamicIndexScan.cpp
+//
+// @doc:
+// Implementation of DXL physical dynamic index scan operators
+//---------------------------------------------------------------------------
+
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
+
+#include "naucrates/dxl/operators/CDXLNode.h"
+#include "naucrates/dxl/xml/CXMLSerializer.h"
+
+using namespace gpos;
+using namespace gpdxl;
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::CDXLPhysicalDynamicIndexScan
+//
+// @doc:
+// Construct an index scan node given its table descriptor,
+// index descriptor and filter conditions on the index
+//
+//---------------------------------------------------------------------------
+CDXLPhysicalDynamicIndexScan::CDXLPhysicalDynamicIndexScan(
+ CMemoryPool *mp, CDXLTableDescr *table_descr, ULONG part_idx_id,
+ ULONG part_idx_id_printable, CDXLIndexDescr *dxl_index_descr,
+ EdxlIndexScanDirection idx_scan_direction)
+ : CDXLPhysical(mp),
+ m_dxl_table_descr(table_descr),
+ m_part_index_id(part_idx_id),
+ m_part_index_id_printable(part_idx_id_printable),
+ m_dxl_index_descr(dxl_index_descr),
+ m_index_scan_dir(idx_scan_direction)
+{
+ GPOS_ASSERT(nullptr != m_dxl_table_descr);
+ GPOS_ASSERT(nullptr != m_dxl_index_descr);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::~CDXLPhysicalDynamicIndexScan
+//
+// @doc:
+// Dtor
+//
+//---------------------------------------------------------------------------
+CDXLPhysicalDynamicIndexScan::~CDXLPhysicalDynamicIndexScan()
+{
+ m_dxl_index_descr->Release();
+ m_dxl_table_descr->Release();
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetDXLOperator
+//
+// @doc:
+// Operator type
+//
+//---------------------------------------------------------------------------
+Edxlopid
+CDXLPhysicalDynamicIndexScan::GetDXLOperator() const
+{
+ return EdxlopPhysicalDynamicIndexScan;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetOpNameStr
+//
+// @doc:
+// Operator name
+//
+//---------------------------------------------------------------------------
+const CWStringConst *
+CDXLPhysicalDynamicIndexScan::GetOpNameStr() const
+{
+ return CDXLTokens::GetDXLTokenStr(EdxltokenPhysicalDynamicIndexScan);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::MakeDXLIndexDescr
+//
+// @doc:
+// Index descriptor for the index scan
+//
+//---------------------------------------------------------------------------
+const CDXLIndexDescr *
+CDXLPhysicalDynamicIndexScan::GetDXLIndexDescr() const
+{
+ return m_dxl_index_descr;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetIndexScanDir
+//
+// @doc:
+// Return the scan direction of the index
+//
+//---------------------------------------------------------------------------
+EdxlIndexScanDirection
+CDXLPhysicalDynamicIndexScan::GetIndexScanDir() const
+{
+ return m_index_scan_dir;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetDXLTableDescr
+//
+// @doc:
+// Return the associated table descriptor
+//
+//---------------------------------------------------------------------------
+const CDXLTableDescr *
+CDXLPhysicalDynamicIndexScan::GetDXLTableDescr() const
+{
+ return m_dxl_table_descr;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetPartIndexId
+//
+// @doc:
+// Part index id
+//
+//---------------------------------------------------------------------------
+ULONG
+CDXLPhysicalDynamicIndexScan::GetPartIndexId() const
+{
+ return m_part_index_id;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::GetPartIndexIdPrintable
+//
+// @doc:
+// Printable partition index id
+//
+//---------------------------------------------------------------------------
+ULONG
+CDXLPhysicalDynamicIndexScan::GetPartIndexIdPrintable() const
+{
+ return m_part_index_id_printable;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::SerializeToDXL
+//
+// @doc:
+// Serialize operator in DXL format
+//
+//---------------------------------------------------------------------------
+void
+CDXLPhysicalDynamicIndexScan::SerializeToDXL(CXMLSerializer *xml_serializer,
+ const CDXLNode *node) const
+{
+ const CWStringConst *element_name = GetOpNameStr();
+
+ xml_serializer->OpenElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenIndexScanDirection),
+ CDXLOperator::GetIdxScanDirectionStr(m_index_scan_dir));
+
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
+ if (m_part_index_id_printable != m_part_index_id)
+ {
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
+ m_part_index_id_printable);
+ }
+
+ // serialize properties
+ node->SerializePropertiesToDXL(xml_serializer);
+
+ // serialize children
+ node->SerializeChildrenToDXL(xml_serializer);
+
+ // serialize index descriptor
+ m_dxl_index_descr->SerializeToDXL(xml_serializer);
+
+ // serialize table descriptor
+ m_dxl_table_descr->SerializeToDXL(xml_serializer);
+
+ xml_serializer->CloseElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+}
+
+#ifdef GPOS_DEBUG
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicIndexScan::AssertValid
+//
+// @doc:
+// Checks whether operator node is well-structured
+//
+//---------------------------------------------------------------------------
+void
+CDXLPhysicalDynamicIndexScan::AssertValid(const CDXLNode *node,
+ BOOL validate_children) const
+{
+ // assert proj list and filter are valid
+ CDXLPhysical::AssertValid(node, validate_children);
+
+ // index scan has only 3 children
+ GPOS_ASSERT(3 == node->Arity());
+
+ // assert validity of the index descriptor
+ GPOS_ASSERT(nullptr != m_dxl_index_descr);
+ GPOS_ASSERT(nullptr != m_dxl_index_descr->MdName());
+ GPOS_ASSERT(m_dxl_index_descr->MdName()->GetMDName()->IsValid());
+
+ // assert validity of the table descriptor
+ GPOS_ASSERT(nullptr != m_dxl_table_descr);
+ GPOS_ASSERT(nullptr != m_dxl_table_descr->MdName());
+ GPOS_ASSERT(m_dxl_table_descr->MdName()->GetMDName()->IsValid());
+
+ CDXLNode *index_filter_dxlnode = (*node)[EdxldisIndexFilter];
+ CDXLNode *index_cond_dxlnode = (*node)[EdxldisIndexCondition];
+
+ // assert children are of right type (physical/scalar)
+ GPOS_ASSERT(EdxlopScalarIndexCondList ==
+ index_cond_dxlnode->GetOperator()->GetDXLOperator());
+ GPOS_ASSERT(EdxlopScalarFilter ==
+ index_filter_dxlnode->GetOperator()->GetDXLOperator());
+
+ if (validate_children)
+ {
+ index_cond_dxlnode->GetOperator()->AssertValid(index_cond_dxlnode,
+ validate_children);
+ }
+}
+#endif // GPOS_DEBUG
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
new file mode 100644
index 0000000000..f5dc4d0ae1
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/src/operators/CDXLPhysicalDynamicTableScan.cpp
@@ -0,0 +1,180 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2012 EMC Corp.
+//
+// @filename:
+// CDXLPhysicalDynamicTableScan.cpp
+//
+// @doc:
+// Implementation of DXL physical dynamic table scan operator
+//---------------------------------------------------------------------------
+
+
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
+
+#include "naucrates/dxl/operators/CDXLNode.h"
+#include "naucrates/dxl/xml/CXMLSerializer.h"
+
+using namespace gpos;
+using namespace gpdxl;
+
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::CDXLPhysicalDynamicTableScan
+//
+// @doc:
+// Ctor
+//
+//---------------------------------------------------------------------------
+CDXLPhysicalDynamicTableScan::CDXLPhysicalDynamicTableScan(
+ CMemoryPool *mp, CDXLTableDescr *table_descr, ULONG part_idx_id,
+ ULONG part_idx_id_printable)
+ : CDXLPhysical(mp),
+ m_dxl_table_descr(table_descr),
+ m_part_index_id(part_idx_id),
+ m_part_index_id_printable(part_idx_id_printable)
+{
+ GPOS_ASSERT(nullptr != table_descr);
+}
+
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::~CDXLPhysicalDynamicTableScan
+//
+// @doc:
+// Destructor
+//
+//---------------------------------------------------------------------------
+CDXLPhysicalDynamicTableScan::~CDXLPhysicalDynamicTableScan()
+{
+ m_dxl_table_descr->Release();
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::GetDXLOperator
+//
+// @doc:
+// Operator type
+//
+//---------------------------------------------------------------------------
+Edxlopid
+CDXLPhysicalDynamicTableScan::GetDXLOperator() const
+{
+ return EdxlopPhysicalDynamicTableScan;
+}
+
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::GetOpNameStr
+//
+// @doc:
+// Operator name
+//
+//---------------------------------------------------------------------------
+const CWStringConst *
+CDXLPhysicalDynamicTableScan::GetOpNameStr() const
+{
+ return CDXLTokens::GetDXLTokenStr(EdxltokenPhysicalDynamicTableScan);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::GetDXLTableDescr
+//
+// @doc:
+// Table descriptor for the table scan
+//
+//---------------------------------------------------------------------------
+const CDXLTableDescr *
+CDXLPhysicalDynamicTableScan::GetDXLTableDescr() const
+{
+ return m_dxl_table_descr;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::GetPartIndexId
+//
+// @doc:
+// Id of partition index
+//
+//---------------------------------------------------------------------------
+ULONG
+CDXLPhysicalDynamicTableScan::GetPartIndexId() const
+{
+ return m_part_index_id;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::GetPartIndexIdPrintable
+//
+// @doc:
+// Printable partition index id
+//
+//---------------------------------------------------------------------------
+ULONG
+CDXLPhysicalDynamicTableScan::GetPartIndexIdPrintable() const
+{
+ return m_part_index_id_printable;
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::SerializeToDXL
+//
+// @doc:
+// Serialize operator in DXL format
+//
+//---------------------------------------------------------------------------
+void
+CDXLPhysicalDynamicTableScan::SerializeToDXL(CXMLSerializer *xml_serializer,
+ const CDXLNode *node) const
+{
+ const CWStringConst *element_name = GetOpNameStr();
+
+ xml_serializer->OpenElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexId), m_part_index_id);
+ if (m_part_index_id_printable != m_part_index_id)
+ {
+ xml_serializer->AddAttribute(
+ CDXLTokens::GetDXLTokenStr(EdxltokenPartIndexIdPrintable),
+ m_part_index_id_printable);
+ }
+ node->SerializePropertiesToDXL(xml_serializer);
+ node->SerializeChildrenToDXL(xml_serializer);
+ m_dxl_table_descr->SerializeToDXL(xml_serializer);
+ xml_serializer->CloseElement(
+ CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix), element_name);
+}
+
+#ifdef GPOS_DEBUG
+//---------------------------------------------------------------------------
+// @function:
+// CDXLPhysicalDynamicTableScan::AssertValid
+//
+// @doc:
+// Checks whether operator node is well-structured
+//
+//---------------------------------------------------------------------------
+void
+CDXLPhysicalDynamicTableScan::AssertValid(const CDXLNode *node,
+ BOOL // validate_children
+) const
+{
+ GPOS_ASSERT(2 == node->Arity());
+
+ // assert validity of table descriptor
+ GPOS_ASSERT(nullptr != m_dxl_table_descr);
+ GPOS_ASSERT(nullptr != m_dxl_table_descr->MdName());
+ GPOS_ASSERT(m_dxl_table_descr->MdName()->GetMDName()->IsValid());
+}
+#endif // GPOS_DEBUG
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/src/operators/Makefile b/src/backend/gporca/libnaucrates/src/operators/Makefile
index 9c642aaf2e..a940507b41 100644
--- a/src/backend/gporca/libnaucrates/src/operators/Makefile
+++ b/src/backend/gporca/libnaucrates/src/operators/Makefile
@@ -58,6 +58,9 @@ OBJS = CDXLColDescr.o \
CDXLPhysicalCTEConsumer.o \
CDXLPhysicalCTEProducer.o \
CDXLPhysicalDML.o \
+ CDXLPhysicalDynamicBitmapTableScan.o \
+ CDXLPhysicalDynamicIndexScan.o \
+ CDXLPhysicalDynamicTableScan.o \
CDXLPhysicalExternalScan.o \
CDXLPhysicalGatherMotion.o \
CDXLPhysicalHashJoin.o \
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
new file mode 100644
index 0000000000..48983c8b73
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicIndexScan.cpp
@@ -0,0 +1,99 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2013 EMC Corp.
+//
+// @filename:
+// CParseHandlerDynamicIndexScan.cpp
+//
+// @doc:
+// Implementation of the SAX parse handler class for dynamic index scan operators
+//
+// @owner:
+//
+//
+// @test:
+//
+//---------------------------------------------------------------------------
+
+#include "naucrates/dxl/parser/CParseHandlerDynamicIndexScan.h"
+
+#include "naucrates/dxl/operators/CDXLOperatorFactory.h"
+#include "naucrates/dxl/parser/CParseHandlerFactory.h"
+#include "naucrates/dxl/parser/CParseHandlerFilter.h"
+#include "naucrates/dxl/parser/CParseHandlerIndexCondList.h"
+#include "naucrates/dxl/parser/CParseHandlerIndexDescr.h"
+#include "naucrates/dxl/parser/CParseHandlerProjList.h"
+#include "naucrates/dxl/parser/CParseHandlerProperties.h"
+#include "naucrates/dxl/parser/CParseHandlerScalarOp.h"
+#include "naucrates/dxl/parser/CParseHandlerTableDescr.h"
+#include "naucrates/dxl/parser/CParseHandlerUtils.h"
+
+using namespace gpdxl;
+
+XERCES_CPP_NAMESPACE_USE
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerDynamicIndexScan::CParseHandlerDynamicIndexScan
+//
+// @doc:
+// Ctor
+//
+//---------------------------------------------------------------------------
+CParseHandlerDynamicIndexScan::CParseHandlerDynamicIndexScan(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+ : CParseHandlerIndexScan(mp, parse_handler_mgr, parse_handler_root),
+ m_part_index_id(0),
+ m_part_index_id_printable(0)
+{
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerDynamicIndexScan::StartElement
+//
+// @doc:
+// Invoked by Xerces to process an opening tag
+//
+//---------------------------------------------------------------------------
+void
+CParseHandlerDynamicIndexScan::StartElement(
+ const XMLCh *const, // element_uri,
+ const XMLCh *const element_local_name,
+ const XMLCh *const, // element_qname
+ const Attributes &attrs)
+{
+ StartElementHelper(element_local_name, attrs,
+ EdxltokenPhysicalDynamicIndexScan);
+
+ m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
+ EdxltokenPhysicalDynamicIndexScan);
+ m_part_index_id_printable =
+ CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
+ EdxltokenPartIndexIdPrintable, EdxltokenPhysicalDynamicIndexScan,
+ true /*is_optional*/, m_part_index_id);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerDynamicIndexScan::EndElement
+//
+// @doc:
+// Invoked by Xerces to process a closing tag
+//
+//---------------------------------------------------------------------------
+void
+CParseHandlerDynamicIndexScan::EndElement(const XMLCh *const, // element_uri,
+ const XMLCh *const element_local_name,
+ const XMLCh *const // element_qname
+)
+{
+ EndElementHelper(element_local_name, EdxltokenPhysicalDynamicIndexScan,
+ m_part_index_id, m_part_index_id_printable);
+}
+
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
similarity index 60%
copy from src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
copy to src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
index e42b991c35..8cfd57a3a4 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerDynamicTableScan.cpp
@@ -1,43 +1,65 @@
//---------------------------------------------------------------------------
// Greenplum Database
-// Copyright (C) 2014 VMware, Inc. or its affiliates.
+// Copyright (C) 2012 EMC Corp.
//
// @filename:
-// CParseHandlerPhysicalAbstractBitmapScan.h
+// CParseHandlerDynamicTableScan.cpp
//
// @doc:
-// SAX parse handler parent class for parsing bitmap scan operator nodes
+// Implementation of the SAX parse handler class for parsing dynamic
+// table scan operators
//---------------------------------------------------------------------------
-#include "naucrates/dxl/parser/CParseHandlerPhysicalAbstractBitmapScan.h"
+#include "naucrates/dxl/parser/CParseHandlerDynamicTableScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalAbstractBitmapScan.h"
-#include "naucrates/dxl/operators/CDXLPhysicalBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLOperatorFactory.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
#include "naucrates/dxl/parser/CParseHandlerProperties.h"
-#include "naucrates/dxl/parser/CParseHandlerScalarBitmapIndexProbe.h"
#include "naucrates/dxl/parser/CParseHandlerTableDescr.h"
#include "naucrates/dxl/parser/CParseHandlerUtils.h"
-#include "naucrates/dxl/xml/dxltokens.h"
using namespace gpdxl;
+
+XERCES_CPP_NAMESPACE_USE
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerDynamicTableScan::CParseHandlerDynamicTableScan
+//
+// @doc:
+// Constructor
+//
+//---------------------------------------------------------------------------
+CParseHandlerDynamicTableScan::CParseHandlerDynamicTableScan(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+ : CParseHandlerPhysicalOp(mp, parse_handler_mgr, parse_handler_root)
+{
+}
+
+
//---------------------------------------------------------------------------
// @function:
-// CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper
+// CParseHandlerDynamicTableScan::StartElement
//
// @doc:
-// Common StartElement functionality for children of this class
+// Invoked by Xerces to process an opening tag
//
//---------------------------------------------------------------------------
void
-CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
- const XMLCh *const element_local_name, Edxltoken token_type)
+CParseHandlerDynamicTableScan::StartElement(
+ const XMLCh *const, // element_uri,
+ const XMLCh *const element_local_name,
+ const XMLCh *const, // element_qname
+ const Attributes &attrs)
{
- if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
- element_local_name))
+ if (0 != XMLString::compareString(
+ CDXLTokens::XmlstrToken(EdxltokenPhysicalDynamicTableScan),
+ element_local_name))
{
CWStringDynamic *str = CDXLUtils::CreateDynamicStringFromXMLChArray(
m_parse_handler_mgr->GetDXLMemoryManager(), element_local_name);
@@ -45,7 +67,19 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
str->GetBuffer());
}
+ m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
+ EdxltokenPhysicalDynamicTableScan);
+
+ m_part_index_id_printable =
+ CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
+ EdxltokenPartIndexIdPrintable, EdxltokenPhysicalDynamicTableScan,
+ true, //is_optional
+ m_part_index_id);
+
// create child node parsers in reverse order of their expected occurrence
+
// parse handler for table descriptor
CParseHandlerBase *table_descr_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -53,20 +87,6 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
m_parse_handler_mgr, this);
m_parse_handler_mgr->ActivateParseHandler(table_descr_parse_handler);
- // parse handler for the bitmap access path
- CParseHandlerBase *bitmap_parse_handler =
- CParseHandlerFactory::GetParseHandler(
- m_mp, CDXLTokens::XmlstrToken(EdxltokenScalar), m_parse_handler_mgr,
- this);
- m_parse_handler_mgr->ActivateParseHandler(bitmap_parse_handler);
-
- // parse handler for the recheck condition
- CParseHandlerBase *recheck_cond_parse_handler =
- CParseHandlerFactory::GetParseHandler(
- m_mp, CDXLTokens::XmlstrToken(EdxltokenScalarRecheckCondFilter),
- m_parse_handler_mgr, this);
- m_parse_handler_mgr->ActivateParseHandler(recheck_cond_parse_handler);
-
// parse handler for the filter
CParseHandlerBase *filter_parse_handler =
CParseHandlerFactory::GetParseHandler(
@@ -92,25 +112,26 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
this->Append(prop_parse_handler);
this->Append(proj_list_parse_handler);
this->Append(filter_parse_handler);
- this->Append(recheck_cond_parse_handler);
- this->Append(bitmap_parse_handler);
this->Append(table_descr_parse_handler);
}
//---------------------------------------------------------------------------
// @function:
-// CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper
+// CParseHandlerDynamicTableScan::EndElement
//
// @doc:
-// Common EndElement functionality for children of this class
+// Invoked by Xerces to process a closing tag
//
//---------------------------------------------------------------------------
void
-CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
- const XMLCh *const element_local_name, Edxltoken token_type)
+CParseHandlerDynamicTableScan::EndElement(const XMLCh *const, // element_uri,
+ const XMLCh *const element_local_name,
+ const XMLCh *const // element_qname
+)
{
- if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
- element_local_name))
+ if (0 != XMLString::compareString(
+ CDXLTokens::XmlstrToken(EdxltokenPhysicalDynamicTableScan),
+ element_local_name))
{
CWStringDynamic *str = CDXLUtils::CreateDynamicStringFromXMLChArray(
m_parse_handler_mgr->GetDXLMemoryManager(), element_local_name);
@@ -118,41 +139,31 @@ CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
str->GetBuffer());
}
- // construct nodes from the created child nodes
+ // construct node from the created child nodes
CParseHandlerProperties *prop_parse_handler =
dynamic_cast<CParseHandlerProperties *>((*this)[0]);
CParseHandlerProjList *proj_list_parse_handler =
dynamic_cast<CParseHandlerProjList *>((*this)[1]);
CParseHandlerFilter *filter_parse_handler =
dynamic_cast<CParseHandlerFilter *>((*this)[2]);
- CParseHandlerFilter *recheck_cond_parse_handler =
- dynamic_cast<CParseHandlerFilter *>((*this)[3]);
- CParseHandlerScalarOp *bitmap_parse_handler =
- dynamic_cast<CParseHandlerScalarOp *>((*this)[4]);
CParseHandlerTableDescr *table_descr_parse_handler =
- dynamic_cast<CParseHandlerTableDescr *>((*this)[5]);
+ dynamic_cast<CParseHandlerTableDescr *>((*this)[3]);
- GPOS_ASSERT(nullptr != table_descr_parse_handler->GetDXLTableDescr());
// set table descriptor
CDXLTableDescr *table_descr = table_descr_parse_handler->GetDXLTableDescr();
table_descr->AddRef();
+ CDXLPhysicalDynamicTableScan *dxl_op =
+ GPOS_NEW(m_mp) CDXLPhysicalDynamicTableScan(
+ m_mp, table_descr, m_part_index_id, m_part_index_id_printable);
-
- GPOS_ASSERT(EdxltokenPhysicalBitmapTableScan == token_type);
- CDXLPhysical *dxl_op =
- GPOS_NEW(m_mp) CDXLPhysicalBitmapTableScan(m_mp, table_descr);
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
-
// set statictics and physical properties
CParseHandlerUtils::SetProperties(m_dxl_node, prop_parse_handler);
// add constructed children
AddChildFromParseHandler(proj_list_parse_handler);
AddChildFromParseHandler(filter_parse_handler);
- AddChildFromParseHandler(recheck_cond_parse_handler);
-
- AddChildFromParseHandler(bitmap_parse_handler);
#ifdef GPOS_DEBUG
dxl_op->AssertValid(m_dxl_node, false /* validate_children */);
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerFactory.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerFactory.cpp
index eacc440d6f..8ba65b6cbe 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerFactory.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerFactory.cpp
@@ -89,6 +89,8 @@ CParseHandlerFactory::Init(CMemoryPool *mp)
{EdxltokenPhysicalAggregate, &CreateAggParseHandler},
{EdxltokenPhysicalTableScan, &CreateTableScanParseHandler},
{EdxltokenPhysicalBitmapTableScan, &CreateBitmapTableScanParseHandler},
+ {EdxltokenPhysicalDynamicBitmapTableScan,
+ &CreateDynBitmapTableScanParseHandler},
{EdxltokenPhysicalExternalScan, &CreateExternalScanParseHandler},
{EdxltokenPhysicalHashJoin, &CreateHashJoinParseHandler},
{EdxltokenPhysicalNLJoin, &CreateNLJoinParseHandler},
@@ -106,6 +108,8 @@ CParseHandlerFactory::Init(CMemoryPool *mp)
{EdxltokenPhysicalSort, &CreateSortParseHandler},
{EdxltokenPhysicalAppend, &CreateAppendParseHandler},
{EdxltokenPhysicalMaterialize, &CreateMaterializeParseHandler},
+ {EdxltokenPhysicalDynamicTableScan, &CreateDTSParseHandler},
+ {EdxltokenPhysicalDynamicIndexScan, &CreateDynamicIdxScanParseHandler},
{EdxltokenPhysicalPartitionSelector,
&CreatePartitionSelectorParseHandler},
{EdxltokenPhysicalSequence, &CreateSequenceParseHandler},
@@ -693,6 +697,16 @@ CParseHandlerFactory::CreateBitmapTableScanParseHandler(
mp, parse_handler_mgr, parse_handler_root);
}
+// creates a parse handler for parsing a dynamic bitmap table scan
+CParseHandlerBase *
+CParseHandlerFactory::CreateDynBitmapTableScanParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+{
+ return GPOS_NEW(mp) CParseHandlerPhysicalDynamicBitmapTableScan(
+ mp, parse_handler_mgr, parse_handler_root);
+}
+
// creates a parse handler for parsing an external scan
CParseHandlerBase *
CParseHandlerFactory::CreateExternalScanParseHandler(
@@ -783,6 +797,26 @@ CParseHandlerFactory::CreateMaterializeParseHandler(
CParseHandlerMaterialize(mp, parse_handler_mgr, parse_handler_root);
}
+// creates a parse handler for parsing a dynamic table scan operator
+CParseHandlerBase *
+CParseHandlerFactory::CreateDTSParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+{
+ return GPOS_NEW(mp) CParseHandlerDynamicTableScan(mp, parse_handler_mgr,
+ parse_handler_root);
+}
+
+// creates a parse handler for parsing a dynamic index scan operator
+CParseHandlerBase *
+CParseHandlerFactory::CreateDynamicIdxScanParseHandler(
+ CMemoryPool *mp, CParseHandlerManager *parse_handler_mgr,
+ CParseHandlerBase *parse_handler_root)
+{
+ return GPOS_NEW(mp) CParseHandlerDynamicIndexScan(mp, parse_handler_mgr,
+ parse_handler_root);
+}
+
// creates a parse handler for parsing a partition selector operator
CParseHandlerBase *
CParseHandlerFactory::CreatePartitionSelectorParseHandler(
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
index 9e82035446..b4d6282442 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerIndexScan.cpp
@@ -18,6 +18,7 @@
#include "naucrates/dxl/parser/CParseHandlerIndexScan.h"
#include "naucrates/dxl/operators/CDXLOperatorFactory.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicIndexScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalIndexOnlyScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
@@ -176,7 +177,9 @@ CParseHandlerIndexScan::StartElementHelper(
//---------------------------------------------------------------------------
void
CParseHandlerIndexScan::EndElementHelper(const XMLCh *const element_local_name,
- Edxltoken token_type)
+ Edxltoken token_type,
+ ULONG part_idx_id,
+ ULONG part_idx_id_printable)
{
if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
element_local_name))
@@ -216,14 +219,21 @@ CParseHandlerIndexScan::EndElementHelper(const XMLCh *const element_local_name,
m_mp, dxl_table_descr, dxl_index_descr, m_index_scan_dir);
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
}
- else
+ else if (EdxltokenPhysicalIndexScan == token_type)
{
- GPOS_ASSERT(EdxltokenPhysicalIndexScan == token_type);
dxl_op = GPOS_NEW(m_mp) CDXLPhysicalIndexScan(
m_mp, dxl_table_descr, dxl_index_descr, m_index_scan_dir);
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
}
+ else
+ {
+ GPOS_ASSERT(EdxltokenPhysicalDynamicIndexScan == token_type);
+ dxl_op = GPOS_NEW(m_mp) CDXLPhysicalDynamicIndexScan(
+ m_mp, dxl_table_descr, part_idx_id, part_idx_id_printable,
+ dxl_index_descr, m_index_scan_dir);
+ m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
+ }
// set statistics and physical properties
CParseHandlerUtils::SetProperties(m_dxl_node, prop_parse_handler);
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
index e42b991c35..3b18e63e44 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalAbstractBitmapScan.cpp
@@ -13,8 +13,11 @@
#include "naucrates/dxl/operators/CDXLPhysicalAbstractBitmapScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalBitmapTableScan.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
+#include "naucrates/dxl/parser/CParseHandlerPhysicalBitmapTableScan.h"
+#include "naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h"
#include "naucrates/dxl/parser/CParseHandlerProjList.h"
#include "naucrates/dxl/parser/CParseHandlerProperties.h"
#include "naucrates/dxl/parser/CParseHandlerScalarBitmapIndexProbe.h"
@@ -107,7 +110,8 @@ CParseHandlerPhysicalAbstractBitmapScan::StartElementHelper(
//---------------------------------------------------------------------------
void
CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
- const XMLCh *const element_local_name, Edxltoken token_type)
+ const XMLCh *const element_local_name, Edxltoken token_type,
+ ULONG part_idx_id, ULONG part_idx_id_printable)
{
if (0 != XMLString::compareString(CDXLTokens::XmlstrToken(token_type),
element_local_name))
@@ -137,11 +141,18 @@ CParseHandlerPhysicalAbstractBitmapScan::EndElementHelper(
// set table descriptor
CDXLTableDescr *table_descr = table_descr_parse_handler->GetDXLTableDescr();
table_descr->AddRef();
+ CDXLPhysical *dxl_op = nullptr;
-
- GPOS_ASSERT(EdxltokenPhysicalBitmapTableScan == token_type);
- CDXLPhysical *dxl_op =
- GPOS_NEW(m_mp) CDXLPhysicalBitmapTableScan(m_mp, table_descr);
+ if (EdxltokenPhysicalBitmapTableScan == token_type)
+ {
+ dxl_op = GPOS_NEW(m_mp) CDXLPhysicalBitmapTableScan(m_mp, table_descr);
+ }
+ else
+ {
+ GPOS_ASSERT(EdxltokenPhysicalDynamicBitmapTableScan == token_type);
+ dxl_op = GPOS_NEW(m_mp) CDXLPhysicalDynamicBitmapTableScan(
+ m_mp, table_descr, part_idx_id, part_idx_id_printable);
+ }
m_dxl_node = GPOS_NEW(m_mp) CDXLNode(m_mp, dxl_op);
// set statictics and physical properties
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp
new file mode 100644
index 0000000000..49f9def6ae
--- /dev/null
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerPhysicalDynamicBitmapTableScan.cpp
@@ -0,0 +1,68 @@
+//---------------------------------------------------------------------------
+// Greenplum Database
+// Copyright (C) 2014 VMware, Inc. or its affiliates.
+//
+// @filename:
+// CParseHandlerPhysicalDynamicBitmapTableScan.cpp
+//
+// @doc:
+// SAX parse handler class for parsing dynamic bitmap table scan operator nodes
+//---------------------------------------------------------------------------
+
+#include "naucrates/dxl/parser/CParseHandlerPhysicalDynamicBitmapTableScan.h"
+
+#include "naucrates/dxl/xml/dxltokens.h"
+
+using namespace gpdxl;
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerPhysicalDynamicBitmapTableScan::StartElement
+//
+// @doc:
+// Invoked by Xerces to process an opening tag
+//
+//---------------------------------------------------------------------------
+void
+CParseHandlerPhysicalDynamicBitmapTableScan::StartElement(
+ const XMLCh *const, // element_uri
+ const XMLCh *const element_local_name,
+ const XMLCh *const, // element_qname
+ const Attributes &attrs)
+{
+ StartElementHelper(element_local_name,
+ EdxltokenPhysicalDynamicBitmapTableScan);
+ m_part_index_id = CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs, EdxltokenPartIndexId,
+ EdxltokenPhysicalDynamicBitmapTableScan);
+
+ m_part_index_id_printable =
+ CDXLOperatorFactory::ExtractConvertAttrValueToUlong(
+ m_parse_handler_mgr->GetDXLMemoryManager(), attrs,
+ EdxltokenPartIndexIdPrintable,
+ EdxltokenPhysicalDynamicBitmapTableScan,
+ true, //is_optional
+ m_part_index_id);
+}
+
+//---------------------------------------------------------------------------
+// @function:
+// CParseHandlerPhysicalDynamicBitmapTableScan::EndElement
+//
+// @doc:
+// Invoked by Xerces to process a closing tag
+//
+//---------------------------------------------------------------------------
+void
+CParseHandlerPhysicalDynamicBitmapTableScan::EndElement(
+ const XMLCh *const, // element_uri
+ const XMLCh *const element_local_name,
+ const XMLCh *const // element_qname
+)
+{
+ EndElementHelper(element_local_name,
+ EdxltokenPhysicalDynamicBitmapTableScan, m_part_index_id,
+ m_part_index_id_printable);
+}
+
+// EOF
diff --git a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerSequence.cpp b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerSequence.cpp
index 7b30d86876..2f50ba1bcd 100644
--- a/src/backend/gporca/libnaucrates/src/parser/CParseHandlerSequence.cpp
+++ b/src/backend/gporca/libnaucrates/src/parser/CParseHandlerSequence.cpp
@@ -13,6 +13,7 @@
#include "naucrates/dxl/parser/CParseHandlerSequence.h"
#include "naucrates/dxl/operators/CDXLOperatorFactory.h"
+#include "naucrates/dxl/operators/CDXLPhysicalDynamicTableScan.h"
#include "naucrates/dxl/operators/CDXLPhysicalSequence.h"
#include "naucrates/dxl/parser/CParseHandlerFactory.h"
#include "naucrates/dxl/parser/CParseHandlerFilter.h"
diff --git a/src/backend/gporca/libnaucrates/src/parser/Makefile b/src/backend/gporca/libnaucrates/src/parser/Makefile
index c1947f8473..28bbc9f91a 100644
--- a/src/backend/gporca/libnaucrates/src/parser/Makefile
+++ b/src/backend/gporca/libnaucrates/src/parser/Makefile
@@ -32,6 +32,8 @@ OBJS = CParseHandlerAgg.o \
CParseHandlerDirectDispatchInfo.o \
CParseHandlerDistinctComp.o \
CParseHandlerDummy.o \
+ CParseHandlerDynamicIndexScan.o \
+ CParseHandlerDynamicTableScan.o \
CParseHandlerEnumeratorConfig.o \
CParseHandlerExternalScan.o \
CParseHandlerFactory.o \
@@ -101,6 +103,7 @@ OBJS = CParseHandlerAgg.o \
CParseHandlerPhysicalCTEConsumer.o \
CParseHandlerPhysicalCTEProducer.o \
CParseHandlerPhysicalDML.o \
+ CParseHandlerPhysicalDynamicBitmapTableScan.o \
CParseHandlerPhysicalOp.o \
CParseHandlerPhysicalRowTrigger.o \
CParseHandlerPhysicalSplit.o \
diff --git a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp
index 9492e2f8bf..2a9f7c3a58 100644
--- a/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp
+++ b/src/backend/gporca/libnaucrates/src/xml/dxltokens.cpp
@@ -107,6 +107,8 @@ CDXLTokens::Init(CMemoryPool *mp)
{EdxltokenPhysicalTableScan, GPOS_WSZ_LIT("TableScan")},
{EdxltokenPhysicalBitmapTableScan, GPOS_WSZ_LIT("BitmapTableScan")},
+ {EdxltokenPhysicalDynamicBitmapTableScan,
+ GPOS_WSZ_LIT("DynamicBitmapTableScan")},
{EdxltokenPhysicalExternalScan, GPOS_WSZ_LIT("ExternalScan")},
{EdxltokenPhysicalIndexScan, GPOS_WSZ_LIT("IndexScan")},
{EdxltokenPhysicalIndexOnlyScan, GPOS_WSZ_LIT("IndexOnlyScan")},
@@ -131,6 +133,8 @@ CDXLTokens::Init(CMemoryPool *mp)
{EdxltokenPhysicalAppend, GPOS_WSZ_LIT("Append")},
{EdxltokenPhysicalMaterialize, GPOS_WSZ_LIT("Materialize")},
{EdxltokenPhysicalSequence, GPOS_WSZ_LIT("Sequence")},
+ {EdxltokenPhysicalDynamicTableScan, GPOS_WSZ_LIT("DynamicTableScan")},
+ {EdxltokenPhysicalDynamicIndexScan, GPOS_WSZ_LIT("DynamicIndexScan")},
{EdxltokenPhysicalTVF, GPOS_WSZ_LIT("TableValuedFunction")},
{EdxltokenPhysicalWindow, GPOS_WSZ_LIT("Window")},
{EdxltokenPhysicalDMLInsert, GPOS_WSZ_LIT("DMLInsert")},
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index defdca28a3..3166706987 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -264,6 +264,30 @@ CopyPlanFields(const Plan *from, Plan *newnode)
COPY_SCALAR_FIELD(operatorMemKB);
}
+/*
+ * CopyLogicalIndexInfo
+ *
+ * This function copies the LogicalIndexInfo, which is part of
+ * DynamicIndexScan node.
+ */
+static LogicalIndexInfo *
+CopyLogicalIndexInfo(const LogicalIndexInfo *from)
+{
+ LogicalIndexInfo *newnode = palloc(sizeof(LogicalIndexInfo));
+
+ COPY_SCALAR_FIELD(logicalIndexOid);
+ COPY_SCALAR_FIELD(nColumns);
+ COPY_POINTER_FIELD(indexKeys, from->nColumns * sizeof(AttrNumber));
+ COPY_NODE_FIELD(indPred);
+ COPY_NODE_FIELD(indExprs);
+ COPY_SCALAR_FIELD(indIsUnique);
+ COPY_SCALAR_FIELD(indType);
+ COPY_NODE_FIELD(partCons);
+ COPY_NODE_FIELD(defaultLevels);
+
+ return newnode;
+}
+
/*
* _copyPlan
*/
@@ -599,6 +623,17 @@ _copySeqScan(const SeqScan *from)
return newnode;
}
+static DynamicSeqScan *
+_copyDynamicSeqScan(const DynamicSeqScan *from)
+{
+ DynamicSeqScan *newnode = makeNode(DynamicSeqScan);
+
+ CopyScanFields((Scan *) from, (Scan *) newnode);
+ COPY_NODE_FIELD(partOids);
+
+ return newnode;
+}
+
/*
* _copyExternalScanInfo
*/
@@ -671,6 +706,22 @@ _copyIndexScan(const IndexScan *from)
return newnode;
}
+/*
+ * _copyDynamicIndexScan
+ */
+static DynamicIndexScan *
+_copyDynamicIndexScan(const DynamicIndexScan *from)
+{
+ DynamicIndexScan *newnode = makeNode(DynamicIndexScan);
+
+ /* DynamicIndexScan has some content from IndexScan */
+ CopyIndexScanFields(&from->indexscan, &newnode->indexscan);
+ COPY_NODE_FIELD(partOids);
+ newnode->logicalIndexInfo = CopyLogicalIndexInfo(from->logicalIndexInfo);
+
+ return newnode;
+}
+
/*
* _copyIndexOnlyScan
*/
@@ -722,6 +773,21 @@ _copyBitmapIndexScan(const BitmapIndexScan *from)
return newnode;
}
+/*
+ * _copyDynamicBitmapIndexScan
+ */
+static DynamicBitmapIndexScan *
+_copyDynamicBitmapIndexScan(const DynamicBitmapIndexScan *from)
+{
+ DynamicBitmapIndexScan *newnode = makeNode(DynamicBitmapIndexScan);
+
+ CopyBitmapIndexScanFields(&from->biscan, &newnode->biscan);
+ COPY_NODE_FIELD(partOids);
+ newnode->logicalIndexInfo = CopyLogicalIndexInfo(from->logicalIndexInfo);
+
+ return newnode;
+}
+
static void
CopyBitmapHeapScanFields(const BitmapHeapScan *from, BitmapHeapScan *newnode)
{
@@ -749,6 +815,20 @@ _copyBitmapHeapScan(const BitmapHeapScan *from)
return newnode;
}
+/*
+ * _copyDynamicBitmapHeapScan
+ */
+static DynamicBitmapHeapScan *
+_copyDynamicBitmapHeapScan(const DynamicBitmapHeapScan *from)
+{
+ DynamicBitmapHeapScan *newnode = makeNode(DynamicBitmapHeapScan);
+
+ CopyBitmapHeapScanFields(&from->bitmapheapscan, &newnode->bitmapheapscan);
+ COPY_NODE_FIELD(partOids);
+
+ return newnode;
+}
+
/*
* _copyTidScan
*/
@@ -6323,6 +6403,9 @@ copyObjectImpl(const void *from)
case T_SeqScan:
retval = _copySeqScan(from);
break;
+ case T_DynamicSeqScan:
+ retval = _copyDynamicSeqScan(from);
+ break;
case T_ExternalScanInfo:
retval = _copyExternalScanInfo(from);
break;
@@ -6332,15 +6415,24 @@ copyObjectImpl(const void *from)
case T_IndexScan:
retval = _copyIndexScan(from);
break;
+ case T_DynamicIndexScan:
+ retval = _copyDynamicIndexScan(from);
+ break;
case T_IndexOnlyScan:
retval = _copyIndexOnlyScan(from);
break;
case T_BitmapIndexScan:
retval = _copyBitmapIndexScan(from);
break;
+ case T_DynamicBitmapIndexScan:
+ retval = _copyDynamicBitmapIndexScan(from);
+ break;
case T_BitmapHeapScan:
retval = _copyBitmapHeapScan(from);
break;
+ case T_DynamicBitmapHeapScan:
+ retval = _copyDynamicBitmapHeapScan(from);
+ break;
case T_TidScan:
retval = _copyTidScan(from);
break;
diff --git a/src/backend/nodes/outfast.c b/src/backend/nodes/outfast.c
index d7ba7f2d78..66a4356a7a 100644
--- a/src/backend/nodes/outfast.c
+++ b/src/backend/nodes/outfast.c
@@ -938,6 +938,9 @@ _outNode(StringInfo str, void *obj)
case T_SeqScan:
_outSeqScan(str, obj);
break;
+ case T_DynamicSeqScan:
+ _outDynamicSeqScan(str, obj);
+ break;
case T_ExternalScanInfo:
_outExternalScanInfo(str, obj);
break;
@@ -950,12 +953,21 @@ _outNode(StringInfo str, void *obj)
case T_IndexOnlyScan:
_outIndexOnlyScan(str, obj);
break;
+ case T_DynamicIndexScan:
+ _outDynamicIndexScan(str, obj);
+ break;
case T_BitmapIndexScan:
_outBitmapIndexScan(str, obj);
break;
+ case T_DynamicBitmapIndexScan:
+ _outDynamicBitmapIndexScan(str, obj);
+ break;
case T_BitmapHeapScan:
_outBitmapHeapScan(str, obj);
break;
+ case T_DynamicBitmapHeapScan:
+ _outDynamicBitmapHeapScan(str, obj);
+ break;
case T_TidScan:
_outTidScan(str, obj);
break;
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index bc0e8b35bf..faa089586c 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -318,6 +318,8 @@ outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
#endif /* COMPILING_BINARY_FUNCS */
+static void outLogicalIndexInfo(StringInfo str, const LogicalIndexInfo *node);
+
/*
* Stuff from plannodes.h
*/
@@ -623,6 +625,15 @@ _outSeqScan(StringInfo str, const SeqScan *node)
_outScanInfo(str, (const Scan *) node);
}
+static void
+_outDynamicSeqScan(StringInfo str, const DynamicSeqScan *node)
+{
+ WRITE_NODE_TYPE("DYNAMICSEQSCAN");
+
+ _outScanInfo(str, (Scan *)node);
+ WRITE_NODE_FIELD(partOids);
+}
+
static void
_outSampleScan(StringInfo str, const SampleScan *node)
{
@@ -634,10 +645,22 @@ _outSampleScan(StringInfo str, const SampleScan *node)
}
static void
-_outIndexScan(StringInfo str, const IndexScan *node)
+outLogicalIndexInfo(StringInfo str, const LogicalIndexInfo *node)
{
- WRITE_NODE_TYPE("INDEXSCAN");
+ WRITE_OID_FIELD(logicalIndexOid);
+ WRITE_INT_FIELD(nColumns);
+ WRITE_ATTRNUMBER_ARRAY(indexKeys, node->nColumns);
+ WRITE_NODE_FIELD(indPred);
+ WRITE_NODE_FIELD(indExprs);
+ WRITE_BOOL_FIELD(indIsUnique);
+ WRITE_ENUM_FIELD(indType, LogicalIndexType);
+ WRITE_NODE_FIELD(partCons);
+ WRITE_NODE_FIELD(defaultLevels);
+}
+static void
+outIndexScanFields(StringInfo str, const IndexScan *node)
+{
_outScanInfo(str, (const Scan *) node);
WRITE_OID_FIELD(indexid);
@@ -649,6 +672,14 @@ _outIndexScan(StringInfo str, const IndexScan *node)
WRITE_ENUM_FIELD(indexorderdir, ScanDirection);
}
+static void
+_outIndexScan(StringInfo str, const IndexScan *node)
+{
+ WRITE_NODE_TYPE("INDEXSCAN");
+
+ outIndexScanFields(str, node);
+}
+
static void
_outIndexOnlyScan(StringInfo str, const IndexOnlyScan *node)
{
@@ -665,11 +696,20 @@ _outIndexOnlyScan(StringInfo str, const IndexOnlyScan *node)
}
static void
-_outBitmapIndexScan(StringInfo str, const BitmapIndexScan *node)
+_outDynamicIndexScan(StringInfo str, const DynamicIndexScan *node)
{
- WRITE_NODE_TYPE("BITMAPINDEXSCAN");
+ WRITE_NODE_TYPE("DYNAMICINDEXSCAN");
- _outScanInfo(str, (const Scan *) node);
+ outIndexScanFields(str, &node->indexscan);
+ WRITE_NODE_FIELD(partOids);
+ WRITE_NODE_FIELD(part_prune_info);
+ WRITE_NODE_FIELD(join_prune_paramids);
+}
+
+static void
+_outBitmapIndexScanFields(StringInfo str, const BitmapIndexScan *node)
+{
+ _outScanInfo(str, (Scan *) node);
WRITE_OID_FIELD(indexid);
WRITE_BOOL_FIELD(isshared);
@@ -678,15 +718,48 @@ _outBitmapIndexScan(StringInfo str, const BitmapIndexScan *node)
}
static void
-_outBitmapHeapScan(StringInfo str, const BitmapHeapScan *node)
+_outBitmapIndexScan(StringInfo str, const BitmapIndexScan *node)
{
- WRITE_NODE_TYPE("BITMAPHEAPSCAN");
+ WRITE_NODE_TYPE("BITMAPINDEXSCAN");
+
+ _outBitmapIndexScanFields(str, node);
+}
+
+static void
+_outDynamicBitmapIndexScan(StringInfo str, const DynamicBitmapIndexScan *node)
+{
+ WRITE_NODE_TYPE("DYNAMICBITMAPINDEXSCAN");
+
+ _outBitmapIndexScanFields(str, &node->biscan);
+ WRITE_NODE_FIELD(partOids);
+ outLogicalIndexInfo(str, node->logicalIndexInfo);
+}
+static void
+outBitmapHeapScanFields(StringInfo str, const BitmapHeapScan *node)
+{
_outScanInfo(str, (const Scan *) node);
WRITE_NODE_FIELD(bitmapqualorig);
}
+static void
+_outBitmapHeapScan(StringInfo str, const BitmapHeapScan *node)
+{
+ WRITE_NODE_TYPE("BITMAPHEAPSCAN");
+
+ outBitmapHeapScanFields(str, node);
+}
+
+static void
+_outDynamicBitmapHeapScan(StringInfo str, const DynamicBitmapHeapScan *node)
+{
+ WRITE_NODE_TYPE("DYNAMICBITMAPHEAPSCAN");
+
+ outBitmapHeapScanFields(str, &node->bitmapheapscan);
+ WRITE_NODE_FIELD(partOids);
+}
+
static void
_outTidScan(StringInfo str, const TidScan *node)
{
@@ -4161,6 +4234,9 @@ outNode(StringInfo str, const void *obj)
case T_SeqScan:
_outSeqScan(str, obj);
break;
+ case T_DynamicSeqScan:
+ _outDynamicSeqScan(str, obj);
+ break;
case T_ExternalScanInfo:
_outExternalScanInfo(str, obj);
break;
@@ -4170,15 +4246,24 @@ outNode(StringInfo str, const void *obj)
case T_IndexScan:
_outIndexScan(str, obj);
break;
+ case T_DynamicIndexScan:
+ _outDynamicIndexScan(str,obj);
+ break;
case T_IndexOnlyScan:
_outIndexOnlyScan(str, obj);
break;
case T_BitmapIndexScan:
_outBitmapIndexScan(str, obj);
break;
+ case T_DynamicBitmapIndexScan:
+ _outDynamicBitmapIndexScan(str, obj);
+ break;
case T_BitmapHeapScan:
_outBitmapHeapScan(str, obj);
break;
+ case T_DynamicBitmapHeapScan:
+ _outDynamicBitmapHeapScan(str, obj);
+ break;
case T_TidScan:
_outTidScan(str, obj);
break;
diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c
index 792caf466e..a33404cd2a 100644
--- a/src/backend/nodes/readfast.c
+++ b/src/backend/nodes/readfast.c
@@ -929,6 +929,17 @@ _readSequence(void)
READ_DONE();
}
+static DynamicSeqScan *
+_readDynamicSeqScan(void)
+{
+ READ_LOCALS(DynamicSeqScan);
+
+ ReadCommonScan(&local_node->seqscan);
+ READ_NODE_FIELD(partOids);
+
+ READ_DONE();
+}
+
/*
* _readExternalScanInfo
*/
@@ -1968,6 +1979,9 @@ readNodeBinary(void)
case T_SeqScan:
return_value = _readSeqScan();
break;
+ case T_DynamicSeqScan:
+ return_value = _readDynamicSeqScan();
+ break;
case T_ExternalScanInfo:
return_value = _readExternalScanInfo();
break;
@@ -1977,12 +1991,21 @@ readNodeBinary(void)
case T_IndexOnlyScan:
return_value = _readIndexOnlyScan();
break;
+ case T_DynamicIndexScan:
+ return_value = _readDynamicIndexScan();
+ break;
case T_BitmapIndexScan:
return_value = _readBitmapIndexScan();
break;
+ case T_DynamicBitmapIndexScan:
+ return_value = _readDynamicBitmapIndexScan();
+ break;
case T_BitmapHeapScan:
return_value = _readBitmapHeapScan();
break;
+ case T_DynamicBitmapHeapScan:
+ return_value = _readDynamicBitmapHeapScan();
+ break;
case T_CteScan:
return_value = _readCteScan();
break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index da2da74925..a50bf90e15 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -1934,10 +1934,34 @@ _readSampleScan(void)
/*
* _readIndexScan
*/
+
+static void readIndexScanFields(IndexScan *local_node);
+static LogicalIndexInfo *readLogicalIndexInfo(void);
+
static IndexScan *
_readIndexScan(void)
{
- READ_LOCALS(IndexScan);
+ READ_LOCALS_NO_FIELDS(IndexScan);
+
+ readIndexScanFields(local_node);
+
+ READ_DONE();
+}
+
+static DynamicIndexScan *
+_readDynamicIndexScan(void)
+{
+ READ_LOCALS(DynamicIndexScan);
+ /* DynamicIndexScan has some content from IndexScan. */
+ readIndexScanFields(&local_node->indexscan);
+ READ_NODE_FIELD(partOids);
+ local_node->logicalIndexInfo = readLogicalIndexInfo();
+ READ_DONE();
+}
+static void
+readIndexScanFields(IndexScan *local_node)
+{
+ READ_TEMP_LOCALS();
ReadCommonScan(&local_node->scan);
@@ -1948,8 +1972,24 @@ _readIndexScan(void)
READ_NODE_FIELD(indexorderbyorig);
READ_NODE_FIELD(indexorderbyops);
READ_ENUM_FIELD(indexorderdir, ScanDirection);
+}
- READ_DONE();
+static LogicalIndexInfo *
+readLogicalIndexInfo(void)
+{
+ READ_TEMP_LOCALS();
+ LogicalIndexInfo *local_node = palloc(sizeof(LogicalIndexInfo));
+ READ_OID_FIELD(logicalIndexOid);
+ READ_INT_FIELD(nColumns);
+ READ_ATTRNUMBER_ARRAY(indexKeys, local_node->nColumns);
+ READ_NODE_FIELD(indPred);
+ READ_NODE_FIELD(indExprs);
+ READ_BOOL_FIELD(indIsUnique);
+ READ_ENUM_FIELD(indType, LogicalIndexType);
+ READ_NODE_FIELD(partCons);
+ READ_NODE_FIELD(defaultLevels);
+ /* No READ_DONE, this is "embedded" in other structs */
+ return local_node;
}
/*
@@ -1972,13 +2012,10 @@ _readIndexOnlyScan(void)
READ_DONE();
}
-/*
- * _readBitmapIndexScan
- */
-static BitmapIndexScan *
-_readBitmapIndexScan(void)
+static void
+readBitmapIndexScanFields(BitmapIndexScan *local_node)
{
- READ_LOCALS(BitmapIndexScan);
+ READ_TEMP_LOCALS();
ReadCommonScan(&local_node->scan);
@@ -1986,22 +2023,63 @@ _readBitmapIndexScan(void)
READ_BOOL_FIELD(isshared);
READ_NODE_FIELD(indexqual);
READ_NODE_FIELD(indexqualorig);
+}
+
+/*
+ * _readBitmapIndexScan
+ */
+static BitmapIndexScan *
+_readBitmapIndexScan(void)
+{
+ READ_LOCALS_NO_FIELDS(BitmapIndexScan);
+
+ readBitmapIndexScanFields(local_node);
READ_DONE();
}
+static DynamicBitmapIndexScan *
+_readDynamicBitmapIndexScan(void)
+{
+ READ_LOCALS(DynamicBitmapIndexScan);
+ /* DynamicBitmapIndexScan has some content from BitmapIndexScan. */
+ readBitmapIndexScanFields(&local_node->biscan);
+ READ_NODE_FIELD(partOids);
+ local_node->logicalIndexInfo = readLogicalIndexInfo();
+ READ_DONE();
+}
+
+static void
+readBitmapHeapScanFields(BitmapHeapScan *local_node)
+{
+ READ_TEMP_LOCALS();
+
+ ReadCommonScan(&local_node->scan);
+
+ READ_NODE_FIELD(bitmapqualorig);
+}
+
/*
* _readBitmapHeapScan
*/
static BitmapHeapScan *
_readBitmapHeapScan(void)
{
- READ_LOCALS(BitmapHeapScan);
+ READ_LOCALS_NO_FIELDS(BitmapHeapScan);
- ReadCommonScan(&local_node->scan);
+ readBitmapHeapScanFields(local_node);
+
+ READ_DONE();
+}
- READ_NODE_FIELD(bitmapqualorig);
+static DynamicBitmapHeapScan *
+_readDynamicBitmapHeapScan(void)
+{
+ READ_LOCALS(DynamicBitmapHeapScan);
+ /* DynamicBitmapHeapScan has some content from BitmapHeapScan. */
+ readBitmapHeapScanFields(&local_node->bitmapheapscan);
+ READ_NODE_FIELD(partOids);
READ_DONE();
}
@@ -3002,12 +3080,18 @@ parseNodeString(void)
return_value = _readSampleScan();
else if (MATCH("INDEXSCAN", 9))
return_value = _readIndexScan();
+ else if (MATCH("DYNAMICINDEXSCAN", 16))
+ return_value = _readDynamicIndexScan();
else if (MATCH("INDEXONLYSCAN", 13))
return_value = _readIndexOnlyScan();
else if (MATCH("BITMAPINDEXSCAN", 15))
return_value = _readBitmapIndexScan();
+ else if (MATCH("DYNAMICBITMAPINDEXSCAN", 23))
+ return_value = _readDynamicBitmapIndexScan();
else if (MATCH("BITMAPHEAPSCAN", 14))
return_value = _readBitmapHeapScan();
+ else if (MATCH("DYNAMICBITMAPHEAPSCAN", 21))
+ return_value = _readDynamicBitmapHeapScan();
else if (MATCH("TIDSCAN", 7))
return_value = _readTidScan();
else if (MATCH("TIDRANGESCAN", 12))
diff --git a/src/backend/optimizer/util/walkers.c b/src/backend/optimizer/util/walkers.c
index 9e7d7ade5c..f578657b84 100644
--- a/src/backend/optimizer/util/walkers.c
+++ b/src/backend/optimizer/util/walkers.c
@@ -235,7 +235,9 @@ plan_tree_walker(Node *node,
case T_SeqScan:
case T_SampleScan:
+ case T_DynamicSeqScan:
case T_BitmapHeapScan:
+ case T_DynamicBitmapHeapScan:
case T_WorkTableScan:
case T_NamedTuplestoreScan:
if (walk_scan_node_fields((Scan *) node, walker, context))
@@ -293,6 +295,7 @@ plan_tree_walker(Node *node,
break;
case T_IndexScan:
+ case T_DynamicIndexScan:
if (walk_scan_node_fields((Scan *) node, walker, context))
return true;
if (walker((Node *) ((IndexScan *) node)->indexqual, context))
@@ -308,11 +311,11 @@ plan_tree_walker(Node *node,
break;
case T_BitmapIndexScan:
+ case T_DynamicBitmapIndexScan:
if (walk_scan_node_fields((Scan *) node, walker, context))
return true;
if (walker((Node *) ((BitmapIndexScan *) node)->indexqual, context))
return true;
-
/* Other fields are lists of basic items, nothing to walk. */
break;
diff --git a/src/include/executor/execDynamicScan.h b/src/include/executor/execDynamicScan.h
new file mode 100644
index 0000000000..f41ae5d34c
--- /dev/null
+++ b/src/include/executor/execDynamicScan.h
@@ -0,0 +1,28 @@
+/*--------------------------------------------------------------------------
+ *
+ * execDynamicScan.h
+ * Definitions and API functions for execDynamicScan.c
+ *
+ * Copyright (c) 2014-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/include/executor/execDynamicScan.h
+ *
+ *--------------------------------------------------------------------------
+ */
+#ifndef EXECDYNAMICSCAN_H
+#define EXECDYNAMICSCAN_H
+
+#include "access/attnum.h"
+#include "nodes/execnodes.h"
+
+extern bool isDynamicScan(const Plan *p);
+extern int DynamicScan_GetDynamicScanIdPrintable(Plan *plan);
+
+extern Oid DynamicScan_GetTableOid(ScanState *scanState);
+extern void DynamicScan_SetTableOid(ScanState *scanState, Oid curRelOid);
+
+extern bool DynamicScan_RemapExpression(ScanState *scanState, AttrNumber *attMap, Node *expr);
+
+#endif /* EXECDYNAMICSCAN_H */
diff --git a/src/include/executor/nodeDynamicBitmapHeapscan.h b/src/include/executor/nodeDynamicBitmapHeapscan.h
new file mode 100644
index 0000000000..b12954cf66
--- /dev/null
+++ b/src/include/executor/nodeDynamicBitmapHeapscan.h
@@ -0,0 +1,27 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicBitmapHeapscan.h
+ *
+ * Portions Copyright (c) 2012 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/include/executor/nodeDynamicBitmapHeapscan.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NODEDYNAMICBITMAPHEAPSCAN_H
+#define NODEDYNAMICBITMAPHEAPSCAN_H
+
+#include "nodes/execnodes.h"
+
+/* GPDB_12_MERGE_FIXME */
+#if 0
+extern DynamicBitmapHeapScanState *ExecInitDynamicBitmapHeapScan(DynamicBitmapHeapScan *node, EState *estate, int eflags);
+extern TupleTableSlot *ExecDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
+extern void ExecEndDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
+extern void ExecReScanDynamicBitmapHeapScan(DynamicBitmapHeapScanState *node);
+#endif
+
+#endif
diff --git a/src/include/executor/nodeDynamicBitmapIndexscan.h b/src/include/executor/nodeDynamicBitmapIndexscan.h
new file mode 100644
index 0000000000..7faa624a97
--- /dev/null
+++ b/src/include/executor/nodeDynamicBitmapIndexscan.h
@@ -0,0 +1,27 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicBitmapIndexscan.h
+ *
+ *
+ *
+ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/include/executor/nodeDynamicBitmapIndexscan.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NODEDYNAMICBITMAPINDEXSCAN_H
+#define NODEDYNAMICBITMAPINDEXSCAN_H
+
+#include "nodes/execnodes.h"
+
+/* GPDB_12_MERGE_FIXME */
+#if 0
+extern DynamicBitmapIndexScanState *ExecInitDynamicBitmapIndexScan(DynamicBitmapIndexScan *node, EState *estate, int eflags);
+extern Node *MultiExecDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node);
+extern void ExecEndDynamicBitmapIndexScan(DynamicBitmapIndexScanState *node);
+extern void ExecReScanDynamicBitmapIndex(DynamicBitmapIndexScanState *node);
+#endif
+
+#endif /* NODEDYNAMICBITMAPINDEXSCAN_H */
diff --git a/src/include/executor/nodeDynamicIndexscan.h b/src/include/executor/nodeDynamicIndexscan.h
new file mode 100644
index 0000000000..2fdf08d594
--- /dev/null
+++ b/src/include/executor/nodeDynamicIndexscan.h
@@ -0,0 +1,30 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicIndexScan.h
+ *
+ * Portions Copyright (c) 2013 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/include/executor/nodeDynamicIndexscan.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NODEDYNAMICINDEXSCAN_H
+#define NODEDYNAMICINDEXSCAN_H
+
+#include "nodes/execnodes.h"
+
+/* GPDB_12_MERGE_FIXME */
+#if 0
+extern DynamicIndexScanState *ExecInitDynamicIndexScan(DynamicIndexScan *node, EState *estate, int eflags);
+extern TupleTableSlot *ExecDynamicIndexScan(DynamicIndexScanState *node);
+extern void ExecEndDynamicIndexScan(DynamicIndexScanState *node);
+extern void ExecReScanDynamicIndex(DynamicIndexScanState *node);
+
+extern bool IndexScan_MapLogicalIndexInfo(LogicalIndexInfo *logicalIndexInfo, AttrNumber *attMap, Index varno);
+extern AttrNumber *IndexScan_GetColumnMapping(Oid oldOid, Oid newOid);
+#endif
+
+#endif
diff --git a/src/include/executor/nodeDynamicSeqscan.h b/src/include/executor/nodeDynamicSeqscan.h
new file mode 100644
index 0000000000..8ac9c52e76
--- /dev/null
+++ b/src/include/executor/nodeDynamicSeqscan.h
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * nodeDynamicSeqscan.h
+ *
+ * Portions Copyright (c) 2012 - present, EMC/Greenplum
+ * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates.
+ *
+ *
+ * IDENTIFICATION
+ * src/include/executor/nodeDynamicSeqscan.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NODEDYNAMICSEQSCAN_H
+#define NODEDYNAMICSEQSCAN_H
+
+#include "nodes/execnodes.h"
+
+extern DynamicSeqScanState *ExecInitDynamicSeqScan(DynamicSeqScan *node, EState *estate, int eflags);
+extern TupleTableSlot *ExecDynamicSeqScan(PlanState *pstate);
+extern void ExecEndDynamicSeqScan(DynamicSeqScanState *node);
+extern void ExecReScanDynamicSeqScan(DynamicSeqScanState *node);
+
+#endif
diff --git a/src/include/gpopt/gpdbwrappers.h b/src/include/gpopt/gpdbwrappers.h
index ea5b9fd3cc..9ddaad768e 100644
--- a/src/include/gpopt/gpdbwrappers.h
+++ b/src/include/gpopt/gpdbwrappers.h
@@ -50,6 +50,7 @@ struct CdbComponentDatabases;
struct StringInfoData;
using StringInfo = StringInfoData *;
struct LogicalIndexes;
+struct LogicalIndexInfo;
struct ParseState;
struct DefElem;
struct GpPolicy;
@@ -586,6 +587,14 @@ double CdbEstimatePartitionedNumTuples(Relation rel);
// close the given relation
void CloseRelation(Relation rel);
+#if 0
+ // return the logical indexes for a partitioned table
+ LogicalIndexes *GetLogicalPartIndexes(Oid oid);
+
+ // return the logical info structure for a given logical index oid
+ LogicalIndexInfo *GetLogicalIndexInfo(Oid root_oid, Oid index_oid);
+#endif
+
// return a list of index oids for a given relation
List *GetRelationIndexes(Relation relation);
diff --git a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
index 3e705bd899..c157850e51 100644
--- a/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
+++ b/src/include/gpopt/translate/CTranslatorDXLToPlStmt.h
@@ -333,6 +333,22 @@ private:
ctxt_translation_prev_siblings // translation contexts of previous siblings
);
+ // translate a dynamic table scan operator
+ Plan *TranslateDXLDynTblScan(
+ const CDXLNode *dyn_tbl_scan_dxlnode,
+ CDXLTranslateContext *output_context,
+ CDXLTranslationContextArray *
+ ctxt_translation_prev_siblings // translation contexts of previous siblings
+ );
+
+ // translate a dynamic index scan operator
+ /* Plan *TranslateDXLDynIdxScan */
+ /* ( */
+ /* const CDXLNode *dyn_idx_scan_dxlnode, */
+ /* CDXLTranslateContext *output_context, */
+ /* CDXLTranslationContextArray *ctxt_translation_prev_siblings // translation contexts of previous siblings */
+ /* ); */
+
// translate a DML operator
Plan *TranslateDXLDml(
const CDXLNode *dml_dxlnode, CDXLTranslateContext *output_context,
@@ -370,7 +386,7 @@ private:
ctxt_translation_prev_siblings // translation contexts of previous siblings
);
- // translate a bitmap table scan operator
+ // translate a (dynamic) bitmap table scan operator
Plan *TranslateDXLBitmapTblScan(
const CDXLNode *bitmapscan_dxlnode,
CDXLTranslateContext *output_context,
@@ -459,7 +475,7 @@ private:
List **hash_expr_types_out_list,
CDXLTranslateContext *output_context);
- // translate the tree of bitmap index operators that are under a bitmap table scan
+ // translate the tree of bitmap index operators that are under a (dynamic) bitmap table scan
Plan *TranslateDXLBitmapAccessPath(
const CDXLNode *bitmap_access_path_dxlnode,
CDXLTranslateContext *output_context, const IMDRelation *md_rel,
@@ -477,7 +493,7 @@ private:
CDXLTranslationContextArray *ctxt_translation_prev_siblings,
BitmapHeapScan *bitmap_tbl_scan);
- // translate CDXLScalarBitmapIndexProbe into BitmapIndexScan
+ // translate CDXLScalarBitmapIndexProbe into BitmapIndexScan or DynamicBitmapIndexScan
Plan *TranslateDXLBitmapIndexProbe(
const CDXLNode *bitmap_index_probe_dxlnode,
CDXLTranslateContext *output_context, const IMDRelation *md_rel,
diff --git a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
index f7e1069cae..7b2771621a 100644
--- a/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
+++ b/src/include/gpopt/translate/CTranslatorRelcacheToDXL.h
@@ -48,6 +48,7 @@ extern "C" {
struct RelationData;
using Relation = struct RelationData *;
struct LogicalIndexes;
+struct LogicalIndexInfo;
namespace gpdxl
{
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 2b4f7ff23b..1715204fc1 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -709,6 +709,14 @@ typedef struct EState
*/
bool useMppParallelMode;
+ /*
+ * Information relevant to dynamic table scans.
+ */
+ /* GPDB_12_MERGE_FIXME: This is no longer used by PartitionSelectors.
+ * But it's still referenced by DynamicHeapScan etc. nodes.
+ */
+ DynamicTableScanInfo *dynamicTableScanInfo;
+
/* Should the executor skip past the alien plan nodes */
bool eliminateAliens;
@@ -1643,6 +1651,47 @@ typedef struct IndexScanState
Oid tableOid;
} IndexScanState;
+/*
+ * DynamicIndexScanState
+ */
+typedef struct DynamicIndexScanState
+{
+ ScanState ss;
+
+ int scan_state; /* the stage of scanning */
+
+ int eflags;
+ IndexScanState *indexScanState;
+ List *tuptable;
+ ExprContext *outer_exprContext;
+
+ /*
+ * Partition id index that mantains all unique partition ids for the
+ * DynamicIndexScan.
+ */
+ HTAB *pidxIndex;
+
+ /*
+ * Status of the part to retrieve (result of the sequential search in a hash table).
+ */
+ HASH_SEQ_STATUS pidxStatus;
+
+ /* Like DynamicTableScanState, this flag is required to handle error condition.
+ * This flag prevent ExecEndDynamicIndexScan from calling hash_seq_term() or
+ * a NULL hash table. */
+ bool shouldCallHashSeqTerm;
+
+ /*
+ * We will create a new copy of logicalIndexInfo in this memory context for
+ * each partition. This memory context will be reset per-partition to free
+ * up previous partition's logicalIndexInfo memory
+ */
+ MemoryContext partitionMemoryContext;
+
+ /* The partition oid for which the current varnos are mapped */
+ Oid columnLayoutOid;
+} DynamicIndexScanState;
+
/* ----------------
* IndexOnlyScanState information
*
@@ -1713,6 +1762,28 @@ typedef struct BitmapIndexScanState
struct IndexScanDescData *biss_ScanDesc;
} BitmapIndexScanState;
+/*
+ * DynamicBitmapIndexScanState
+ */
+typedef struct DynamicBitmapIndexScanState
+{
+ ScanState ss;
+
+ int eflags;
+ BitmapIndexScanState *bitmapIndexScanState;
+ ExprContext *outer_exprContext;
+
+ /*
+ * We will create a new copy of logicalIndexInfo in this memory context for
+ * each partition. This memory context will be reset per-partition to free
+ * up previous partition's logicalIndexInfo memory
+ */
+ MemoryContext partitionMemoryContext;
+
+ /* The partition oid for which the current varnos are mapped */
+ Oid columnLayoutOid;
+} DynamicBitmapIndexScanState;
+
/* ----------------
* SharedBitmapState information
*
@@ -1806,6 +1877,63 @@ typedef struct BitmapHeapScanState
ParallelBitmapHeapState *pstate;
} BitmapHeapScanState;
+typedef struct DynamicBitmapHeapScanState
+{
+ ScanState ss; /* its first field is NodeTag */
+
+ int scan_state; /* the stage of scanning */
+
+ int eflags;
+ BitmapHeapScanState *bhsState;
+
+
+ /*
+ * Pid index that maintains all unique partition pids for this dynamic
+ * table scan to scan.
+ */
+ HTAB *pidIndex;
+
+ /*
+ * The status of sequentially scan the pid index.
+ */
+ HASH_SEQ_STATUS pidStatus;
+
+ /*
+ * Should we call hash_seq_term()? This is required
+ * to handle error condition, where we are required to explicitly
+ * call hash_seq_term(). Also, if we don't have any partition, this
+ * flag should prevent ExecEndDynamicSeqScan from calling
+ * hash_seq_term() on a NULL hash table.
+ */
+ bool shouldCallHashSeqTerm;
+
+ /*
+ * The first partition requires initialization of expression states,
+ * such as qual and targetlist, regardless of whether we need to re-map varattno
+ */
+ bool firstPartition;
+ /*
+ * lastRelOid is the last relation that corresponds to the
+ * varattno mapping of qual and target list. Each time we open a new partition, we will
+ * compare the last relation with current relation by using varattnos_map()
+ * and then convert the varattno to the new varattno
+ */
+ Oid lastRelOid;
+
+ /*
+ * scanrelid is the RTE index for this scan node. It will be used to select
+ * varno whose varattno will be remapped, if necessary
+ */
+ Index scanrelid;
+
+ /*
+ * This memory context will be reset per-partition to free
+ * up previous partition's memory
+ */
+ MemoryContext partitionMemoryContext;
+
+} DynamicBitmapHeapScanState;
+
/* ----------------
* TidScanState information
*
@@ -2055,6 +2183,48 @@ typedef struct ForeignScanState
void *fdw_state; /* foreign-data wrapper can keep state here */
} ForeignScanState;
+/*
+ * DynamicSeqScanState
+ */
+typedef struct DynamicSeqScanState
+{
+ ScanState ss;
+
+ int scan_state; /* the stage of scanning */
+
+ int eflags;
+ SeqScanState *seqScanState;
+
+ /*
+ * The first partition requires initialization of expression states,
+ * such as qual and targetlist, regardless of whether we need to re-map varattno
+ */
+ bool firstPartition;
+ /*
+ * lastRelOid is the last relation that corresponds to the
+ * varattno mapping of qual and target list. Each time we open a new partition, we will
+ * compare the last relation with current relation by using varattnos_map()
+ * and then convert the varattno to the new varattno
+ */
+ Oid lastRelOid;
+
+ /*
+ * scanrelid is the RTE index for this scan node. It will be used to select
+ * varno whose varattno will be remapped, if necessary
+ */
+ Index scanrelid;
+
+ /*
+ * This memory context will be reset per-partition to free
+ * up previous partition's memory
+ */
+ MemoryContext partitionMemoryContext;
+
+ int nOids;
+ Oid *partOids;
+ int whichPart;
+} DynamicSeqScanState;
+
/* ----------------
* CustomScanState information
*
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index 75ceaf3a2d..1132a003b9 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -70,11 +70,15 @@ typedef enum NodeTag
T_BitmapAnd,
T_BitmapOr,
T_SeqScan,
+ T_DynamicSeqScan,
T_SampleScan,
T_IndexScan,
+ T_DynamicIndexScan,
T_IndexOnlyScan,
T_BitmapIndexScan,
+ T_DynamicBitmapIndexScan,
T_BitmapHeapScan,
+ T_DynamicBitmapHeapScan,
T_TidScan,
T_TidRangeScan,
T_SubqueryScan,
@@ -143,11 +147,15 @@ typedef enum NodeTag
T_BitmapAndState,
T_BitmapOrState,
T_SeqScanState,
+ T_DynamicSeqScanState,
T_SampleScanState,
T_IndexScanState,
+ T_DynamicIndexScanState,
T_IndexOnlyScanState,
T_BitmapIndexScanState,
+ T_DynamicBitmapIndexScanState,
T_BitmapHeapScanState,
+ T_DynamicBitmapHeapScanState,
T_TidScanState,
T_TidRangeScanState,
T_SubqueryScanState,
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index fbac2ca02b..0bf113a30c 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -573,6 +573,31 @@ typedef struct SampleScan
struct TableSampleClause *tablesample;
} SampleScan;
+/* ----------------
+ * index type information
+ */
+typedef enum LogicalIndexType
+{
+ INDTYPE_BTREE = 0,
+ INDTYPE_BITMAP = 1,
+ INDTYPE_GIST = 2,
+ INDTYPE_GIN = 3
+} LogicalIndexType;
+
+typedef struct LogicalIndexInfo
+{
+ Oid logicalIndexOid; /* OID of the logical index */
+ int nColumns; /* Number of columns in the index */
+ AttrNumber *indexKeys; /* column numbers of index keys */
+ List *indPred; /* predicate if partial index, or NIL */
+ List *indExprs; /* index on expressions */
+ bool indIsUnique; /* unique index */
+ LogicalIndexType indType; /* index type: btree or bitmap */
+ Node *partCons; /* concatenated list of check constraints
+ * of each partition on which this index is defined */
+ List *defaultLevels; /* Used to identify a default partition */
+} LogicalIndexInfo;
+
/* ----------------
* index scan node
*
@@ -622,6 +647,26 @@ typedef struct IndexScan
ScanDirection indexorderdir; /* forward or backward or don't care */
} IndexScan;
+/*
+ * DynamicIndexScan
+ * Scan a list of indexes that will be determined at run time.
+ * The primary application of this operator is to be used
+ * for partition tables.
+*/
+typedef struct DynamicIndexScan
+{
+ /* Fields shared with a normal IndexScan. Must be first! */
+ IndexScan indexscan;
+
+ /*
+ * List of partition OIDs to scan.
+ */
+ List *partOids;
+
+ /* logical index to use */
+ LogicalIndexInfo *logicalIndexInfo;
+} DynamicIndexScan;
+
/* ----------------
* index-only scan node
*
@@ -695,6 +740,25 @@ typedef struct BitmapIndexScan
List *indexqualorig; /* the same in original form */
} BitmapIndexScan;
+/*
+ * DynamicBitmapIndexScan
+ * Scan a list of indexes that will be determined at run time.
+ * For use with partitioned tables.
+*/
+typedef struct DynamicBitmapIndexScan
+{
+ /* Fields shared with a normal BitmapIndexScan. Must be first! */
+ BitmapIndexScan biscan;
+
+ /*
+ * List of partition OIDs to scan.
+ */
+ List *partOids;
+
+ /* logical index to use */
+ LogicalIndexInfo *logicalIndexInfo;
+} DynamicBitmapIndexScan;
+
/* ----------------
* bitmap sequential scan node
*
@@ -710,6 +774,43 @@ typedef struct BitmapHeapScan
List *bitmapqualorig; /* index quals, in standard expr form */
} BitmapHeapScan;
+/*
+ * DynamicBitmapHeapScan
+ * Scan a list of tables that will be determined at run time.
+ *
+ * Dynamic counterpart of a BitmapHeapScan, for use with partitioned tables.
+ */
+typedef struct DynamicBitmapHeapScan
+{
+ BitmapHeapScan bitmapheapscan;
+
+ /*
+ * List of partition OIDs to scan.
+ */
+ List *partOids;
+} DynamicBitmapHeapScan;
+
+/*
+ * DynamicSeqScan
+ * Scan a list of tables that will be determined at run time.
+ */
+typedef struct DynamicSeqScan
+{
+ /* Fields shared with a normal SeqScan. Must be first! */
+ SeqScan seqscan;
+
+ /*
+ * Index to arrays in EState->dynamicTableScanInfo, that contain information
+ * about the partitiones that need to be scanned.
+ */
+ int32 partIndex;
+ int32 partIndexPrintable;
+ /*
+ * List of partition OIDs to scan.
+ */
+ List *partOids;
+} DynamicSeqScan;
+
/* ----------------
* tid scan node
*
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org
(cloudberry) 11/11: Fix the icw tests which generated by dynamic (bitmap/index/table) scan
Posted by ma...@apache.org.
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 43ca55d2a9beb0266106f877623028f7a33d9601
Author: zhoujiaqi <zh...@hashdata.cn>
AuthorDate: Fri Dec 20 14:07:50 2024 +0800
Fix the icw tests which generated by dynamic (bitmap/index/table) scan
The reason for the current test failure is not only that the scan
of the partition table has been changed to a dynamic scan, but
also that we have disabled the index scan in nest loop in ORCA.
---
src/test/regress/expected/aggregates_optimizer.out | 7 +-
src/test/regress/expected/bfv_index_optimizer.out | 122 ++--
src/test/regress/expected/bfv_partition_plans.out | 1 +
.../expected/bfv_partition_plans_optimizer.out | 3 +-
src/test/regress/expected/dpe_optimizer.out | 789 +++++++++++++--------
.../regress/expected/explain_format_optimizer.out | 1 +
src/test/regress/expected/gporca_optimizer.out | 68 +-
src/test/regress/expected/join_optimizer.out | 15 +-
.../expected/orca_static_pruning_optimizer.out | 18 +-
.../regress/expected/partition_prune_optimizer.out | 162 ++---
src/test/regress/expected/subselect_optimizer.out | 28 +-
src/test/regress/sql/bfv_partition_plans.sql | 1 +
12 files changed, 712 insertions(+), 503 deletions(-)
diff --git a/src/test/regress/expected/aggregates_optimizer.out b/src/test/regress/expected/aggregates_optimizer.out
index 959aef0c0b..6c2d7c06f9 100644
--- a/src/test/regress/expected/aggregates_optimizer.out
+++ b/src/test/regress/expected/aggregates_optimizer.out
@@ -1431,11 +1431,10 @@ explain (costs off) select * from p_t1 group by a,b,c,d;
QUERY PLAN
------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on p_t1_1
- -> Seq Scan on p_t1_2
+ -> Dynamic Seq Scan on p_t1
+ Number of partitions to scan: 2
Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(4 rows)
drop table t1 cascade;
NOTICE: drop cascades to table t1c
diff --git a/src/test/regress/expected/bfv_index_optimizer.out b/src/test/regress/expected/bfv_index_optimizer.out
index da317532ff..7829a16f26 100644
--- a/src/test/regress/expected/bfv_index_optimizer.out
+++ b/src/test/regress/expected/bfv_index_optimizer.out
@@ -127,55 +127,89 @@ explain SELECT count(*)
FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1
WHERE ft.wk_id = dt.wk_id
AND ft.id = dt1.id;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------
- Aggregate (cost=0.00..1250.34 rows=1 width=8)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1250.34 rows=7 width=1)
- -> Hash Join (cost=0.00..1250.34 rows=3 width=1)
- Hash Cond: (bfv_tab2_dimdate.wk_id = bfv_tab2_facttable1.wk_id)
- -> Seq Scan on bfv_tab2_dimdate (cost=0.00..431.00 rows=4 width=2)
- -> Hash (cost=819.34..819.34 rows=3 width=2)
- -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..819.34 rows=3 width=2)
- Hash Key: bfv_tab2_facttable1.wk_id
- -> Nested Loop (cost=0.00..819.34 rows=3 width=2)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=7 width=4)
- -> Seq Scan on bfv_tab2_dimtabl1 (cost=0.00..431.00 rows=3 width=4)
- -> Dynamic Bitmap Heap Scan on bfv_tab2_facttable1 (cost=0.00..388.34 rows=1 width=2)
- Number of partitions to scan: 21
- Recheck Cond: (id = bfv_tab2_dimtabl1.id)
- Filter: (id = bfv_tab2_dimtabl1.id)
- -> Dynamic Bitmap Index Scan on idx_bfv_tab2_facttable1 (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (id = bfv_tab2_dimtabl1.id)
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Aggregate (cost=23.80..23.81 rows=1 width=8)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=2.28..23.79 rows=3 width=0)
+ -> Hash Join (cost=2.28..23.74 rows=1 width=0)
+ Hash Cond: (ft.wk_id = dt.wk_id)
+ -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.20..22.65 rows=2 width=2)
+ Hash Key: ft.wk_id
+ -> Hash Join (cost=1.20..22.60 rows=2 width=2)
+ Hash Cond: (ft.id = dt1.id)
+ -> Append (cost=0.00..21.32 rows=21 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..1.01 rows=1 width=6)
+ -> Hash (cost=1.12..1.12 rows=7 width=4)
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..1.12 rows=7 width=4)
+ -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.02 rows=2 width=4)
+ -> Hash (cost=1.03..1.03 rows=3 width=2)
+ -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.03 rows=3 width=2)
+ Optimizer: Postgres query optimizer
+(36 rows)
explain SELECT count(*)
FROM bfv_tab2_facttable1 ft, bfv_tab2_dimdate dt, bfv_tab2_dimtabl1 dt1
WHERE ft.wk_id = dt.wk_id
AND ft.id = dt1.id;
- QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------
- Aggregate (cost=0.00..1250.34 rows=1 width=8)
- -> Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..1250.34 rows=7 width=1)
- -> Hash Join (cost=0.00..1250.34 rows=3 width=1)
- Hash Cond: (bfv_tab2_dimdate.wk_id = bfv_tab2_facttable1.wk_id)
- -> Seq Scan on bfv_tab2_dimdate (cost=0.00..431.00 rows=4 width=2)
- -> Hash (cost=819.34..819.34 rows=3 width=2)
- -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=0.00..819.34 rows=3 width=2)
- Hash Key: bfv_tab2_facttable1.wk_id
- -> Nested Loop (cost=0.00..819.34 rows=3 width=2)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..431.00 rows=7 width=4)
- -> Seq Scan on bfv_tab2_dimtabl1 (cost=0.00..431.00 rows=3 width=4)
- -> Dynamic Bitmap Heap Scan on bfv_tab2_facttable1 (cost=0.00..388.34 rows=1 width=2)
- Number of partitions to scan: 21
- Recheck Cond: (id = bfv_tab2_dimtabl1.id)
- Filter: (id = bfv_tab2_dimtabl1.id)
- -> Dynamic Bitmap Index Scan on idx_bfv_tab2_facttable1 (cost=0.00..0.00 rows=0 width=0)
- Index Cond: (id = bfv_tab2_dimtabl1.id)
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Aggregate (cost=23.80..23.81 rows=1 width=8)
+ -> Gather Motion 3:1 (slice1; segments: 3) (cost=2.28..23.79 rows=3 width=0)
+ -> Hash Join (cost=2.28..23.74 rows=1 width=0)
+ Hash Cond: (ft.wk_id = dt.wk_id)
+ -> Redistribute Motion 3:3 (slice2; segments: 3) (cost=1.20..22.65 rows=2 width=2)
+ Hash Key: ft.wk_id
+ -> Hash Join (cost=1.20..22.60 rows=2 width=2)
+ Hash Cond: (ft.id = dt1.id)
+ -> Append (cost=0.00..21.32 rows=21 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_2 ft_1 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_3 ft_2 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_4 ft_3 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_5 ft_4 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_6 ft_5 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_7 ft_6 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_8 ft_7 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_9 ft_8 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_10 ft_9 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_11 ft_10 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_12 ft_11 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_13 ft_12 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_14 ft_13 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_15 ft_14 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_16 ft_15 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_17 ft_16 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_18 ft_17 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_19 ft_18 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_20 ft_19 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_21 ft_20 (cost=0.00..1.01 rows=1 width=6)
+ -> Seq Scan on bfv_tab2_facttable1_1_prt_dflt ft_21 (cost=0.00..1.01 rows=1 width=6)
+ -> Hash (cost=1.12..1.12 rows=7 width=4)
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (cost=0.00..1.12 rows=7 width=4)
+ -> Seq Scan on bfv_tab2_dimtabl1 dt1 (cost=0.00..1.02 rows=2 width=4)
+ -> Hash (cost=1.03..1.03 rows=3 width=2)
+ -> Seq Scan on bfv_tab2_dimdate dt (cost=0.00..1.03 rows=3 width=2)
+ Optimizer: Postgres query optimizer
+(36 rows)
-- start_ignore
create language plpython3u;
diff --git a/src/test/regress/expected/bfv_partition_plans.out b/src/test/regress/expected/bfv_partition_plans.out
index 597f507a65..b9cc5a0d40 100644
--- a/src/test/regress/expected/bfv_partition_plans.out
+++ b/src/test/regress/expected/bfv_partition_plans.out
@@ -114,6 +114,7 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur
insert into mpp23195_t1 values (generate_series(1,19));
insert into mpp23195_t2 values (1);
-- TEST
+-- Operator Fallback: InnerIndexNestLoopJoin may have wrong plan not supported
select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan');
find_operator
---------------
diff --git a/src/test/regress/expected/bfv_partition_plans_optimizer.out b/src/test/regress/expected/bfv_partition_plans_optimizer.out
index a5bb5f0570..816629637f 100644
--- a/src/test/regress/expected/bfv_partition_plans_optimizer.out
+++ b/src/test/regress/expected/bfv_partition_plans_optimizer.out
@@ -114,10 +114,11 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur
insert into mpp23195_t1 values (generate_series(1,19));
insert into mpp23195_t2 values (1);
-- TEST
+-- Operator Fallback: InnerIndexNestLoopJoin may have wrong plan not supported
select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan');
find_operator
---------------
- ['true']
+ ['false']
(1 row)
select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;
diff --git a/src/test/regress/expected/dpe_optimizer.out b/src/test/regress/expected/dpe_optimizer.out
index b78f6e3172..a35f9b80b9 100644
--- a/src/test/regress/expected/dpe_optimizer.out
+++ b/src/test/regress/expected/dpe_optimizer.out
@@ -77,19 +77,27 @@ analyze t1;
-- Simple positive cases
--
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(18 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -115,19 +123,27 @@ select * from t, pt where tid = ptid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid + 1 = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = (t.tid + 1))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = (t.tid + 1))
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(18 rows)
select * from t, pt where tid + 1 = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -153,20 +169,28 @@ select * from t, pt where tid + 1 = ptid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid and t1 = 'hello' || tid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ Optimizer: Postgres query optimizer
+(19 rows)
select * from t, pt where tid = ptid and t1 = 'hello' || tid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -192,20 +216,27 @@ select * from t, pt where tid = ptid and t1 = 'hello' || tid;
(18 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where t1 = pt1 and ptid = tid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Nested Loop (actual rows=2 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=2)
- Index Cond: (pt1 = t.t1)
- Filter: ((pt1 = t.t1) AND (ptid = t.tid))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ -> Hash Join (actual rows=2 loops=1)
+ Hash Cond: ((pt.pt1 = t.t1) AND (pt.ptid = t.tid))
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(18 rows)
select * from t, pt where t1 = pt1 and ptid = tid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -221,28 +252,25 @@ explain (costs off, timing off, summary off, analyze) select * from pt where pti
QUERY PLAN
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Join (actual rows=8 loops=1)
+ -> Hash Semi Join (actual rows=8 loops=1)
Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Dynamic Seq Scan on pt (actual rows=8 loops=1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
-> Hash (actual rows=2 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=2 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> GroupAggregate (actual rows=2 loops=1)
- Group Key: t.tid
- -> Sort (actual rows=2 loops=1)
- Sort Key: t.tid
- Sort Method: quicksort Memory: 75kB
- Executor Memory: 178kB Segments: 3 Max: 60kB (segment 0)
- -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- Hash Key: t.tid
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ Optimizer: Postgres query optimizer
+(19 rows)
select * from pt where ptid in (select tid from t where t1 = 'hello' || tid);
dist | pt1 | pt2 | pt3 | ptid
@@ -274,28 +302,25 @@ explain (costs off, timing off, summary off, analyze) select * from pt where exi
QUERY PLAN
---------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Hash Join (actual rows=8 loops=1)
+ -> Hash Semi Join (actual rows=8 loops=1)
Hash Cond: (pt.ptid = t.tid)
- Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
- -> Dynamic Seq Scan on pt (actual rows=8 loops=1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
-> Hash (actual rows=2 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=2 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> GroupAggregate (actual rows=2 loops=1)
- Group Key: t.tid
- -> Sort (actual rows=2 loops=1)
- Sort Key: t.tid
- Sort Method: quicksort Memory: 75kB
- Executor Memory: 76kB Segments: 3 Max: 26kB (segment 1)
- -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- Hash Key: t.tid
- -> Seq Scan on t (actual rows=2 loops=1)
- Filter: (t1 = ('hello'::text || (tid)::text))
- Optimizer: Pivotal Optimizer (GPORCA)
-(20 rows)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Filter: (t1 = ('hello'::text || (tid)::text))
+ Optimizer: Postgres query optimizer
+(19 rows)
select * from pt where exists (select 1 from t where tid = ptid and t1 = 'hello' || tid);
dist | pt1 | pt2 | pt3 | ptid
@@ -324,21 +349,29 @@ select * from pt where exists (select 1 from t where tid = ptid and t1 = 'hello'
-- group-by on top
--
explain (costs off, timing off, summary off, analyze) select count(*) from t, pt where tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(12 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 524288 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 524288 Batches: 1 Memory Usage: 4097kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(20 rows)
select count(*) from t, pt where tid = ptid;
count
@@ -350,8 +383,8 @@ select count(*) from t, pt where tid = ptid;
-- window function on top
--
explain (costs off, timing off, summary off, analyze) select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------
WindowAgg (actual rows=18 loops=1)
Order By: pt.ptid, pt.pt1
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
@@ -359,17 +392,24 @@ explain (costs off, timing off, summary off, analyze) select *, rank() over (ord
-> Sort (actual rows=8 loops=1)
Sort Key: pt.ptid, pt.pt1
Sort Method: quicksort Memory: 76kB
- Executor Memory: 85kB Segments: 3 Max: 29kB (segment 1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(16 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(24 rows)
select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid | rank
@@ -400,28 +440,44 @@ select *, rank() over (order by ptid,pt1) from t, pt where tid = ptid;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid
union all
select * from t, pt where tid + 2 = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=36 loops=1)
-> Append (actual rows=14 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- -> Nested Loop (actual rows=7 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t t_1 (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=4 loops=2)
- Index Cond: (ptid = (t_1.tid + 2))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Hash Join (actual rows=7 loops=1)
+ Hash Cond: (pt_7.ptid = (t_1.tid + 2))
+ Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
+ -> Append (actual rows=7 loops=1)
+ Partition Selectors: $1
+ -> Seq Scan on pt_1_prt_2 pt_8 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt_9 (never executed)
+ -> Seq Scan on pt_1_prt_4 pt_10 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_11 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt_12 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_13 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $1) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t t_1 (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(35 rows)
select * from t, pt where tid = ptid
union all
@@ -474,30 +530,48 @@ explain (costs off, timing off, summary off, analyze) select count(*) from
union all
select * from t, pt where tid + 2 = ptid
) foo;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
-> Append (actual rows=14 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- -> Nested Loop (actual rows=7 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t t_1 (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=4 loops=2)
- Index Cond: (ptid = (t_1.tid + 2))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(21 rows)
+ -> Subquery Scan on "*SELECT* 1" (actual rows=8 loops=1)
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Subquery Scan on "*SELECT* 2" (actual rows=7 loops=1)
+ -> Hash Join (actual rows=7 loops=1)
+ Hash Cond: (pt_7.ptid = (t_1.tid + 2))
+ Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=7 loops=1)
+ Partition Selectors: $1
+ -> Seq Scan on pt_1_prt_2 pt_8 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt_9 (never executed)
+ -> Seq Scan on pt_1_prt_4 pt_10 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_11 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt_12 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_13 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $1) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t t_1 (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(39 rows)
select count(*) from
( select * from t, pt where tid = ptid
@@ -516,20 +590,24 @@ set enable_hashjoin=off;
set enable_nestloop=on;
set enable_mergejoin=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
-> Nested Loop (actual rows=8 loops=1)
Join Filter: (t.tid = pt.ptid)
Rows Removed by Join Filter: 30
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Materialize (actual rows=20 loops=2)
+ -> Append (actual rows=20 loops=1)
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
+ Optimizer: Postgres query optimizer
+(15 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -566,22 +644,30 @@ set enable_hashjoin=off;
-- Known_opt_diff: MPP-21322
-- end_ignore
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid and pt1 = 'hello0';
- QUERY PLAN
-------------------------------------------------------------------------------------
- Hash Join (actual rows=1 loops=1)
- Hash Cond: (t.tid = pt.ptid)
- Extra Text: Hash chain length 1.0 avg, 1 max, using 1 of 262144 buckets.
- -> Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Hash (actual rows=1 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Gather Motion 3:1 (slice2; segments: 3) (actual rows=1 loops=1)
- -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(12 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (actual rows=1 loops=1)
+ -> Nested Loop (actual rows=1 loops=1)
+ Join Filter: (t.tid = pt.ptid)
+ Rows Removed by Join Filter: 1
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ -> Materialize (actual rows=1 loops=2)
+ -> Append (actual rows=1 loops=1)
+ -> Index Scan using pt_1_prt_2_pt1_idx on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ -> Index Scan using pt_1_prt_3_pt1_idx on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ -> Index Scan using pt_1_prt_4_pt1_idx on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ -> Index Scan using pt_1_prt_5_pt1_idx on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ -> Index Scan using pt_1_prt_6_pt1_idx on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ -> Index Scan using pt_1_prt_junk_data_pt1_idx on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
+ Index Cond: (pt1 = 'hello0'::text)
+ Optimizer: Postgres query optimizer
+(21 rows)
select * from t, pt where tid = ptid and pt1 = 'hello0';
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -597,20 +683,24 @@ set enable_indexscan=on;
set enable_seqscan=off;
set enable_hashjoin=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
-> Nested Loop (actual rows=8 loops=1)
Join Filter: (t.tid = pt.ptid)
Rows Removed by Join Filter: 30
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Materialize (actual rows=20 loops=2)
+ -> Append (actual rows=20 loops=1)
+ -> Index Scan using pt_1_prt_2_ptid_idx on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Index Scan using pt_1_prt_3_ptid_idx on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Index Scan using pt_1_prt_4_ptid_idx on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Index Scan using pt_1_prt_5_ptid_idx on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
+ -> Index Scan using pt_1_prt_6_ptid_idx on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
+ -> Index Scan using pt_1_prt_junk_data_ptid_idx on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
+ Optimizer: Postgres query optimizer
+(15 rows)
select * from t, pt where tid = ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -643,19 +733,25 @@ set enable_seqscan=on;
set enable_hashjoin=on;
set enable_nestloop=off;
explain (costs off, timing off, summary off, analyze) select * from t, pt where t1 = pt1;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Nested Loop (actual rows=2 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=2)
- Index Cond: (pt1 = t.t1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Hash Join (actual rows=2 loops=1)
+ Hash Cond: (pt.pt1 = t.t1)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 262144 buckets.
+ -> Append (actual rows=20 loops=1)
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(16 rows)
select * from t, pt where t1 = pt1;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -665,20 +761,24 @@ select * from t, pt where t1 = pt1;
(2 rows)
explain (costs off, timing off, summary off, analyze) select * from t, pt where tid < ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=81 loops=1)
-> Nested Loop (actual rows=31 loops=1)
Join Filter: (t.tid < pt.ptid)
Rows Removed by Join Filter: 9
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
-> Seq Scan on t (actual rows=2 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=16 loops=2)
- Index Cond: (ptid > t.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(10 rows)
+ -> Materialize (actual rows=20 loops=2)
+ -> Append (actual rows=20 loops=1)
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=4 loops=1)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
+ Optimizer: Postgres query optimizer
+(15 rows)
select * from t, pt where tid < ptid;
dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -775,26 +875,34 @@ reset enable_nestloop;
--
-- one of the joined tables can be used for partition elimination, the other can not
explain (costs off, timing off, summary off, analyze) select * from t, t1, pt where t1.t2 = t.t2 and t1.tid = ptid;
- QUERY PLAN
------------------------------------------------------------------------------------------------
- Hash Join (actual rows=36 loops=1)
- Hash Cond: (t1.t2 = t.t2)
- Extra Text: Hash chain length 2.0 avg, 2 max, using 1 of 262144 buckets.
- -> Gather Motion 3:1 (slice1; segments: 3) (actual rows=18 loops=1)
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t1 (actual rows=1 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=4 loops=2)
- Index Cond: (ptid = t1.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 2 scans. Max 6 parts (seg0).
- -> Hash (actual rows=2 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Gather Motion 3:1 (slice3; segments: 3) (actual rows=2 loops=1)
- -> Seq Scan on t (actual rows=2 loops=1)
- Optimizer: Pivotal Optimizer (GPORCA)
-(16 rows)
+ QUERY PLAN
+---------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (actual rows=36 loops=1)
+ -> Hash Join (actual rows=16 loops=1)
+ Hash Cond: (t1.t2 = t.t2)
+ Extra Text: (seg1) Hash chain length 2.0 avg, 2 max, using 1 of 131072 buckets.
+ -> Hash Join (actual rows=8 loops=1)
+ Hash Cond: (pt.ptid = t1.tid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 2 of 131072 buckets.
+ -> Append (actual rows=8 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (never executed)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $0) (actual rows=2 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t1 (actual rows=1 loops=1)
+ -> Hash (actual rows=2 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=2 loops=1)
+ -> Seq Scan on t (actual rows=2 loops=1)
+ Optimizer: Postgres query optimizer
+(25 rows)
select * from t, t1, pt where t1.t2 = t.t2 and t1.tid = ptid;
dist | tid | t1 | t2 | dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -846,29 +954,35 @@ insert into t1 select i, -100, 'dummy' from generate_series(1,10) i;
analyze t;
analyze t1;
explain (costs off, timing off, summary off, analyze) select * from t, t1, pt where t1.tid = ptid and t.tid = ptid;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=9 loops=1)
- -> Hash Join (actual rows=9 loops=1)
- Hash Cond: (t.tid = pt.ptid)
- Extra Text: (seg1) Hash chain length 9.0 avg, 9 max, using 1 of 262144 buckets.
- -> Redistribute Motion 3:3 (slice2; segments: 3) (actual rows=2 loops=1)
- Hash Key: t.tid
- -> Seq Scan on t (actual rows=5 loops=1)
- -> Hash (actual rows=9 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2049kB
- -> Redistribute Motion 3:3 (slice3; segments: 3) (actual rows=9 loops=1)
- Hash Key: pt.ptid
- -> Nested Loop (actual rows=8 loops=1)
- Join Filter: true
- -> Broadcast Motion 3:3 (slice4; segments: 3) (actual rows=12 loops=1)
- -> Seq Scan on t1 (actual rows=6 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=1 loops=12)
- Index Cond: (ptid = t1.tid)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers of 12 scans. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ -> Hash Join (actual rows=3 loops=1)
+ Hash Cond: (pt.ptid = t1.tid)
+ Extra Text: (seg0) Hash chain length 4.0 avg, 10 max, using 3 of 131072 buckets.
+ -> Hash Join (actual rows=3 loops=1)
+ Hash Cond: (pt.ptid = t.tid)
+ Extra Text: (seg0) Hash chain length 4.0 avg, 10 max, using 3 of 131072 buckets.
+ -> Append (actual rows=6 loops=1)
+ Partition Selectors: $0, $1
+ -> Seq Scan on pt_1_prt_2 pt_1 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt_3 (never executed)
+ -> Seq Scan on pt_1_prt_5 pt_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=3 loops=1)
+ -> Hash (actual rows=12 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $0) (actual rows=12 loops=1)
+ -> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=12 loops=1)
+ -> Seq Scan on t (actual rows=5 loops=1)
+ -> Hash (actual rows=12 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $1) (actual rows=12 loops=1)
+ -> Broadcast Motion 3:3 (slice3; segments: 3) (actual rows=12 loops=1)
+ -> Seq Scan on t1 (actual rows=6 loops=1)
+ Optimizer: Postgres query optimizer
+(26 rows)
select * from t, t1, pt where t1.tid = ptid and t.tid = ptid;
dist | tid | t1 | t2 | dist | tid | t1 | t2 | dist | pt1 | pt2 | pt3 | ptid
@@ -893,26 +1007,43 @@ begin;
set local from_collapse_limit = 1;
set local join_collapse_limit = 1;
explain (costs off, timing off, summary off, analyze) select * from t1 inner join (select pt1.*, pt2.ptid as ptid2 from pt as pt1, pt as pt2 WHERE pt1.ptid <= pt2.ptid and pt1.dist = pt2.dist ) as ptx ON t1.dist = ptx.dist and t1.tid = ptx.ptid and t1.tid = ptx.ptid2;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=2 loops=1)
- -> Nested Loop (actual rows=1 loops=1)
- Join Filter: true
- -> Nested Loop (actual rows=1 loops=1)
- Join Filter: true
- -> Seq Scan on t1 (actual rows=1 loops=1)
- -> Dynamic Index Scan on ptid_idx on pt (actual rows=1 loops=1)
- Index Cond: (ptid = t1.tid)
- Filter: ((ptid = t1.tid) AND (t1.dist = dist))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 2 workers. Max 6 parts (seg0).
- -> Dynamic Index Scan on ptid_idx on pt pt_1 (actual rows=1 loops=1)
- Index Cond: ((ptid <= pt.ptid) AND (ptid = pt.ptid))
- Filter: ((ptid <= pt.ptid) AND (ptid = pt.ptid) AND (dist = pt.dist))
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 2 workers. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+ -> Hash Join (actual rows=1 loops=1)
+ Hash Cond: ((pt1.dist = t1.dist) AND (pt1.ptid = t1.tid))
+ Join Filter: ((t1.tid <= pt2.ptid) AND (pt1.ptid <= t1.tid))
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 131072 buckets.
+ -> Hash Join (actual rows=3 loops=1)
+ Hash Cond: ((pt1.dist = pt2.dist) AND (pt1.ptid = pt2.ptid))
+ Join Filter: (pt1.ptid <= pt2.ptid)
+ Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 14 of 262144 buckets.
+ -> Append (actual rows=3 loops=1)
+ Partition Selectors: $0, $1
+ -> Seq Scan on pt_1_prt_2 pt1_1 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt1_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt1_3 (actual rows=2 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt1_4 (never executed)
+ -> Seq Scan on pt_1_prt_6 pt1_5 (never executed)
+ -> Seq Scan on pt_1_prt_junk_data pt1_6 (never executed)
+ -> Hash (actual rows=14 loops=1)
+ Buckets: 262144 Batches: 1 Memory Usage: 2049kB
+ -> Partition Selector (selector id: $0) (actual rows=14 loops=1)
+ -> Append (actual rows=14 loops=1)
+ Partition Selectors: $2
+ -> Seq Scan on pt_1_prt_2 pt2_1 (never executed)
+ -> Seq Scan on pt_1_prt_3 pt2_2 (actual rows=3 loops=1)
+ -> Seq Scan on pt_1_prt_4 pt2_3 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_5 pt2_4 (actual rows=5 loops=1)
+ -> Seq Scan on pt_1_prt_6 pt2_5 (actual rows=4 loops=1)
+ -> Seq Scan on pt_1_prt_junk_data pt2_6 (actual rows=3 loops=1)
+ -> Hash (actual rows=1 loops=1)
+ Buckets: 131072 Batches: 1 Memory Usage: 1025kB
+ -> Partition Selector (selector id: $2) (actual rows=1 loops=1)
+ -> Partition Selector (selector id: $1) (actual rows=1 loops=1)
+ -> Seq Scan on t1 (actual rows=1 loops=1)
+ Optimizer: Postgres query optimizer
+(34 rows)
rollback;
--
@@ -920,8 +1051,8 @@ rollback;
-- not projection capable.
--
explain (costs off, timing off, summary off, analyze) select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt1.dist;
- QUERY PLAN
-------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=9 loops=1)
Merge Key: pt1.dist
-> Sort (actual rows=5 loops=1)
@@ -930,19 +1061,39 @@ explain (costs off, timing off, summary off, analyze) select * from pt, pt1 wher
-> Hash Join (actual rows=5 loops=1)
Hash Cond: (pt1.ptid = pt.ptid)
Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 131072 buckets.
- -> Dynamic Seq Scan on pt1 (actual rows=5 loops=1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
+ -> Append (actual rows=5 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt1_1_prt_2 pt1_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt1_1_prt_3 pt1_2 (never executed)
+ -> Seq Scan on pt1_1_prt_4 pt1_3 (never executed)
+ -> Seq Scan on pt1_1_prt_5 pt1_4 (never executed)
+ -> Seq Scan on pt1_1_prt_6 pt1_5 (never executed)
+ -> Seq Scan on pt1_1_prt_junk_data pt1_6 (never executed)
-> Hash (actual rows=1 loops=1)
Buckets: 131072 Batches: 1 Memory Usage: 1025kB
-> Partition Selector (selector id: $0) (actual rows=1 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=1 loops=1)
- -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(19 rows)
+ -> Append (actual rows=1 loops=1)
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 4
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 3
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 2
+ -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 5
+ -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 4
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 3
+ Optimizer: Postgres query optimizer
+(40 rows)
select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt1.dist;
dist | pt1 | pt2 | pt3 | ptid | dist | pt1 | pt2 | pt3 | ptid
@@ -959,27 +1110,47 @@ select * from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0' order by pt
(9 rows)
explain (costs off, timing off, summary off, analyze) select count(*) from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0';
- QUERY PLAN
-------------------------------------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------------------------
Finalize Aggregate (actual rows=1 loops=1)
-> Gather Motion 3:1 (slice1; segments: 3) (actual rows=3 loops=1)
-> Partial Aggregate (actual rows=1 loops=1)
-> Hash Join (actual rows=5 loops=1)
Hash Cond: (pt1.ptid = pt.ptid)
Extra Text: (seg1) Hash chain length 1.0 avg, 1 max, using 1 of 524288 buckets.
- -> Dynamic Seq Scan on pt1 (actual rows=5 loops=1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
+ -> Append (actual rows=5 loops=1)
+ Partition Selectors: $0
+ -> Seq Scan on pt1_1_prt_2 pt1_1 (actual rows=5 loops=1)
+ -> Seq Scan on pt1_1_prt_3 pt1_2 (never executed)
+ -> Seq Scan on pt1_1_prt_4 pt1_3 (never executed)
+ -> Seq Scan on pt1_1_prt_5 pt1_4 (never executed)
+ -> Seq Scan on pt1_1_prt_6 pt1_5 (never executed)
+ -> Seq Scan on pt1_1_prt_junk_data pt1_6 (never executed)
-> Hash (actual rows=1 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
-> Partition Selector (selector id: $0) (actual rows=1 loops=1)
-> Broadcast Motion 3:3 (slice2; segments: 3) (actual rows=1 loops=1)
- -> Dynamic Index Scan on pt1_idx on pt (actual rows=1 loops=1)
- Index Cond: (pt1 = 'hello0'::text)
- Number of partitions to scan: 6
- Partitions scanned: Avg 6.0 x 3 workers. Max 6 parts (seg0).
- Optimizer: Pivotal Optimizer (GPORCA)
-(17 rows)
+ -> Append (actual rows=1 loops=1)
+ -> Seq Scan on pt_1_prt_2 pt_1 (actual rows=1 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 4
+ -> Seq Scan on pt_1_prt_3 pt_2 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 3
+ -> Seq Scan on pt_1_prt_4 pt_3 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 2
+ -> Seq Scan on pt_1_prt_5 pt_4 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 5
+ -> Seq Scan on pt_1_prt_6 pt_5 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 4
+ -> Seq Scan on pt_1_prt_junk_data pt_6 (actual rows=0 loops=1)
+ Filter: (pt1 = 'hello0'::text)
+ Rows Removed by Filter: 3
+ Optimizer: Postgres query optimizer
+(38 rows)
select count(*) from pt, pt1 where pt.ptid = pt1.ptid and pt.pt1 = 'hello0';
count
@@ -1063,9 +1234,9 @@ explain (costs off, timing off, summary off, analyze) select * from t, pt where
QUERY PLAN
--------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Hash Join (never executed)
+ -> Hash Join (actual rows=0 loops=1)
Hash Cond: (pt.b = t.a)
- -> Dynamic Seq Scan on pt (never executed)
+ -> Dynamic Seq Scan on pt (actual rows=0 loops=1)
Number of partitions to scan: 5
-> Hash (actual rows=4 loops=1)
Buckets: 524288 Batches: 1 Memory Usage: 4097kB
@@ -2732,24 +2903,30 @@ set enable_seqscan=off;
-- force_explain
explain (analyze, timing off, summary off)
select * from pt, t where t.dist = pt.dist and t.tid = pt.ptid order by t.tid, t.sk;
- QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3) (cost=0.00..862.10 rows=98 width=24) (actual rows=5 loops=1)
- Merge Key: t.tid, t.sk
- -> Sort (cost=0.00..862.09 rows=33 width=24) (actual rows=2 loops=1)
- Sort Key: t.tid, t.sk
- Sort Method: quicksort Memory: 75kB
- Executor Memory: 76kB Segments: 3 Max: 26kB (segment 0)
- -> Hash Join (cost=0.00..862.05 rows=33 width=24) (actual rows=2 loops=1)
- Hash Cond: ((pt.dist = t.dist) AND (pt.ptid = t.tid))
- Extra Text: (seg0) Hash chain length 1.0 avg, 1 max, using 36 of 262144 buckets.
- -> Dynamic Seq Scan on pt (cost=0.00..431.00 rows=33 width=12) (actual rows=36 loops=1)
- Number of partitions to scan: 6
- Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
- -> Hash (cost=431.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
- Buckets: 262144 Batches: 1 Memory Usage: 2050kB
- -> Partition Selector (selector id: $0) (cost=0.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
- -> Seq Scan on t (cost=0.00..431.00 rows=33 width=12) (actual rows=37 loops=1)
- Optimizer: Pivotal Optimizer (GPORCA)
-(15 rows)
+ QUERY PLAN
+------------------------------------------------------------------------------------------------------------------------------------------------
+ Gather Motion 3:1 (slice1; segments: 3) (cost=10000000008.18..10000000014.83 rows=7 width=24) (actual rows=5 loops=1)
+ Merge Key: pt.ptid, t.sk
+ -> Incremental Sort (cost=10000000008.18..10000000014.74 rows=2 width=24) (actual rows=2 loops=1)
+ Sort Key: pt.ptid, t.sk
+ Presorted Key: pt.ptid
+ Full-sort Groups: 1 Sort Method: quicksort Average Memory: 25kB Peak Memory: 25kB
+ -> Merge Join (cost=10000000003.00..10000000014.64 rows=2 width=24) (actual rows=2 loops=1)
+ Merge Cond: (pt.ptid = t.tid)
+ Join Filter: (pt.dist = t.dist)
+ -> Merge Append (cost=0.85..446.48 rows=39 width=12) (actual rows=3 loops=1)
+ Sort Key: pt.ptid
+ -> Index Scan using pt1_ptid_sk_idx on pt1 pt_1 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
+ -> Index Scan using pt2_ptid_sk_idx on pt2 pt_2 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
+ -> Index Scan using pt3_ptid_sk_idx on pt3 pt_3 (cost=0.12..8.14 rows=1 width=12) (never executed)
+ -> Index Scan using pt4_ptid_sk_idx on pt4 pt_4 (cost=0.12..8.14 rows=1 width=12) (never executed)
+ -> Index Scan using pt5_ptid_sk_idx on pt5 pt_5 (cost=0.12..8.14 rows=1 width=12) (actual rows=1 loops=1)
+ -> Index Scan using ptdefault_ptid_sk_idx on ptdefault pt_6 (cost=0.14..405.00 rows=34 width=12) (actual rows=2 loops=1)
+ -> Sort (cost=10000000002.15..10000000002.23 rows=33 width=12) (actual rows=19 loops=2)
+ Sort Key: t.tid
+ Sort Method: quicksort Memory: 79kB
+ -> Partition Selector (selector id: $0) (cost=10000000000.00..10000000001.33 rows=33 width=12) (actual rows=37 loops=1)
+ -> Seq Scan on t (cost=10000000000.00..10000000001.33 rows=33 width=12) (actual rows=37 loops=1)
+ Optimizer: Postgres query optimizer
+(23 rows)
diff --git a/src/test/regress/expected/explain_format_optimizer.out b/src/test/regress/expected/explain_format_optimizer.out
index bfbf1a589e..1122773b46 100644
--- a/src/test/regress/expected/explain_format_optimizer.out
+++ b/src/test/regress/expected/explain_format_optimizer.out
@@ -515,6 +515,7 @@ QUERY PLAN
"Segments": 1,
"Gang Type": "primary reader",
"Parallel Aware": false,
+ "Async Capable": false,
"Relation Name": "jsonexplaintest",
"Alias": "jsonexplaintest",
"Number of partitions to scan": 1,
diff --git a/src/test/regress/expected/gporca_optimizer.out b/src/test/regress/expected/gporca_optimizer.out
index d6774aa879..3fc2cea054 100644
--- a/src/test/regress/expected/gporca_optimizer.out
+++ b/src/test/regress/expected/gporca_optimizer.out
@@ -13354,21 +13354,21 @@ explain (costs off) select * from tpart_dim d join t_ao_btree f on d.a=f.a where
(8 rows)
explain (costs off) select * from tpart_dim d join tpart_ao_btree f on d.a=f.a where d.b=1;
- QUERY PLAN
-------------------------------------------------------------------
+INFO: GPORCA failed to produce a plan, falling back to planner
+DETAIL: Operator Fallback: InnerIndexNestLoopJoin may have wrong plan not supported
+ QUERY PLAN
+----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Nested Loop
- Join Filter: true
- -> Seq Scan on tpart_dim
- Filter: (b = 1)
- -> Dynamic Bitmap Heap Scan on tpart_ao_btree
- Number of partitions to scan: 2
- Recheck Cond: (a = tpart_dim.a)
- Filter: (a = tpart_dim.a)
- -> Dynamic Bitmap Index Scan on tpart_ao_btree_ix
- Index Cond: (a = tpart_dim.a)
- Optimizer: Pivotal Optimizer (GPORCA)
-(12 rows)
+ -> Hash Join
+ Hash Cond: (f.a = d.a)
+ -> Append
+ -> Seq Scan on tpart_ao_btree_1_prt_1 f_1
+ -> Seq Scan on tpart_ao_btree_1_prt_2 f_2
+ -> Hash
+ -> Seq Scan on tpart_dim d
+ Filter: (b = 1)
+ Optimizer: Postgres query optimizer
+(10 rows)
-- negative test, make sure we don't use a btree scan on an AO table
-- start_ignore
@@ -13535,20 +13535,34 @@ default partition def);
create INDEX y_idx on y (j);
set optimizer_enable_indexjoin=on;
explain (costs off) select count(*) from x, y where (x.i > y.j AND x.j <= y.i);
- QUERY PLAN
----------------------------------------------------------------
- Aggregate
+INFO: GPORCA failed to produce a plan, falling back to planner
+DETAIL: Operator Fallback: InnerIndexNestLoopJoin may have wrong plan not supported
+ QUERY PLAN
+-------------------------------------------------------------------------------------
+ Finalize Aggregate
-> Gather Motion 3:1 (slice1; segments: 3)
- -> Nested Loop
- Join Filter: true
- -> Broadcast Motion 3:3 (slice2; segments: 3)
- -> Seq Scan on x
- -> Dynamic Index Scan on y_idx on y
- Index Cond: (j < x.i)
- Filter: ((j < x.i) AND (x.j <= i))
- Number of partitions to scan: 5
- Optimizer: Pivotal Optimizer (GPORCA)
-(11 rows)
+ -> Partial Aggregate
+ -> Nested Loop
+ -> Broadcast Motion 3:3 (slice2; segments: 3)
+ -> Seq Scan on x
+ -> Append
+ -> Index Scan using y_1_prt_p0_j_idx on y_1_prt_p0 y_1
+ Index Cond: (j < x.i)
+ Filter: (x.j <= i)
+ -> Index Scan using y_1_prt_p1_j_idx on y_1_prt_p1 y_2
+ Index Cond: (j < x.i)
+ Filter: (x.j <= i)
+ -> Index Scan using y_1_prt_p2_j_idx on y_1_prt_p2 y_3
+ Index Cond: (j < x.i)
+ Filter: (x.j <= i)
+ -> Index Scan using y_1_prt_p3_j_idx on y_1_prt_p3 y_4
+ Index Cond: (j < x.i)
+ Filter: (x.j <= i)
+ -> Index Scan using y_1_prt_def_j_idx on y_1_prt_def y_5
+ Index Cond: (j < x.i)
+ Filter: (x.j <= i)
+ Optimizer: Postgres query optimizer
+(23 rows)
reset optimizer_enable_indexjoin;
-- InferPredicatesBCC-vcpart-txt.mdp
diff --git a/src/test/regress/expected/join_optimizer.out b/src/test/regress/expected/join_optimizer.out
index e9d8c38557..436d1ee200 100644
--- a/src/test/regress/expected/join_optimizer.out
+++ b/src/test/regress/expected/join_optimizer.out
@@ -5402,23 +5402,22 @@ select * from
(select *, 12 as phv from parttbl) as ss
right join int4_tbl on true
where ss.a = ss.phv and f1 = 0;
- QUERY PLAN
-------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Nested Loop
Join Filter: true
-> Result
- Filter: (((12) = 12) AND (parttbl1.a = (12)))
- -> Result
- -> Append
- -> Index Scan using parttbl1_pkey on parttbl1
- Index Cond: (a = 12)
+ Filter: (((12) = 12) AND (parttbl.a = (12)))
+ -> Dynamic Index Scan on parttbl_pkey on parttbl
+ Index Cond: (a = 12)
+ Number of partitions to scan: 1
-> Materialize
-> Broadcast Motion 3:3 (slice2; segments: 3)
-> Seq Scan on int4_tbl
Filter: (f1 = 0)
Optimizer: Pivotal Optimizer (GPORCA)
-(14 rows)
+(13 rows)
select * from
(select *, 12 as phv from parttbl) as ss
diff --git a/src/test/regress/expected/orca_static_pruning_optimizer.out b/src/test/regress/expected/orca_static_pruning_optimizer.out
index a51ea2bac2..45032fd959 100644
--- a/src/test/regress/expected/orca_static_pruning_optimizer.out
+++ b/src/test/regress/expected/orca_static_pruning_optimizer.out
@@ -241,22 +241,22 @@ SET enable_hashjoin TO off;
SET enable_mergejoin TO off;
SET enable_nestloop TO on;
EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM foo JOIN bar on foo.a = bar.a AND foo.b = 11;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
Output: foo.a, foo.b, bar.a
-> Nested Loop
Output: foo.a, foo.b, bar.a
- Join Filter: true
+ Join Filter: (foo.a = bar.a)
-> Seq Scan on orca_static_pruning.bar
Output: bar.a
- -> Dynamic Index Scan on foo_idx on orca_static_pruning.foo
+ -> Materialize
Output: foo.a, foo.b
- Index Cond: (foo.a = bar.a)
- Filter: ((foo.a = bar.a) AND (foo.b = 11))
- Number of partitions to scan: 1
- Optimizer: Pivotal Optimizer (GPORCA)
- Settings: enable_hashjoin=off, enable_mergejoin=off, enable_nestloop=on, optimizer=on
+ -> Seq Scan on orca_static_pruning.foo_part2 foo
+ Output: foo.a, foo.b
+ Filter: (foo.b = 11)
+ Settings: enable_hashjoin = 'off', enable_mergejoin = 'off', enable_nestloop = 'on', enable_parallel = 'off', optimizer = 'on'
+ Optimizer: Postgres query optimizer
(14 rows)
SELECT * FROM foo JOIN bar on foo.a = bar.a AND foo.b = 11;
diff --git a/src/test/regress/expected/partition_prune_optimizer.out b/src/test/regress/expected/partition_prune_optimizer.out
index fc684dda33..7c9c1bcdd0 100644
--- a/src/test/regress/expected/partition_prune_optimizer.out
+++ b/src/test/regress/expected/partition_prune_optimizer.out
@@ -43,7 +43,7 @@ explain (costs off) select * from lp;
(4 rows)
explain (costs off) select * from lp where a > 'a' and a < 'd';
- QUERY PLAN
+ QUERY PLAN
-----------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Dynamic Seq Scan on lp
@@ -53,7 +53,7 @@ explain (costs off) select * from lp where a > 'a' and a < 'd';
(5 rows)
explain (costs off) select * from lp where a > 'a' and a <= 'd';
- QUERY PLAN
+ QUERY PLAN
------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Dynamic Seq Scan on lp
@@ -103,7 +103,7 @@ explain (costs off) select * from lp where a is null;
(5 rows)
explain (costs off) select * from lp where a = 'a' or a = 'c';
- QUERY PLAN
+ QUERY PLAN
----------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
-> Dynamic Seq Scan on lp
@@ -113,7 +113,7 @@ explain (costs off) select * from lp where a = 'a' or a = 'c';
(5 rows)
explain (costs off) select * from lp where a is not null and (a = 'a' or a = 'c');
- QUERY PLAN
+ QUERY PLAN
----------------------------------------------------------------------------------
Gather Motion 1:1 (slice1; segments: 1)
-> Dynamic Seq Scan on lp
@@ -133,7 +133,7 @@ explain (costs off) select * from lp where a <> 'g';
(5 rows)
explain (costs off) select * from lp where a <> 'a' and a <> 'd';
- QUERY PLAN
+ QUERY PLAN
-------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Dynamic Seq Scan on lp
@@ -143,7 +143,7 @@ explain (costs off) select * from lp where a <> 'a' and a <> 'd';
(5 rows)
explain (costs off) select * from lp where a not in ('a', 'd');
- QUERY PLAN
+ QUERY PLAN
------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Dynamic Seq Scan on lp
@@ -1332,86 +1332,74 @@ explain (costs off) select * from coercepart where a !~ all ('{ab,bc}');
(5 rows)
explain (costs off) select * from coercepart where a = any ('{ab,bc}');
- QUERY PLAN
--------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ANY ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text = ANY ('{ab,bc}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 2
+ Filter: ((a)::text = ANY ('{ab,bc}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from coercepart where a = any ('{ab,null}');
- QUERY PLAN
----------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ANY ('{ab,NULL}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 1
+ Filter: ((a)::text = ANY ('{ab,NULL}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from coercepart where a = any (null::text[]);
- QUERY PLAN
---------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ANY (NULL::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text = ANY (NULL::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text = ANY (NULL::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text = ANY (NULL::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
explain (costs off) select * from coercepart where a = all ('{ab}');
- QUERY PLAN
-----------------------------------------------------------
+ QUERY PLAN
+----------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ALL ('{ab}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 1
+ Filter: ((a)::text = ALL ('{ab}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from coercepart where a = all ('{ab,bc}');
- QUERY PLAN
--------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ALL ('{ab,bc}'::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text = ALL ('{ab,bc}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 2
+ Filter: ((a)::text = ALL ('{ab,bc}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(7 rows)
+(5 rows)
explain (costs off) select * from coercepart where a = all ('{ab,null}');
- QUERY PLAN
----------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ALL ('{ab,NULL}'::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 1
+ Filter: ((a)::text = ALL ('{ab,NULL}'::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
(5 rows)
explain (costs off) select * from coercepart where a = all (null::text[]);
- QUERY PLAN
---------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
- -> Append
- -> Seq Scan on coercepart_ab
- Filter: ((a)::text = ALL (NULL::text[]))
- -> Seq Scan on coercepart_bc
- Filter: ((a)::text = ALL (NULL::text[]))
- -> Seq Scan on coercepart_cd
- Filter: ((a)::text = ALL (NULL::text[]))
+ -> Dynamic Seq Scan on coercepart
+ Number of partitions to scan: 3
+ Filter: ((a)::text = ALL (NULL::text[]))
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(5 rows)
drop table coercepart;
CREATE TABLE part (a INT, b INT) PARTITION BY LIST (a);
@@ -2158,7 +2146,7 @@ explain (analyze, costs off, summary off, timing off) select * from list_part wh
QUERY PLAN
------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on list_part (never executed)
+ -> Dynamic Seq Scan on list_part (actual rows=0 loops=1)
Number of partitions to scan: 4
Filter: (a = (1 + a))
Partitions scanned: Avg 4.0 x 3 workers. Max 4 parts (seg0).
@@ -2996,7 +2984,7 @@ select * from tbl1 join tprt on tbl1.col1 = tprt.col1;
QUERY PLAN
------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Hash Join (never executed)
+ -> Hash Join (actual rows=0 loops=1)
Hash Cond: (tbl1.col1 = tprt.col1)
-> Seq Scan on tbl1 (actual rows=1 loops=1)
-> Hash (actual rows=3 loops=1)
@@ -3146,12 +3134,12 @@ create table stable_qual_pruning3 partition of stable_qual_pruning
-- comparison against a stable value requires run-time pruning
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning where a < localtimestamp;
- QUERY PLAN
--------------------------------------------------------------------------------------
+ QUERY PLAN
+--------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
Number of partitions to scan: 2
- Filter: (a < 'Thu May 19 15:14:26.02528 2022'::timestamp without time zone)
+ Filter: (a < 'Thu Dec 19 19:04:45.779097 2024'::timestamp without time zone)
Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
(6 rows)
@@ -3162,7 +3150,7 @@ select * from stable_qual_pruning where a < '2000-02-01'::timestamptz;
QUERY PLAN
--------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
Number of partitions to scan: 1
Filter: (a < 'Tue Feb 01 00:00:00 2000 PST'::timestamp with time zone)
Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
@@ -3186,7 +3174,7 @@ select * from stable_qual_pruning
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
Number of partitions to scan: 1
Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Fri Jan 01 00:00:00 2010"}'::timestamp without time zone[]))
Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
@@ -3199,9 +3187,9 @@ select * from stable_qual_pruning
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
Number of partitions to scan: 1
- Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Thu May 19 15:14:26.037645 2022"}'::timestamp without time zone[]))
+ Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000","Thu Dec 19 19:04:45.852371 2024"}'::timestamp without time zone[]))
Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
(6 rows)
@@ -3222,7 +3210,7 @@ select * from stable_qual_pruning
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Dynamic Seq Scan on stable_qual_pruning (never executed)
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
Number of partitions to scan: 1
Filter: (a = ANY ('{"Tue Feb 01 00:00:00 2000 PST","Fri Jan 01 00:00:00 2010 PST"}'::timestamp with time zone[]))
Partitions scanned: Avg 1.0 x 3 workers. Max 1 parts (seg0).
@@ -3232,18 +3220,15 @@ select * from stable_qual_pruning
explain (analyze, costs off, summary off, timing off)
select * from stable_qual_pruning
where a = any(null::timestamptz[]);
- QUERY PLAN
---------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on stable_qual_pruning1 (actual rows=0 loops=1)
- Filter: (a = ANY (NULL::timestamp with time zone[]))
- -> Seq Scan on stable_qual_pruning2 (actual rows=0 loops=1)
- Filter: (a = ANY (NULL::timestamp with time zone[]))
- -> Seq Scan on stable_qual_pruning3 (actual rows=0 loops=1)
- Filter: (a = ANY (NULL::timestamp with time zone[]))
+ -> Dynamic Seq Scan on stable_qual_pruning (actual rows=0 loops=1)
+ Number of partitions to scan: 3
+ Filter: (a = ANY (NULL::timestamp with time zone[]))
+ Partitions scanned: Avg 3.0 x 3 workers. Max 3 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
-(9 rows)
+(6 rows)
drop table stable_qual_pruning;
--
@@ -3328,7 +3313,7 @@ select * from boolp where a = (select value from boolvalues where value);
------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
-> Hash Join (actual rows=0 loops=1)
- Hash Cond: (boolvalues.value = boolp_f.a)
+ Hash Cond: (boolvalues.value = boolp.a)
-> Redistribute Motion 1:3 (slice2) (never executed)
-> Assert (actual rows=1 loops=1)
Assert Cond: ((row_number() OVER (?)) = 1)
@@ -3340,9 +3325,9 @@ select * from boolp where a = (select value from boolvalues where value);
-> Hash (actual rows=0 loops=1)
Buckets: 262144 Batches: 1 Memory Usage: 2048kB
-> Broadcast Motion 3:3 (slice4; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on boolp_f (actual rows=0 loops=1)
- -> Seq Scan on boolp_t (actual rows=0 loops=1)
+ -> Dynamic Seq Scan on boolp (actual rows=0 loops=1)
+ Number of partitions to scan: 2
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
(18 rows)
@@ -3352,7 +3337,7 @@ select * from boolp where a = (select value from boolvalues where not value);
------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3) (actual rows=0 loops=1)
-> Hash Join (actual rows=0 loops=1)
- Hash Cond: (boolvalues.value = boolp_f.a)
+ Hash Cond: (boolvalues.value = boolp.a)
-> Redistribute Motion 1:3 (slice2) (never executed)
-> Assert (actual rows=1 loops=1)
Assert Cond: ((row_number() OVER (?)) = 1)
@@ -3364,9 +3349,9 @@ select * from boolp where a = (select value from boolvalues where not value);
-> Hash (actual rows=0 loops=1)
Buckets: 262144 Batches: 1 Memory Usage: 2048kB
-> Broadcast Motion 3:3 (slice4; segments: 3) (actual rows=0 loops=1)
- -> Append (actual rows=0 loops=1)
- -> Seq Scan on boolp_f (actual rows=0 loops=1)
- -> Seq Scan on boolp_t (actual rows=0 loops=1)
+ -> Dynamic Seq Scan on boolp (actual rows=0 loops=1)
+ Number of partitions to scan: 2
+ Partitions scanned: Avg 2.0 x 3 workers. Max 2 parts (seg0).
Optimizer: Pivotal Optimizer (GPORCA)
(18 rows)
@@ -3474,8 +3459,7 @@ explain (analyze, costs off, summary off, timing off) select * from ma_test wher
Merge Key: ma_test.b
-> Sort (actual rows=8 loops=1)
Sort Key: ma_test.b
- Sort Method: quicksort Memory: ###kB
- Executor Memory: ###kB Segments: ### Max: ###kB (segment ###)
+ Sort Method: quicksort Memory: 75kB
-> Nested Loop (actual rows=8 loops=1)
Join Filter: (ma_test.a >= (min(ma_test_p2.b)))
Rows Removed by Join Filter: 3
@@ -3628,7 +3612,7 @@ create table pp_recpart_23 partition of pp_recpart for values in ('(2,3)');
explain (costs off) select * from pp_recpart where a = '(1,1)'::pp_rectype;
QUERY PLAN
-------------------------------------------
- Gather Motion 3:1 (slice1; segments: 3)
+ Gather Motion 1:1 (slice1; segments: 1)
-> Dynamic Seq Scan on pp_recpart
Number of partitions to scan: 1
Filter: (a = '(1,1)'::pp_rectype)
diff --git a/src/test/regress/expected/subselect_optimizer.out b/src/test/regress/expected/subselect_optimizer.out
index b50164c455..643cca693f 100644
--- a/src/test/regress/expected/subselect_optimizer.out
+++ b/src/test/regress/expected/subselect_optimizer.out
@@ -1016,28 +1016,26 @@ analyze exists_tbl;
explain (costs off)
select * from exists_tbl t1
where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
- QUERY PLAN
-------------------------------------------------------------------------------
+ QUERY PLAN
+-------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
-> Result
- Filter: ((COALESCE((count()), '0'::bigint) > '0'::bigint) OR (exists_tbl_null.c3 < 0))
+ Filter: ((COALESCE((count()), '0'::bigint) > '0'::bigint) OR (exists_tbl.c3 < 0))
-> Hash Left Join
- Hash Cond: (exists_tbl_null.c1 = exists_tbl_null_1.c2)
- -> Append
- -> Seq Scan on exists_tbl_null
- -> Seq Scan on exists_tbl_def
+ Hash Cond: (exists_tbl.c1 = exists_tbl_1.c2)
+ -> Dynamic Seq Scan on exists_tbl
+ Number of partitions to scan: 2
-> Hash
-> GroupAggregate
- Group Key: exists_tbl_null_1.c2
+ Group Key: exists_tbl_1.c2
-> Sort
- Sort Key: exists_tbl_null_1.c2
+ Sort Key: exists_tbl_1.c2
-> Redistribute Motion 3:3 (slice2; segments: 3)
- Hash Key: exists_tbl_null_1.c2
- -> Append
- -> Seq Scan on exists_tbl_null exists_tbl_null_1
- -> Seq Scan on exists_tbl_def exists_tbl_def_1
- Optimizer: Postgres query optimizer
-(19 rows)
+ Hash Key: exists_tbl_1.c2
+ -> Dynamic Seq Scan on exists_tbl exists_tbl_1
+ Number of partitions to scan: 2
+ Optimizer: Pivotal Optimizer (GPORCA)
+(17 rows)
select * from exists_tbl t1
where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0);
diff --git a/src/test/regress/sql/bfv_partition_plans.sql b/src/test/regress/sql/bfv_partition_plans.sql
index c730d50d8c..a60fd0adc8 100644
--- a/src/test/regress/sql/bfv_partition_plans.sql
+++ b/src/test/regress/sql/bfv_partition_plans.sql
@@ -105,6 +105,7 @@ insert into mpp23195_t1 values (generate_series(1,19));
insert into mpp23195_t2 values (1);
-- TEST
+-- Operator Fallback: InnerIndexNestLoopJoin may have wrong plan not supported
select find_operator('select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;', 'Dynamic Index Scan');
select * from mpp23195_t1,mpp23195_t2 where mpp23195_t1.i < mpp23195_t2.i;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org