This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new baf16be610b IGNITE-28213 Enable JOIN_PUSH_TRANSITIVE_PREDICATES rule
(#7766)
baf16be610b is described below
commit baf16be610b321ad5ff521356f65445ed05b02d3
Author: Andrew V. Mashenkov <[email protected]>
AuthorDate: Mon Mar 30 11:36:16 2026 +0300
IGNITE-28213 Enable JOIN_PUSH_TRANSITIVE_PREDICATES rule (#7766)
---
.../internal/sql/engine/prepare/PlannerPhase.java | 1 +
.../planner/PredicatePushDownPlannerTest.java | 23 ++++
.../src/test/resources/mapping/correlated.test | 5 +-
.../resources/mapping/test_partition_pruning.test | 27 ++--
.../src/test/resources/tpcds/plan/q1.plan | 63 ++++-----
.../src/test/resources/tpcds/plan/q16.plan | 27 ++--
.../src/test/resources/tpcds/plan/q2.plan | 79 +++++------
.../src/test/resources/tpcds/plan/q31.plan | 8 +-
.../src/test/resources/tpcds/plan/q59.plan | 65 ++++-----
.../src/test/resources/tpcds/plan/q6.plan | 26 ++--
.../src/test/resources/tpcds/plan/q78.plan | 146 +++++++++++----------
.../src/test/resources/tpcds/plan/q85.plan | 116 ++++++++--------
.../src/test/resources/tpcds/plan/q94.plan | 27 ++--
13 files changed, 329 insertions(+), 284 deletions(-)
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerPhase.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerPhase.java
index 93161a67e8d..303f08400a4 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerPhase.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PlannerPhase.java
@@ -205,6 +205,7 @@ public enum PlannerPhase {
CoreRules.JOIN_PUSH_EXPRESSIONS,
IgniteJoinConditionPushRule.INSTANCE,
+ CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES,
FilterIntoJoinRule.FilterIntoJoinRuleConfig.DEFAULT
.withOperandSupplier(b0 ->
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PredicatePushDownPlannerTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PredicatePushDownPlannerTest.java
index 140e4346192..778932e3175 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PredicatePushDownPlannerTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/PredicatePushDownPlannerTest.java
@@ -53,6 +53,29 @@ public class PredicatePushDownPlannerTest extends
AbstractPlannerTest {
}
+ @Test
+ protected void transitivePredicatePushedDownToJoinSources() throws
Exception {
+ IgniteSchema schema = createSchema(
+ createTable("T1"),
+ createTable("T2")
+ );
+
+ String sql = ""
+ + " SELECT * "
+ + " FROM t1 "
+ + " JOIN t2 ON t1.c1 = t2.c1"
+ + " WHERE t1.c1 = 10";
+
+ assertPlan(sql, schema, nodeOrAnyChild(isInstanceOf(Join.class))
+
.and(hasChildThat(isInstanceOf(ProjectableFilterableTableScan.class)
+ .and(scan ->
scan.condition().toString().contains("=($t0, 10)")
+ &&
scan.getTable().getQualifiedName().contains("T1"))))
+
.and(hasChildThat(isInstanceOf(ProjectableFilterableTableScan.class)
+ .and(scan ->
scan.condition().toString().contains("=($t0, 10)")
+ &&
scan.getTable().getQualifiedName().contains("T2"))))
+ );
+ }
+
private static IgniteTable createTable(String tableName) {
return TestBuilders.table()
.name(tableName)
diff --git a/modules/sql-engine/src/test/resources/mapping/correlated.test
b/modules/sql-engine/src/test/resources/mapping/correlated.test
index 70d95670e3e..4fd6027d50e 100644
--- a/modules/sql-engine/src/test/resources/mapping/correlated.test
+++ b/modules/sql-engine/src/test/resources/mapping/correlated.test
@@ -280,12 +280,13 @@ Fragment#3
Sender
distribution: single
targetFragmentId: 2
- est: (rows=100008)
+ est: (rows=1)
TableScan
table: PUBLIC.T_N1
+ predicate: =(MOD(CAST(ID):BIGINT NOT NULL, 10), 0)
fieldNames: [C1, ID0]
projection: [C1, CAST(ID):BIGINT NOT NULL]
- est: (rows=100008)
+ est: (rows=1)
---
N0
diff --git
a/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test
b/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test
index 0bafb7ce56e..d0932226f45 100644
--- a/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test
+++ b/modules/sql-engine/src/test/resources/mapping/test_partition_pruning.test
@@ -164,6 +164,7 @@ Fragment#4
est: (rows=1)
---
# Self join, different predicates that produce disjoint set of partitions
+# TODO https://issues.apache.org/jira/browse/IGNITE-28389: Fix the test. We
expect the mapper should eliminate all the disjoined parts.
N1
SELECT /*+ DISABLE_RULE('NestedLoopJoinConverter', 'HashJoinConverter',
'CorrelatedNestedLoopJoin') */ *
FROM t1_n1n2n3 as t1, t1_n1n2n3 as t2
@@ -172,7 +173,7 @@ SELECT /*+ DISABLE_RULE('NestedLoopJoinConverter',
'HashJoinConverter', 'Correla
Fragment#2 root
distribution: single
executionNodes: [N1]
- exchangeSourceNodes: {3=[N2, N3]}
+ exchangeSourceNodes: {3=[N1, N2, N3]}
colocationGroup[-1]: {nodes=[N1], sourceIds=[-1, 3], assignments={},
partitionsWithConsistencyTokens={N1=[]}}
colocationGroup[3]: {nodes=[N1], sourceIds=[-1, 3], assignments={},
partitionsWithConsistencyTokens={N1=[]}}
tree:
@@ -183,37 +184,37 @@ Fragment#2 root
Fragment#3
distribution: table PUBLIC.T1_N1N2N3 in zone ZONE_1
- executionNodes: [N2, N3]
+ executionNodes: [N1, N2, N3]
targetNodes: [N1]
- colocationGroup[0]: {nodes=[N2], sourceIds=[0], assignments={part_1=N2:3},
partitionsWithConsistencyTokens={N2=[part_1:3]}}
- colocationGroup[1]: {nodes=[N3], sourceIds=[1], assignments={part_2=N3:3},
partitionsWithConsistencyTokens={N3=[part_2:3]}}
- partitions: [T1_N1N2N3=[N2={1}, N3={2}]]
+ colocationGroup[0]: {nodes=[N1, N2, N3], sourceIds=[0, 1],
assignments={part_0=N1:3, part_1=N2:3, part_2=N3:3},
partitionsWithConsistencyTokens={N1=[part_0:3], N2=[part_1:3], N3=[part_2:3]}}
+ colocationGroup[1]: {nodes=[N1, N2, N3], sourceIds=[0, 1],
assignments={part_0=N1:3, part_1=N2:3, part_2=N3:3},
partitionsWithConsistencyTokens={N1=[part_0:3], N2=[part_1:3], N3=[part_2:3]}}
+ partitions: [T1_N1N2N3=[N1={0}, N2={1}, N3={2}]]
tree:
Sender
distribution: single
targetFragmentId: 2
- est: (rows=32316)
+ est: (rows=6250)
MergeJoin
predicate: =(ID, ID$0)
fieldNames: [ID, C1, C2, ID$0, C1$0, C2$0]
type: inner
- est: (rows=32316)
+ est: (rows=6250)
Sort
collation: [ID ASC]
- est: (rows=56847)
+ est: (rows=25000)
TableScan
table: PUBLIC.T1_N1N2N3
- predicate: SEARCH(ID, Sarg[1, 3])
+ predicate: false
fieldNames: [ID, C1, C2]
- est: (rows=56847)
+ est: (rows=25000)
Sort
collation: [ID ASC]
- est: (rows=56847)
+ est: (rows=25000)
TableScan
table: PUBLIC.T1_N1N2N3
- predicate: SEARCH(ID, Sarg[42, 44])
+ predicate: false
fieldNames: [ID, C1, C2]
- est: (rows=56847)
+ est: (rows=25000)
---
# Correlated
# Prune partitions from left arm statically, and pass meta to the right arm.
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q1.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q1.plan
index 9251c0f581d..b7f9579bab6 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q1.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q1.plan
@@ -4,11 +4,11 @@ Limit
Project
fieldNames: [C_CUSTOMER_ID]
projection: [C_CUSTOMER_ID]
- est: (rows=26702964)
+ est: (rows=24032667)
HashJoin
predicate: =(CTR_CUSTOMER_SK, C_CUSTOMER_SK)
type: inner
- est: (rows=26702964)
+ est: (rows=24032667)
Exchange
distribution: single
est: (rows=100000)
@@ -22,7 +22,7 @@ Limit
MergeJoin
predicate: =(S_STORE_SK, CTR_STORE_SK)
type: inner
- est: (rows=26702964)
+ est: (rows=24032667)
Exchange
distribution: single
est: (rows=4)
@@ -38,38 +38,41 @@ Limit
predicate: AND(=(CTR_STORE_SK, CTR_STORE_SK$0),
>(CAST(CTR_TOTAL_RETURN):DECIMAL(30, 17), *($f1, 1.2:DECIMAL(2, 1))))
fieldNames: [CTR_CUSTOMER_SK, CTR_STORE_SK, CTR_TOTAL_RETURN,
CTR_STORE_SK$0, $f1]
type: inner
- est: (rows=80189081)
+ est: (rows=72170173)
Sort
collation: [CTR_STORE_SK ASC]
- est: (rows=34467)
- ColocatedHashAggregate
- fieldNames: [CTR_CUSTOMER_SK, CTR_STORE_SK, CTR_TOTAL_RETURN]
- group: [CTR_CUSTOMER_SK, CTR_STORE_SK]
- aggregation: [SUM(SR_FEE)]
- est: (rows=34467)
- Project
- fieldNames: [CTR_CUSTOMER_SK, CTR_STORE_SK, SR_FEE]
- projection: [SR_CUSTOMER_SK, SR_STORE_SK, SR_FEE]
- est: (rows=95742)
- HashJoin
- predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
- type: inner
+ est: (rows=31020)
+ Filter
+ predicate: IS NOT NULL(CTR_STORE_SK)
+ est: (rows=31020)
+ ColocatedHashAggregate
+ fieldNames: [CTR_CUSTOMER_SK, CTR_STORE_SK, CTR_TOTAL_RETURN]
+ group: [CTR_CUSTOMER_SK, CTR_STORE_SK]
+ aggregation: [SUM(SR_FEE)]
+ est: (rows=34467)
+ Project
+ fieldNames: [CTR_CUSTOMER_SK, CTR_STORE_SK, SR_FEE]
+ projection: [SR_CUSTOMER_SK, SR_STORE_SK, SR_FEE]
est: (rows=95742)
- Exchange
- distribution: single
- est: (rows=287514)
- TableScan
- table: PUBLIC.STORE_RETURNS
- fieldNames: [SR_RETURNED_DATE_SK, SR_CUSTOMER_SK,
SR_STORE_SK, SR_FEE]
+ HashJoin
+ predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+ type: inner
+ est: (rows=95742)
+ Exchange
+ distribution: single
est: (rows=287514)
- Exchange
- distribution: single
- est: (rows=24325)
- TableScan
- table: PUBLIC.DATE_DIM
- predicate: =(D_YEAR, 2000)
- fieldNames: [D_DATE_SK, D_YEAR]
+ TableScan
+ table: PUBLIC.STORE_RETURNS
+ fieldNames: [SR_RETURNED_DATE_SK, SR_CUSTOMER_SK,
SR_STORE_SK, SR_FEE]
+ est: (rows=287514)
+ Exchange
+ distribution: single
est: (rows=24325)
+ TableScan
+ table: PUBLIC.DATE_DIM
+ predicate: =(D_YEAR, 2000)
+ fieldNames: [D_DATE_SK, D_YEAR]
+ est: (rows=24325)
ColocatedHashAggregate
fieldNames: [CTR_STORE_SK, $f1]
group: [CTR_STORE_SK]
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
index 9ce2e36a302..9c96df5f528 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
@@ -4,56 +4,57 @@ Sort
est: (rows=100)
Project
projection: [order count, CAST(total shipping cost):DECIMAL(14, 2),
CAST(total net profit):DECIMAL(14, 2)]
- est: (rows=981399350335625)
+ est: (rows=883259415302063)
ColocatedSortAggregate
fieldNames: [order count, total shipping cost, total net profit]
collation: []
group: []
aggregation: [COUNT(CS_ORDER_NUMBER), SUM(total shipping cost),
SUM(total net profit)]
- est: (rows=981399350335625)
+ est: (rows=883259415302063)
ColocatedSortAggregate
fieldNames: [CS_ORDER_NUMBER, total shipping cost, total net profit]
collation: [CS_ORDER_NUMBER ASC]
group: [CS_ORDER_NUMBER]
aggregation: [SUM(CS_EXT_SHIP_COST), SUM(CS_NET_PROFIT)]
- est: (rows=981399350335625)
+ est: (rows=883259415302063)
Project
fieldNames: [CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
projection: [CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
- est: (rows=4906996751678128)
+ est: (rows=4416297076510316)
Filter
predicate: IS NULL($f1)
- est: (rows=4906996751678128)
+ est: (rows=4416297076510316)
MergeJoin
predicate: =(CS_ORDER_NUMBER, CR_ORDER_NUMBER)
type: left
- est: (rows=19627987006712512)
+ est: (rows=17665188306041262)
HashJoin
predicate: AND(=(CS_WAREHOUSE_SK, CS_WAREHOUSE_SK0),
=(CS_ORDER_NUMBER, CS_ORDER_NUMBER0))
type: inner
- est: (rows=4540509525340)
+ est: (rows=4086458572806)
HashJoin
predicate: =(CS_CALL_CENTER_SK, CC_CALL_CENTER_SK)
type: inner
- est: (rows=120009)
+ est: (rows=108008)
HashJoin
predicate: =(CS_SHIP_ADDR_SK, CA_ADDRESS_SK)
type: inner
- est: (rows=120009)
+ est: (rows=108008)
HashJoin
predicate: =(CS_SHIP_DATE_SK, D_DATE_SK)
type: inner
- est: (rows=360387)
+ est: (rows=324348)
Exchange
distribution: single
- est: (rows=1441548)
+ est: (rows=1297393)
Sort
collation: [CS_ORDER_NUMBER ASC, CS_WAREHOUSE_SK
ASC]
- est: (rows=1441548)
+ est: (rows=1297393)
TableScan
table: PUBLIC.CATALOG_SALES
+ predicate: IS NOT NULL(CS_WAREHOUSE_SK)
fieldNames: [CS_SHIP_DATE_SK, CS_SHIP_ADDR_SK,
CS_CALL_CENTER_SK, CS_WAREHOUSE_SK, CS_ORDER_NUMBER, CS_EXT_SHIP_COST,
CS_NET_PROFIT]
- est: (rows=1441548)
+ est: (rows=1297393)
Exchange
distribution: single
est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q2.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q2.plan
index 427680a7b34..aed9add3960 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q2.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q2.plan
@@ -1,11 +1,11 @@
Project
fieldNames: [D_WEEK_SEQ1, EXPR$1, EXPR$2, EXPR$3, EXPR$4, EXPR$5, EXPR$6,
EXPR$7]
projection: [D_WEEK_SEQ1, ROUND(/(SUN_SALES1, SUN_SALES2), 2),
ROUND(/(MON_SALES1, MON_SALES2), 2), ROUND(/(TUE_SALES1, TUE_SALES2), 2),
ROUND(/(WED_SALES1, WED_SALES2), 2), ROUND(/(THU_SALES1, THU_SALES2), 2),
ROUND(/(FRI_SALES1, FRI_SALES2), 2), ROUND(/(SAT_SALES1, SAT_SALES2), 2)]
- est: (rows=44786183521985440000000000)
+ est: (rows=36276808652808206000000000)
HashJoin
predicate: =(D_WEEK_SEQ1, $f8)
type: inner
- est: (rows=44786183521985440000000000)
+ est: (rows=36276808652808206000000000)
Project
fieldNames: [D_WEEK_SEQ1, SUN_SALES1, MON_SALES1, TUE_SALES1,
WED_SALES1, THU_SALES1, FRI_SALES1, SAT_SALES1]
projection: [D_WEEK_SEQ$0, SUN_SALES, MON_SALES, TUE_SALES, WED_SALES,
THU_SALES, FRI_SALES, SAT_SALES]
@@ -68,53 +68,56 @@ Project
Project
fieldNames: [D_WEEK_SEQ2, SUN_SALES2, MON_SALES2, TUE_SALES2,
WED_SALES2, THU_SALES2, FRI_SALES2, SAT_SALES2, $f8]
projection: [D_WEEK_SEQ$0, SUN_SALES, MON_SALES, TUE_SALES, WED_SALES,
THU_SALES, FRI_SALES, SAT_SALES, -(D_WEEK_SEQ$0, 53)]
- est: (rows=17279310079203)
+ est: (rows=13996241164154)
HashJoin
predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
fieldNames: [D_WEEK_SEQ, D_YEAR, D_WEEK_SEQ$0, SUN_SALES, MON_SALES,
TUE_SALES, WED_SALES, THU_SALES, FRI_SALES, SAT_SALES]
type: inner
- est: (rows=17279310079203)
+ est: (rows=13996241164154)
Exchange
distribution: single
- est: (rows=24325)
+ est: (rows=21893)
TableScan
table: PUBLIC.DATE_DIM
- predicate: =(D_YEAR, 1999)
+ predicate: AND(=(D_YEAR, 1999), IS NOT NULL(D_WEEK_SEQ))
fieldNames: [D_WEEK_SEQ, D_YEAR]
- est: (rows=24325)
- ColocatedHashAggregate
- fieldNames: [D_WEEK_SEQ, SUN_SALES, MON_SALES, TUE_SALES,
WED_SALES, THU_SALES, FRI_SALES, SAT_SALES]
- group: [D_WEEK_SEQ]
- aggregation: [SUM($f1), SUM($f2), SUM($f3), SUM($f4), SUM($f5),
SUM($f6), SUM($f7)]
- est: (rows=4735617650)
- Project
- fieldNames: [D_WEEK_SEQ, $f1, $f2, $f3, $f4, $f5, $f6, $f7]
- projection: [D_WEEK_SEQ, CASE(=(D_DAY_NAME, _UTF-8'Sunday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Monday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Tuesday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Wednesday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Thursday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Friday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'S [...]
- est: (rows=23678088250)
- HashJoin
- predicate: =(D_DATE_SK, SOLD_DATE_SK)
- type: inner
+ est: (rows=21893)
+ Filter
+ predicate: IS NOT NULL(D_WEEK_SEQ)
+ est: (rows=4262055885)
+ ColocatedHashAggregate
+ fieldNames: [D_WEEK_SEQ, SUN_SALES, MON_SALES, TUE_SALES,
WED_SALES, THU_SALES, FRI_SALES, SAT_SALES]
+ group: [D_WEEK_SEQ]
+ aggregation: [SUM($f1), SUM($f2), SUM($f3), SUM($f4), SUM($f5),
SUM($f6), SUM($f7)]
+ est: (rows=4735617650)
+ Project
+ fieldNames: [D_WEEK_SEQ, $f1, $f2, $f3, $f4, $f5, $f6, $f7]
+ projection: [D_WEEK_SEQ, CASE(=(D_DAY_NAME, _UTF-8'Sunday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Monday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Tuesday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Wednesday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Thursday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8'Friday'),
SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME, _UTF-8 [...]
est: (rows=23678088250)
- UnionAll
- est: (rows=2160932)
- Exchange
- distribution: single
- est: (rows=719384)
- TableScan
- table: PUBLIC.WEB_SALES
- fieldNames: [SOLD_DATE_SK, SALES_PRICE]
+ HashJoin
+ predicate: =(D_DATE_SK, SOLD_DATE_SK)
+ type: inner
+ est: (rows=23678088250)
+ UnionAll
+ est: (rows=2160932)
+ Exchange
+ distribution: single
est: (rows=719384)
+ TableScan
+ table: PUBLIC.WEB_SALES
+ fieldNames: [SOLD_DATE_SK, SALES_PRICE]
+ est: (rows=719384)
+ Exchange
+ distribution: single
+ est: (rows=1441548)
+ TableScan
+ table: PUBLIC.CATALOG_SALES
+ fieldNames: [SOLD_DATE_SK, SALES_PRICE]
+ est: (rows=1441548)
Exchange
distribution: single
- est: (rows=1441548)
- TableScan
- table: PUBLIC.CATALOG_SALES
- fieldNames: [SOLD_DATE_SK, SALES_PRICE]
- est: (rows=1441548)
- Exchange
- distribution: single
- est: (rows=73049)
- TableScan
- table: PUBLIC.DATE_DIM
- fieldNames: [D_DATE_SK, D_WEEK_SEQ, D_DAY_NAME]
est: (rows=73049)
+ TableScan
+ table: PUBLIC.DATE_DIM
+ fieldNames: [D_DATE_SK, D_WEEK_SEQ, D_DAY_NAME]
+ est: (rows=73049)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q31.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q31.plan
index e69f365a348..2d49f4b9b73 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q31.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q31.plan
@@ -1,12 +1,12 @@
Project
fieldNames: [CA_COUNTY, D_YEAR, WEB_Q1_Q2_INCREASE, STORE_Q1_Q2_INCREASE,
WEB_Q2_Q3_INCREASE, STORE_Q2_Q3_INCREASE]
projection: [CA_COUNTY, D_YEAR, /(WEB_SALES, WEB_SALES$0),
/(STORE_SALES$0, STORE_SALES), /(WEB_SALES$0$0, WEB_SALES), /(STORE_SALES$0$0,
STORE_SALES$0)]
- est: (rows=1060299571221102000000000)
+ est: (rows=159044935683165300000000)
HashJoin
predicate: AND(CASE(>(STORE_SALES, 0.00), CASE(>(WEB_SALES$0, 0.00),
>(/(WEB_SALES, WEB_SALES$0), /(STORE_SALES$0, STORE_SALES)), false), false),
=(CA_COUNTY, CA_COUNTY$0$0$0))
fieldNames: [CA_COUNTY, D_QOY, D_YEAR, STORE_SALES, CA_COUNTY$0,
D_QOY$0, D_YEAR$0, STORE_SALES$0, CA_COUNTY$0$0, D_QOY$0$0, D_YEAR$0$0,
STORE_SALES$0$0, CA_COUNTY$1, D_QOY$1, D_YEAR$1, WEB_SALES, CA_COUNTY$0$0$0,
D_QOY$0$0$0, D_YEAR$0$0$0, WEB_SALES$0, CA_COUNTY$0$0$0$0, D_QOY$0$0$0$0,
D_YEAR$0$0$0$0, WEB_SALES$0$0]
type: inner
- est: (rows=1060299571221102000000000)
+ est: (rows=159044935683165300000000)
Sort
collation: [D_YEAR ASC]
est: (rows=155870)
@@ -50,10 +50,10 @@ Project
fieldNames: [CA_ADDRESS_SK, CA_COUNTY]
est: (rows=50000)
HashJoin
- predicate: AND(CASE(>(STORE_SALES, 0.00), CASE(>(WEB_SALES, 0.00),
>(/(WEB_SALES$0$0, WEB_SALES), /(STORE_SALES$0, STORE_SALES)), false), false),
=(CA_COUNTY$0$0, CA_COUNTY))
+ predicate: AND(CASE(>(STORE_SALES, 0.00), CASE(>(WEB_SALES, 0.00),
>(/(WEB_SALES$0$0, WEB_SALES), /(STORE_SALES$0, STORE_SALES)), false), false),
=(CA_COUNTY$0, CA_COUNTY$0$0), =(CA_COUNTY, CA_COUNTY$0$0$0))
fieldNames: [CA_COUNTY, D_QOY, D_YEAR, STORE_SALES, CA_COUNTY$0,
D_QOY$0, D_YEAR$0, STORE_SALES$0, CA_COUNTY$1, D_QOY$1, D_YEAR$1, WEB_SALES,
CA_COUNTY$0$0, D_QOY$0$0, D_YEAR$0$0, WEB_SALES$0, CA_COUNTY$0$0$0,
D_QOY$0$0$0, D_YEAR$0$0$0, WEB_SALES$0$0]
type: inner
- est: (rows=181399307039732700000)
+ est: (rows=27209896055959904000)
HashJoin
predicate: =(CA_COUNTY, CA_COUNTY$0)
fieldNames: [CA_COUNTY, D_QOY, D_YEAR, STORE_SALES, CA_COUNTY$0,
D_QOY$0, D_YEAR$0, STORE_SALES$0]
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q59.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q59.plan
index b860efe7d5a..dbc932e941e 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q59.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q59.plan
@@ -4,11 +4,11 @@ Limit
Project
fieldNames: [S_STORE_NAME1, S_STORE_ID1, D_WEEK_SEQ1, EXPR$3, EXPR$4,
EXPR$5, EXPR$6, EXPR$7, EXPR$8, EXPR$9]
projection: [S_STORE_NAME1, S_STORE_ID1, D_WEEK_SEQ1, /(SUN_SALES1,
SUN_SALES2), /(MON_SALES1, MON_SALES2), /(TUE_SALES1, TUE_SALES2),
/(WED_SALES1, WED_SALES2), /(THU_SALES1, THU_SALES2), /(FRI_SALES1,
FRI_SALES2), /(SAT_SALES1, SAT_SALES2)]
- est: (rows=181545469684679584)
+ est: (rows=147051830444590464)
HashJoin
predicate: AND(=(S_STORE_ID1, S_STORE_ID2), =(D_WEEK_SEQ1, $f9))
type: inner
- est: (rows=181545469684679584)
+ est: (rows=147051830444590464)
Sort
collation: [S_STORE_NAME1 ASC, S_STORE_ID1 ASC, D_WEEK_SEQ1 ASC]
est: (rows=2840543529)
@@ -70,24 +70,24 @@ Limit
Project
fieldNames: [D_WEEK_SEQ2, S_STORE_ID2, SUN_SALES2, MON_SALES2,
TUE_SALES2, WED_SALES2, THU_SALES2, FRI_SALES2, SAT_SALES2, $f9]
projection: [D_WEEK_SEQ$0, S_STORE_ID, SUN_SALES, MON_SALES,
TUE_SALES, WED_SALES, THU_SALES, FRI_SALES, SAT_SALES, -(D_WEEK_SEQ$0, 52)]
- est: (rows=2840543529)
+ est: (rows=2300840259)
HashJoin
predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
fieldNames: [D_MONTH_SEQ, D_WEEK_SEQ, S_STORE_SK, S_STORE_ID,
D_WEEK_SEQ$0, SS_STORE_SK, SUN_SALES, MON_SALES, TUE_SALES, WED_SALES,
THU_SALES, FRI_SALES, SAT_SALES]
type: inner
- est: (rows=2840543529)
+ est: (rows=2300840259)
Exchange
distribution: single
- est: (rows=18262)
+ est: (rows=16436)
TableScan
table: PUBLIC.DATE_DIM
- predicate: SEARCH(D_MONTH_SEQ, Sarg[[1217..1228]])
+ predicate: AND(SEARCH(D_MONTH_SEQ, Sarg[[1217..1228]]), IS NOT
NULL(D_WEEK_SEQ))
fieldNames: [D_MONTH_SEQ, D_WEEK_SEQ]
- est: (rows=18262)
+ est: (rows=16436)
HashJoin
predicate: =(SS_STORE_SK, S_STORE_SK)
type: inner
- est: (rows=1036945)
+ est: (rows=933251)
Exchange
distribution: single
est: (rows=12)
@@ -95,30 +95,33 @@ Limit
table: PUBLIC.STORE
fieldNames: [S_STORE_SK, S_STORE_ID]
est: (rows=12)
- ColocatedHashAggregate
- fieldNames: [D_WEEK_SEQ, SS_STORE_SK, SUN_SALES, MON_SALES,
TUE_SALES, WED_SALES, THU_SALES, FRI_SALES, SAT_SALES]
- group: [D_WEEK_SEQ, SS_STORE_SK]
- aggregation: [SUM($f2), SUM($f3), SUM($f4), SUM($f5),
SUM($f6), SUM($f7), SUM($f8)]
- est: (rows=1036945)
- Project
- fieldNames: [D_WEEK_SEQ, SS_STORE_SK, $f2, $f3, $f4, $f5,
$f6, $f7, $f8]
- projection: [D_WEEK_SEQ, SS_STORE_SK, CASE(=(D_DAY_NAME,
_UTF-8'Sunday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Monday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Tuesday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Wednesday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Thursday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Friday'), SS_SALES_PRICE, null:DECIMAL( [...]
- est: (rows=2880404)
- HashJoin
- predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
- type: inner
+ Filter
+ predicate: IS NOT NULL(D_WEEK_SEQ)
+ est: (rows=933251)
+ ColocatedHashAggregate
+ fieldNames: [D_WEEK_SEQ, SS_STORE_SK, SUN_SALES, MON_SALES,
TUE_SALES, WED_SALES, THU_SALES, FRI_SALES, SAT_SALES]
+ group: [D_WEEK_SEQ, SS_STORE_SK]
+ aggregation: [SUM($f2), SUM($f3), SUM($f4), SUM($f5),
SUM($f6), SUM($f7), SUM($f8)]
+ est: (rows=1036945)
+ Project
+ fieldNames: [D_WEEK_SEQ, SS_STORE_SK, $f2, $f3, $f4, $f5,
$f6, $f7, $f8]
+ projection: [D_WEEK_SEQ, SS_STORE_SK, CASE(=(D_DAY_NAME,
_UTF-8'Sunday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Monday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Tuesday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Wednesday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Thursday'), SS_SALES_PRICE, null:DECIMAL(7, 2)), CASE(=(D_DAY_NAME,
_UTF-8'Friday'), SS_SALES_PRICE, null:DECIMA [...]
est: (rows=2880404)
- Exchange
- distribution: single
+ HashJoin
+ predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
+ type: inner
est: (rows=2880404)
- TableScan
- table: PUBLIC.STORE_SALES
- fieldNames: [SS_SOLD_DATE_SK, SS_STORE_SK,
SS_SALES_PRICE]
+ Exchange
+ distribution: single
est: (rows=2880404)
- Exchange
- distribution: single
- est: (rows=73049)
- TableScan
- table: PUBLIC.DATE_DIM
- fieldNames: [D_DATE_SK, D_WEEK_SEQ, D_DAY_NAME]
+ TableScan
+ table: PUBLIC.STORE_SALES
+ fieldNames: [SS_SOLD_DATE_SK, SS_STORE_SK,
SS_SALES_PRICE]
+ est: (rows=2880404)
+ Exchange
+ distribution: single
est: (rows=73049)
+ TableScan
+ table: PUBLIC.DATE_DIM
+ fieldNames: [D_DATE_SK, D_WEEK_SEQ, D_DAY_NAME]
+ est: (rows=73049)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q6.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q6.plan
index cefb1e0e8f1..6424334f626 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q6.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q6.plan
@@ -4,36 +4,40 @@ Sort
est: (rows=100)
Filter
predicate: >=(CNT, 10)
- est: (rows=28746)
+ est: (rows=25872)
ColocatedHashAggregate
fieldNames: [STATE, CNT]
group: [STATE]
aggregation: [COUNT()]
- est: (rows=57493)
+ est: (rows=51744)
Project
fieldNames: [STATE]
projection: [CA_STATE]
- est: (rows=287465)
+ est: (rows=258718)
HashJoin
predicate: =(C_CUSTOMER_SK, SS_CUSTOMER_SK)
type: inner
- est: (rows=287465)
+ est: (rows=258718)
HashJoin
predicate: =(SS_ITEM_SK, I_ITEM_SK)
type: inner
- est: (rows=287465)
+ est: (rows=258718)
HashJoin
predicate: AND(=(I_CATEGORY, I_CATEGORY$0),
>(CAST(I_CURRENT_PRICE):DECIMAL(23, 17), *(1.2:DECIMAL(2, 1), EXPR$0)))
fieldNames: [I_ITEM_SK, I_CURRENT_PRICE, I_CATEGORY,
I_CATEGORY$0, EXPR$0]
type: inner
- est: (rows=4374000)
+ est: (rows=3936600)
Exchange
distribution: single
- est: (rows=18000)
- TableScan
- table: PUBLIC.ITEM
- fieldNames: [I_ITEM_SK, I_CURRENT_PRICE, I_CATEGORY]
- est: (rows=18000)
+ est: (rows=16200)
+ Sort
+ collation: [I_ITEM_SK ASC]
+ est: (rows=16200)
+ TableScan
+ table: PUBLIC.ITEM
+ predicate: IS NOT NULL(I_CATEGORY)
+ fieldNames: [I_ITEM_SK, I_CURRENT_PRICE, I_CATEGORY]
+ est: (rows=16200)
Project
fieldNames: [I_CATEGORY, EXPR$0]
projection: [f0, DECIMAL_DIVIDE(CAST(f0_1):DECIMAL(14, 2),
f1_2, 21, 16)]
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q78.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q78.plan
index 07699e582b6..c5a6fa3a2d5 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q78.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q78.plan
@@ -5,18 +5,18 @@ Sort
Project
fieldNames: [SS_CUSTOMER_SK, RATIO, STORE_QTY, STORE_WHOLESALE_COST,
STORE_SALES_PRICE, OTHER_CHAN_QTY, OTHER_CHAN_WHOLESALE_COST,
OTHER_CHAN_SALES_PRICE]
projection: [SS_CUSTOMER_SK, ROUND(/(SS_QTY, +(CASE(IS NOT NULL(WS_QTY),
CAST(WS_QTY):BIGINT NOT NULL, 0:BIGINT), CASE(IS NOT NULL(CS_QTY),
CAST(CS_QTY):BIGINT NOT NULL, 0:BIGINT))), 2), SS_QTY, SS_WC, SS_SP, +(CASE(IS
NOT NULL(WS_QTY), CAST(WS_QTY):BIGINT NOT NULL, 0:BIGINT), CASE(IS NOT
NULL(CS_QTY), CAST(CS_QTY):BIGINT NOT NULL, 0:BIGINT)), +(CASE(IS NOT
NULL(WS_WC), CAST(WS_WC):DECIMAL(14, 2) NOT NULL, 0.00:DECIMAL(14, 2)), CASE(IS
NOT NULL(CS_WC), CAST(CS_WC):DECIMAL(14, 2) NO [...]
- est: (rows=5169421725)
+ est: (rows=119648002)
Filter
predicate: OR(>(CAST(WS_QTY):BIGINT NOT NULL, 0),
>(CAST(CS_QTY):BIGINT NOT NULL, 0))
- est: (rows=5169421725)
+ est: (rows=119648002)
MergeJoin
predicate: AND(=(CS_SOLD_YEAR, SS_SOLD_YEAR), =(CS_ITEM_SK,
SS_ITEM_SK), =(CS_CUSTOMER_SK, SS_CUSTOMER_SK))
type: left
- est: (rows=20677686899)
+ est: (rows=478592006)
MergeJoin
predicate: AND(=(WS_SOLD_YEAR, SS_SOLD_YEAR), =(WS_ITEM_SK,
SS_ITEM_SK), =(WS_CUSTOMER_SK, SS_CUSTOMER_SK))
type: left
- est: (rows=34778483)
+ est: (rows=5315903)
Sort
collation: [SS_SOLD_YEAR ASC, SS_ITEM_SK ASC, SS_CUSTOMER_SK ASC]
est: (rows=117019)
@@ -64,41 +64,91 @@ Sort
est: (rows=24325)
Sort
collation: [WS_SOLD_YEAR ASC, WS_ITEM_SK ASC, WS_CUSTOMER_SK ASC]
- est: (rows=87765)
+ est: (rows=13165)
+ Filter
+ predicate: =(WS_SOLD_YEAR, 2001)
+ est: (rows=13165)
+ ColocatedHashAggregate
+ fieldNames: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK,
WS_QTY, WS_WC, WS_SP]
+ group: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK]
+ aggregation: [SUM(WS_QUANTITY), SUM(WS_WHOLESALE_COST),
SUM(WS_SALES_PRICE)]
+ est: (rows=87765)
+ Project
+ fieldNames: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK,
WS_QUANTITY, WS_WHOLESALE_COST, WS_SALES_PRICE]
+ projection: [D_YEAR, WS_ITEM_SK, WS_BILL_CUSTOMER_SK,
WS_QUANTITY, WS_WHOLESALE_COST, WS_SALES_PRICE]
+ est: (rows=179846)
+ HashJoin
+ predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+ type: inner
+ est: (rows=179846)
+ Filter
+ predicate: IS NULL(WR_ORDER_NUMBER)
+ est: (rows=179846)
+ HashJoin
+ predicate: AND(=(WR_ORDER_NUMBER, WS_ORDER_NUMBER),
=(WS_ITEM_SK, WR_ITEM_SK))
+ type: left
+ est: (rows=719384)
+ Exchange
+ distribution: single
+ est: (rows=719384)
+ TableScan
+ table: PUBLIC.WEB_SALES
+ fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK,
WS_BILL_CUSTOMER_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_WHOLESALE_COST,
WS_SALES_PRICE]
+ est: (rows=719384)
+ Exchange
+ distribution: single
+ est: (rows=71763)
+ TableScan
+ table: PUBLIC.WEB_RETURNS
+ fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER]
+ est: (rows=71763)
+ Exchange
+ distribution: single
+ est: (rows=73049)
+ TableScan
+ table: PUBLIC.DATE_DIM
+ fieldNames: [D_DATE_SK, D_YEAR]
+ est: (rows=73049)
+ Sort
+ collation: [CS_SOLD_YEAR ASC, CS_ITEM_SK ASC, CS_CUSTOMER_SK ASC]
+ est: (rows=26380)
+ Filter
+ predicate: =(CS_SOLD_YEAR, 2001)
+ est: (rows=26380)
ColocatedHashAggregate
- fieldNames: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK, WS_QTY,
WS_WC, WS_SP]
- group: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK]
- aggregation: [SUM(WS_QUANTITY), SUM(WS_WHOLESALE_COST),
SUM(WS_SALES_PRICE)]
- est: (rows=87765)
+ fieldNames: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK, CS_QTY,
CS_WC, CS_SP]
+ group: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK]
+ aggregation: [SUM(CS_QUANTITY), SUM(CS_WHOLESALE_COST),
SUM(CS_SALES_PRICE)]
+ est: (rows=175869)
Project
- fieldNames: [WS_SOLD_YEAR, WS_ITEM_SK, WS_CUSTOMER_SK,
WS_QUANTITY, WS_WHOLESALE_COST, WS_SALES_PRICE]
- projection: [D_YEAR, WS_ITEM_SK, WS_BILL_CUSTOMER_SK,
WS_QUANTITY, WS_WHOLESALE_COST, WS_SALES_PRICE]
- est: (rows=179846)
+ fieldNames: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK,
CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
+ projection: [D_YEAR, CS_ITEM_SK, CS_BILL_CUSTOMER_SK,
CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
+ est: (rows=360387)
HashJoin
- predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+ predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
type: inner
- est: (rows=179846)
+ est: (rows=360387)
Filter
- predicate: IS NULL(WR_ORDER_NUMBER)
- est: (rows=179846)
+ predicate: IS NULL(CR_ORDER_NUMBER)
+ est: (rows=360387)
HashJoin
- predicate: AND(=(WR_ORDER_NUMBER, WS_ORDER_NUMBER),
=(WS_ITEM_SK, WR_ITEM_SK))
+ predicate: AND(=(CR_ORDER_NUMBER, CS_ORDER_NUMBER),
=(CS_ITEM_SK, CR_ITEM_SK))
type: left
- est: (rows=719384)
+ est: (rows=1441548)
Exchange
distribution: single
- est: (rows=719384)
+ est: (rows=1441548)
TableScan
- table: PUBLIC.WEB_SALES
- fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK,
WS_BILL_CUSTOMER_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_WHOLESALE_COST,
WS_SALES_PRICE]
- est: (rows=719384)
+ table: PUBLIC.CATALOG_SALES
+ fieldNames: [CS_SOLD_DATE_SK, CS_BILL_CUSTOMER_SK,
CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
+ est: (rows=1441548)
Exchange
distribution: single
- est: (rows=71763)
+ est: (rows=144067)
TableScan
- table: PUBLIC.WEB_RETURNS
- fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER]
- est: (rows=71763)
+ table: PUBLIC.CATALOG_RETURNS
+ fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER]
+ est: (rows=144067)
Exchange
distribution: single
est: (rows=73049)
@@ -106,47 +156,3 @@ Sort
table: PUBLIC.DATE_DIM
fieldNames: [D_DATE_SK, D_YEAR]
est: (rows=73049)
- Sort
- collation: [CS_SOLD_YEAR ASC, CS_ITEM_SK ASC, CS_CUSTOMER_SK ASC]
- est: (rows=175869)
- ColocatedHashAggregate
- fieldNames: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK, CS_QTY,
CS_WC, CS_SP]
- group: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK]
- aggregation: [SUM(CS_QUANTITY), SUM(CS_WHOLESALE_COST),
SUM(CS_SALES_PRICE)]
- est: (rows=175869)
- Project
- fieldNames: [CS_SOLD_YEAR, CS_ITEM_SK, CS_CUSTOMER_SK,
CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
- projection: [D_YEAR, CS_ITEM_SK, CS_BILL_CUSTOMER_SK,
CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
- est: (rows=360387)
- HashJoin
- predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
- type: inner
- est: (rows=360387)
- Filter
- predicate: IS NULL(CR_ORDER_NUMBER)
- est: (rows=360387)
- HashJoin
- predicate: AND(=(CR_ORDER_NUMBER, CS_ORDER_NUMBER),
=(CS_ITEM_SK, CR_ITEM_SK))
- type: left
- est: (rows=1441548)
- Exchange
- distribution: single
- est: (rows=1441548)
- TableScan
- table: PUBLIC.CATALOG_SALES
- fieldNames: [CS_SOLD_DATE_SK, CS_BILL_CUSTOMER_SK,
CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_WHOLESALE_COST, CS_SALES_PRICE]
- est: (rows=1441548)
- Exchange
- distribution: single
- est: (rows=144067)
- TableScan
- table: PUBLIC.CATALOG_RETURNS
- fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER]
- est: (rows=144067)
- Exchange
- distribution: single
- est: (rows=73049)
- TableScan
- table: PUBLIC.DATE_DIM
- fieldNames: [D_DATE_SK, D_YEAR]
- est: (rows=73049)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q85.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q85.plan
index 9894cda19ae..063f7a292da 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q85.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q85.plan
@@ -14,11 +14,11 @@ Sort
Project
fieldNames: [R_REASON_DESC, WS_QUANTITY, WR_REFUNDED_CASH, WR_FEE]
projection: [R_REASON_DESC, WS_QUANTITY, WR_REFUNDED_CASH, WR_FEE]
- est: (rows=2)
+ est: (rows=1)
HashJoin
predicate: =(WS_WEB_PAGE_SK, WP_WEB_PAGE_SK)
type: inner
- est: (rows=2)
+ est: (rows=1)
Exchange
distribution: single
est: (rows=60)
@@ -29,7 +29,7 @@ Sort
HashJoin
predicate: =(R_REASON_SK, WR_REASON_SK)
type: inner
- est: (rows=2)
+ est: (rows=1)
Exchange
distribution: single
est: (rows=35)
@@ -37,73 +37,71 @@ Sort
table: PUBLIC.REASON
fieldNames: [R_REASON_SK, R_REASON_DESC]
est: (rows=35)
- Exchange
- distribution: single
- est: (rows=2)
- HashJoin
- predicate: AND(=(CD_DEMO_SK, WR_RETURNING_CDEMO_SK),
=(CD_MARITAL_STATUS$0, CD_MARITAL_STATUS), =(CD_EDUCATION_STATUS$0,
CD_EDUCATION_STATUS), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'M',
_UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"), =(CD_MARITAL_STATUS$0,
CD_MARITAL_STATUS)), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'M',
_UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"), =(CD_EDUCATION_STATUS$0,
CD_EDUCATION_STATUS)), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'D',
_UTF-8'M']:C [...]
- fieldNames: [CD_DEMO_SK, CD_MARITAL_STATUS,
CD_EDUCATION_STATUS, D_DATE_SK, D_YEAR, CA_ADDRESS_SK, CA_STATE, CA_COUNTRY,
WS_SOLD_DATE_SK, WS_ITEM_SK, WS_WEB_PAGE_SK, WS_ORDER_NUMBER, WS_QUANTITY,
WS_SALES_PRICE, WS_NET_PROFIT, WR_ITEM_SK, WR_REFUNDED_CDEMO_SK,
WR_REFUNDED_ADDR_SK, WR_RETURNING_CDEMO_SK, WR_REASON_SK, WR_ORDER_NUMBER,
WR_FEE, WR_REFUNDED_CASH, CD_DEMO_SK$0, CD_MARITAL_STATUS$0,
CD_EDUCATION_STATUS$0]
- type: inner
- est: (rows=2)
+ HashJoin
+ predicate: AND(=(CD_DEMO_SK, WR_RETURNING_CDEMO_SK),
=(CD_MARITAL_STATUS$0, CD_MARITAL_STATUS), =(CD_EDUCATION_STATUS$0,
CD_EDUCATION_STATUS), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'M',
_UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"), =(CD_MARITAL_STATUS$0,
CD_MARITAL_STATUS)), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'M',
_UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"), =(CD_EDUCATION_STATUS$0,
CD_EDUCATION_STATUS)), OR(SEARCH(CD_MARITAL_STATUS$0, Sarg[_UTF-8'D',
_UTF-8'M']:CHA [...]
+ fieldNames: [CD_DEMO_SK, CD_MARITAL_STATUS,
CD_EDUCATION_STATUS, D_DATE_SK, D_YEAR, CA_ADDRESS_SK, CA_STATE, CA_COUNTRY,
WS_SOLD_DATE_SK, WS_ITEM_SK, WS_WEB_PAGE_SK, WS_ORDER_NUMBER, WS_QUANTITY,
WS_SALES_PRICE, WS_NET_PROFIT, WR_ITEM_SK, WR_REFUNDED_CDEMO_SK,
WR_REFUNDED_ADDR_SK, WR_RETURNING_CDEMO_SK, WR_REASON_SK, WR_ORDER_NUMBER,
WR_FEE, WR_REFUNDED_CASH, CD_DEMO_SK$0, CD_MARITAL_STATUS$0,
CD_EDUCATION_STATUS$0]
+ type: inner
+ est: (rows=1)
+ Exchange
+ distribution: single
+ est: (rows=37512)
TableScan
table: PUBLIC.CUSTOMER_DEMOGRAPHICS
+ predicate: AND(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'D',
_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'Secondary')),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'D', _UTF-8'M']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'College')), OR(=(CD_MARITAL_STATUS,
_UTF-8'M'), SEARCH(CD_EDUCATION_STATUS, Sarg[_UTF-8'College':VARCHAR(9) CHA
[...]
fieldNames: [CD_DEMO_SK, CD_MARITAL_STATUS,
CD_EDUCATION_STATUS]
- est: (rows=1920800)
+ est: (rows=37512)
+ HashJoin
+ predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+ type: inner
+ est: (rows=3)
Exchange
- distribution: table PUBLIC.CUSTOMER_DEMOGRAPHICS in zone
"Default" by [WR_RETURNING_CDEMO_SK]
- est: (rows=3)
+ distribution: single
+ est: (rows=24325)
+ TableScan
+ table: PUBLIC.DATE_DIM
+ predicate: =(D_YEAR, 2001)
+ fieldNames: [D_DATE_SK, D_YEAR]
+ est: (rows=24325)
+ HashJoin
+ predicate: AND(=(CA_ADDRESS_SK, WR_REFUNDED_ADDR_SK),
OR(=(CA_COUNTRY, _UTF-8'United States'), SEARCH(CAST(WS_NET_PROFIT):DECIMAL(12,
2), Sarg[[50.00:DECIMAL(12, 2)..250.00:DECIMAL(12, 2)]]:DECIMAL(12, 2))),
OR(=(CA_COUNTRY, _UTF-8'United States'), SEARCH(CA_STATE,
Sarg[_UTF-8'AR':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'MO':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'NE':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCHAR(2)
CHARACTER SET "UTF-8"), SEARCH(CAST(WS_NET_PROFIT):DECI [...]
+ type: inner
+ est: (rows=10)
+ Exchange
+ distribution: single
+ est: (rows=12138)
+ TableScan
+ table: PUBLIC.CUSTOMER_ADDRESS
+ predicate: AND(=(CA_COUNTRY, _UTF-8'United States'),
OR(IS NOT NULL(CA_COUNTRY), SEARCH(CA_STATE, Sarg[_UTF-8'IA':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'MS':VARCHAR(2) CHARACTER SET "UTF-8",
_UTF-8'WA':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCHAR(2) CHARACTER SET
"UTF-8")), OR(IS NOT NULL(CA_COUNTRY), SEARCH(CA_STATE,
Sarg[_UTF-8'AR':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'MO':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'NE':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCHAR(2
[...]
+ fieldNames: [CA_ADDRESS_SK, CA_STATE, CA_COUNTRY]
+ est: (rows=12138)
HashJoin
- predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+ predicate: AND(=(WS_ITEM_SK, WR_ITEM_SK),
=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), OR(SEARCH(CD_MARITAL_STATUS,
Sarg[_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"),
SEARCH(WS_SALES_PRICE, Sarg[[150.00:DECIMAL(5, 2)..200.00:DECIMAL(5,
2)]]:DECIMAL(5, 2))), OR(=(CD_MARITAL_STATUS, _UTF-8'M'),
=(CD_EDUCATION_STATUS, _UTF-8'College'), SEARCH(WS_SALES_PRICE,
Sarg[[150.00:DECIMAL(5, 2)..200.00:DECIMAL(5, 2)]]:DECIMAL(5, 2))),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'D', [...]
type: inner
- est: (rows=3)
+ est: (rows=61)
Exchange
distribution: single
- est: (rows=24325)
+ est: (rows=44962)
TableScan
- table: PUBLIC.DATE_DIM
- predicate: =(D_YEAR, 2001)
- fieldNames: [D_DATE_SK, D_YEAR]
- est: (rows=24325)
+ table: PUBLIC.WEB_SALES
+ predicate:
AND(SEARCH(CAST(WS_NET_PROFIT):DECIMAL(12, 2), Sarg[[50.00:DECIMAL(12,
2)..300.00:DECIMAL(12, 2)]]:DECIMAL(12, 2)), SEARCH(WS_SALES_PRICE,
Sarg[[50.00:DECIMAL(5, 2)..200.00:DECIMAL(5, 2)]]:DECIMAL(5, 2)))
+ fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK,
WS_WEB_PAGE_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_SALES_PRICE, WS_NET_PROFIT]
+ est: (rows=44962)
HashJoin
- predicate: AND(=(CA_ADDRESS_SK, WR_REFUNDED_ADDR_SK),
OR(=(CA_COUNTRY, _UTF-8'United States'), SEARCH(CAST(WS_NET_PROFIT):DECIMAL(12,
2), Sarg[[50.00:DECIMAL(12, 2)..250.00:DECIMAL(12, 2)]]:DECIMAL(12, 2))),
OR(=(CA_COUNTRY, _UTF-8'United States'), SEARCH(CA_STATE,
Sarg[_UTF-8'AR':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'MO':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'NE':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCHAR(2)
CHARACTER SET "UTF-8"), SEARCH(CAST(WS_NET_PROFIT): [...]
+ predicate: =(CD_DEMO_SK, WR_REFUNDED_CDEMO_SK)
type: inner
- est: (rows=10)
+ est: (rows=1401)
+ Exchange
+ distribution: single
+ est: (rows=71763)
+ TableScan
+ table: PUBLIC.WEB_RETURNS
+ fieldNames: [WR_ITEM_SK, WR_REFUNDED_CDEMO_SK,
WR_REFUNDED_ADDR_SK, WR_RETURNING_CDEMO_SK, WR_REASON_SK, WR_ORDER_NUMBER,
WR_FEE, WR_REFUNDED_CASH]
+ est: (rows=71763)
Exchange
distribution: single
- est: (rows=12138)
+ est: (rows=37512)
TableScan
- table: PUBLIC.CUSTOMER_ADDRESS
- predicate: AND(=(CA_COUNTRY, _UTF-8'United
States'), OR(IS NOT NULL(CA_COUNTRY), SEARCH(CA_STATE,
Sarg[_UTF-8'IA':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'MS':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'WA':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCHAR(2)
CHARACTER SET "UTF-8")), OR(IS NOT NULL(CA_COUNTRY), SEARCH(CA_STATE,
Sarg[_UTF-8'AR':VARCHAR(2) CHARACTER SET "UTF-8", _UTF-8'MO':VARCHAR(2)
CHARACTER SET "UTF-8", _UTF-8'NE':VARCHAR(2) CHARACTER SET "UTF-8"]:VARCH [...]
- fieldNames: [CA_ADDRESS_SK, CA_STATE, CA_COUNTRY]
- est: (rows=12138)
- HashJoin
- predicate: AND(=(WS_ITEM_SK, WR_ITEM_SK),
=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), OR(SEARCH(CD_MARITAL_STATUS,
Sarg[_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"),
SEARCH(WS_SALES_PRICE, Sarg[[150.00:DECIMAL(5, 2)..200.00:DECIMAL(5,
2)]]:DECIMAL(5, 2))), OR(=(CD_MARITAL_STATUS, _UTF-8'M'),
=(CD_EDUCATION_STATUS, _UTF-8'College'), SEARCH(WS_SALES_PRICE,
Sarg[[150.00:DECIMAL(5, 2)..200.00:DECIMAL(5, 2)]]:DECIMAL(5, 2))),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8 [...]
- type: inner
- est: (rows=61)
- Exchange
- distribution: single
- est: (rows=44962)
- TableScan
- table: PUBLIC.WEB_SALES
- predicate:
AND(SEARCH(CAST(WS_NET_PROFIT):DECIMAL(12, 2), Sarg[[50.00:DECIMAL(12,
2)..300.00:DECIMAL(12, 2)]]:DECIMAL(12, 2)), SEARCH(WS_SALES_PRICE,
Sarg[[50.00:DECIMAL(5, 2)..200.00:DECIMAL(5, 2)]]:DECIMAL(5, 2)))
- fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK,
WS_WEB_PAGE_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_SALES_PRICE, WS_NET_PROFIT]
- est: (rows=44962)
- HashJoin
- predicate: =(CD_DEMO_SK, WR_REFUNDED_CDEMO_SK)
- type: inner
- est: (rows=1401)
- Exchange
- distribution: single
- est: (rows=71763)
- TableScan
- table: PUBLIC.WEB_RETURNS
- fieldNames: [WR_ITEM_SK, WR_REFUNDED_CDEMO_SK,
WR_REFUNDED_ADDR_SK, WR_RETURNING_CDEMO_SK, WR_REASON_SK, WR_ORDER_NUMBER,
WR_FEE, WR_REFUNDED_CASH]
- est: (rows=71763)
- Exchange
- distribution: single
- est: (rows=37512)
- TableScan
- table: PUBLIC.CUSTOMER_DEMOGRAPHICS
- predicate: AND(SEARCH(CD_MARITAL_STATUS,
Sarg[_UTF-8'D', _UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'Secondary')),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'D', _UTF-8'M']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'College')), OR(=(CD_MARITAL_STATUS,
_UTF-8'M'), SEARCH(CD_EDUCATION_STATUS, Sarg[_UTF-8'College':VA [...]
- fieldNames: [CD_DEMO_SK, CD_MARITAL_STATUS,
CD_EDUCATION_STATUS]
- est: (rows=37512)
+ table: PUBLIC.CUSTOMER_DEMOGRAPHICS
+ predicate: AND(SEARCH(CD_MARITAL_STATUS,
Sarg[_UTF-8'D', _UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET "UTF-8"),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'M', _UTF-8'S']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'Secondary')),
OR(SEARCH(CD_MARITAL_STATUS, Sarg[_UTF-8'D', _UTF-8'M']:CHAR(1) CHARACTER SET
"UTF-8"), =(CD_EDUCATION_STATUS, _UTF-8'College')), OR(=(CD_MARITAL_STATUS,
_UTF-8'M'), SEARCH(CD_EDUCATION_STATUS, Sarg[_UTF-8'College':VARCHA [...]
+ fieldNames: [CD_DEMO_SK, CD_MARITAL_STATUS,
CD_EDUCATION_STATUS]
+ est: (rows=37512)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
b/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
index 23c790772d4..c0f8b989115 100644
--- a/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
@@ -4,56 +4,57 @@ Sort
est: (rows=100)
Project
projection: [order count, CAST(total shipping cost):DECIMAL(14, 2),
CAST(total net profit):DECIMAL(14, 2)]
- est: (rows=6738315409742)
+ est: (rows=6064483868767)
ColocatedSortAggregate
fieldNames: [order count, total shipping cost, total net profit]
collation: []
group: []
aggregation: [COUNT(WS_ORDER_NUMBER), SUM(total shipping cost),
SUM(total net profit)]
- est: (rows=6738315409742)
+ est: (rows=6064483868767)
ColocatedSortAggregate
fieldNames: [WS_ORDER_NUMBER, total shipping cost, total net profit]
collation: [WS_ORDER_NUMBER ASC]
group: [WS_ORDER_NUMBER]
aggregation: [SUM(WS_EXT_SHIP_COST), SUM(WS_NET_PROFIT)]
- est: (rows=6738315409742)
+ est: (rows=6064483868767)
Project
fieldNames: [WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
projection: [WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
- est: (rows=33691577048708)
+ est: (rows=30322419343837)
Filter
predicate: IS NULL($f1)
- est: (rows=33691577048708)
+ est: (rows=30322419343837)
MergeJoin
predicate: =(WS_ORDER_NUMBER, WR_ORDER_NUMBER)
type: left
- est: (rows=134766308194832)
+ est: (rows=121289677375349)
HashJoin
predicate: AND(=(WS_WAREHOUSE_SK, WS_WAREHOUSE_SK0),
=(WS_ORDER_NUMBER, WS_ORDER_NUMBER0))
type: inner
- est: (rows=62573155625)
+ est: (rows=56315840062)
HashJoin
predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
type: inner
- est: (rows=19943)
+ est: (rows=17949)
HashJoin
predicate: =(WS_SHIP_ADDR_SK, CA_ADDRESS_SK)
type: inner
- est: (rows=59889)
+ est: (rows=53900)
HashJoin
predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
type: inner
- est: (rows=179846)
+ est: (rows=161861)
Exchange
distribution: single
- est: (rows=719384)
+ est: (rows=647446)
Sort
collation: [WS_ORDER_NUMBER ASC, WS_WAREHOUSE_SK
ASC]
- est: (rows=719384)
+ est: (rows=647446)
TableScan
table: PUBLIC.WEB_SALES
+ predicate: IS NOT NULL(WS_WAREHOUSE_SK)
fieldNames: [WS_SHIP_DATE_SK, WS_SHIP_ADDR_SK,
WS_WEB_SITE_SK, WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST,
WS_NET_PROFIT]
- est: (rows=719384)
+ est: (rows=647446)
Exchange
distribution: single
est: (rows=18262)