You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/07/09 14:41:06 UTC

(ignite-3) 01/01: Fix invalid quoting. Fix invalid intervals.

This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-25594
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 91ef0abe485aebd7d2b4fe91743aa97f043f6171
Author: amashenkov <am...@apache.org>
AuthorDate: Wed Jul 9 17:21:06 2025 +0300

    Fix invalid quoting. Fix invalid intervals.
---
 .../src/test/resources/tpcds/plan/q12.plan         |  48 ++++
 .../test/resources/tpcds/plan/q12_colocated.plan   |  48 ++++
 .../src/test/resources/tpcds/plan/q16.plan         | 129 +++++++++
 .../test/resources/tpcds/plan/q16_colocated.plan   | 129 +++++++++
 .../src/test/resources/tpcds/plan/q20.plan         |  48 ++++
 .../test/resources/tpcds/plan/q20_colocated.plan   |  48 ++++
 .../src/test/resources/tpcds/plan/q21.plan         |  58 ++++
 .../test/resources/tpcds/plan/q21_colocated.plan   |  58 ++++
 .../src/test/resources/tpcds/plan/q32.plan         | 103 +++++++
 .../test/resources/tpcds/plan/q32_colocated.plan   | 103 +++++++
 .../src/test/resources/tpcds/plan/q37.plan         |  55 ++++
 .../test/resources/tpcds/plan/q37_colocated.plan   |  55 ++++
 .../src/test/resources/tpcds/plan/q40.plan         |  75 +++++
 .../test/resources/tpcds/plan/q40_colocated.plan   |  75 +++++
 .../src/test/resources/tpcds/plan/q5.plan          | 205 ++++++++++++++
 .../src/test/resources/tpcds/plan/q50.plan         |  66 +++++
 .../test/resources/tpcds/plan/q50_colocated.plan   |  66 +++++
 .../src/test/resources/tpcds/plan/q58.plan         | 284 +++++++++++++++++++
 .../test/resources/tpcds/plan/q58_colocated.plan   | 284 +++++++++++++++++++
 .../test/resources/tpcds/plan/q5_colocated.plan    | 205 ++++++++++++++
 .../src/test/resources/tpcds/plan/q62.plan         |  65 +++++
 .../test/resources/tpcds/plan/q62_colocated.plan   |  65 +++++
 .../src/test/resources/tpcds/plan/q66.plan         | 152 ++++++++++
 .../test/resources/tpcds/plan/q66_colocated.plan   | 152 ++++++++++
 .../src/test/resources/tpcds/plan/q74.plan         | 255 +++++++++++++++++
 .../test/resources/tpcds/plan/q74_colocated.plan   | 255 +++++++++++++++++
 .../src/test/resources/tpcds/plan/q75.plan         | 309 +++++++++++++++++++++
 .../test/resources/tpcds/plan/q75_colocated.plan   | 309 +++++++++++++++++++++
 .../src/test/resources/tpcds/plan/q77.plan         | 255 +++++++++++++++++
 .../test/resources/tpcds/plan/q77_colocated.plan   | 255 +++++++++++++++++
 .../src/test/resources/tpcds/plan/q80.plan         | 278 ++++++++++++++++++
 .../test/resources/tpcds/plan/q80_colocated.plan   | 278 ++++++++++++++++++
 .../src/test/resources/tpcds/plan/q82.plan         |  55 ++++
 .../test/resources/tpcds/plan/q82_colocated.plan   |  55 ++++
 .../src/test/resources/tpcds/plan/q83.plan         | 297 ++++++++++++++++++++
 .../test/resources/tpcds/plan/q83_colocated.plan   | 297 ++++++++++++++++++++
 .../src/test/resources/tpcds/plan/q92.plan         | 104 +++++++
 .../test/resources/tpcds/plan/q92_colocated.plan   | 104 +++++++
 .../src/test/resources/tpcds/plan/q94.plan         | 129 +++++++++
 .../test/resources/tpcds/plan/q94_colocated.plan   | 129 +++++++++
 .../src/test/resources/tpcds/plan/q95.plan         | 151 ++++++++++
 .../test/resources/tpcds/plan/q95_colocated.plan   | 151 ++++++++++
 .../src/test/resources/tpcds/plan/q98.plan         |  47 ++++
 .../test/resources/tpcds/plan/q98_colocated.plan   |  47 ++++
 .../src/test/resources/tpcds/plan/q99.plan         |  65 +++++
 .../test/resources/tpcds/plan/q99_colocated.plan   |  65 +++++
 .../src/testFixtures/resources/tpcds/query12.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query16.sql   |   8 +-
 .../src/testFixtures/resources/tpcds/query20.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query21.sql   |   4 +-
 .../src/testFixtures/resources/tpcds/query27.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query32.sql   |   6 +-
 .../src/testFixtures/resources/tpcds/query37.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query40.sql   |   4 +-
 .../src/testFixtures/resources/tpcds/query5.sql    |   6 +-
 .../src/testFixtures/resources/tpcds/query50.sql   |  10 +-
 .../src/testFixtures/resources/tpcds/query58.sql   |   6 +-
 .../src/testFixtures/resources/tpcds/query62.sql   |  10 +-
 .../src/testFixtures/resources/tpcds/query66.sql   |   8 +-
 .../src/testFixtures/resources/tpcds/query74.sql   |  12 +-
 .../src/testFixtures/resources/tpcds/query75.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query77.sql   |  12 +-
 .../src/testFixtures/resources/tpcds/query80.sql   |   6 +-
 .../src/testFixtures/resources/tpcds/query82.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query83.sql   |   6 +-
 .../src/testFixtures/resources/tpcds/query92.sql   |   6 +-
 .../src/testFixtures/resources/tpcds/query94.sql   |   8 +-
 .../src/testFixtures/resources/tpcds/query95.sql   |   8 +-
 .../src/testFixtures/resources/tpcds/query98.sql   |   2 +-
 .../src/testFixtures/resources/tpcds/query99.sql   |  10 +-
 70 files changed, 6538 insertions(+), 72 deletions(-)

diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q12.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q12.plan
new file mode 100644
index 00000000000..5624010e344
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q12.plan
@@ -0,0 +1,48 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=91982)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(WS_EXT_SALES_PRICE)]
+        est: (rows=91982)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, WS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, WS_EXT_SALES_PRICE]
+          est: (rows=136813)
+        HashJoin
+            predicate: =(WS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=136813)
+          HashJoin
+              predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=179846)
+            Exchange
+                distribution: single
+                est: (rows=719384)
+              TableScan
+                  table: PUBLIC.WEB_SALES
+                  fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_SALES_PRICE]
+                  est: (rows=719384)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 1998-01-06), <=(D_DATE, +(1998-01-06, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Books':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Electronics':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Women':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q12_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q12_colocated.plan
new file mode 100644
index 00000000000..5624010e344
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q12_colocated.plan
@@ -0,0 +1,48 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=91982)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(WS_EXT_SALES_PRICE)]
+        est: (rows=91982)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, WS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, WS_EXT_SALES_PRICE]
+          est: (rows=136813)
+        HashJoin
+            predicate: =(WS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=136813)
+          HashJoin
+              predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=179846)
+            Exchange
+                distribution: single
+                est: (rows=719384)
+              TableScan
+                  table: PUBLIC.WEB_SALES
+                  fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_SALES_PRICE]
+                  est: (rows=719384)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 1998-01-06), <=(D_DATE, +(1998-01-06, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Books':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Electronics':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Women':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
new file mode 100644
index 00000000000..6e983c007bc
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q16.plan
@@ -0,0 +1,129 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=100)
+  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=2763728885610)
+    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=2763728885610)
+      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=13818644428048)
+        Filter
+            predicate: IS NULL(i)
+            est: (rows=13818644428048)
+          CorrelatedNestedLoopJoin
+              predicate: true
+              type: left
+              correlates: [$cor4]
+              est: (rows=55274577712193)
+            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=5760851647)
+              CorrelatedNestedLoopJoin
+                  predicate: true
+                  type: inner
+                  correlates: [$cor5]
+                  est: (rows=5760851647)
+                Sort
+                    collation: [CS_ORDER_NUMBER ASC]
+                    est: (rows=120009)
+                  Project
+                      fieldNames: [CS_WAREHOUSE_SK, CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
+                      projection: [CS_WAREHOUSE_SK, CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
+                      est: (rows=120009)
+                    HashJoin
+                        predicate: =(CS_CALL_CENTER_SK, CC_CALL_CENTER_SK)
+                        type: inner
+                        est: (rows=120009)
+                      HashJoin
+                          predicate: =(CS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+                          type: inner
+                          est: (rows=120009)
+                        HashJoin
+                            predicate: =(CS_SHIP_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=360387)
+                          Exchange
+                              distribution: single
+                              est: (rows=1441548)
+                            TableScan
+                                table: PUBLIC.CATALOG_SALES
+                                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)
+                          Exchange
+                              distribution: single
+                              est: (rows=18262)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(>=(D_DATE, 1999-04-01), <=(D_DATE, +(1999-04-01, *(60, 86400000:INTERVAL DAY))))
+                                fieldNames: [D_DATE_SK, D_DATE]
+                                est: (rows=18262)
+                        Exchange
+                            distribution: single
+                            est: (rows=16650)
+                          TableScan
+                              table: PUBLIC.CUSTOMER_ADDRESS
+                              predicate: =(CA_STATE, _UTF-8'IL')
+                              fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                              est: (rows=16650)
+                      Exchange
+                          distribution: single
+                          est: (rows=6)
+                        TableScan
+                            table: PUBLIC.CALL_CENTER
+                            predicate: SEARCH(CC_COUNTY, Sarg[_UTF-8'Bronx County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Maverick County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Mesa County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Raleigh County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Richland County':VARCHAR(30) CHARACTER SET "UTF-8"]:VARCHAR(30) CHARACTER SET "UTF-8")
+                            fieldNames: [CC_CALL_CENTER_SK, CC_COUNTY]
+                            est: (rows=6)
+                Project
+                    fieldNames: []
+                    projection: []
+                    est: (rows=48004)
+                  ReduceHashAggregate
+                      fieldNames: [i]
+                      group: [i]
+                      aggregation: []
+                      est: (rows=48004)
+                    Exchange
+                        distribution: single
+                        est: (rows=48004)
+                      MapHashAggregate
+                          fieldNames: [i, _GROUP_ID]
+                          group: [i]
+                          aggregation: []
+                          est: (rows=48004)
+                        TableScan
+                            table: PUBLIC.CATALOG_SALES
+                            predicate: AND(=($cor5.CS_ORDER_NUMBER, CS_ORDER_NUMBER), <>($cor5.CS_WAREHOUSE_SK, CS_WAREHOUSE_SK))
+                            fieldNames: [i]
+                            projection: [true]
+                            est: (rows=240018)
+            ReduceHashAggregate
+                fieldNames: [i]
+                group: [i]
+                aggregation: []
+                est: (rows=9595)
+              Exchange
+                  distribution: single
+                  est: (rows=9595)
+                MapHashAggregate
+                    fieldNames: [i, _GROUP_ID]
+                    group: [i]
+                    aggregation: []
+                    est: (rows=9595)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      predicate: =($cor4.CS_ORDER_NUMBER, CR_ORDER_NUMBER)
+                      fieldNames: [i]
+                      projection: [true]
+                      est: (rows=47974)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q16_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q16_colocated.plan
new file mode 100644
index 00000000000..6e983c007bc
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q16_colocated.plan
@@ -0,0 +1,129 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=100)
+  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=2763728885610)
+    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=2763728885610)
+      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=13818644428048)
+        Filter
+            predicate: IS NULL(i)
+            est: (rows=13818644428048)
+          CorrelatedNestedLoopJoin
+              predicate: true
+              type: left
+              correlates: [$cor4]
+              est: (rows=55274577712193)
+            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=5760851647)
+              CorrelatedNestedLoopJoin
+                  predicate: true
+                  type: inner
+                  correlates: [$cor5]
+                  est: (rows=5760851647)
+                Sort
+                    collation: [CS_ORDER_NUMBER ASC]
+                    est: (rows=120009)
+                  Project
+                      fieldNames: [CS_WAREHOUSE_SK, CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
+                      projection: [CS_WAREHOUSE_SK, CS_ORDER_NUMBER, CS_EXT_SHIP_COST, CS_NET_PROFIT]
+                      est: (rows=120009)
+                    HashJoin
+                        predicate: =(CS_CALL_CENTER_SK, CC_CALL_CENTER_SK)
+                        type: inner
+                        est: (rows=120009)
+                      HashJoin
+                          predicate: =(CS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+                          type: inner
+                          est: (rows=120009)
+                        HashJoin
+                            predicate: =(CS_SHIP_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=360387)
+                          Exchange
+                              distribution: single
+                              est: (rows=1441548)
+                            TableScan
+                                table: PUBLIC.CATALOG_SALES
+                                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)
+                          Exchange
+                              distribution: single
+                              est: (rows=18262)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(>=(D_DATE, 1999-04-01), <=(D_DATE, +(1999-04-01, *(60, 86400000:INTERVAL DAY))))
+                                fieldNames: [D_DATE_SK, D_DATE]
+                                est: (rows=18262)
+                        Exchange
+                            distribution: single
+                            est: (rows=16650)
+                          TableScan
+                              table: PUBLIC.CUSTOMER_ADDRESS
+                              predicate: =(CA_STATE, _UTF-8'IL')
+                              fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                              est: (rows=16650)
+                      Exchange
+                          distribution: single
+                          est: (rows=6)
+                        TableScan
+                            table: PUBLIC.CALL_CENTER
+                            predicate: SEARCH(CC_COUNTY, Sarg[_UTF-8'Bronx County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Maverick County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Mesa County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Raleigh County':VARCHAR(30) CHARACTER SET "UTF-8", _UTF-8'Richland County':VARCHAR(30) CHARACTER SET "UTF-8"]:VARCHAR(30) CHARACTER SET "UTF-8")
+                            fieldNames: [CC_CALL_CENTER_SK, CC_COUNTY]
+                            est: (rows=6)
+                Project
+                    fieldNames: []
+                    projection: []
+                    est: (rows=48004)
+                  ReduceHashAggregate
+                      fieldNames: [i]
+                      group: [i]
+                      aggregation: []
+                      est: (rows=48004)
+                    Exchange
+                        distribution: single
+                        est: (rows=48004)
+                      MapHashAggregate
+                          fieldNames: [i, _GROUP_ID]
+                          group: [i]
+                          aggregation: []
+                          est: (rows=48004)
+                        TableScan
+                            table: PUBLIC.CATALOG_SALES
+                            predicate: AND(=($cor5.CS_ORDER_NUMBER, CS_ORDER_NUMBER), <>($cor5.CS_WAREHOUSE_SK, CS_WAREHOUSE_SK))
+                            fieldNames: [i]
+                            projection: [true]
+                            est: (rows=240018)
+            ReduceHashAggregate
+                fieldNames: [i]
+                group: [i]
+                aggregation: []
+                est: (rows=9595)
+              Exchange
+                  distribution: single
+                  est: (rows=9595)
+                MapHashAggregate
+                    fieldNames: [i, _GROUP_ID]
+                    group: [i]
+                    aggregation: []
+                    est: (rows=9595)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      predicate: =($cor4.CS_ORDER_NUMBER, CR_ORDER_NUMBER)
+                      fieldNames: [i]
+                      projection: [true]
+                      est: (rows=47974)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q20.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q20.plan
new file mode 100644
index 00000000000..8afbf64ca4d
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q20.plan
@@ -0,0 +1,48 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=184320)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(CS_EXT_SALES_PRICE)]
+        est: (rows=184320)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, CS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, CS_EXT_SALES_PRICE]
+          est: (rows=274155)
+        HashJoin
+            predicate: =(CS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=274155)
+          HashJoin
+              predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=360387)
+            Exchange
+                distribution: single
+                est: (rows=1441548)
+              TableScan
+                  table: PUBLIC.CATALOG_SALES
+                  fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_SALES_PRICE]
+                  est: (rows=1441548)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 2001-03-14), <=(D_DATE, +(2001-03-14, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Children':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Electronics':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Shoes':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q20_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q20_colocated.plan
new file mode 100644
index 00000000000..8afbf64ca4d
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q20_colocated.plan
@@ -0,0 +1,48 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=184320)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(CS_EXT_SALES_PRICE)]
+        est: (rows=184320)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, CS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, CS_EXT_SALES_PRICE]
+          est: (rows=274155)
+        HashJoin
+            predicate: =(CS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=274155)
+          HashJoin
+              predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=360387)
+            Exchange
+                distribution: single
+                est: (rows=1441548)
+              TableScan
+                  table: PUBLIC.CATALOG_SALES
+                  fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_SALES_PRICE]
+                  est: (rows=1441548)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 2001-03-14), <=(D_DATE, +(2001-03-14, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Children':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Electronics':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Shoes':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q21.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q21.plan
new file mode 100644
index 00000000000..1d058b7557c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q21.plan
@@ -0,0 +1,58 @@
+Sort
+    collation: [W_WAREHOUSE_NAME ASC, I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  Filter
+      predicate: AND(>=(CAST(CASE(>(INV_BEFORE, 0), /(INV_AFTER, INV_BEFORE), null:BIGINT)):DECIMAL(25, 6), CAST(/(2.0:DECIMAL(2, 1), 3.0:DECIMAL(2, 1))):DECIMAL(25, 6) NOT NULL), <=(CAST(CASE(>(INV_BEFORE, 0), /(INV_AFTER, INV_BEFORE), null:BIGINT)):DECIMAL(25, 6), CAST(/(3.0:DECIMAL(2, 1), 2.0:DECIMAL(2, 1))):DECIMAL(25, 6) NOT NULL))
+      est: (rows=66066)
+    ColocatedHashAggregate
+        fieldNames: [W_WAREHOUSE_NAME, I_ITEM_ID, INV_BEFORE, INV_AFTER]
+        group: [W_WAREHOUSE_NAME, I_ITEM_ID]
+        aggregation: [SUM($f2), SUM($f3)]
+        est: (rows=264262)
+      Project
+          fieldNames: [W_WAREHOUSE_NAME, I_ITEM_ID, $f2, $f3]
+          projection: [W_WAREHOUSE_NAME, I_ITEM_ID, CASE(<(D_DATE, 1999-03-20), INV_QUANTITY_ON_HAND, 0), CASE(>=(D_DATE, 1999-03-20), INV_QUANTITY_ON_HAND, 0)]
+          est: (rows=734063)
+        HashJoin
+            predicate: =(INV_WAREHOUSE_SK, W_WAREHOUSE_SK)
+            type: inner
+            est: (rows=734063)
+          HashJoin
+              predicate: =(I_ITEM_SK, INV_ITEM_SK)
+              type: inner
+              est: (rows=734063)
+            HashJoin
+                predicate: =(INV_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=2936250)
+              Exchange
+                  distribution: single
+                  est: (rows=11745000)
+                TableScan
+                    table: PUBLIC.INVENTORY
+                    fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_WAREHOUSE_SK, INV_QUANTITY_ON_HAND]
+                    est: (rows=11745000)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_DATE, -(1999-03-20, *(30, 86400000:INTERVAL DAY))), <=(D_DATE, +(1999-03-20, *(30, 86400000:INTERVAL DAY))))
+                    fieldNames: [D_DATE_SK, D_DATE]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=4500)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: SEARCH(I_CURRENT_PRICE, Sarg[[0.99:DECIMAL(3, 2)..1.49:DECIMAL(3, 2)]]:DECIMAL(3, 2))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_CURRENT_PRICE]
+                  est: (rows=4500)
+          Exchange
+              distribution: single
+              est: (rows=5)
+            TableScan
+                table: PUBLIC.WAREHOUSE
+                fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+                est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q21_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q21_colocated.plan
new file mode 100644
index 00000000000..1d058b7557c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q21_colocated.plan
@@ -0,0 +1,58 @@
+Sort
+    collation: [W_WAREHOUSE_NAME ASC, I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  Filter
+      predicate: AND(>=(CAST(CASE(>(INV_BEFORE, 0), /(INV_AFTER, INV_BEFORE), null:BIGINT)):DECIMAL(25, 6), CAST(/(2.0:DECIMAL(2, 1), 3.0:DECIMAL(2, 1))):DECIMAL(25, 6) NOT NULL), <=(CAST(CASE(>(INV_BEFORE, 0), /(INV_AFTER, INV_BEFORE), null:BIGINT)):DECIMAL(25, 6), CAST(/(3.0:DECIMAL(2, 1), 2.0:DECIMAL(2, 1))):DECIMAL(25, 6) NOT NULL))
+      est: (rows=66066)
+    ColocatedHashAggregate
+        fieldNames: [W_WAREHOUSE_NAME, I_ITEM_ID, INV_BEFORE, INV_AFTER]
+        group: [W_WAREHOUSE_NAME, I_ITEM_ID]
+        aggregation: [SUM($f2), SUM($f3)]
+        est: (rows=264262)
+      Project
+          fieldNames: [W_WAREHOUSE_NAME, I_ITEM_ID, $f2, $f3]
+          projection: [W_WAREHOUSE_NAME, I_ITEM_ID, CASE(<(D_DATE, 1999-03-20), INV_QUANTITY_ON_HAND, 0), CASE(>=(D_DATE, 1999-03-20), INV_QUANTITY_ON_HAND, 0)]
+          est: (rows=734063)
+        HashJoin
+            predicate: =(INV_WAREHOUSE_SK, W_WAREHOUSE_SK)
+            type: inner
+            est: (rows=734063)
+          HashJoin
+              predicate: =(I_ITEM_SK, INV_ITEM_SK)
+              type: inner
+              est: (rows=734063)
+            HashJoin
+                predicate: =(INV_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=2936250)
+              Exchange
+                  distribution: single
+                  est: (rows=11745000)
+                TableScan
+                    table: PUBLIC.INVENTORY
+                    fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_WAREHOUSE_SK, INV_QUANTITY_ON_HAND]
+                    est: (rows=11745000)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_DATE, -(1999-03-20, *(30, 86400000:INTERVAL DAY))), <=(D_DATE, +(1999-03-20, *(30, 86400000:INTERVAL DAY))))
+                    fieldNames: [D_DATE_SK, D_DATE]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=4500)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: SEARCH(I_CURRENT_PRICE, Sarg[[0.99:DECIMAL(3, 2)..1.49:DECIMAL(3, 2)]]:DECIMAL(3, 2))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_CURRENT_PRICE]
+                  est: (rows=4500)
+          Exchange
+              distribution: single
+              est: (rows=5)
+            TableScan
+                table: PUBLIC.WAREHOUSE
+                fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+                est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q32.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q32.plan
new file mode 100644
index 00000000000..a486ee46890
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q32.plan
@@ -0,0 +1,103 @@
+Limit
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [excess discount amount]
+      group: []
+      aggregation: [SUM(CS_EXT_DISCOUNT_AMT)]
+      est: (rows=1)
+    Project
+        fieldNames: [CS_EXT_DISCOUNT_AMT]
+        projection: [CS_EXT_DISCOUNT_AMT]
+        est: (rows=60004)
+      Filter
+          predicate: >(CAST(CS_EXT_DISCOUNT_AMT):DECIMAL(23, 17), EXPR$0)
+          est: (rows=60004)
+        CorrelatedNestedLoopJoin
+            predicate: true
+            type: left
+            correlates: [$cor1]
+            est: (rows=120009)
+          Project
+              fieldNames: [CS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              projection: [CS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              est: (rows=120009)
+            HashJoin
+                predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                type: inner
+                est: (rows=120009)
+              HashJoin
+                  predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                  type: inner
+                  est: (rows=360387)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_DISCOUNT_AMT]
+                      est: (rows=1441548)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2002-03-29), <=(D_DATE, +(2002-03-29, *(90, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=5994)
+                TableScan
+                    table: PUBLIC.ITEM
+                    predicate: =(I_MANUFACT_ID, 66)
+                    fieldNames: [I_ITEM_SK, I_MANUFACT_ID]
+                    est: (rows=5994)
+          Project
+              fieldNames: [EXPR$0]
+              projection: [*(1.3:DECIMAL(2, 1), $f0)]
+              est: (rows=1)
+            Project
+                fieldNames: [$f0]
+                projection: [CASE(=(f0_0, 0:DECIMAL(32767, 0)), null:DECIMAL(21, 16), DECIMAL_DIVIDE(f0_0, f1_1, 21, 16))]
+                est: (rows=1)
+              ReduceSortAggregate
+                  fieldNames: [f0_0, f1_1]
+                  collation: []
+                  group: []
+                  aggregation: [SUM(0), $SUM0(1)]
+                  est: (rows=1)
+                Project
+                    fieldNames: [0, 1]
+                    projection: [_ACC0, CAST(_ACC1):DECIMAL(32767, 0) NOT NULL]
+                    est: (rows=1)
+                  Exchange
+                      distribution: single
+                      est: (rows=1)
+                    MapSortAggregate
+                        fieldNames: [_ACC0, _ACC1]
+                        collation: []
+                        group: []
+                        aggregation: [SUM(CS_EXT_DISCOUNT_AMT), COUNT(CS_EXT_DISCOUNT_AMT)]
+                        est: (rows=1)
+                      Project
+                          fieldNames: [CS_EXT_DISCOUNT_AMT]
+                          projection: [CS_EXT_DISCOUNT_AMT]
+                          est: (rows=120009)
+                        HashJoin
+                            predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                            type: inner
+                            est: (rows=120009)
+                          Exchange
+                              distribution: table PUBLIC.DATE_DIM in zone "Default" by [CS_SOLD_DATE_SK]
+                              est: (rows=480035)
+                            TableScan
+                                table: PUBLIC.CATALOG_SALES
+                                predicate: =(CS_ITEM_SK, $cor1.I_ITEM_SK)
+                                fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_DISCOUNT_AMT]
+                                est: (rows=480035)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(>=(D_DATE, 2002-03-29), <=(D_DATE, +(2002-03-29, *(90, 86400000:INTERVAL DAY))))
+                              fieldNames: [D_DATE_SK, D_DATE]
+                              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q32_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q32_colocated.plan
new file mode 100644
index 00000000000..a486ee46890
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q32_colocated.plan
@@ -0,0 +1,103 @@
+Limit
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [excess discount amount]
+      group: []
+      aggregation: [SUM(CS_EXT_DISCOUNT_AMT)]
+      est: (rows=1)
+    Project
+        fieldNames: [CS_EXT_DISCOUNT_AMT]
+        projection: [CS_EXT_DISCOUNT_AMT]
+        est: (rows=60004)
+      Filter
+          predicate: >(CAST(CS_EXT_DISCOUNT_AMT):DECIMAL(23, 17), EXPR$0)
+          est: (rows=60004)
+        CorrelatedNestedLoopJoin
+            predicate: true
+            type: left
+            correlates: [$cor1]
+            est: (rows=120009)
+          Project
+              fieldNames: [CS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              projection: [CS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              est: (rows=120009)
+            HashJoin
+                predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                type: inner
+                est: (rows=120009)
+              HashJoin
+                  predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                  type: inner
+                  est: (rows=360387)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_DISCOUNT_AMT]
+                      est: (rows=1441548)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2002-03-29), <=(D_DATE, +(2002-03-29, *(90, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=5994)
+                TableScan
+                    table: PUBLIC.ITEM
+                    predicate: =(I_MANUFACT_ID, 66)
+                    fieldNames: [I_ITEM_SK, I_MANUFACT_ID]
+                    est: (rows=5994)
+          Project
+              fieldNames: [EXPR$0]
+              projection: [*(1.3:DECIMAL(2, 1), $f0)]
+              est: (rows=1)
+            Project
+                fieldNames: [$f0]
+                projection: [CASE(=(f0_0, 0:DECIMAL(32767, 0)), null:DECIMAL(21, 16), DECIMAL_DIVIDE(f0_0, f1_1, 21, 16))]
+                est: (rows=1)
+              ReduceSortAggregate
+                  fieldNames: [f0_0, f1_1]
+                  collation: []
+                  group: []
+                  aggregation: [SUM(0), $SUM0(1)]
+                  est: (rows=1)
+                Project
+                    fieldNames: [0, 1]
+                    projection: [_ACC0, CAST(_ACC1):DECIMAL(32767, 0) NOT NULL]
+                    est: (rows=1)
+                  Exchange
+                      distribution: single
+                      est: (rows=1)
+                    MapSortAggregate
+                        fieldNames: [_ACC0, _ACC1]
+                        collation: []
+                        group: []
+                        aggregation: [SUM(CS_EXT_DISCOUNT_AMT), COUNT(CS_EXT_DISCOUNT_AMT)]
+                        est: (rows=1)
+                      Project
+                          fieldNames: [CS_EXT_DISCOUNT_AMT]
+                          projection: [CS_EXT_DISCOUNT_AMT]
+                          est: (rows=120009)
+                        HashJoin
+                            predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                            type: inner
+                            est: (rows=120009)
+                          Exchange
+                              distribution: table PUBLIC.DATE_DIM in zone "Default" by [CS_SOLD_DATE_SK]
+                              est: (rows=480035)
+                            TableScan
+                                table: PUBLIC.CATALOG_SALES
+                                predicate: =(CS_ITEM_SK, $cor1.I_ITEM_SK)
+                                fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_DISCOUNT_AMT]
+                                est: (rows=480035)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(>=(D_DATE, 2002-03-29), <=(D_DATE, +(2002-03-29, *(90, 86400000:INTERVAL DAY))))
+                              fieldNames: [D_DATE_SK, D_DATE]
+                              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q37.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q37.plan
new file mode 100644
index 00000000000..5e5994fc64c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q37.plan
@@ -0,0 +1,55 @@
+Sort
+    collation: [I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+      aggregation: []
+      est: (rows=10192)
+    Project
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        projection: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        est: (rows=20885)
+      HashJoin
+          predicate: =(D_DATE_SK, INV_DATE_SK)
+          type: inner
+          est: (rows=20885)
+        HashJoin
+            predicate: =(CS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=83540)
+          Exchange
+              distribution: single
+              est: (rows=1441548)
+            TableScan
+                table: PUBLIC.CATALOG_SALES
+                fieldNames: [CS_ITEM_SK]
+                est: (rows=1441548)
+          HashJoin
+              predicate: =(INV_ITEM_SK, I_ITEM_SK)
+              type: inner
+              est: (rows=680641)
+            Exchange
+                distribution: single
+                est: (rows=2936250)
+              TableScan
+                  table: PUBLIC.INVENTORY
+                  predicate: SEARCH(INV_QUANTITY_ON_HAND, Sarg[[100..500]])
+                  fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_QUANTITY_ON_HAND]
+                  est: (rows=2936250)
+            Exchange
+                distribution: single
+                est: (rows=4173)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: AND(>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 39.00), <=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), CAST(+(39, 30)):DECIMAL(12, 2) NOT NULL), SEARCH(I_MANUFACT_ID, Sarg[728, 765, 886, 889]))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_MANUFACT_ID]
+                  est: (rows=4173)
+        Exchange
+            distribution: single
+            est: (rows=18262)
+          TableScan
+              table: PUBLIC.DATE_DIM
+              predicate: AND(>=(D_DATE, 2001-01-16), <=(D_DATE, +(2001-01-16, *(60, 86400000:INTERVAL DAY))))
+              fieldNames: [D_DATE_SK, D_DATE]
+              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q37_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q37_colocated.plan
new file mode 100644
index 00000000000..5e5994fc64c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q37_colocated.plan
@@ -0,0 +1,55 @@
+Sort
+    collation: [I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+      aggregation: []
+      est: (rows=10192)
+    Project
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        projection: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        est: (rows=20885)
+      HashJoin
+          predicate: =(D_DATE_SK, INV_DATE_SK)
+          type: inner
+          est: (rows=20885)
+        HashJoin
+            predicate: =(CS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=83540)
+          Exchange
+              distribution: single
+              est: (rows=1441548)
+            TableScan
+                table: PUBLIC.CATALOG_SALES
+                fieldNames: [CS_ITEM_SK]
+                est: (rows=1441548)
+          HashJoin
+              predicate: =(INV_ITEM_SK, I_ITEM_SK)
+              type: inner
+              est: (rows=680641)
+            Exchange
+                distribution: single
+                est: (rows=2936250)
+              TableScan
+                  table: PUBLIC.INVENTORY
+                  predicate: SEARCH(INV_QUANTITY_ON_HAND, Sarg[[100..500]])
+                  fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_QUANTITY_ON_HAND]
+                  est: (rows=2936250)
+            Exchange
+                distribution: single
+                est: (rows=4173)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: AND(>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 39.00), <=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), CAST(+(39, 30)):DECIMAL(12, 2) NOT NULL), SEARCH(I_MANUFACT_ID, Sarg[728, 765, 886, 889]))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_MANUFACT_ID]
+                  est: (rows=4173)
+        Exchange
+            distribution: single
+            est: (rows=18262)
+          TableScan
+              table: PUBLIC.DATE_DIM
+              predicate: AND(>=(D_DATE, 2001-01-16), <=(D_DATE, +(2001-01-16, *(60, 86400000:INTERVAL DAY))))
+              fieldNames: [D_DATE_SK, D_DATE]
+              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q40.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q40.plan
new file mode 100644
index 00000000000..83e2ff6306c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q40.plan
@@ -0,0 +1,75 @@
+Sort
+    collation: [W_STATE ASC, I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [W_STATE, I_ITEM_ID, SALES_BEFORE, SALES_AFTER]
+      group: [W_STATE, I_ITEM_ID]
+      aggregation: [SUM($f2), SUM($f3)]
+      est: (rows=105169450)
+    Project
+        fieldNames: [W_STATE, I_ITEM_ID, $f2, $f3]
+        projection: [W_STATE, I_ITEM_ID, CASE(<(D_DATE, 2000-03-18), -(CS_SALES_PRICE, CASE(IS NOT NULL(CR_REFUNDED_CASH), CAST(CR_REFUNDED_CASH):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2))), 0.00:DECIMAL(13, 2)), CASE(>=(D_DATE, 2000-03-18), -(CS_SALES_PRICE, CASE(IS NOT NULL(CR_REFUNDED_CASH), CAST(CR_REFUNDED_CASH):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2))), 0.00:DECIMAL(13, 2))]
+        est: (rows=292137360)
+      MergeJoin
+          predicate: =(I_ITEM_SK, CS_ITEM_SK)
+          type: inner
+          est: (rows=292137360)
+        HashJoin
+            predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+            type: inner
+            est: (rows=1168549442)
+          HashJoin
+              predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+              type: inner
+              est: (rows=4674197767)
+            MergeJoin
+                predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                type: left
+                est: (rows=4674197767)
+              Exchange
+                  distribution: single
+                  est: (rows=1441548)
+                Sort
+                    collation: [CS_ITEM_SK ASC, CS_ORDER_NUMBER ASC]
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_WAREHOUSE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_SALES_PRICE]
+                      est: (rows=1441548)
+              Exchange
+                  distribution: single
+                  est: (rows=144067)
+                Sort
+                    collation: [CR_ITEM_SK ASC, CR_ORDER_NUMBER ASC]
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_REFUNDED_CASH]
+                      est: (rows=144067)
+            Exchange
+                distribution: single
+                est: (rows=5)
+              TableScan
+                  table: PUBLIC.WAREHOUSE
+                  fieldNames: [W_WAREHOUSE_SK, W_STATE]
+                  est: (rows=5)
+          Exchange
+              distribution: single
+              est: (rows=18262)
+            TableScan
+                table: PUBLIC.DATE_DIM
+                predicate: AND(>=(D_DATE, -(2000-03-18, *(30, 86400000:INTERVAL DAY))), <=(D_DATE, +(2000-03-18, *(30, 86400000:INTERVAL DAY))))
+                fieldNames: [D_DATE_SK, D_DATE]
+                est: (rows=18262)
+        Exchange
+            distribution: single
+            est: (rows=4500)
+          Sort
+              collation: [I_ITEM_SK ASC]
+              est: (rows=4500)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CURRENT_PRICE, Sarg[[0.99:DECIMAL(3, 2)..1.49:DECIMAL(3, 2)]]:DECIMAL(3, 2))
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_CURRENT_PRICE]
+                est: (rows=4500)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q40_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q40_colocated.plan
new file mode 100644
index 00000000000..83e2ff6306c
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q40_colocated.plan
@@ -0,0 +1,75 @@
+Sort
+    collation: [W_STATE ASC, I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [W_STATE, I_ITEM_ID, SALES_BEFORE, SALES_AFTER]
+      group: [W_STATE, I_ITEM_ID]
+      aggregation: [SUM($f2), SUM($f3)]
+      est: (rows=105169450)
+    Project
+        fieldNames: [W_STATE, I_ITEM_ID, $f2, $f3]
+        projection: [W_STATE, I_ITEM_ID, CASE(<(D_DATE, 2000-03-18), -(CS_SALES_PRICE, CASE(IS NOT NULL(CR_REFUNDED_CASH), CAST(CR_REFUNDED_CASH):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2))), 0.00:DECIMAL(13, 2)), CASE(>=(D_DATE, 2000-03-18), -(CS_SALES_PRICE, CASE(IS NOT NULL(CR_REFUNDED_CASH), CAST(CR_REFUNDED_CASH):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2))), 0.00:DECIMAL(13, 2))]
+        est: (rows=292137360)
+      MergeJoin
+          predicate: =(I_ITEM_SK, CS_ITEM_SK)
+          type: inner
+          est: (rows=292137360)
+        HashJoin
+            predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+            type: inner
+            est: (rows=1168549442)
+          HashJoin
+              predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+              type: inner
+              est: (rows=4674197767)
+            MergeJoin
+                predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                type: left
+                est: (rows=4674197767)
+              Exchange
+                  distribution: single
+                  est: (rows=1441548)
+                Sort
+                    collation: [CS_ITEM_SK ASC, CS_ORDER_NUMBER ASC]
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_WAREHOUSE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_SALES_PRICE]
+                      est: (rows=1441548)
+              Exchange
+                  distribution: single
+                  est: (rows=144067)
+                Sort
+                    collation: [CR_ITEM_SK ASC, CR_ORDER_NUMBER ASC]
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_REFUNDED_CASH]
+                      est: (rows=144067)
+            Exchange
+                distribution: single
+                est: (rows=5)
+              TableScan
+                  table: PUBLIC.WAREHOUSE
+                  fieldNames: [W_WAREHOUSE_SK, W_STATE]
+                  est: (rows=5)
+          Exchange
+              distribution: single
+              est: (rows=18262)
+            TableScan
+                table: PUBLIC.DATE_DIM
+                predicate: AND(>=(D_DATE, -(2000-03-18, *(30, 86400000:INTERVAL DAY))), <=(D_DATE, +(2000-03-18, *(30, 86400000:INTERVAL DAY))))
+                fieldNames: [D_DATE_SK, D_DATE]
+                est: (rows=18262)
+        Exchange
+            distribution: single
+            est: (rows=4500)
+          Sort
+              collation: [I_ITEM_SK ASC]
+              est: (rows=4500)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CURRENT_PRICE, Sarg[[0.99:DECIMAL(3, 2)..1.49:DECIMAL(3, 2)]]:DECIMAL(3, 2))
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_CURRENT_PRICE]
+                est: (rows=4500)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q5.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q5.plan
new file mode 100644
index 00000000000..7e621461f1f
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q5.plan
@@ -0,0 +1,205 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=2770902750067)
+    UnionAll
+        est: (rows=4395725844132)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=3124078767)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', ||(_UTF-8'store', S_STORE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+            est: (rows=3124078767)
+          ColocatedHashAggregate
+              fieldNames: [S_STORE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+              group: [S_STORE_ID]
+              aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+              est: (rows=3124078767)
+            Project
+                fieldNames: [S_STORE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                projection: [S_STORE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                est: (rows=15620393834)
+              MergeJoin
+                  predicate: =(STORE_SK, S_STORE_SK)
+                  type: inner
+                  est: (rows=15620393834)
+                HashJoin
+                    predicate: =(DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=8677996574)
+                  Exchange
+                      distribution: single
+                      est: (rows=3167918)
+                    Sort
+                        collation: [STORE_SK ASC]
+                        est: (rows=3167918)
+                      UnionAll
+                          est: (rows=3167918)
+                        TableScan
+                            table: PUBLIC.STORE_SALES
+                            fieldNames: [STORE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [SS_STORE_SK, SS_SOLD_DATE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                            est: (rows=2880404)
+                        TableScan
+                            table: PUBLIC.STORE_RETURNS
+                            fieldNames: [STORE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [SR_STORE_SK, SR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), SR_RETURN_AMT, SR_NET_LOSS]
+                            est: (rows=287514)
+                  Exchange
+                      distribution: single
+                      est: (rows=18262)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                        fieldNames: [D_DATE_SK, D_DATE]
+                        est: (rows=18262)
+                Exchange
+                    distribution: single
+                    est: (rows=12)
+                  Sort
+                      collation: [S_STORE_SK ASC]
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK, S_STORE_ID]
+                        est: (rows=12)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', ||(_UTF-8'catalog_page', CP_CATALOG_PAGE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+          est: (rows=1526926163852)
+        ColocatedHashAggregate
+            fieldNames: [CP_CATALOG_PAGE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+            group: [CP_CATALOG_PAGE_ID]
+            aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+            est: (rows=1526926163852)
+          Project
+              fieldNames: [CP_CATALOG_PAGE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+              projection: [CP_CATALOG_PAGE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+              est: (rows=7634630819261)
+            MergeJoin
+                predicate: =(PAGE_SK, CP_CATALOG_PAGE_SK)
+                type: inner
+                est: (rows=7634630819261)
+              HashJoin
+                  predicate: =(DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=4343534630)
+                Exchange
+                    distribution: single
+                    est: (rows=1585615)
+                  Sort
+                      collation: [PAGE_SK ASC]
+                      est: (rows=1585615)
+                    UnionAll
+                        est: (rows=1585615)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [PAGE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [CS_CATALOG_PAGE_SK, CS_SOLD_DATE_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                          est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_RETURNS
+                          fieldNames: [PAGE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [CR_CATALOG_PAGE_SK, CR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), CR_RETURN_AMOUNT, CR_NET_LOSS]
+                          est: (rows=144067)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=11718)
+                Sort
+                    collation: [CP_CATALOG_PAGE_SK ASC]
+                    est: (rows=11718)
+                  TableScan
+                      table: PUBLIC.CATALOG_PAGE
+                      fieldNames: [CP_CATALOG_PAGE_SK, CP_CATALOG_PAGE_ID]
+                      est: (rows=11718)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=2865675601513)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', ||(_UTF-8'web_site', WEB_SITE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+            est: (rows=2865675601513)
+          ColocatedHashAggregate
+              fieldNames: [WEB_SITE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+              group: [WEB_SITE_ID]
+              aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+              est: (rows=2865675601513)
+            Project
+                fieldNames: [WEB_SITE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                projection: [WEB_SITE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                est: (rows=14328378007564)
+              MergeJoin
+                  predicate: =(WSR_WEB_SITE_SK, WEB_SITE_SK)
+                  type: inner
+                  est: (rows=14328378007564)
+                HashJoin
+                    predicate: =(DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=3184084001681)
+                  Sort
+                      collation: [WSR_WEB_SITE_SK ASC]
+                      est: (rows=1162355497)
+                    UnionAll
+                        est: (rows=1162355497)
+                      Exchange
+                          distribution: single
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WSR_WEB_SITE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [WS_WEB_SITE_SK, WS_SOLD_DATE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                            est: (rows=719384)
+                      Project
+                          fieldNames: [WSR_WEB_SITE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [WS_WEB_SITE_SK, WR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), WR_RETURN_AMT, WR_NET_LOSS]
+                          est: (rows=1161636113)
+                        HashJoin
+                            predicate: AND(=(WR_ITEM_SK, WS_ITEM_SK), =(WR_ORDER_NUMBER, WS_ORDER_NUMBER))
+                            type: left
+                            est: (rows=1161636113)
+                          Exchange
+                              distribution: single
+                              est: (rows=71763)
+                            TableScan
+                                table: PUBLIC.WEB_RETURNS
+                                fieldNames: [WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_AMT, WR_NET_LOSS]
+                                est: (rows=71763)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_ITEM_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER]
+                                est: (rows=719384)
+                  Exchange
+                      distribution: single
+                      est: (rows=18262)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                        fieldNames: [D_DATE_SK, D_DATE]
+                        est: (rows=18262)
+                Exchange
+                    distribution: single
+                    est: (rows=30)
+                  Sort
+                      collation: [WEB_SITE_SK ASC]
+                      est: (rows=30)
+                    TableScan
+                        table: PUBLIC.WEB_SITE
+                        fieldNames: [WEB_SITE_SK, WEB_SITE_ID]
+                        est: (rows=30)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q50.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q50.plan
new file mode 100644
index 00000000000..9d93f05588f
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q50.plan
@@ -0,0 +1,66 @@
+Sort
+    collation: [S_STORE_NAME ASC, S_COMPANY_ID ASC, S_STREET_NUMBER ASC, S_STREET_NAME ASC, S_STREET_TYPE ASC, S_SUITE_NUMBER ASC, S_CITY ASC, S_COUNTY ASC, S_STATE ASC, S_ZIP ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP]
+      aggregation: [SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14)]
+      est: (rows=28459)
+    Project
+        fieldNames: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, $f10, $f11, $f12, $f13, $f14]
+        projection: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, CASE(<=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 30), <=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 60), <=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 90),  [...]
+        est: (rows=31882)
+      HashJoin
+          predicate: =(SS_STORE_SK, S_STORE_SK)
+          type: inner
+          est: (rows=31882)
+        HashJoin
+            predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+            fieldNames: [D_DATE_SK, SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CUSTOMER_SK, SS_STORE_SK, SS_TICKET_NUMBER, SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_CUSTOMER_SK, SR_TICKET_NUMBER, D_DATE_SK$0, D_YEAR, D_MOY]
+            type: inner
+            est: (rows=31882)
+          Exchange
+              distribution: single
+              est: (rows=73049)
+            TableScan
+                table: PUBLIC.DATE_DIM
+                fieldNames: [D_DATE_SK]
+                est: (rows=73049)
+          HashJoin
+              predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK), =(SS_CUSTOMER_SK, SR_CUSTOMER_SK))
+              type: inner
+              est: (rows=31882)
+            Exchange
+                distribution: single
+                est: (rows=2880404)
+              TableScan
+                  table: PUBLIC.STORE_SALES
+                  fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CUSTOMER_SK, SS_STORE_SK, SS_TICKET_NUMBER]
+                  est: (rows=2880404)
+            HashJoin
+                predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=31882)
+              Exchange
+                  distribution: single
+                  est: (rows=287514)
+                TableScan
+                    table: PUBLIC.STORE_RETURNS
+                    fieldNames: [SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_CUSTOMER_SK, SR_TICKET_NUMBER]
+                    est: (rows=287514)
+              Exchange
+                  distribution: single
+                  est: (rows=8100)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(=(D_YEAR, 1998), =(D_MOY, 9))
+                    fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                    est: (rows=8100)
+        Exchange
+            distribution: single
+            est: (rows=12)
+          TableScan
+              table: PUBLIC.STORE
+              fieldNames: [S_STORE_SK, S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP]
+              est: (rows=12)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q50_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q50_colocated.plan
new file mode 100644
index 00000000000..9d93f05588f
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q50_colocated.plan
@@ -0,0 +1,66 @@
+Sort
+    collation: [S_STORE_NAME ASC, S_COMPANY_ID ASC, S_STREET_NUMBER ASC, S_STREET_NAME ASC, S_STREET_TYPE ASC, S_SUITE_NUMBER ASC, S_CITY ASC, S_COUNTY ASC, S_STATE ASC, S_ZIP ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP]
+      aggregation: [SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14)]
+      est: (rows=28459)
+    Project
+        fieldNames: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, $f10, $f11, $f12, $f13, $f14]
+        projection: [S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP, CASE(<=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 30), <=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 60), <=(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(SR_RETURNED_DATE_SK, SS_SOLD_DATE_SK), 90),  [...]
+        est: (rows=31882)
+      HashJoin
+          predicate: =(SS_STORE_SK, S_STORE_SK)
+          type: inner
+          est: (rows=31882)
+        HashJoin
+            predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+            fieldNames: [D_DATE_SK, SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CUSTOMER_SK, SS_STORE_SK, SS_TICKET_NUMBER, SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_CUSTOMER_SK, SR_TICKET_NUMBER, D_DATE_SK$0, D_YEAR, D_MOY]
+            type: inner
+            est: (rows=31882)
+          Exchange
+              distribution: single
+              est: (rows=73049)
+            TableScan
+                table: PUBLIC.DATE_DIM
+                fieldNames: [D_DATE_SK]
+                est: (rows=73049)
+          HashJoin
+              predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK), =(SS_CUSTOMER_SK, SR_CUSTOMER_SK))
+              type: inner
+              est: (rows=31882)
+            Exchange
+                distribution: single
+                est: (rows=2880404)
+              TableScan
+                  table: PUBLIC.STORE_SALES
+                  fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_CUSTOMER_SK, SS_STORE_SK, SS_TICKET_NUMBER]
+                  est: (rows=2880404)
+            HashJoin
+                predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=31882)
+              Exchange
+                  distribution: single
+                  est: (rows=287514)
+                TableScan
+                    table: PUBLIC.STORE_RETURNS
+                    fieldNames: [SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_CUSTOMER_SK, SR_TICKET_NUMBER]
+                    est: (rows=287514)
+              Exchange
+                  distribution: single
+                  est: (rows=8100)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(=(D_YEAR, 1998), =(D_MOY, 9))
+                    fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                    est: (rows=8100)
+        Exchange
+            distribution: single
+            est: (rows=12)
+          TableScan
+              table: PUBLIC.STORE
+              fieldNames: [S_STORE_SK, S_STORE_NAME, S_COMPANY_ID, S_STREET_NUMBER, S_STREET_NAME, S_STREET_TYPE, S_SUITE_NUMBER, S_CITY, S_COUNTY, S_STATE, S_ZIP]
+              est: (rows=12)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q58.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q58.plan
new file mode 100644
index 00000000000..7ab91f402e6
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q58.plan
@@ -0,0 +1,284 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [ITEM_ID, SS_ITEM_REV, SS_DEV, CS_ITEM_REV, CS_DEV, WS_ITEM_REV, WS_DEV, AVERAGE]
+      projection: [ITEM_ID, SS_ITEM_REV, *(/(SS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), CS_ITEM_REV, *(/(CS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), WS_ITEM_REV, *(/(WS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)]
+      est: (rows=4847173278)
+    HashJoin
+        predicate: AND(>=(SS_ITEM_REV, *(0.9:DECIMAL(2, 1), WS_ITEM_REV)), <=(SS_ITEM_REV, *(1.1:DECIMAL(2, 1), WS_ITEM_REV)), >=(WS_ITEM_REV, *(0.9:DECIMAL(2, 1), SS_ITEM_REV)), <=(WS_ITEM_REV, *(1.1:DECIMAL(2, 1), SS_ITEM_REV)), >=(SS_ITEM_REV, *(0.9:DECIMAL(2, 1), CS_ITEM_REV)), <=(SS_ITEM_REV, *(1.1:DECIMAL(2, 1), CS_ITEM_REV)), >=(CS_ITEM_REV, *(0.9:DECIMAL(2, 1), SS_ITEM_REV)), <=(CS_ITEM_REV, *(1.1:DECIMAL(2, 1), SS_ITEM_REV)), =(ITEM_ID, ITEM_ID$0$0))
+        fieldNames: [ITEM_ID, SS_ITEM_REV, ITEM_ID$0, CS_ITEM_REV, ITEM_ID$0$0, WS_ITEM_REV]
+        type: inner
+        est: (rows=4847173278)
+      Sort
+          collation: [ITEM_ID ASC, SS_ITEM_REV ASC]
+          est: (rows=191835)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, SS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(SS_EXT_SALES_PRICE)]
+            est: (rows=191835)
+          Project
+              fieldNames: [ITEM_ID, SS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, SS_EXT_SALES_PRICE]
+              est: (rows=959175)
+            HashJoin
+                predicate: =(SS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=959175)
+              MergeJoin
+                  predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=959175)
+                Exchange
+                    distribution: single
+                    est: (rows=2880404)
+                  Sort
+                      collation: [SS_SOLD_DATE_SK ASC]
+                      est: (rows=2880404)
+                    TableScan
+                        table: PUBLIC.STORE_SALES
+                        fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_EXT_SALES_PRICE]
+                        est: (rows=2880404)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+      HashJoin
+          predicate: AND(>=(CS_ITEM_REV, *(0.9:DECIMAL(2, 1), WS_ITEM_REV)), <=(CS_ITEM_REV, *(1.1:DECIMAL(2, 1), WS_ITEM_REV)), >=(WS_ITEM_REV, *(0.9:DECIMAL(2, 1), CS_ITEM_REV)), <=(WS_ITEM_REV, *(1.1:DECIMAL(2, 1), CS_ITEM_REV)), =(ITEM_ID$0, ITEM_ID))
+          fieldNames: [ITEM_ID, CS_ITEM_REV, ITEM_ID$0, WS_ITEM_REV]
+          type: inner
+          est: (rows=43123065)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, CS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(CS_EXT_SALES_PRICE)]
+            est: (rows=96007)
+          Project
+              fieldNames: [ITEM_ID, CS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, CS_EXT_SALES_PRICE]
+              est: (rows=480035)
+            HashJoin
+                predicate: =(CS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=480035)
+              MergeJoin
+                  predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=480035)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  Sort
+                      collation: [CS_SOLD_DATE_SK ASC]
+                      est: (rows=1441548)
+                    TableScan
+                        table: PUBLIC.CATALOG_SALES
+                        fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_SALES_PRICE]
+                        est: (rows=1441548)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, WS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(WS_EXT_SALES_PRICE)]
+            est: (rows=47911)
+          Project
+              fieldNames: [ITEM_ID, WS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, WS_EXT_SALES_PRICE]
+              est: (rows=239555)
+            HashJoin
+                predicate: =(WS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=239555)
+              MergeJoin
+                  predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=239555)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  Sort
+                      collation: [WS_SOLD_DATE_SK ASC]
+                      est: (rows=719384)
+                    TableScan
+                        table: PUBLIC.WEB_SALES
+                        fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_SALES_PRICE]
+                        est: (rows=719384)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q58_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q58_colocated.plan
new file mode 100644
index 00000000000..7ab91f402e6
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q58_colocated.plan
@@ -0,0 +1,284 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [ITEM_ID, SS_ITEM_REV, SS_DEV, CS_ITEM_REV, CS_DEV, WS_ITEM_REV, WS_DEV, AVERAGE]
+      projection: [ITEM_ID, SS_ITEM_REV, *(/(SS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), CS_ITEM_REV, *(/(CS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), WS_ITEM_REV, *(/(WS_ITEM_REV, /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)), 100), /(+(+(SS_ITEM_REV, CS_ITEM_REV), WS_ITEM_REV), 3)]
+      est: (rows=4847173278)
+    HashJoin
+        predicate: AND(>=(SS_ITEM_REV, *(0.9:DECIMAL(2, 1), WS_ITEM_REV)), <=(SS_ITEM_REV, *(1.1:DECIMAL(2, 1), WS_ITEM_REV)), >=(WS_ITEM_REV, *(0.9:DECIMAL(2, 1), SS_ITEM_REV)), <=(WS_ITEM_REV, *(1.1:DECIMAL(2, 1), SS_ITEM_REV)), >=(SS_ITEM_REV, *(0.9:DECIMAL(2, 1), CS_ITEM_REV)), <=(SS_ITEM_REV, *(1.1:DECIMAL(2, 1), CS_ITEM_REV)), >=(CS_ITEM_REV, *(0.9:DECIMAL(2, 1), SS_ITEM_REV)), <=(CS_ITEM_REV, *(1.1:DECIMAL(2, 1), SS_ITEM_REV)), =(ITEM_ID, ITEM_ID$0$0))
+        fieldNames: [ITEM_ID, SS_ITEM_REV, ITEM_ID$0, CS_ITEM_REV, ITEM_ID$0$0, WS_ITEM_REV]
+        type: inner
+        est: (rows=4847173278)
+      Sort
+          collation: [ITEM_ID ASC, SS_ITEM_REV ASC]
+          est: (rows=191835)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, SS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(SS_EXT_SALES_PRICE)]
+            est: (rows=191835)
+          Project
+              fieldNames: [ITEM_ID, SS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, SS_EXT_SALES_PRICE]
+              est: (rows=959175)
+            HashJoin
+                predicate: =(SS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=959175)
+              MergeJoin
+                  predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=959175)
+                Exchange
+                    distribution: single
+                    est: (rows=2880404)
+                  Sort
+                      collation: [SS_SOLD_DATE_SK ASC]
+                      est: (rows=2880404)
+                    TableScan
+                        table: PUBLIC.STORE_SALES
+                        fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_EXT_SALES_PRICE]
+                        est: (rows=2880404)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+      HashJoin
+          predicate: AND(>=(CS_ITEM_REV, *(0.9:DECIMAL(2, 1), WS_ITEM_REV)), <=(CS_ITEM_REV, *(1.1:DECIMAL(2, 1), WS_ITEM_REV)), >=(WS_ITEM_REV, *(0.9:DECIMAL(2, 1), CS_ITEM_REV)), <=(WS_ITEM_REV, *(1.1:DECIMAL(2, 1), CS_ITEM_REV)), =(ITEM_ID$0, ITEM_ID))
+          fieldNames: [ITEM_ID, CS_ITEM_REV, ITEM_ID$0, WS_ITEM_REV]
+          type: inner
+          est: (rows=43123065)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, CS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(CS_EXT_SALES_PRICE)]
+            est: (rows=96007)
+          Project
+              fieldNames: [ITEM_ID, CS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, CS_EXT_SALES_PRICE]
+              est: (rows=480035)
+            HashJoin
+                predicate: =(CS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=480035)
+              MergeJoin
+                  predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=480035)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  Sort
+                      collation: [CS_SOLD_DATE_SK ASC]
+                      est: (rows=1441548)
+                    TableScan
+                        table: PUBLIC.CATALOG_SALES
+                        fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_EXT_SALES_PRICE]
+                        est: (rows=1441548)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, WS_ITEM_REV]
+            group: [ITEM_ID]
+            aggregation: [SUM(WS_EXT_SALES_PRICE)]
+            est: (rows=47911)
+          Project
+              fieldNames: [ITEM_ID, WS_EXT_SALES_PRICE]
+              projection: [I_ITEM_ID, WS_EXT_SALES_PRICE]
+              est: (rows=239555)
+            HashJoin
+                predicate: =(WS_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=239555)
+              MergeJoin
+                  predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=239555)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  Sort
+                      collation: [WS_SOLD_DATE_SK ASC]
+                      est: (rows=719384)
+                    TableScan
+                        table: PUBLIC.WEB_SALES
+                        fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_SALES_PRICE]
+                        est: (rows=719384)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=24012704)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedHashAggregate
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=2191)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=10957)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, $f0)
+                          type: inner
+                          est: (rows=10957)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                        ReduceSortAggregate
+                            fieldNames: [$f0]
+                            collation: []
+                            group: []
+                            aggregation: [SINGLE_VALUE(_ACC0)]
+                            est: (rows=1)
+                          Exchange
+                              distribution: single
+                              est: (rows=1)
+                            MapSortAggregate
+                                fieldNames: [_ACC0]
+                                collation: []
+                                group: []
+                                aggregation: [SINGLE_VALUE(D_WEEK_SEQ)]
+                                est: (rows=1)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: =(D_DATE, 1998-02-21)
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=24325)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q5_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q5_colocated.plan
new file mode 100644
index 00000000000..7e621461f1f
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q5_colocated.plan
@@ -0,0 +1,205 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=2770902750067)
+    UnionAll
+        est: (rows=4395725844132)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=3124078767)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', ||(_UTF-8'store', S_STORE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+            est: (rows=3124078767)
+          ColocatedHashAggregate
+              fieldNames: [S_STORE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+              group: [S_STORE_ID]
+              aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+              est: (rows=3124078767)
+            Project
+                fieldNames: [S_STORE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                projection: [S_STORE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                est: (rows=15620393834)
+              MergeJoin
+                  predicate: =(STORE_SK, S_STORE_SK)
+                  type: inner
+                  est: (rows=15620393834)
+                HashJoin
+                    predicate: =(DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=8677996574)
+                  Exchange
+                      distribution: single
+                      est: (rows=3167918)
+                    Sort
+                        collation: [STORE_SK ASC]
+                        est: (rows=3167918)
+                      UnionAll
+                          est: (rows=3167918)
+                        TableScan
+                            table: PUBLIC.STORE_SALES
+                            fieldNames: [STORE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [SS_STORE_SK, SS_SOLD_DATE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                            est: (rows=2880404)
+                        TableScan
+                            table: PUBLIC.STORE_RETURNS
+                            fieldNames: [STORE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [SR_STORE_SK, SR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), SR_RETURN_AMT, SR_NET_LOSS]
+                            est: (rows=287514)
+                  Exchange
+                      distribution: single
+                      est: (rows=18262)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                        fieldNames: [D_DATE_SK, D_DATE]
+                        est: (rows=18262)
+                Exchange
+                    distribution: single
+                    est: (rows=12)
+                  Sort
+                      collation: [S_STORE_SK ASC]
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK, S_STORE_ID]
+                        est: (rows=12)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', ||(_UTF-8'catalog_page', CP_CATALOG_PAGE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+          est: (rows=1526926163852)
+        ColocatedHashAggregate
+            fieldNames: [CP_CATALOG_PAGE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+            group: [CP_CATALOG_PAGE_ID]
+            aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+            est: (rows=1526926163852)
+          Project
+              fieldNames: [CP_CATALOG_PAGE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+              projection: [CP_CATALOG_PAGE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+              est: (rows=7634630819261)
+            MergeJoin
+                predicate: =(PAGE_SK, CP_CATALOG_PAGE_SK)
+                type: inner
+                est: (rows=7634630819261)
+              HashJoin
+                  predicate: =(DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=4343534630)
+                Exchange
+                    distribution: single
+                    est: (rows=1585615)
+                  Sort
+                      collation: [PAGE_SK ASC]
+                      est: (rows=1585615)
+                    UnionAll
+                        est: (rows=1585615)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [PAGE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [CS_CATALOG_PAGE_SK, CS_SOLD_DATE_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                          est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_RETURNS
+                          fieldNames: [PAGE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [CR_CATALOG_PAGE_SK, CR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), CR_RETURN_AMOUNT, CR_NET_LOSS]
+                          est: (rows=144067)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=11718)
+                Sort
+                    collation: [CP_CATALOG_PAGE_SK ASC]
+                    est: (rows=11718)
+                  TableScan
+                      table: PUBLIC.CATALOG_PAGE
+                      fieldNames: [CP_CATALOG_PAGE_SK, CP_CATALOG_PAGE_ID]
+                      est: (rows=11718)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=2865675601513)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', ||(_UTF-8'web_site', WEB_SITE_ID), SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+            est: (rows=2865675601513)
+          ColocatedHashAggregate
+              fieldNames: [WEB_SITE_ID, SALES, PROFIT, RETURNS, PROFIT_LOSS]
+              group: [WEB_SITE_ID]
+              aggregation: [SUM(SALES_PRICE), SUM(PROFIT), SUM(RETURN_AMT), SUM(NET_LOSS)]
+              est: (rows=2865675601513)
+            Project
+                fieldNames: [WEB_SITE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                projection: [WEB_SITE_ID, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                est: (rows=14328378007564)
+              MergeJoin
+                  predicate: =(WSR_WEB_SITE_SK, WEB_SITE_SK)
+                  type: inner
+                  est: (rows=14328378007564)
+                HashJoin
+                    predicate: =(DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=3184084001681)
+                  Sort
+                      collation: [WSR_WEB_SITE_SK ASC]
+                      est: (rows=1162355497)
+                    UnionAll
+                        est: (rows=1162355497)
+                      Exchange
+                          distribution: single
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WSR_WEB_SITE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                            projection: [WS_WEB_SITE_SK, WS_SOLD_DATE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2)]
+                            est: (rows=719384)
+                      Project
+                          fieldNames: [WSR_WEB_SITE_SK, DATE_SK, SALES_PRICE, PROFIT, RETURN_AMT, NET_LOSS]
+                          projection: [WS_WEB_SITE_SK, WR_RETURNED_DATE_SK, 0.00:DECIMAL(7, 2), 0.00:DECIMAL(7, 2), WR_RETURN_AMT, WR_NET_LOSS]
+                          est: (rows=1161636113)
+                        HashJoin
+                            predicate: AND(=(WR_ITEM_SK, WS_ITEM_SK), =(WR_ORDER_NUMBER, WS_ORDER_NUMBER))
+                            type: left
+                            est: (rows=1161636113)
+                          Exchange
+                              distribution: single
+                              est: (rows=71763)
+                            TableScan
+                                table: PUBLIC.WEB_RETURNS
+                                fieldNames: [WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_AMT, WR_NET_LOSS]
+                                est: (rows=71763)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_ITEM_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER]
+                                est: (rows=719384)
+                  Exchange
+                      distribution: single
+                      est: (rows=18262)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: AND(>=(D_DATE, 2000-08-19), <=(D_DATE, +(2000-08-19, *(14, 86400000:INTERVAL DAY))))
+                        fieldNames: [D_DATE_SK, D_DATE]
+                        est: (rows=18262)
+                Exchange
+                    distribution: single
+                    est: (rows=30)
+                  Sort
+                      collation: [WEB_SITE_SK ASC]
+                      est: (rows=30)
+                    TableScan
+                        table: PUBLIC.WEB_SITE
+                        fieldNames: [WEB_SITE_SK, WEB_SITE_ID]
+                        est: (rows=30)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q62.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q62.plan
new file mode 100644
index 00000000000..0ffb3577aa8
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q62.plan
@@ -0,0 +1,65 @@
+Sort
+    collation: [EXPR$0 ASC, SM_TYPE ASC, WEB_NAME ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [EXPR$0, SM_TYPE, WEB_NAME, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [EXPR$0, SM_TYPE, WEB_NAME]
+      aggregation: [SUM($f3), SUM($f4), SUM($f5), SUM($f6), SUM($f7)]
+      est: (rows=87765)
+    Project
+        fieldNames: [EXPR$0, SM_TYPE, WEB_NAME, $f3, $f4, $f5, $f6, $f7]
+        projection: [SUBSTR(W_WAREHOUSE_NAME, 1, 20), SM_TYPE, WEB_NAME, CASE(<=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 30), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 60), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 90), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 120)), 1, 0), CASE(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), [...]
+        est: (rows=179846)
+      HashJoin
+          predicate: =(WS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+          type: inner
+          est: (rows=179846)
+        HashJoin
+            predicate: =(WS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+            type: inner
+            est: (rows=179846)
+          HashJoin
+              predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+              type: inner
+              est: (rows=179846)
+            HashJoin
+                predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=179846)
+              Exchange
+                  distribution: single
+                  est: (rows=719384)
+                TableScan
+                    table: PUBLIC.WEB_SALES
+                    fieldNames: [WS_SOLD_DATE_SK, WS_SHIP_DATE_SK, WS_WEB_SITE_SK, WS_SHIP_MODE_SK, WS_WAREHOUSE_SK]
+                    est: (rows=719384)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_MONTH_SEQ, 1215), <=(D_MONTH_SEQ, +(1215, 11)))
+                    fieldNames: [D_DATE_SK, D_MONTH_SEQ]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=30)
+              TableScan
+                  table: PUBLIC.WEB_SITE
+                  fieldNames: [WEB_SITE_SK, WEB_NAME]
+                  est: (rows=30)
+          Exchange
+              distribution: single
+              est: (rows=20)
+            TableScan
+                table: PUBLIC.SHIP_MODE
+                fieldNames: [SM_SHIP_MODE_SK, SM_TYPE]
+                est: (rows=20)
+        Exchange
+            distribution: single
+            est: (rows=5)
+          TableScan
+              table: PUBLIC.WAREHOUSE
+              fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+              est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q62_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q62_colocated.plan
new file mode 100644
index 00000000000..0ffb3577aa8
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q62_colocated.plan
@@ -0,0 +1,65 @@
+Sort
+    collation: [EXPR$0 ASC, SM_TYPE ASC, WEB_NAME ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [EXPR$0, SM_TYPE, WEB_NAME, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [EXPR$0, SM_TYPE, WEB_NAME]
+      aggregation: [SUM($f3), SUM($f4), SUM($f5), SUM($f6), SUM($f7)]
+      est: (rows=87765)
+    Project
+        fieldNames: [EXPR$0, SM_TYPE, WEB_NAME, $f3, $f4, $f5, $f6, $f7]
+        projection: [SUBSTR(W_WAREHOUSE_NAME, 1, 20), SM_TYPE, WEB_NAME, CASE(<=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 30), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 60), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 90), <=(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), 120)), 1, 0), CASE(>(-(WS_SHIP_DATE_SK, WS_SOLD_DATE_SK), [...]
+        est: (rows=179846)
+      HashJoin
+          predicate: =(WS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+          type: inner
+          est: (rows=179846)
+        HashJoin
+            predicate: =(WS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+            type: inner
+            est: (rows=179846)
+          HashJoin
+              predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+              type: inner
+              est: (rows=179846)
+            HashJoin
+                predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=179846)
+              Exchange
+                  distribution: single
+                  est: (rows=719384)
+                TableScan
+                    table: PUBLIC.WEB_SALES
+                    fieldNames: [WS_SOLD_DATE_SK, WS_SHIP_DATE_SK, WS_WEB_SITE_SK, WS_SHIP_MODE_SK, WS_WAREHOUSE_SK]
+                    est: (rows=719384)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_MONTH_SEQ, 1215), <=(D_MONTH_SEQ, +(1215, 11)))
+                    fieldNames: [D_DATE_SK, D_MONTH_SEQ]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=30)
+              TableScan
+                  table: PUBLIC.WEB_SITE
+                  fieldNames: [WEB_SITE_SK, WEB_NAME]
+                  est: (rows=30)
+          Exchange
+              distribution: single
+              est: (rows=20)
+            TableScan
+                table: PUBLIC.SHIP_MODE
+                fieldNames: [SM_SHIP_MODE_SK, SM_TYPE]
+                est: (rows=20)
+        Exchange
+            distribution: single
+            est: (rows=5)
+          TableScan
+              table: PUBLIC.WAREHOUSE
+              fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+              est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q66.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q66.plan
new file mode 100644
index 00000000000..ab007a115ea
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q66.plan
@@ -0,0 +1,152 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  ColocatedSortAggregate
+      fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_SALES_PER_SQ_FOOT, FEB_SALES_PER_SQ_FOOT, MAR_SALES_PER_SQ_FOOT, APR_SALES_PER_SQ_FOOT, MAY_SALES_PER_SQ_FOOT, JUN_SALES_PER_SQ_FOOT, JUL_SALES_PER_SQ_FOOT, AUG_SALES_PER_SQ_FOOT, SEP_SALES_PER_SQ_FOOT, OCT_SALES_PER_SQ_FOOT, NOV_SALES_PER_S [...]
+      collation: [W_WAREHOUSE_NAME ASC, W_WAREHOUSE_SQ_FT ASC, W_CITY ASC, W_COUNTY ASC, W_STATE ASC, W_COUNTRY ASC, SHIP_CARRIERS ASC, year ASC]
+      group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year]
+      aggregation: [SUM(JAN_SALES), SUM(FEB_SALES), SUM(MAR_SALES), SUM(APR_SALES), SUM(MAY_SALES), SUM(JUN_SALES), SUM(JUL_SALES), SUM(AUG_SALES), SUM(SEP_SALES), SUM(OCT_SALES), SUM(NOV_SALES), SUM(DEC_SALES), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30), SUM($f31), SUM(JAN_NET), SUM(FEB_NET), SUM(MAR_NET), SUM(APR_NET), SUM(MAY_NET), SUM(JUN_NET), SUM(JUL_NET), SUM(AUG_NET), SUM(SEP_NET), SUM(OCT_NET), SUM(NOV_ [...]
+      est: (rows=80809)
+    Project
+        fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30, $f31, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+        projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, /(JAN_SALES, W_WAREHOUSE_SQ_FT), /(FEB_SALES, W_WAREHOUSE_SQ_FT), /(MAR_SALES, W_WAREHOUSE_SQ_FT), /(APR_SALES, W_WAREHOUSE_SQ_FT), /(MAY_SALES, W_WAREHOUSE_SQ_FT), /(JUN_SALES, W_WAREHOUSE_SQ_FT), /(JUL_SALES, W_WAREHOUSE_SQ_FT), /(AUG_SALES, [...]
+        est: (rows=80819)
+      Sort
+          collation: [W_WAREHOUSE_NAME ASC, W_WAREHOUSE_SQ_FT ASC, W_CITY ASC, W_COUNTY ASC, W_STATE ASC, W_COUNTRY ASC, SHIP_CARRIERS ASC, year ASC]
+          est: (rows=80819)
+        UnionAll
+            est: (rows=80819)
+          Project
+              fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, ||(||(_UTF-8'MSC', _UTF-8','), _UTF-8'GERMA'), year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              est: (rows=26905)
+            ColocatedHashAggregate
+                fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+                group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year]
+                aggregation: [SUM($f7), SUM($f8), SUM($f9), SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14), SUM($f15), SUM($f16), SUM($f17), SUM($f18), SUM($f19), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30)]
+                est: (rows=26905)
+              Project
+                  fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, $f7, $f8, $f9, $f10, $f11, $f12, $f13, $f14, $f15, $f16, $f17, $f18, $f19, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30]
+                  projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, D_YEAR, CASE(=(D_MOY, 1), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 2), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 3), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 4), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 5), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 6),  [...]
+                  est: (rows=34045)
+                HashJoin
+                    predicate: =(WS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+                    type: inner
+                    est: (rows=34045)
+                  HashJoin
+                      predicate: =(WS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+                      type: inner
+                      est: (rows=34045)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=59889)
+                      HashJoin
+                          predicate: =(WS_SOLD_TIME_SK, T_TIME_SK)
+                          type: inner
+                          est: (rows=179846)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          TableScan
+                              table: PUBLIC.WEB_SALES
+                              fieldNames: [WS_SOLD_DATE_SK, WS_SOLD_TIME_SK, WS_SHIP_MODE_SK, WS_WAREHOUSE_SK, WS_QUANTITY, WS_SALES_PRICE, WS_NET_PAID_INC_SHIP_TAX]
+                              est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=21600)
+                          TableScan
+                              table: PUBLIC.TIME_DIM
+                              predicate: AND(>=(T_TIME, 9453), <=(T_TIME, +(9453, 28800)))
+                              fieldNames: [T_TIME_SK, T_TIME]
+                              est: (rows=21600)
+                      Exchange
+                          distribution: single
+                          est: (rows=24325)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: =(D_YEAR, 2001)
+                            fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                            est: (rows=24325)
+                    Exchange
+                        distribution: single
+                        est: (rows=11)
+                      TableScan
+                          table: PUBLIC.SHIP_MODE
+                          predicate: SEARCH(SM_CARRIER, Sarg[_UTF-8'GERMA':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'MSC':VARCHAR(20) CHARACTER SET "UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8")
+                          fieldNames: [SM_SHIP_MODE_SK, SM_CARRIER]
+                          est: (rows=11)
+                  Exchange
+                      distribution: single
+                      est: (rows=5)
+                    TableScan
+                        table: PUBLIC.WAREHOUSE
+                        fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY]
+                        est: (rows=5)
+          Project
+              fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, ||(||(_UTF-8'MSC', _UTF-8','), _UTF-8'GERMA'), year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              est: (rows=53914)
+            ColocatedHashAggregate
+                fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+                group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year]
+                aggregation: [SUM($f7), SUM($f8), SUM($f9), SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14), SUM($f15), SUM($f16), SUM($f17), SUM($f18), SUM($f19), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30)]
+                est: (rows=53914)
+              Project
+                  fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, $f7, $f8, $f9, $f10, $f11, $f12, $f13, $f14, $f15, $f16, $f17, $f18, $f19, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30]
+                  projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, D_YEAR, CASE(=(D_MOY, 1), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 2), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 3), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 4), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 5), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CAS [...]
+                  est: (rows=68221)
+                HashJoin
+                    predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+                    type: inner
+                    est: (rows=68221)
+                  HashJoin
+                      predicate: =(CS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+                      type: inner
+                      est: (rows=68221)
+                    HashJoin
+                        predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=120009)
+                      HashJoin
+                          predicate: =(CS_SOLD_TIME_SK, T_TIME_SK)
+                          type: inner
+                          est: (rows=360387)
+                        Exchange
+                            distribution: single
+                            est: (rows=1441548)
+                          TableScan
+                              table: PUBLIC.CATALOG_SALES
+                              fieldNames: [CS_SOLD_DATE_SK, CS_SOLD_TIME_SK, CS_SHIP_MODE_SK, CS_WAREHOUSE_SK, CS_QUANTITY, CS_EXT_LIST_PRICE, CS_NET_PAID_INC_SHIP]
+                              est: (rows=1441548)
+                        Exchange
+                            distribution: single
+                            est: (rows=21600)
+                          TableScan
+                              table: PUBLIC.TIME_DIM
+                              predicate: AND(>=(T_TIME, 9453), <=(T_TIME, +(9453, 28800)))
+                              fieldNames: [T_TIME_SK, T_TIME]
+                              est: (rows=21600)
+                      Exchange
+                          distribution: single
+                          est: (rows=24325)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: =(D_YEAR, 2001)
+                            fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                            est: (rows=24325)
+                    Exchange
+                        distribution: single
+                        est: (rows=11)
+                      TableScan
+                          table: PUBLIC.SHIP_MODE
+                          predicate: SEARCH(SM_CARRIER, Sarg[_UTF-8'GERMA':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'MSC':VARCHAR(20) CHARACTER SET "UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8")
+                          fieldNames: [SM_SHIP_MODE_SK, SM_CARRIER]
+                          est: (rows=11)
+                  Exchange
+                      distribution: single
+                      est: (rows=5)
+                    TableScan
+                        table: PUBLIC.WAREHOUSE
+                        fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY]
+                        est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q66_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q66_colocated.plan
new file mode 100644
index 00000000000..ab007a115ea
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q66_colocated.plan
@@ -0,0 +1,152 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  ColocatedSortAggregate
+      fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_SALES_PER_SQ_FOOT, FEB_SALES_PER_SQ_FOOT, MAR_SALES_PER_SQ_FOOT, APR_SALES_PER_SQ_FOOT, MAY_SALES_PER_SQ_FOOT, JUN_SALES_PER_SQ_FOOT, JUL_SALES_PER_SQ_FOOT, AUG_SALES_PER_SQ_FOOT, SEP_SALES_PER_SQ_FOOT, OCT_SALES_PER_SQ_FOOT, NOV_SALES_PER_S [...]
+      collation: [W_WAREHOUSE_NAME ASC, W_WAREHOUSE_SQ_FT ASC, W_CITY ASC, W_COUNTY ASC, W_STATE ASC, W_COUNTRY ASC, SHIP_CARRIERS ASC, year ASC]
+      group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year]
+      aggregation: [SUM(JAN_SALES), SUM(FEB_SALES), SUM(MAR_SALES), SUM(APR_SALES), SUM(MAY_SALES), SUM(JUN_SALES), SUM(JUL_SALES), SUM(AUG_SALES), SUM(SEP_SALES), SUM(OCT_SALES), SUM(NOV_SALES), SUM(DEC_SALES), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30), SUM($f31), SUM(JAN_NET), SUM(FEB_NET), SUM(MAR_NET), SUM(APR_NET), SUM(MAY_NET), SUM(JUN_NET), SUM(JUL_NET), SUM(AUG_NET), SUM(SEP_NET), SUM(OCT_NET), SUM(NOV_ [...]
+      est: (rows=80809)
+    Project
+        fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30, $f31, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+        projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, /(JAN_SALES, W_WAREHOUSE_SQ_FT), /(FEB_SALES, W_WAREHOUSE_SQ_FT), /(MAR_SALES, W_WAREHOUSE_SQ_FT), /(APR_SALES, W_WAREHOUSE_SQ_FT), /(MAY_SALES, W_WAREHOUSE_SQ_FT), /(JUN_SALES, W_WAREHOUSE_SQ_FT), /(JUL_SALES, W_WAREHOUSE_SQ_FT), /(AUG_SALES, [...]
+        est: (rows=80819)
+      Sort
+          collation: [W_WAREHOUSE_NAME ASC, W_WAREHOUSE_SQ_FT ASC, W_CITY ASC, W_COUNTY ASC, W_STATE ASC, W_COUNTRY ASC, SHIP_CARRIERS ASC, year ASC]
+          est: (rows=80819)
+        UnionAll
+            est: (rows=80819)
+          Project
+              fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, ||(||(_UTF-8'MSC', _UTF-8','), _UTF-8'GERMA'), year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              est: (rows=26905)
+            ColocatedHashAggregate
+                fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+                group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year]
+                aggregation: [SUM($f7), SUM($f8), SUM($f9), SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14), SUM($f15), SUM($f16), SUM($f17), SUM($f18), SUM($f19), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30)]
+                est: (rows=26905)
+              Project
+                  fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, $f7, $f8, $f9, $f10, $f11, $f12, $f13, $f14, $f15, $f16, $f17, $f18, $f19, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30]
+                  projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, D_YEAR, CASE(=(D_MOY, 1), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 2), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 3), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 4), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 5), *(WS_SALES_PRICE, WS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 6),  [...]
+                  est: (rows=34045)
+                HashJoin
+                    predicate: =(WS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+                    type: inner
+                    est: (rows=34045)
+                  HashJoin
+                      predicate: =(WS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+                      type: inner
+                      est: (rows=34045)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=59889)
+                      HashJoin
+                          predicate: =(WS_SOLD_TIME_SK, T_TIME_SK)
+                          type: inner
+                          est: (rows=179846)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          TableScan
+                              table: PUBLIC.WEB_SALES
+                              fieldNames: [WS_SOLD_DATE_SK, WS_SOLD_TIME_SK, WS_SHIP_MODE_SK, WS_WAREHOUSE_SK, WS_QUANTITY, WS_SALES_PRICE, WS_NET_PAID_INC_SHIP_TAX]
+                              est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=21600)
+                          TableScan
+                              table: PUBLIC.TIME_DIM
+                              predicate: AND(>=(T_TIME, 9453), <=(T_TIME, +(9453, 28800)))
+                              fieldNames: [T_TIME_SK, T_TIME]
+                              est: (rows=21600)
+                      Exchange
+                          distribution: single
+                          est: (rows=24325)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: =(D_YEAR, 2001)
+                            fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                            est: (rows=24325)
+                    Exchange
+                        distribution: single
+                        est: (rows=11)
+                      TableScan
+                          table: PUBLIC.SHIP_MODE
+                          predicate: SEARCH(SM_CARRIER, Sarg[_UTF-8'GERMA':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'MSC':VARCHAR(20) CHARACTER SET "UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8")
+                          fieldNames: [SM_SHIP_MODE_SK, SM_CARRIER]
+                          est: (rows=11)
+                  Exchange
+                      distribution: single
+                      est: (rows=5)
+                    TableScan
+                        table: PUBLIC.WAREHOUSE
+                        fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY]
+                        est: (rows=5)
+          Project
+              fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, SHIP_CARRIERS, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, ||(||(_UTF-8'MSC', _UTF-8','), _UTF-8'GERMA'), year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+              est: (rows=53914)
+            ColocatedHashAggregate
+                fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, JAN_SALES, FEB_SALES, MAR_SALES, APR_SALES, MAY_SALES, JUN_SALES, JUL_SALES, AUG_SALES, SEP_SALES, OCT_SALES, NOV_SALES, DEC_SALES, JAN_NET, FEB_NET, MAR_NET, APR_NET, MAY_NET, JUN_NET, JUL_NET, AUG_NET, SEP_NET, OCT_NET, NOV_NET, DEC_NET]
+                group: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year]
+                aggregation: [SUM($f7), SUM($f8), SUM($f9), SUM($f10), SUM($f11), SUM($f12), SUM($f13), SUM($f14), SUM($f15), SUM($f16), SUM($f17), SUM($f18), SUM($f19), SUM($f20), SUM($f21), SUM($f22), SUM($f23), SUM($f24), SUM($f25), SUM($f26), SUM($f27), SUM($f28), SUM($f29), SUM($f30)]
+                est: (rows=53914)
+              Project
+                  fieldNames: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, year, $f7, $f8, $f9, $f10, $f11, $f12, $f13, $f14, $f15, $f16, $f17, $f18, $f19, $f20, $f21, $f22, $f23, $f24, $f25, $f26, $f27, $f28, $f29, $f30]
+                  projection: [W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY, D_YEAR, CASE(=(D_MOY, 1), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 2), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 3), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 4), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CASE(=(D_MOY, 5), *(CS_EXT_LIST_PRICE, CS_QUANTITY), 0.00:DECIMAL(17, 2)), CAS [...]
+                  est: (rows=68221)
+                HashJoin
+                    predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+                    type: inner
+                    est: (rows=68221)
+                  HashJoin
+                      predicate: =(CS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+                      type: inner
+                      est: (rows=68221)
+                    HashJoin
+                        predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=120009)
+                      HashJoin
+                          predicate: =(CS_SOLD_TIME_SK, T_TIME_SK)
+                          type: inner
+                          est: (rows=360387)
+                        Exchange
+                            distribution: single
+                            est: (rows=1441548)
+                          TableScan
+                              table: PUBLIC.CATALOG_SALES
+                              fieldNames: [CS_SOLD_DATE_SK, CS_SOLD_TIME_SK, CS_SHIP_MODE_SK, CS_WAREHOUSE_SK, CS_QUANTITY, CS_EXT_LIST_PRICE, CS_NET_PAID_INC_SHIP]
+                              est: (rows=1441548)
+                        Exchange
+                            distribution: single
+                            est: (rows=21600)
+                          TableScan
+                              table: PUBLIC.TIME_DIM
+                              predicate: AND(>=(T_TIME, 9453), <=(T_TIME, +(9453, 28800)))
+                              fieldNames: [T_TIME_SK, T_TIME]
+                              est: (rows=21600)
+                      Exchange
+                          distribution: single
+                          est: (rows=24325)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: =(D_YEAR, 2001)
+                            fieldNames: [D_DATE_SK, D_YEAR, D_MOY]
+                            est: (rows=24325)
+                    Exchange
+                        distribution: single
+                        est: (rows=11)
+                      TableScan
+                          table: PUBLIC.SHIP_MODE
+                          predicate: SEARCH(SM_CARRIER, Sarg[_UTF-8'GERMA':VARCHAR(20) CHARACTER SET "UTF-8", _UTF-8'MSC':VARCHAR(20) CHARACTER SET "UTF-8"]:VARCHAR(20) CHARACTER SET "UTF-8")
+                          fieldNames: [SM_SHIP_MODE_SK, SM_CARRIER]
+                          est: (rows=11)
+                  Exchange
+                      distribution: single
+                      est: (rows=5)
+                    TableScan
+                        table: PUBLIC.WAREHOUSE
+                        fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME, W_WAREHOUSE_SQ_FT, W_CITY, W_COUNTY, W_STATE, W_COUNTRY]
+                        est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q74.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q74.plan
new file mode 100644
index 00000000000..405bc091944
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q74.plan
@@ -0,0 +1,255 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME]
+      projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME]
+      est: (rows=874578399118912500)
+    HashJoin
+        predicate: AND(>(CASE(>(YEAR_TOTAL$0, 0.00), /(YEAR_TOTAL$0$0$0, YEAR_TOTAL$0), null:DECIMAL(32767, 0)), CASE(>(YEAR_TOTAL$0$0, 0.00), /(YEAR_TOTAL, YEAR_TOTAL$0$0), null:DECIMAL(32767, 0))), =(CUSTOMER_ID, CUSTOMER_ID$0$0))
+        fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0, CUSTOMER_ID$0$0, year$0$0, YEAR_TOTAL$0$0, SALE_TYPE$0$0, CUSTOMER_ID$0$0$0, year$0$0$0, YEAR_TOTAL$0$0$0, SALE_TYPE$0$0$0]
+        type: inner
+        est: (rows=874578399118912500)
+      Sort
+          collation: [CUSTOMER_LAST_NAME ASC, CUSTOMER_ID ASC, CUSTOMER_FIRST_NAME ASC]
+          est: (rows=321922)
+        UnionAll
+            est: (rows=321922)
+          Project
+              fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE]
+              projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, _UTF-8's']
+              est: (rows=321921)
+            ColocatedHashAggregate
+                fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                aggregation: [SUM(SS_NET_PAID)]
+                est: (rows=321921)
+              Project
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                  projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, SS_NET_PAID]
+                  est: (rows=545259)
+                HashJoin
+                    predicate: =(C_CUSTOMER_SK, SS_CUSTOMER_SK)
+                    type: inner
+                    est: (rows=545259)
+                  HashJoin
+                      predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=545259)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_CUSTOMER_SK, SS_NET_PAID]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=13828)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(OR(=(D_YEAR, 1998), =(D_YEAR, +(1998, 1))), =(D_YEAR, +(1998, 1)))
+                          fieldNames: [D_DATE_SK, D_YEAR]
+                          est: (rows=13828)
+                  Exchange
+                      distribution: single
+                      est: (rows=100000)
+                    TableScan
+                        table: PUBLIC.CUSTOMER
+                        fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                        est: (rows=100000)
+          Project
+              fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE]
+              projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, CAST(WS_NET_PAID):DECIMAL(32767, 2), _UTF-8'w']
+              est: (rows=1)
+            Values
+                fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                tuples: []
+                est: (rows=1)
+      MergeJoin
+          predicate: =(CUSTOMER_ID$0, CUSTOMER_ID)
+          fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0, CUSTOMER_ID$0$0, year$0$0, YEAR_TOTAL$0$0, SALE_TYPE$0$0]
+          type: inner
+          est: (rows=36223234343827)
+        Sort
+            collation: [CUSTOMER_ID ASC]
+            est: (rows=70718)
+          UnionAll
+              est: (rows=70718)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, CAST(SS_NET_PAID):DECIMAL(32767, 2), _UTF-8's']
+                est: (rows=1)
+              Filter
+                  predicate: >(CAST(SS_NET_PAID):DECIMAL(32767, 2), 0.00)
+                  est: (rows=1)
+                Values
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                    tuples: []
+                    est: (rows=1)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8'w']
+                est: (rows=70717)
+              Filter
+                  predicate: >(YEAR_TOTAL, 0.00)
+                  est: (rows=70717)
+                ColocatedHashAggregate
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                    group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                    aggregation: [SUM(WS_NET_PAID)]
+                    est: (rows=141433)
+                  Project
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                      projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, WS_NET_PAID]
+                      est: (rows=239555)
+                    HashJoin
+                        predicate: =(C_CUSTOMER_SK, WS_BILL_CUSTOMER_SK)
+                        type: inner
+                        est: (rows=239555)
+                      HashJoin
+                          predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                          type: inner
+                          est: (rows=239555)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          TableScan
+                              table: PUBLIC.WEB_SALES
+                              fieldNames: [WS_SOLD_DATE_SK, WS_BILL_CUSTOMER_SK, WS_NET_PAID]
+                              est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=24325)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(OR(IS NOT NULL(D_YEAR), =(D_YEAR, +(1998, 1))), =(D_YEAR, 1998))
+                              fieldNames: [D_DATE_SK, D_YEAR]
+                              est: (rows=24325)
+                      Exchange
+                          distribution: single
+                          est: (rows=100000)
+                        TableScan
+                            table: PUBLIC.CUSTOMER
+                            fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                            est: (rows=100000)
+        HashJoin
+            predicate: =(CUSTOMER_ID, CUSTOMER_ID$0)
+            fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0]
+            type: inner
+            est: (rows=3414825094)
+          Sort
+              collation: [CUSTOMER_ID ASC]
+              est: (rows=283149)
+            UnionAll
+                est: (rows=283149)
+              Project
+                  fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                  projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8's']
+                  est: (rows=283148)
+                Filter
+                    predicate: >(YEAR_TOTAL, 0.00)
+                    est: (rows=283148)
+                  ColocatedHashAggregate
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                      group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                      aggregation: [SUM(SS_NET_PAID)]
+                      est: (rows=566297)
+                    Project
+                        fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                        projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, SS_NET_PAID]
+                        est: (rows=959175)
+                      HashJoin
+                          predicate: =(C_CUSTOMER_SK, SS_CUSTOMER_SK)
+                          type: inner
+                          est: (rows=959175)
+                        HashJoin
+                            predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=959175)
+                          Exchange
+                              distribution: single
+                              est: (rows=2880404)
+                            TableScan
+                                table: PUBLIC.STORE_SALES
+                                fieldNames: [SS_SOLD_DATE_SK, SS_CUSTOMER_SK, SS_NET_PAID]
+                                est: (rows=2880404)
+                          Exchange
+                              distribution: single
+                              est: (rows=24325)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(OR(IS NOT NULL(D_YEAR), =(D_YEAR, +(1998, 1))), =(D_YEAR, 1998))
+                                fieldNames: [D_DATE_SK, D_YEAR]
+                                est: (rows=24325)
+                        Exchange
+                            distribution: single
+                            est: (rows=100000)
+                          TableScan
+                              table: PUBLIC.CUSTOMER
+                              fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                              est: (rows=100000)
+              Project
+                  fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                  projection: [CUSTOMER_ID, year, CAST(WS_NET_PAID):DECIMAL(32767, 2), _UTF-8'w']
+                  est: (rows=1)
+                Filter
+                    predicate: >(CAST(WS_NET_PAID):DECIMAL(32767, 2), 0.00)
+                    est: (rows=1)
+                  Values
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                      tuples: []
+                      est: (rows=1)
+          UnionAll
+              est: (rows=80401)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, CAST(SS_NET_PAID):DECIMAL(32767, 2), _UTF-8's']
+                est: (rows=1)
+              Values
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                  tuples: []
+                  est: (rows=1)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8'w']
+                est: (rows=80400)
+              ColocatedHashAggregate
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                  group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                  aggregation: [SUM(WS_NET_PAID)]
+                  est: (rows=80400)
+                Project
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                    projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, WS_NET_PAID]
+                    est: (rows=136179)
+                  HashJoin
+                      predicate: =(C_CUSTOMER_SK, WS_BILL_CUSTOMER_SK)
+                      type: inner
+                      est: (rows=136179)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=136179)
+                      Exchange
+                          distribution: single
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WS_SOLD_DATE_SK, WS_BILL_CUSTOMER_SK, WS_NET_PAID]
+                            est: (rows=719384)
+                      Exchange
+                          distribution: single
+                          est: (rows=13828)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(OR(=(D_YEAR, 1998), =(D_YEAR, +(1998, 1))), =(D_YEAR, +(1998, 1)))
+                            fieldNames: [D_DATE_SK, D_YEAR]
+                            est: (rows=13828)
+                    Exchange
+                        distribution: single
+                        est: (rows=100000)
+                      TableScan
+                          table: PUBLIC.CUSTOMER
+                          fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                          est: (rows=100000)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q74_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q74_colocated.plan
new file mode 100644
index 00000000000..405bc091944
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q74_colocated.plan
@@ -0,0 +1,255 @@
+Limit
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME]
+      projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME]
+      est: (rows=874578399118912500)
+    HashJoin
+        predicate: AND(>(CASE(>(YEAR_TOTAL$0, 0.00), /(YEAR_TOTAL$0$0$0, YEAR_TOTAL$0), null:DECIMAL(32767, 0)), CASE(>(YEAR_TOTAL$0$0, 0.00), /(YEAR_TOTAL, YEAR_TOTAL$0$0), null:DECIMAL(32767, 0))), =(CUSTOMER_ID, CUSTOMER_ID$0$0))
+        fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0, CUSTOMER_ID$0$0, year$0$0, YEAR_TOTAL$0$0, SALE_TYPE$0$0, CUSTOMER_ID$0$0$0, year$0$0$0, YEAR_TOTAL$0$0$0, SALE_TYPE$0$0$0]
+        type: inner
+        est: (rows=874578399118912500)
+      Sort
+          collation: [CUSTOMER_LAST_NAME ASC, CUSTOMER_ID ASC, CUSTOMER_FIRST_NAME ASC]
+          est: (rows=321922)
+        UnionAll
+            est: (rows=321922)
+          Project
+              fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE]
+              projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, _UTF-8's']
+              est: (rows=321921)
+            ColocatedHashAggregate
+                fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                aggregation: [SUM(SS_NET_PAID)]
+                est: (rows=321921)
+              Project
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                  projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, SS_NET_PAID]
+                  est: (rows=545259)
+                HashJoin
+                    predicate: =(C_CUSTOMER_SK, SS_CUSTOMER_SK)
+                    type: inner
+                    est: (rows=545259)
+                  HashJoin
+                      predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=545259)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_CUSTOMER_SK, SS_NET_PAID]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=13828)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(OR(=(D_YEAR, 1998), =(D_YEAR, +(1998, 1))), =(D_YEAR, +(1998, 1)))
+                          fieldNames: [D_DATE_SK, D_YEAR]
+                          est: (rows=13828)
+                  Exchange
+                      distribution: single
+                      est: (rows=100000)
+                    TableScan
+                        table: PUBLIC.CUSTOMER
+                        fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                        est: (rows=100000)
+          Project
+              fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL, SALE_TYPE]
+              projection: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, CAST(WS_NET_PAID):DECIMAL(32767, 2), _UTF-8'w']
+              est: (rows=1)
+            Values
+                fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                tuples: []
+                est: (rows=1)
+      MergeJoin
+          predicate: =(CUSTOMER_ID$0, CUSTOMER_ID)
+          fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0, CUSTOMER_ID$0$0, year$0$0, YEAR_TOTAL$0$0, SALE_TYPE$0$0]
+          type: inner
+          est: (rows=36223234343827)
+        Sort
+            collation: [CUSTOMER_ID ASC]
+            est: (rows=70718)
+          UnionAll
+              est: (rows=70718)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, CAST(SS_NET_PAID):DECIMAL(32767, 2), _UTF-8's']
+                est: (rows=1)
+              Filter
+                  predicate: >(CAST(SS_NET_PAID):DECIMAL(32767, 2), 0.00)
+                  est: (rows=1)
+                Values
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                    tuples: []
+                    est: (rows=1)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8'w']
+                est: (rows=70717)
+              Filter
+                  predicate: >(YEAR_TOTAL, 0.00)
+                  est: (rows=70717)
+                ColocatedHashAggregate
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                    group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                    aggregation: [SUM(WS_NET_PAID)]
+                    est: (rows=141433)
+                  Project
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                      projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, WS_NET_PAID]
+                      est: (rows=239555)
+                    HashJoin
+                        predicate: =(C_CUSTOMER_SK, WS_BILL_CUSTOMER_SK)
+                        type: inner
+                        est: (rows=239555)
+                      HashJoin
+                          predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                          type: inner
+                          est: (rows=239555)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          TableScan
+                              table: PUBLIC.WEB_SALES
+                              fieldNames: [WS_SOLD_DATE_SK, WS_BILL_CUSTOMER_SK, WS_NET_PAID]
+                              est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=24325)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(OR(IS NOT NULL(D_YEAR), =(D_YEAR, +(1998, 1))), =(D_YEAR, 1998))
+                              fieldNames: [D_DATE_SK, D_YEAR]
+                              est: (rows=24325)
+                      Exchange
+                          distribution: single
+                          est: (rows=100000)
+                        TableScan
+                            table: PUBLIC.CUSTOMER
+                            fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                            est: (rows=100000)
+        HashJoin
+            predicate: =(CUSTOMER_ID, CUSTOMER_ID$0)
+            fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE, CUSTOMER_ID$0, year$0, YEAR_TOTAL$0, SALE_TYPE$0]
+            type: inner
+            est: (rows=3414825094)
+          Sort
+              collation: [CUSTOMER_ID ASC]
+              est: (rows=283149)
+            UnionAll
+                est: (rows=283149)
+              Project
+                  fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                  projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8's']
+                  est: (rows=283148)
+                Filter
+                    predicate: >(YEAR_TOTAL, 0.00)
+                    est: (rows=283148)
+                  ColocatedHashAggregate
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                      group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                      aggregation: [SUM(SS_NET_PAID)]
+                      est: (rows=566297)
+                    Project
+                        fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                        projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, SS_NET_PAID]
+                        est: (rows=959175)
+                      HashJoin
+                          predicate: =(C_CUSTOMER_SK, SS_CUSTOMER_SK)
+                          type: inner
+                          est: (rows=959175)
+                        HashJoin
+                            predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=959175)
+                          Exchange
+                              distribution: single
+                              est: (rows=2880404)
+                            TableScan
+                                table: PUBLIC.STORE_SALES
+                                fieldNames: [SS_SOLD_DATE_SK, SS_CUSTOMER_SK, SS_NET_PAID]
+                                est: (rows=2880404)
+                          Exchange
+                              distribution: single
+                              est: (rows=24325)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(OR(IS NOT NULL(D_YEAR), =(D_YEAR, +(1998, 1))), =(D_YEAR, 1998))
+                                fieldNames: [D_DATE_SK, D_YEAR]
+                                est: (rows=24325)
+                        Exchange
+                            distribution: single
+                            est: (rows=100000)
+                          TableScan
+                              table: PUBLIC.CUSTOMER
+                              fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                              est: (rows=100000)
+              Project
+                  fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                  projection: [CUSTOMER_ID, year, CAST(WS_NET_PAID):DECIMAL(32767, 2), _UTF-8'w']
+                  est: (rows=1)
+                Filter
+                    predicate: >(CAST(WS_NET_PAID):DECIMAL(32767, 2), 0.00)
+                    est: (rows=1)
+                  Values
+                      fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                      tuples: []
+                      est: (rows=1)
+          UnionAll
+              est: (rows=80401)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, CAST(SS_NET_PAID):DECIMAL(32767, 2), _UTF-8's']
+                est: (rows=1)
+              Values
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, SS_NET_PAID]
+                  tuples: []
+                  est: (rows=1)
+            Project
+                fieldNames: [CUSTOMER_ID, year, YEAR_TOTAL, SALE_TYPE]
+                projection: [CUSTOMER_ID, year, YEAR_TOTAL, _UTF-8'w']
+                est: (rows=80400)
+              ColocatedHashAggregate
+                  fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, YEAR_TOTAL]
+                  group: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year]
+                  aggregation: [SUM(WS_NET_PAID)]
+                  est: (rows=80400)
+                Project
+                    fieldNames: [CUSTOMER_ID, CUSTOMER_FIRST_NAME, CUSTOMER_LAST_NAME, year, WS_NET_PAID]
+                    projection: [C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME, D_YEAR, WS_NET_PAID]
+                    est: (rows=136179)
+                  HashJoin
+                      predicate: =(C_CUSTOMER_SK, WS_BILL_CUSTOMER_SK)
+                      type: inner
+                      est: (rows=136179)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=136179)
+                      Exchange
+                          distribution: single
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WS_SOLD_DATE_SK, WS_BILL_CUSTOMER_SK, WS_NET_PAID]
+                            est: (rows=719384)
+                      Exchange
+                          distribution: single
+                          est: (rows=13828)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(OR(=(D_YEAR, 1998), =(D_YEAR, +(1998, 1))), =(D_YEAR, +(1998, 1)))
+                            fieldNames: [D_DATE_SK, D_YEAR]
+                            est: (rows=13828)
+                    Exchange
+                        distribution: single
+                        est: (rows=100000)
+                      TableScan
+                          table: PUBLIC.CUSTOMER
+                          fieldNames: [C_CUSTOMER_SK, C_CUSTOMER_ID, C_FIRST_NAME, C_LAST_NAME]
+                          est: (rows=100000)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q75.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q75.plan
new file mode 100644
index 00000000000..a7bf23418d0
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q75.plan
@@ -0,0 +1,309 @@
+Sort
+    collation: [SALES_CNT_DIFF ASC, SALES_AMT_DIFF ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [PREV_YEAR, year, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, PREV_YR_CNT, CURR_YR_CNT, SALES_CNT_DIFF, SALES_AMT_DIFF]
+      projection: [D_YEAR$0, D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT$0, SALES_CNT, -(SALES_CNT, SALES_CNT$0), -(SALES_AMT, SALES_AMT$0)]
+      est: (rows=1164251132626172)
+    HashJoin
+        predicate: AND(=(I_BRAND_ID, I_BRAND_ID$0), =(I_CLASS_ID, I_CLASS_ID$0), =(I_CATEGORY_ID, I_CATEGORY_ID$0), =(I_MANUFACT_ID, I_MANUFACT_ID$0), <(/(CAST(SALES_CNT):DECIMAL(17, 2), CAST(SALES_CNT$0):DECIMAL(17, 2)), 0.90000000000000000000))
+        fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT, D_YEAR$0, I_BRAND_ID$0, I_CLASS_ID$0, I_CATEGORY_ID$0, I_MANUFACT_ID$0, SALES_CNT$0, SALES_AMT$0]
+        type: inner
+        est: (rows=1164251132626172)
+      ColocatedHashAggregate
+          group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID]
+          aggregation: [SUM(SALES_CNT), SUM(SALES_AMT)]
+          est: (rows=2144646975)
+        ColocatedHashAggregate
+            group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+            aggregation: []
+            est: (rows=2144646975)
+          UnionAll
+              est: (rows=2713764677)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(CS_QUANTITY, CASE(IS NOT NULL(CR_RETURN_QUANTITY), CAST(CR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=518317116)
+              HashJoin
+                  predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                  type: left
+                  est: (rows=518317116)
+                HashJoin
+                    predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=159852)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                      type: inner
+                      est: (rows=480035)
+                    Exchange
+                        distribution: single
+                        est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_EXT_SALES_PRICE]
+                          est: (rows=1441548)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_QUANTITY, CR_RETURN_AMOUNT]
+                      est: (rows=144067)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(SS_QUANTITY, CASE(IS NOT NULL(SR_RETURN_QUANTITY), CAST(SR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=2066564696)
+              HashJoin
+                  predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK))
+                  type: left
+                  est: (rows=2066564696)
+                HashJoin
+                    predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=319405)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, SS_ITEM_SK)
+                      type: inner
+                      est: (rows=959175)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_TICKET_NUMBER, SS_QUANTITY, SS_EXT_SALES_PRICE]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=287514)
+                  TableScan
+                      table: PUBLIC.STORE_RETURNS
+                      fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_QUANTITY, SR_RETURN_AMT]
+                      est: (rows=287514)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(WS_QUANTITY, CASE(IS NOT NULL(WR_RETURN_QUANTITY), CAST(WR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=128882865)
+              HashJoin
+                  predicate: AND(=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), =(WS_ITEM_SK, WR_ITEM_SK))
+                  type: left
+                  est: (rows=128882865)
+                HashJoin
+                    predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=79772)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                      type: inner
+                      est: (rows=239555)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_EXT_SALES_PRICE]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=71763)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_QUANTITY, WR_RETURN_AMT]
+                      est: (rows=71763)
+      ColocatedHashAggregate
+          group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID]
+          aggregation: [SUM(SALES_CNT), SUM(SALES_AMT)]
+          est: (rows=2144646975)
+        ColocatedHashAggregate
+            group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+            aggregation: []
+            est: (rows=2144646975)
+          UnionAll
+              est: (rows=2713764677)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(CS_QUANTITY, CASE(IS NOT NULL(CR_RETURN_QUANTITY), CAST(CR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=518317116)
+              HashJoin
+                  predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                  type: left
+                  est: (rows=518317116)
+                HashJoin
+                    predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=159852)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                      type: inner
+                      est: (rows=480035)
+                    Exchange
+                        distribution: single
+                        est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_EXT_SALES_PRICE]
+                          est: (rows=1441548)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_QUANTITY, CR_RETURN_AMOUNT]
+                      est: (rows=144067)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(SS_QUANTITY, CASE(IS NOT NULL(SR_RETURN_QUANTITY), CAST(SR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=2066564696)
+              HashJoin
+                  predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK))
+                  type: left
+                  est: (rows=2066564696)
+                HashJoin
+                    predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=319405)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, SS_ITEM_SK)
+                      type: inner
+                      est: (rows=959175)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_TICKET_NUMBER, SS_QUANTITY, SS_EXT_SALES_PRICE]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=287514)
+                  TableScan
+                      table: PUBLIC.STORE_RETURNS
+                      fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_QUANTITY, SR_RETURN_AMT]
+                      est: (rows=287514)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(WS_QUANTITY, CASE(IS NOT NULL(WR_RETURN_QUANTITY), CAST(WR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=128882865)
+              HashJoin
+                  predicate: AND(=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), =(WS_ITEM_SK, WR_ITEM_SK))
+                  type: left
+                  est: (rows=128882865)
+                HashJoin
+                    predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=79772)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                      type: inner
+                      est: (rows=239555)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_EXT_SALES_PRICE]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=71763)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_QUANTITY, WR_RETURN_AMT]
+                      est: (rows=71763)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q75_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q75_colocated.plan
new file mode 100644
index 00000000000..a7bf23418d0
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q75_colocated.plan
@@ -0,0 +1,309 @@
+Sort
+    collation: [SALES_CNT_DIFF ASC, SALES_AMT_DIFF ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [PREV_YEAR, year, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, PREV_YR_CNT, CURR_YR_CNT, SALES_CNT_DIFF, SALES_AMT_DIFF]
+      projection: [D_YEAR$0, D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT$0, SALES_CNT, -(SALES_CNT, SALES_CNT$0), -(SALES_AMT, SALES_AMT$0)]
+      est: (rows=1164251132626172)
+    HashJoin
+        predicate: AND(=(I_BRAND_ID, I_BRAND_ID$0), =(I_CLASS_ID, I_CLASS_ID$0), =(I_CATEGORY_ID, I_CATEGORY_ID$0), =(I_MANUFACT_ID, I_MANUFACT_ID$0), <(/(CAST(SALES_CNT):DECIMAL(17, 2), CAST(SALES_CNT$0):DECIMAL(17, 2)), 0.90000000000000000000))
+        fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT, D_YEAR$0, I_BRAND_ID$0, I_CLASS_ID$0, I_CATEGORY_ID$0, I_MANUFACT_ID$0, SALES_CNT$0, SALES_AMT$0]
+        type: inner
+        est: (rows=1164251132626172)
+      ColocatedHashAggregate
+          group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID]
+          aggregation: [SUM(SALES_CNT), SUM(SALES_AMT)]
+          est: (rows=2144646975)
+        ColocatedHashAggregate
+            group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+            aggregation: []
+            est: (rows=2144646975)
+          UnionAll
+              est: (rows=2713764677)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(CS_QUANTITY, CASE(IS NOT NULL(CR_RETURN_QUANTITY), CAST(CR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=518317116)
+              HashJoin
+                  predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                  type: left
+                  est: (rows=518317116)
+                HashJoin
+                    predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=159852)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                      type: inner
+                      est: (rows=480035)
+                    Exchange
+                        distribution: single
+                        est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_EXT_SALES_PRICE]
+                          est: (rows=1441548)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_QUANTITY, CR_RETURN_AMOUNT]
+                      est: (rows=144067)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(SS_QUANTITY, CASE(IS NOT NULL(SR_RETURN_QUANTITY), CAST(SR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=2066564696)
+              HashJoin
+                  predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK))
+                  type: left
+                  est: (rows=2066564696)
+                HashJoin
+                    predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=319405)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, SS_ITEM_SK)
+                      type: inner
+                      est: (rows=959175)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_TICKET_NUMBER, SS_QUANTITY, SS_EXT_SALES_PRICE]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=287514)
+                  TableScan
+                      table: PUBLIC.STORE_RETURNS
+                      fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_QUANTITY, SR_RETURN_AMT]
+                      est: (rows=287514)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(WS_QUANTITY, CASE(IS NOT NULL(WR_RETURN_QUANTITY), CAST(WR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=128882865)
+              HashJoin
+                  predicate: AND(=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), =(WS_ITEM_SK, WR_ITEM_SK))
+                  type: left
+                  est: (rows=128882865)
+                HashJoin
+                    predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=79772)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                      type: inner
+                      est: (rows=239555)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_EXT_SALES_PRICE]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, 2001)
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=71763)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_QUANTITY, WR_RETURN_AMT]
+                      est: (rows=71763)
+      ColocatedHashAggregate
+          group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID]
+          aggregation: [SUM(SALES_CNT), SUM(SALES_AMT)]
+          est: (rows=2144646975)
+        ColocatedHashAggregate
+            group: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+            aggregation: []
+            est: (rows=2144646975)
+          UnionAll
+              est: (rows=2713764677)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(CS_QUANTITY, CASE(IS NOT NULL(CR_RETURN_QUANTITY), CAST(CR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=518317116)
+              HashJoin
+                  predicate: AND(=(CS_ORDER_NUMBER, CR_ORDER_NUMBER), =(CS_ITEM_SK, CR_ITEM_SK))
+                  type: left
+                  est: (rows=518317116)
+                HashJoin
+                    predicate: =(D_DATE_SK, CS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=159852)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, CS_ITEM_SK)
+                      type: inner
+                      est: (rows=480035)
+                    Exchange
+                        distribution: single
+                        est: (rows=1441548)
+                      TableScan
+                          table: PUBLIC.CATALOG_SALES
+                          fieldNames: [CS_SOLD_DATE_SK, CS_ITEM_SK, CS_ORDER_NUMBER, CS_QUANTITY, CS_EXT_SALES_PRICE]
+                          est: (rows=1441548)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_QUANTITY, CR_RETURN_AMOUNT]
+                      est: (rows=144067)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(SS_QUANTITY, CASE(IS NOT NULL(SR_RETURN_QUANTITY), CAST(SR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=2066564696)
+              HashJoin
+                  predicate: AND(=(SS_TICKET_NUMBER, SR_TICKET_NUMBER), =(SS_ITEM_SK, SR_ITEM_SK))
+                  type: left
+                  est: (rows=2066564696)
+                HashJoin
+                    predicate: =(D_DATE_SK, SS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=319405)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, SS_ITEM_SK)
+                      type: inner
+                      est: (rows=959175)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_TICKET_NUMBER, SS_QUANTITY, SS_EXT_SALES_PRICE]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=287514)
+                  TableScan
+                      table: PUBLIC.STORE_RETURNS
+                      fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_QUANTITY, SR_RETURN_AMT]
+                      est: (rows=287514)
+            Project
+                fieldNames: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, SALES_CNT, SALES_AMT]
+                projection: [D_YEAR, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_MANUFACT_ID, -(WS_QUANTITY, CASE(IS NOT NULL(WR_RETURN_QUANTITY), CAST(WR_RETURN_QUANTITY):INTEGER NOT NULL, 0)), -(WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(7, 2) NOT NULL, 0.00:DECIMAL(7, 2)))]
+                est: (rows=128882865)
+              HashJoin
+                  predicate: AND(=(WS_ORDER_NUMBER, WR_ORDER_NUMBER), =(WS_ITEM_SK, WR_ITEM_SK))
+                  type: left
+                  est: (rows=128882865)
+                HashJoin
+                    predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                    type: inner
+                    est: (rows=79772)
+                  HashJoin
+                      predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                      type: inner
+                      est: (rows=239555)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_ORDER_NUMBER, WS_QUANTITY, WS_EXT_SALES_PRICE]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=5994)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: =(I_CATEGORY, _UTF-8'Sports')
+                          fieldNames: [I_ITEM_SK, I_BRAND_ID, I_CLASS_ID, I_CATEGORY_ID, I_CATEGORY, I_MANUFACT_ID]
+                          est: (rows=5994)
+                  Exchange
+                      distribution: single
+                      est: (rows=24325)
+                    TableScan
+                        table: PUBLIC.DATE_DIM
+                        predicate: =(D_YEAR, -(2001, 1))
+                        fieldNames: [D_DATE_SK, D_YEAR]
+                        est: (rows=24325)
+                Exchange
+                    distribution: single
+                    est: (rows=71763)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_QUANTITY, WR_RETURN_AMT]
+                      est: (rows=71763)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q77.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q77.plan
new file mode 100644
index 00000000000..35a5aaa9221
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q77.plan
@@ -0,0 +1,255 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=469455114)
+    UnionAll
+        est: (rows=849269841)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):INTEGER, SALES, CAST(RETURNS):DECIMAL(32767, 2), PROFIT]
+          est: (rows=310681096)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', S_STORE_SK, SALES, CASE(IS NOT NULL(RETURNS), CAST(RETURNS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)), -(PROFIT, CASE(IS NOT NULL(PROFIT_LOSS), CAST(PROFIT_LOSS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)))]
+            est: (rows=310681096)
+          HashJoin
+              predicate: =(S_STORE_SK, S_STORE_SK$0)
+              fieldNames: [S_STORE_SK, SALES, PROFIT, S_STORE_SK$0, RETURNS, PROFIT_LOSS]
+              type: left
+              est: (rows=310681096)
+            ColocatedHashAggregate
+                fieldNames: [S_STORE_SK, SALES, PROFIT]
+                group: [S_STORE_SK]
+                aggregation: [SUM(SS_EXT_SALES_PRICE), SUM(SS_NET_PROFIT)]
+                est: (rows=144020)
+              Project
+                  fieldNames: [S_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                  projection: [S_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                  est: (rows=720101)
+                HashJoin
+                    predicate: =(SS_STORE_SK, S_STORE_SK)
+                    type: inner
+                    est: (rows=720101)
+                  HashJoin
+                      predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=720101)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK]
+                        est: (rows=12)
+            ColocatedHashAggregate
+                fieldNames: [S_STORE_SK, RETURNS, PROFIT_LOSS]
+                group: [S_STORE_SK]
+                aggregation: [SUM(SR_RETURN_AMT), SUM(SR_NET_LOSS)]
+                est: (rows=14376)
+              Project
+                  fieldNames: [S_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                  projection: [S_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                  est: (rows=71879)
+                HashJoin
+                    predicate: =(SR_STORE_SK, S_STORE_SK)
+                    type: inner
+                    est: (rows=71879)
+                  HashJoin
+                      predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=71879)
+                    Exchange
+                        distribution: single
+                        est: (rows=287514)
+                      TableScan
+                          table: PUBLIC.STORE_RETURNS
+                          fieldNames: [SR_RETURNED_DATE_SK, SR_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                          est: (rows=287514)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK]
+                        est: (rows=12)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', CS_CALL_CENTER_SK, SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+          est: (rows=519198739)
+        NestedLoopJoin
+            predicate: true
+            type: inner
+            est: (rows=519198739)
+          ColocatedHashAggregate
+              fieldNames: [CS_CALL_CENTER_SK, SALES, PROFIT]
+              group: [CS_CALL_CENTER_SK]
+              aggregation: [SUM(CS_EXT_SALES_PRICE), SUM(CS_NET_PROFIT)]
+              est: (rows=72077)
+            Project
+                fieldNames: [CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                projection: [CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                est: (rows=360387)
+              HashJoin
+                  predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=360387)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                      est: (rows=1441548)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+          ColocatedHashAggregate
+              fieldNames: [CR_CALL_CENTER_SK, RETURNS, PROFIT_LOSS]
+              group: [CR_CALL_CENTER_SK]
+              aggregation: [SUM(CR_RETURN_AMOUNT), SUM(CR_NET_LOSS)]
+              est: (rows=7203)
+            Project
+                fieldNames: [CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                projection: [CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                est: (rows=36017)
+              HashJoin
+                  predicate: =(CR_RETURNED_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=36017)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_RETURNED_DATE_SK, CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                      est: (rows=144067)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):INTEGER, SALES, CAST(RETURNS):DECIMAL(32767, 2), PROFIT]
+          est: (rows=19390007)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', WP_WEB_PAGE_SK, SALES, CASE(IS NOT NULL(RETURNS), CAST(RETURNS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)), -(PROFIT, CASE(IS NOT NULL(PROFIT_LOSS), CAST(PROFIT_LOSS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)))]
+            est: (rows=19390007)
+          HashJoin
+              predicate: =(WP_WEB_PAGE_SK, WP_WEB_PAGE_SK$0)
+              fieldNames: [WP_WEB_PAGE_SK, SALES, PROFIT, WP_WEB_PAGE_SK$0, RETURNS, PROFIT_LOSS]
+              type: left
+              est: (rows=19390007)
+            ColocatedHashAggregate
+                fieldNames: [WP_WEB_PAGE_SK, SALES, PROFIT]
+                group: [WP_WEB_PAGE_SK]
+                aggregation: [SUM(WS_EXT_SALES_PRICE), SUM(WS_NET_PROFIT)]
+                est: (rows=35969)
+              Project
+                  fieldNames: [WP_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                  projection: [WP_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                  est: (rows=179846)
+                HashJoin
+                    predicate: =(WS_WEB_PAGE_SK, WP_WEB_PAGE_SK)
+                    type: inner
+                    est: (rows=179846)
+                  HashJoin
+                      predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=179846)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=60)
+                    TableScan
+                        table: PUBLIC.WEB_PAGE
+                        fieldNames: [WP_WEB_PAGE_SK]
+                        est: (rows=60)
+            ColocatedHashAggregate
+                fieldNames: [WP_WEB_PAGE_SK, RETURNS, PROFIT_LOSS]
+                group: [WP_WEB_PAGE_SK]
+                aggregation: [SUM(WR_RETURN_AMT), SUM(WR_NET_LOSS)]
+                est: (rows=3588)
+              Project
+                  fieldNames: [WP_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                  projection: [WP_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                  est: (rows=17941)
+                HashJoin
+                    predicate: =(WR_WEB_PAGE_SK, WP_WEB_PAGE_SK)
+                    type: inner
+                    est: (rows=17941)
+                  HashJoin
+                      predicate: =(WR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=17941)
+                    Exchange
+                        distribution: single
+                        est: (rows=71763)
+                      TableScan
+                          table: PUBLIC.WEB_RETURNS
+                          fieldNames: [WR_RETURNED_DATE_SK, WR_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                          est: (rows=71763)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=60)
+                    TableScan
+                        table: PUBLIC.WEB_PAGE
+                        fieldNames: [WP_WEB_PAGE_SK]
+                        est: (rows=60)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q77_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q77_colocated.plan
new file mode 100644
index 00000000000..35a5aaa9221
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q77_colocated.plan
@@ -0,0 +1,255 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=469455114)
+    UnionAll
+        est: (rows=849269841)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):INTEGER, SALES, CAST(RETURNS):DECIMAL(32767, 2), PROFIT]
+          est: (rows=310681096)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', S_STORE_SK, SALES, CASE(IS NOT NULL(RETURNS), CAST(RETURNS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)), -(PROFIT, CASE(IS NOT NULL(PROFIT_LOSS), CAST(PROFIT_LOSS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)))]
+            est: (rows=310681096)
+          HashJoin
+              predicate: =(S_STORE_SK, S_STORE_SK$0)
+              fieldNames: [S_STORE_SK, SALES, PROFIT, S_STORE_SK$0, RETURNS, PROFIT_LOSS]
+              type: left
+              est: (rows=310681096)
+            ColocatedHashAggregate
+                fieldNames: [S_STORE_SK, SALES, PROFIT]
+                group: [S_STORE_SK]
+                aggregation: [SUM(SS_EXT_SALES_PRICE), SUM(SS_NET_PROFIT)]
+                est: (rows=144020)
+              Project
+                  fieldNames: [S_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                  projection: [S_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                  est: (rows=720101)
+                HashJoin
+                    predicate: =(SS_STORE_SK, S_STORE_SK)
+                    type: inner
+                    est: (rows=720101)
+                  HashJoin
+                      predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=720101)
+                    Exchange
+                        distribution: single
+                        est: (rows=2880404)
+                      TableScan
+                          table: PUBLIC.STORE_SALES
+                          fieldNames: [SS_SOLD_DATE_SK, SS_STORE_SK, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                          est: (rows=2880404)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK]
+                        est: (rows=12)
+            ColocatedHashAggregate
+                fieldNames: [S_STORE_SK, RETURNS, PROFIT_LOSS]
+                group: [S_STORE_SK]
+                aggregation: [SUM(SR_RETURN_AMT), SUM(SR_NET_LOSS)]
+                est: (rows=14376)
+              Project
+                  fieldNames: [S_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                  projection: [S_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                  est: (rows=71879)
+                HashJoin
+                    predicate: =(SR_STORE_SK, S_STORE_SK)
+                    type: inner
+                    est: (rows=71879)
+                  HashJoin
+                      predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=71879)
+                    Exchange
+                        distribution: single
+                        est: (rows=287514)
+                      TableScan
+                          table: PUBLIC.STORE_RETURNS
+                          fieldNames: [SR_RETURNED_DATE_SK, SR_STORE_SK, SR_RETURN_AMT, SR_NET_LOSS]
+                          est: (rows=287514)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=12)
+                    TableScan
+                        table: PUBLIC.STORE
+                        fieldNames: [S_STORE_SK]
+                        est: (rows=12)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', CS_CALL_CENTER_SK, SALES, RETURNS, -(PROFIT, PROFIT_LOSS)]
+          est: (rows=519198739)
+        NestedLoopJoin
+            predicate: true
+            type: inner
+            est: (rows=519198739)
+          ColocatedHashAggregate
+              fieldNames: [CS_CALL_CENTER_SK, SALES, PROFIT]
+              group: [CS_CALL_CENTER_SK]
+              aggregation: [SUM(CS_EXT_SALES_PRICE), SUM(CS_NET_PROFIT)]
+              est: (rows=72077)
+            Project
+                fieldNames: [CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                projection: [CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                est: (rows=360387)
+              HashJoin
+                  predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=360387)
+                Exchange
+                    distribution: single
+                    est: (rows=1441548)
+                  TableScan
+                      table: PUBLIC.CATALOG_SALES
+                      fieldNames: [CS_SOLD_DATE_SK, CS_CALL_CENTER_SK, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                      est: (rows=1441548)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+          ColocatedHashAggregate
+              fieldNames: [CR_CALL_CENTER_SK, RETURNS, PROFIT_LOSS]
+              group: [CR_CALL_CENTER_SK]
+              aggregation: [SUM(CR_RETURN_AMOUNT), SUM(CR_NET_LOSS)]
+              est: (rows=7203)
+            Project
+                fieldNames: [CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                projection: [CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                est: (rows=36017)
+              HashJoin
+                  predicate: =(CR_RETURNED_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=36017)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  TableScan
+                      table: PUBLIC.CATALOG_RETURNS
+                      fieldNames: [CR_RETURNED_DATE_SK, CR_CALL_CENTER_SK, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                      est: (rows=144067)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):INTEGER, SALES, CAST(RETURNS):DECIMAL(32767, 2), PROFIT]
+          est: (rows=19390007)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', WP_WEB_PAGE_SK, SALES, CASE(IS NOT NULL(RETURNS), CAST(RETURNS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)), -(PROFIT, CASE(IS NOT NULL(PROFIT_LOSS), CAST(PROFIT_LOSS):DECIMAL(32767, 2) NOT NULL, 0.00:DECIMAL(32767, 2)))]
+            est: (rows=19390007)
+          HashJoin
+              predicate: =(WP_WEB_PAGE_SK, WP_WEB_PAGE_SK$0)
+              fieldNames: [WP_WEB_PAGE_SK, SALES, PROFIT, WP_WEB_PAGE_SK$0, RETURNS, PROFIT_LOSS]
+              type: left
+              est: (rows=19390007)
+            ColocatedHashAggregate
+                fieldNames: [WP_WEB_PAGE_SK, SALES, PROFIT]
+                group: [WP_WEB_PAGE_SK]
+                aggregation: [SUM(WS_EXT_SALES_PRICE), SUM(WS_NET_PROFIT)]
+                est: (rows=35969)
+              Project
+                  fieldNames: [WP_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                  projection: [WP_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                  est: (rows=179846)
+                HashJoin
+                    predicate: =(WS_WEB_PAGE_SK, WP_WEB_PAGE_SK)
+                    type: inner
+                    est: (rows=179846)
+                  HashJoin
+                      predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=179846)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_SOLD_DATE_SK, WS_WEB_PAGE_SK, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                          est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=60)
+                    TableScan
+                        table: PUBLIC.WEB_PAGE
+                        fieldNames: [WP_WEB_PAGE_SK]
+                        est: (rows=60)
+            ColocatedHashAggregate
+                fieldNames: [WP_WEB_PAGE_SK, RETURNS, PROFIT_LOSS]
+                group: [WP_WEB_PAGE_SK]
+                aggregation: [SUM(WR_RETURN_AMT), SUM(WR_NET_LOSS)]
+                est: (rows=3588)
+              Project
+                  fieldNames: [WP_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                  projection: [WP_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                  est: (rows=17941)
+                HashJoin
+                    predicate: =(WR_WEB_PAGE_SK, WP_WEB_PAGE_SK)
+                    type: inner
+                    est: (rows=17941)
+                  HashJoin
+                      predicate: =(WR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=17941)
+                    Exchange
+                        distribution: single
+                        est: (rows=71763)
+                      TableScan
+                          table: PUBLIC.WEB_RETURNS
+                          fieldNames: [WR_RETURNED_DATE_SK, WR_WEB_PAGE_SK, WR_RETURN_AMT, WR_NET_LOSS]
+                          est: (rows=71763)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2000-08-16), <=(D_DATE, +(2000-08-16, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=60)
+                    TableScan
+                        table: PUBLIC.WEB_PAGE
+                        fieldNames: [WP_WEB_PAGE_SK]
+                        est: (rows=60)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q80.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q80.plan
new file mode 100644
index 00000000000..4ef30a74922
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q80.plan
@@ -0,0 +1,278 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=110383850)
+    UnionAll
+        est: (rows=203736087)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=155147500)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', ||(_UTF-8'store', STORE_ID), SALES, RETURNS, PROFIT]
+            est: (rows=155147500)
+          ColocatedHashAggregate
+              fieldNames: [STORE_ID, SALES, RETURNS, PROFIT]
+              group: [STORE_ID]
+              aggregation: [SUM(SS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+              est: (rows=155147500)
+            Project
+                fieldNames: [STORE_ID, SS_EXT_SALES_PRICE, $f2, $f3]
+                projection: [S_STORE_ID, SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(SS_NET_PROFIT, CASE(IS NOT NULL(SR_NET_LOSS), CAST(SR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+                est: (rows=775737498)
+              HashJoin
+                  predicate: =(SS_PROMO_SK, P_PROMO_SK)
+                  type: inner
+                  est: (rows=775737498)
+                MergeJoin
+                    predicate: =(SS_ITEM_SK, I_ITEM_SK)
+                    type: inner
+                    est: (rows=2329542037)
+                  HashJoin
+                      predicate: =(SS_STORE_SK, S_STORE_SK)
+                      type: inner
+                      est: (rows=4659084074)
+                    HashJoin
+                        predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=4659084074)
+                      MergeJoin
+                          predicate: AND(=(SS_ITEM_SK, SR_ITEM_SK), =(SS_TICKET_NUMBER, SR_TICKET_NUMBER))
+                          type: left
+                          est: (rows=18636336297)
+                        Exchange
+                            distribution: single
+                            est: (rows=2880404)
+                          Sort
+                              collation: [SS_ITEM_SK ASC, SS_TICKET_NUMBER ASC]
+                              est: (rows=2880404)
+                            TableScan
+                                table: PUBLIC.STORE_SALES
+                                fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_STORE_SK, SS_PROMO_SK, SS_TICKET_NUMBER, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                                est: (rows=2880404)
+                        Exchange
+                            distribution: single
+                            est: (rows=287514)
+                          Sort
+                              collation: [SR_ITEM_SK ASC, SR_TICKET_NUMBER ASC]
+                              est: (rows=287514)
+                            TableScan
+                                table: PUBLIC.STORE_RETURNS
+                                fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_AMT, SR_NET_LOSS]
+                                est: (rows=287514)
+                      Exchange
+                          distribution: single
+                          est: (rows=18262)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=18262)
+                    Exchange
+                        distribution: single
+                        est: (rows=12)
+                      TableScan
+                          table: PUBLIC.STORE
+                          fieldNames: [S_STORE_SK, S_STORE_ID]
+                          est: (rows=12)
+                  Exchange
+                      distribution: single
+                      est: (rows=9000)
+                    Sort
+                        collation: [I_ITEM_SK ASC]
+                        est: (rows=9000)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                          fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                          est: (rows=9000)
+                Exchange
+                    distribution: single
+                    est: (rows=100)
+                  TableScan
+                      table: PUBLIC.PROMOTION
+                      predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                      fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                      est: (rows=100)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', ||(_UTF-8'catalog_page', CATALOG_PAGE_ID), SALES, RETURNS, PROFIT]
+          est: (rows=38912696)
+        ColocatedHashAggregate
+            fieldNames: [CATALOG_PAGE_ID, SALES, RETURNS, PROFIT]
+            group: [CATALOG_PAGE_ID]
+            aggregation: [SUM(CS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+            est: (rows=38912696)
+          Project
+              fieldNames: [CATALOG_PAGE_ID, CS_EXT_SALES_PRICE, $f2, $f3]
+              projection: [CP_CATALOG_PAGE_ID, CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(CS_NET_PROFIT, CASE(IS NOT NULL(CR_NET_LOSS), CAST(CR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+              est: (rows=194563482)
+            HashJoin
+                predicate: =(CS_PROMO_SK, P_PROMO_SK)
+                type: inner
+                est: (rows=194563482)
+              MergeJoin
+                  predicate: =(CS_ITEM_SK, I_ITEM_SK)
+                  type: inner
+                  est: (rows=584274721)
+                HashJoin
+                    predicate: =(CS_CATALOG_PAGE_SK, CP_CATALOG_PAGE_SK)
+                    type: inner
+                    est: (rows=1168549442)
+                  HashJoin
+                      predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=1168549442)
+                    MergeJoin
+                        predicate: AND(=(CS_ITEM_SK, CR_ITEM_SK), =(CS_ORDER_NUMBER, CR_ORDER_NUMBER))
+                        type: left
+                        est: (rows=4674197767)
+                      Exchange
+                          distribution: single
+                          est: (rows=1441548)
+                        Sort
+                            collation: [CS_ITEM_SK ASC, CS_ORDER_NUMBER ASC]
+                            est: (rows=1441548)
+                          TableScan
+                              table: PUBLIC.CATALOG_SALES
+                              fieldNames: [CS_SOLD_DATE_SK, CS_CATALOG_PAGE_SK, CS_ITEM_SK, CS_PROMO_SK, CS_ORDER_NUMBER, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                              est: (rows=1441548)
+                      Exchange
+                          distribution: single
+                          est: (rows=144067)
+                        Sort
+                            collation: [CR_ITEM_SK ASC, CR_ORDER_NUMBER ASC]
+                            est: (rows=144067)
+                          TableScan
+                              table: PUBLIC.CATALOG_RETURNS
+                              fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                              est: (rows=144067)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=11718)
+                    TableScan
+                        table: PUBLIC.CATALOG_PAGE
+                        fieldNames: [CP_CATALOG_PAGE_SK, CP_CATALOG_PAGE_ID]
+                        est: (rows=11718)
+                Exchange
+                    distribution: single
+                    est: (rows=9000)
+                  Sort
+                      collation: [I_ITEM_SK ASC]
+                      est: (rows=9000)
+                    TableScan
+                        table: PUBLIC.ITEM
+                        predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                        fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                        est: (rows=9000)
+              Exchange
+                  distribution: single
+                  est: (rows=100)
+                TableScan
+                    table: PUBLIC.PROMOTION
+                    predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                    fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                    est: (rows=100)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=9675891)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', ||(_UTF-8'web_site', WEB_SITE_ID), SALES, RETURNS, PROFIT]
+            est: (rows=9675891)
+          ColocatedHashAggregate
+              fieldNames: [WEB_SITE_ID, SALES, RETURNS, PROFIT]
+              group: [WEB_SITE_ID]
+              aggregation: [SUM(WS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+              est: (rows=9675891)
+            Project
+                fieldNames: [WEB_SITE_ID, WS_EXT_SALES_PRICE, $f2, $f3]
+                projection: [WEB_SITE_ID, WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(WS_NET_PROFIT, CASE(IS NOT NULL(WR_NET_LOSS), CAST(WR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+                est: (rows=48379454)
+              HashJoin
+                  predicate: =(WS_PROMO_SK, P_PROMO_SK)
+                  type: inner
+                  est: (rows=48379454)
+                MergeJoin
+                    predicate: =(WS_ITEM_SK, I_ITEM_SK)
+                    type: inner
+                    est: (rows=145283645)
+                  HashJoin
+                      predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+                      type: inner
+                      est: (rows=290567291)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=290567291)
+                      MergeJoin
+                          predicate: AND(=(WS_ITEM_SK, WR_ITEM_SK), =(WS_ORDER_NUMBER, WR_ORDER_NUMBER))
+                          type: left
+                          est: (rows=1162269163)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          Sort
+                              collation: [WS_ITEM_SK ASC, WS_ORDER_NUMBER ASC]
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_WEB_SITE_SK, WS_PROMO_SK, WS_ORDER_NUMBER, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                                est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=71763)
+                          Sort
+                              collation: [WR_ITEM_SK ASC, WR_ORDER_NUMBER ASC]
+                              est: (rows=71763)
+                            TableScan
+                                table: PUBLIC.WEB_RETURNS
+                                fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_AMT, WR_NET_LOSS]
+                                est: (rows=71763)
+                      Exchange
+                          distribution: single
+                          est: (rows=18262)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=18262)
+                    Exchange
+                        distribution: single
+                        est: (rows=30)
+                      TableScan
+                          table: PUBLIC.WEB_SITE
+                          fieldNames: [WEB_SITE_SK, WEB_SITE_ID]
+                          est: (rows=30)
+                  Exchange
+                      distribution: single
+                      est: (rows=9000)
+                    Sort
+                        collation: [I_ITEM_SK ASC]
+                        est: (rows=9000)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                          fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                          est: (rows=9000)
+                Exchange
+                    distribution: single
+                    est: (rows=100)
+                  TableScan
+                      table: PUBLIC.PROMOTION
+                      predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                      fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                      est: (rows=100)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q80_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q80_colocated.plan
new file mode 100644
index 00000000000..4ef30a74922
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q80_colocated.plan
@@ -0,0 +1,278 @@
+Sort
+    collation: [CHANNEL ASC, ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [CHANNEL, ID]
+      groupSets: [[CHANNEL, ID], [CHANNEL], []]
+      aggregation: [SUM(SALES), SUM(RETURNS), SUM(PROFIT)]
+      est: (rows=110383850)
+    UnionAll
+        est: (rows=203736087)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=155147500)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'store channel', ||(_UTF-8'store', STORE_ID), SALES, RETURNS, PROFIT]
+            est: (rows=155147500)
+          ColocatedHashAggregate
+              fieldNames: [STORE_ID, SALES, RETURNS, PROFIT]
+              group: [STORE_ID]
+              aggregation: [SUM(SS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+              est: (rows=155147500)
+            Project
+                fieldNames: [STORE_ID, SS_EXT_SALES_PRICE, $f2, $f3]
+                projection: [S_STORE_ID, SS_EXT_SALES_PRICE, CASE(IS NOT NULL(SR_RETURN_AMT), CAST(SR_RETURN_AMT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(SS_NET_PROFIT, CASE(IS NOT NULL(SR_NET_LOSS), CAST(SR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+                est: (rows=775737498)
+              HashJoin
+                  predicate: =(SS_PROMO_SK, P_PROMO_SK)
+                  type: inner
+                  est: (rows=775737498)
+                MergeJoin
+                    predicate: =(SS_ITEM_SK, I_ITEM_SK)
+                    type: inner
+                    est: (rows=2329542037)
+                  HashJoin
+                      predicate: =(SS_STORE_SK, S_STORE_SK)
+                      type: inner
+                      est: (rows=4659084074)
+                    HashJoin
+                        predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=4659084074)
+                      MergeJoin
+                          predicate: AND(=(SS_ITEM_SK, SR_ITEM_SK), =(SS_TICKET_NUMBER, SR_TICKET_NUMBER))
+                          type: left
+                          est: (rows=18636336297)
+                        Exchange
+                            distribution: single
+                            est: (rows=2880404)
+                          Sort
+                              collation: [SS_ITEM_SK ASC, SS_TICKET_NUMBER ASC]
+                              est: (rows=2880404)
+                            TableScan
+                                table: PUBLIC.STORE_SALES
+                                fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_STORE_SK, SS_PROMO_SK, SS_TICKET_NUMBER, SS_EXT_SALES_PRICE, SS_NET_PROFIT]
+                                est: (rows=2880404)
+                        Exchange
+                            distribution: single
+                            est: (rows=287514)
+                          Sort
+                              collation: [SR_ITEM_SK ASC, SR_TICKET_NUMBER ASC]
+                              est: (rows=287514)
+                            TableScan
+                                table: PUBLIC.STORE_RETURNS
+                                fieldNames: [SR_ITEM_SK, SR_TICKET_NUMBER, SR_RETURN_AMT, SR_NET_LOSS]
+                                est: (rows=287514)
+                      Exchange
+                          distribution: single
+                          est: (rows=18262)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=18262)
+                    Exchange
+                        distribution: single
+                        est: (rows=12)
+                      TableScan
+                          table: PUBLIC.STORE
+                          fieldNames: [S_STORE_SK, S_STORE_ID]
+                          est: (rows=12)
+                  Exchange
+                      distribution: single
+                      est: (rows=9000)
+                    Sort
+                        collation: [I_ITEM_SK ASC]
+                        est: (rows=9000)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                          fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                          est: (rows=9000)
+                Exchange
+                    distribution: single
+                    est: (rows=100)
+                  TableScan
+                      table: PUBLIC.PROMOTION
+                      predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                      fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                      est: (rows=100)
+      Project
+          fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+          projection: [_UTF-8'catalog channel', ||(_UTF-8'catalog_page', CATALOG_PAGE_ID), SALES, RETURNS, PROFIT]
+          est: (rows=38912696)
+        ColocatedHashAggregate
+            fieldNames: [CATALOG_PAGE_ID, SALES, RETURNS, PROFIT]
+            group: [CATALOG_PAGE_ID]
+            aggregation: [SUM(CS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+            est: (rows=38912696)
+          Project
+              fieldNames: [CATALOG_PAGE_ID, CS_EXT_SALES_PRICE, $f2, $f3]
+              projection: [CP_CATALOG_PAGE_ID, CS_EXT_SALES_PRICE, CASE(IS NOT NULL(CR_RETURN_AMOUNT), CAST(CR_RETURN_AMOUNT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(CS_NET_PROFIT, CASE(IS NOT NULL(CR_NET_LOSS), CAST(CR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+              est: (rows=194563482)
+            HashJoin
+                predicate: =(CS_PROMO_SK, P_PROMO_SK)
+                type: inner
+                est: (rows=194563482)
+              MergeJoin
+                  predicate: =(CS_ITEM_SK, I_ITEM_SK)
+                  type: inner
+                  est: (rows=584274721)
+                HashJoin
+                    predicate: =(CS_CATALOG_PAGE_SK, CP_CATALOG_PAGE_SK)
+                    type: inner
+                    est: (rows=1168549442)
+                  HashJoin
+                      predicate: =(CS_SOLD_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=1168549442)
+                    MergeJoin
+                        predicate: AND(=(CS_ITEM_SK, CR_ITEM_SK), =(CS_ORDER_NUMBER, CR_ORDER_NUMBER))
+                        type: left
+                        est: (rows=4674197767)
+                      Exchange
+                          distribution: single
+                          est: (rows=1441548)
+                        Sort
+                            collation: [CS_ITEM_SK ASC, CS_ORDER_NUMBER ASC]
+                            est: (rows=1441548)
+                          TableScan
+                              table: PUBLIC.CATALOG_SALES
+                              fieldNames: [CS_SOLD_DATE_SK, CS_CATALOG_PAGE_SK, CS_ITEM_SK, CS_PROMO_SK, CS_ORDER_NUMBER, CS_EXT_SALES_PRICE, CS_NET_PROFIT]
+                              est: (rows=1441548)
+                      Exchange
+                          distribution: single
+                          est: (rows=144067)
+                        Sort
+                            collation: [CR_ITEM_SK ASC, CR_ORDER_NUMBER ASC]
+                            est: (rows=144067)
+                          TableScan
+                              table: PUBLIC.CATALOG_RETURNS
+                              fieldNames: [CR_ITEM_SK, CR_ORDER_NUMBER, CR_RETURN_AMOUNT, CR_NET_LOSS]
+                              est: (rows=144067)
+                    Exchange
+                        distribution: single
+                        est: (rows=18262)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=18262)
+                  Exchange
+                      distribution: single
+                      est: (rows=11718)
+                    TableScan
+                        table: PUBLIC.CATALOG_PAGE
+                        fieldNames: [CP_CATALOG_PAGE_SK, CP_CATALOG_PAGE_ID]
+                        est: (rows=11718)
+                Exchange
+                    distribution: single
+                    est: (rows=9000)
+                  Sort
+                      collation: [I_ITEM_SK ASC]
+                      est: (rows=9000)
+                    TableScan
+                        table: PUBLIC.ITEM
+                        predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                        fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                        est: (rows=9000)
+              Exchange
+                  distribution: single
+                  est: (rows=100)
+                TableScan
+                    table: PUBLIC.PROMOTION
+                    predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                    fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                    est: (rows=100)
+      Project
+          projection: [CAST(CHANNEL):CHAR(15) CHARACTER SET "UTF-8" NOT NULL, CAST(ID):VARCHAR(28) CHARACTER SET "UTF-8", SALES, RETURNS, PROFIT]
+          est: (rows=9675891)
+        Project
+            fieldNames: [CHANNEL, ID, SALES, RETURNS, PROFIT]
+            projection: [_UTF-8'web channel', ||(_UTF-8'web_site', WEB_SITE_ID), SALES, RETURNS, PROFIT]
+            est: (rows=9675891)
+          ColocatedHashAggregate
+              fieldNames: [WEB_SITE_ID, SALES, RETURNS, PROFIT]
+              group: [WEB_SITE_ID]
+              aggregation: [SUM(WS_EXT_SALES_PRICE), SUM($f2), SUM($f3)]
+              est: (rows=9675891)
+            Project
+                fieldNames: [WEB_SITE_ID, WS_EXT_SALES_PRICE, $f2, $f3]
+                projection: [WEB_SITE_ID, WS_EXT_SALES_PRICE, CASE(IS NOT NULL(WR_RETURN_AMT), CAST(WR_RETURN_AMT):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)), -(WS_NET_PROFIT, CASE(IS NOT NULL(WR_NET_LOSS), CAST(WR_NET_LOSS):DECIMAL(12, 2) NOT NULL, 0.00:DECIMAL(12, 2)))]
+                est: (rows=48379454)
+              HashJoin
+                  predicate: =(WS_PROMO_SK, P_PROMO_SK)
+                  type: inner
+                  est: (rows=48379454)
+                MergeJoin
+                    predicate: =(WS_ITEM_SK, I_ITEM_SK)
+                    type: inner
+                    est: (rows=145283645)
+                  HashJoin
+                      predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+                      type: inner
+                      est: (rows=290567291)
+                    HashJoin
+                        predicate: =(WS_SOLD_DATE_SK, D_DATE_SK)
+                        type: inner
+                        est: (rows=290567291)
+                      MergeJoin
+                          predicate: AND(=(WS_ITEM_SK, WR_ITEM_SK), =(WS_ORDER_NUMBER, WR_ORDER_NUMBER))
+                          type: left
+                          est: (rows=1162269163)
+                        Exchange
+                            distribution: single
+                            est: (rows=719384)
+                          Sort
+                              collation: [WS_ITEM_SK ASC, WS_ORDER_NUMBER ASC]
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_WEB_SITE_SK, WS_PROMO_SK, WS_ORDER_NUMBER, WS_EXT_SALES_PRICE, WS_NET_PROFIT]
+                                est: (rows=719384)
+                        Exchange
+                            distribution: single
+                            est: (rows=71763)
+                          Sort
+                              collation: [WR_ITEM_SK ASC, WR_ORDER_NUMBER ASC]
+                              est: (rows=71763)
+                            TableScan
+                                table: PUBLIC.WEB_RETURNS
+                                fieldNames: [WR_ITEM_SK, WR_ORDER_NUMBER, WR_RETURN_AMT, WR_NET_LOSS]
+                                est: (rows=71763)
+                      Exchange
+                          distribution: single
+                          est: (rows=18262)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            predicate: AND(>=(D_DATE, 2002-08-06), <=(D_DATE, +(2002-08-06, *(30, 86400000:INTERVAL DAY))))
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=18262)
+                    Exchange
+                        distribution: single
+                        est: (rows=30)
+                      TableScan
+                          table: PUBLIC.WEB_SITE
+                          fieldNames: [WEB_SITE_SK, WEB_SITE_ID]
+                          est: (rows=30)
+                  Exchange
+                      distribution: single
+                      est: (rows=9000)
+                    Sort
+                        collation: [I_ITEM_SK ASC]
+                        est: (rows=9000)
+                      TableScan
+                          table: PUBLIC.ITEM
+                          predicate: >(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 50.00)
+                          fieldNames: [I_ITEM_SK, I_CURRENT_PRICE]
+                          est: (rows=9000)
+                Exchange
+                    distribution: single
+                    est: (rows=100)
+                  TableScan
+                      table: PUBLIC.PROMOTION
+                      predicate: =(P_CHANNEL_TV, _UTF-8'N')
+                      fieldNames: [P_PROMO_SK, P_CHANNEL_TV]
+                      est: (rows=100)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q82.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q82.plan
new file mode 100644
index 00000000000..8abf4ff3e9e
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q82.plan
@@ -0,0 +1,55 @@
+Sort
+    collation: [I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+      aggregation: []
+      est: (rows=20365)
+    Project
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        projection: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        est: (rows=41731)
+      HashJoin
+          predicate: =(D_DATE_SK, INV_DATE_SK)
+          type: inner
+          est: (rows=41731)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=166924)
+          Exchange
+              distribution: single
+              est: (rows=2880404)
+            TableScan
+                table: PUBLIC.STORE_SALES
+                fieldNames: [SS_ITEM_SK]
+                est: (rows=2880404)
+          HashJoin
+              predicate: =(INV_ITEM_SK, I_ITEM_SK)
+              type: inner
+              est: (rows=680641)
+            Exchange
+                distribution: single
+                est: (rows=2936250)
+              TableScan
+                  table: PUBLIC.INVENTORY
+                  predicate: SEARCH(INV_QUANTITY_ON_HAND, Sarg[[100..500]])
+                  fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_QUANTITY_ON_HAND]
+                  est: (rows=2936250)
+            Exchange
+                distribution: single
+                est: (rows=4173)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: AND(>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 49.00), <=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), CAST(+(49, 30)):DECIMAL(12, 2) NOT NULL), SEARCH(I_MANUFACT_ID, Sarg[17, 80, 292, 675]))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_MANUFACT_ID]
+                  est: (rows=4173)
+        Exchange
+            distribution: single
+            est: (rows=18262)
+          TableScan
+              table: PUBLIC.DATE_DIM
+              predicate: AND(>=(D_DATE, 2001-01-28), <=(D_DATE, +(2001-01-28, *(60, 86400000:INTERVAL DAY))))
+              fieldNames: [D_DATE_SK, D_DATE]
+              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q82_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q82_colocated.plan
new file mode 100644
index 00000000000..8abf4ff3e9e
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q82_colocated.plan
@@ -0,0 +1,55 @@
+Sort
+    collation: [I_ITEM_ID ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      group: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+      aggregation: []
+      est: (rows=20365)
+    Project
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        projection: [I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE]
+        est: (rows=41731)
+      HashJoin
+          predicate: =(D_DATE_SK, INV_DATE_SK)
+          type: inner
+          est: (rows=41731)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=166924)
+          Exchange
+              distribution: single
+              est: (rows=2880404)
+            TableScan
+                table: PUBLIC.STORE_SALES
+                fieldNames: [SS_ITEM_SK]
+                est: (rows=2880404)
+          HashJoin
+              predicate: =(INV_ITEM_SK, I_ITEM_SK)
+              type: inner
+              est: (rows=680641)
+            Exchange
+                distribution: single
+                est: (rows=2936250)
+              TableScan
+                  table: PUBLIC.INVENTORY
+                  predicate: SEARCH(INV_QUANTITY_ON_HAND, Sarg[[100..500]])
+                  fieldNames: [INV_DATE_SK, INV_ITEM_SK, INV_QUANTITY_ON_HAND]
+                  est: (rows=2936250)
+            Exchange
+                distribution: single
+                est: (rows=4173)
+              TableScan
+                  table: PUBLIC.ITEM
+                  predicate: AND(>=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), 49.00), <=(CAST(I_CURRENT_PRICE):DECIMAL(12, 2), CAST(+(49, 30)):DECIMAL(12, 2) NOT NULL), SEARCH(I_MANUFACT_ID, Sarg[17, 80, 292, 675]))
+                  fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_MANUFACT_ID]
+                  est: (rows=4173)
+        Exchange
+            distribution: single
+            est: (rows=18262)
+          TableScan
+              table: PUBLIC.DATE_DIM
+              predicate: AND(>=(D_DATE, 2001-01-28), <=(D_DATE, +(2001-01-28, *(60, 86400000:INTERVAL DAY))))
+              fieldNames: [D_DATE_SK, D_DATE]
+              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q83.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q83.plan
new file mode 100644
index 00000000000..2ca85b1eb48
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q83.plan
@@ -0,0 +1,297 @@
+Sort
+    collation: [ITEM_ID ASC, SR_ITEM_QTY ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [ITEM_ID, SR_ITEM_QTY, SR_DEV, CR_ITEM_QTY, CR_DEV, WR_ITEM_QTY, WR_DEV, AVERAGE]
+      projection: [ITEM_ID$0, SR_ITEM_QTY, *(/(/(SR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), CR_ITEM_QTY, *(/(/(CR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), WR_ITEM_QTY, *(/(/(WR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), /(+(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY), 3.0:DECIMAL(2, 1))]
+      est: (rows=1131225932799338900)
+    MergeJoin
+        predicate: =(ITEM_ID$0, ITEM_ID)
+        fieldNames: [ITEM_ID, CR_ITEM_QTY, ITEM_ID$0, SR_ITEM_QTY, ITEM_ID$0$0, WR_ITEM_QTY]
+        type: inner
+        est: (rows=1131225932799338900)
+      Sort
+          collation: [ITEM_ID ASC]
+          est: (rows=21919)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, CR_ITEM_QTY]
+            group: [ITEM_ID]
+            aggregation: [SUM(CR_RETURN_QUANTITY)]
+            est: (rows=21919)
+          Project
+              fieldNames: [ITEM_ID, CR_RETURN_QUANTITY]
+              projection: [I_ITEM_ID, CR_RETURN_QUANTITY]
+              est: (rows=109595)
+            HashJoin
+                predicate: =(CR_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=109595)
+              MergeJoin
+                  predicate: =(CR_RETURNED_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=109595)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  Sort
+                      collation: [CR_RETURNED_DATE_SK ASC]
+                      est: (rows=144067)
+                    TableScan
+                        table: PUBLIC.CATALOG_RETURNS
+                        fieldNames: [CR_RETURNED_DATE_SK, CR_ITEM_SK, CR_RETURN_QUANTITY]
+                        est: (rows=144067)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=266877871676)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedSortAggregate
+                      collation: [D_DATE ASC]
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=24356060)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=121780299)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                          fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                          type: inner
+                          est: (rows=121780299)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          Sort
+                              collation: [D_DATE ASC]
+                              est: (rows=73049)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                fieldNames: [D_DATE, D_WEEK_SEQ]
+                                est: (rows=73049)
+                        ReduceHashAggregate
+                            fieldNames: [D_WEEK_SEQ]
+                            group: [D_WEEK_SEQ]
+                            aggregation: []
+                            est: (rows=11114)
+                          Exchange
+                              distribution: single
+                              est: (rows=11114)
+                            MapHashAggregate
+                                fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                                group: [D_WEEK_SEQ]
+                                aggregation: []
+                                est: (rows=11114)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=55570)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+      HashJoin
+          predicate: =(ITEM_ID, ITEM_ID$0)
+          fieldNames: [ITEM_ID, SR_ITEM_QTY, ITEM_ID$0, WR_ITEM_QTY]
+          type: inner
+          est: (rows=344061718558242)
+        Sort
+            collation: [ITEM_ID ASC]
+            est: (rows=43744)
+          ColocatedHashAggregate
+              fieldNames: [ITEM_ID, SR_ITEM_QTY]
+              group: [ITEM_ID]
+              aggregation: [SUM(SR_RETURN_QUANTITY)]
+              est: (rows=43744)
+            Project
+                fieldNames: [ITEM_ID, SR_RETURN_QUANTITY]
+                projection: [I_ITEM_ID, SR_RETURN_QUANTITY]
+                est: (rows=218719)
+              HashJoin
+                  predicate: =(SR_ITEM_SK, I_ITEM_SK)
+                  type: inner
+                  est: (rows=218719)
+                MergeJoin
+                    predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=218719)
+                  Exchange
+                      distribution: single
+                      est: (rows=287514)
+                    Sort
+                        collation: [SR_RETURNED_DATE_SK ASC]
+                        est: (rows=287514)
+                      TableScan
+                          table: PUBLIC.STORE_RETURNS
+                          fieldNames: [SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_RETURN_QUANTITY]
+                          est: (rows=287514)
+                  HashJoin
+                      predicate: =(D_DATE, D_DATE$0)
+                      fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                      type: inner
+                      est: (rows=266877871676)
+                    Exchange
+                        distribution: single
+                        est: (rows=73049)
+                      Sort
+                          collation: [D_DATE_SK ASC]
+                          est: (rows=73049)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=73049)
+                    ColocatedSortAggregate
+                        collation: [D_DATE ASC]
+                        group: [D_DATE]
+                        aggregation: []
+                        est: (rows=24356060)
+                      Project
+                          fieldNames: [D_DATE]
+                          projection: [D_DATE]
+                          est: (rows=121780299)
+                        HashJoin
+                            predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                            fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                            type: inner
+                            est: (rows=121780299)
+                          Exchange
+                              distribution: single
+                              est: (rows=73049)
+                            Sort
+                                collation: [D_DATE ASC]
+                                est: (rows=73049)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  fieldNames: [D_DATE, D_WEEK_SEQ]
+                                  est: (rows=73049)
+                          ReduceHashAggregate
+                              fieldNames: [D_WEEK_SEQ]
+                              group: [D_WEEK_SEQ]
+                              aggregation: []
+                              est: (rows=11114)
+                            Exchange
+                                distribution: single
+                                est: (rows=11114)
+                              MapHashAggregate
+                                  fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                                  group: [D_WEEK_SEQ]
+                                  aggregation: []
+                                  est: (rows=11114)
+                                TableScan
+                                    table: PUBLIC.DATE_DIM
+                                    predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                    fieldNames: [D_WEEK_SEQ]
+                                    est: (rows=55570)
+                Exchange
+                    distribution: single
+                    est: (rows=18000)
+                  TableScan
+                      table: PUBLIC.ITEM
+                      fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                      est: (rows=18000)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, WR_ITEM_QTY]
+            group: [ITEM_ID]
+            aggregation: [SUM(WR_RETURN_QUANTITY)]
+            est: (rows=52435917549)
+          Project
+              fieldNames: [ITEM_ID, WR_RETURN_QUANTITY]
+              projection: [I_ITEM_ID, WR_RETURN_QUANTITY]
+              est: (rows=262179587743)
+            MergeJoin
+                predicate: =(WR_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=262179587743)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                Sort
+                    collation: [I_ITEM_SK ASC]
+                    est: (rows=18000)
+                  TableScan
+                      table: PUBLIC.ITEM
+                      fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                      est: (rows=18000)
+              HashJoin
+                  predicate: =(D_DATE, D_DATE$0)
+                  fieldNames: [D_DATE_SK, D_DATE, WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_RETURN_QUANTITY, D_DATE$0]
+                  type: inner
+                  est: (rows=262179587743)
+                Sort
+                    collation: [WR_ITEM_SK ASC]
+                    est: (rows=71763)
+                  HashJoin
+                      predicate: =(WR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=71763)
+                    Exchange
+                        distribution: single
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                    Exchange
+                        distribution: single
+                        est: (rows=71763)
+                      TableScan
+                          table: PUBLIC.WEB_RETURNS
+                          fieldNames: [WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_RETURN_QUANTITY]
+                          est: (rows=71763)
+                ColocatedSortAggregate
+                    collation: [D_DATE ASC]
+                    group: [D_DATE]
+                    aggregation: []
+                    est: (rows=24356060)
+                  Project
+                      fieldNames: [D_DATE]
+                      projection: [D_DATE]
+                      est: (rows=121780299)
+                    HashJoin
+                        predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                        fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                        type: inner
+                        est: (rows=121780299)
+                      Exchange
+                          distribution: single
+                          est: (rows=73049)
+                        Sort
+                            collation: [D_DATE ASC]
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                      ReduceHashAggregate
+                          fieldNames: [D_WEEK_SEQ]
+                          group: [D_WEEK_SEQ]
+                          aggregation: []
+                          est: (rows=11114)
+                        Exchange
+                            distribution: single
+                            est: (rows=11114)
+                          MapHashAggregate
+                              fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                              group: [D_WEEK_SEQ]
+                              aggregation: []
+                              est: (rows=11114)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                fieldNames: [D_WEEK_SEQ]
+                                est: (rows=55570)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q83_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q83_colocated.plan
new file mode 100644
index 00000000000..2ca85b1eb48
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q83_colocated.plan
@@ -0,0 +1,297 @@
+Sort
+    collation: [ITEM_ID ASC, SR_ITEM_QTY ASC]
+    fetch: 100
+    est: (rows=100)
+  Project
+      fieldNames: [ITEM_ID, SR_ITEM_QTY, SR_DEV, CR_ITEM_QTY, CR_DEV, WR_ITEM_QTY, WR_DEV, AVERAGE]
+      projection: [ITEM_ID$0, SR_ITEM_QTY, *(/(/(SR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), CR_ITEM_QTY, *(/(/(CR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), WR_ITEM_QTY, *(/(/(WR_ITEM_QTY, +(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY)), 3.0:DECIMAL(2, 1)), 100), /(+(+(SR_ITEM_QTY, CR_ITEM_QTY), WR_ITEM_QTY), 3.0:DECIMAL(2, 1))]
+      est: (rows=1131225932799338900)
+    MergeJoin
+        predicate: =(ITEM_ID$0, ITEM_ID)
+        fieldNames: [ITEM_ID, CR_ITEM_QTY, ITEM_ID$0, SR_ITEM_QTY, ITEM_ID$0$0, WR_ITEM_QTY]
+        type: inner
+        est: (rows=1131225932799338900)
+      Sort
+          collation: [ITEM_ID ASC]
+          est: (rows=21919)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, CR_ITEM_QTY]
+            group: [ITEM_ID]
+            aggregation: [SUM(CR_RETURN_QUANTITY)]
+            est: (rows=21919)
+          Project
+              fieldNames: [ITEM_ID, CR_RETURN_QUANTITY]
+              projection: [I_ITEM_ID, CR_RETURN_QUANTITY]
+              est: (rows=109595)
+            HashJoin
+                predicate: =(CR_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=109595)
+              MergeJoin
+                  predicate: =(CR_RETURNED_DATE_SK, D_DATE_SK)
+                  type: inner
+                  est: (rows=109595)
+                Exchange
+                    distribution: single
+                    est: (rows=144067)
+                  Sort
+                      collation: [CR_RETURNED_DATE_SK ASC]
+                      est: (rows=144067)
+                    TableScan
+                        table: PUBLIC.CATALOG_RETURNS
+                        fieldNames: [CR_RETURNED_DATE_SK, CR_ITEM_SK, CR_RETURN_QUANTITY]
+                        est: (rows=144067)
+                HashJoin
+                    predicate: =(D_DATE, D_DATE$0)
+                    fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                    type: inner
+                    est: (rows=266877871676)
+                  Exchange
+                      distribution: single
+                      est: (rows=73049)
+                    Sort
+                        collation: [D_DATE_SK ASC]
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                  ColocatedSortAggregate
+                      collation: [D_DATE ASC]
+                      group: [D_DATE]
+                      aggregation: []
+                      est: (rows=24356060)
+                    Project
+                        fieldNames: [D_DATE]
+                        projection: [D_DATE]
+                        est: (rows=121780299)
+                      HashJoin
+                          predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                          fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                          type: inner
+                          est: (rows=121780299)
+                        Exchange
+                            distribution: single
+                            est: (rows=73049)
+                          Sort
+                              collation: [D_DATE ASC]
+                              est: (rows=73049)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                fieldNames: [D_DATE, D_WEEK_SEQ]
+                                est: (rows=73049)
+                        ReduceHashAggregate
+                            fieldNames: [D_WEEK_SEQ]
+                            group: [D_WEEK_SEQ]
+                            aggregation: []
+                            est: (rows=11114)
+                          Exchange
+                              distribution: single
+                              est: (rows=11114)
+                            MapHashAggregate
+                                fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                                group: [D_WEEK_SEQ]
+                                aggregation: []
+                                est: (rows=11114)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                  fieldNames: [D_WEEK_SEQ]
+                                  est: (rows=55570)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                TableScan
+                    table: PUBLIC.ITEM
+                    fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                    est: (rows=18000)
+      HashJoin
+          predicate: =(ITEM_ID, ITEM_ID$0)
+          fieldNames: [ITEM_ID, SR_ITEM_QTY, ITEM_ID$0, WR_ITEM_QTY]
+          type: inner
+          est: (rows=344061718558242)
+        Sort
+            collation: [ITEM_ID ASC]
+            est: (rows=43744)
+          ColocatedHashAggregate
+              fieldNames: [ITEM_ID, SR_ITEM_QTY]
+              group: [ITEM_ID]
+              aggregation: [SUM(SR_RETURN_QUANTITY)]
+              est: (rows=43744)
+            Project
+                fieldNames: [ITEM_ID, SR_RETURN_QUANTITY]
+                projection: [I_ITEM_ID, SR_RETURN_QUANTITY]
+                est: (rows=218719)
+              HashJoin
+                  predicate: =(SR_ITEM_SK, I_ITEM_SK)
+                  type: inner
+                  est: (rows=218719)
+                MergeJoin
+                    predicate: =(SR_RETURNED_DATE_SK, D_DATE_SK)
+                    type: inner
+                    est: (rows=218719)
+                  Exchange
+                      distribution: single
+                      est: (rows=287514)
+                    Sort
+                        collation: [SR_RETURNED_DATE_SK ASC]
+                        est: (rows=287514)
+                      TableScan
+                          table: PUBLIC.STORE_RETURNS
+                          fieldNames: [SR_RETURNED_DATE_SK, SR_ITEM_SK, SR_RETURN_QUANTITY]
+                          est: (rows=287514)
+                  HashJoin
+                      predicate: =(D_DATE, D_DATE$0)
+                      fieldNames: [D_DATE_SK, D_DATE, D_DATE$0]
+                      type: inner
+                      est: (rows=266877871676)
+                    Exchange
+                        distribution: single
+                        est: (rows=73049)
+                      Sort
+                          collation: [D_DATE_SK ASC]
+                          est: (rows=73049)
+                        TableScan
+                            table: PUBLIC.DATE_DIM
+                            fieldNames: [D_DATE_SK, D_DATE]
+                            est: (rows=73049)
+                    ColocatedSortAggregate
+                        collation: [D_DATE ASC]
+                        group: [D_DATE]
+                        aggregation: []
+                        est: (rows=24356060)
+                      Project
+                          fieldNames: [D_DATE]
+                          projection: [D_DATE]
+                          est: (rows=121780299)
+                        HashJoin
+                            predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                            fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                            type: inner
+                            est: (rows=121780299)
+                          Exchange
+                              distribution: single
+                              est: (rows=73049)
+                            Sort
+                                collation: [D_DATE ASC]
+                                est: (rows=73049)
+                              TableScan
+                                  table: PUBLIC.DATE_DIM
+                                  fieldNames: [D_DATE, D_WEEK_SEQ]
+                                  est: (rows=73049)
+                          ReduceHashAggregate
+                              fieldNames: [D_WEEK_SEQ]
+                              group: [D_WEEK_SEQ]
+                              aggregation: []
+                              est: (rows=11114)
+                            Exchange
+                                distribution: single
+                                est: (rows=11114)
+                              MapHashAggregate
+                                  fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                                  group: [D_WEEK_SEQ]
+                                  aggregation: []
+                                  est: (rows=11114)
+                                TableScan
+                                    table: PUBLIC.DATE_DIM
+                                    predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                    fieldNames: [D_WEEK_SEQ]
+                                    est: (rows=55570)
+                Exchange
+                    distribution: single
+                    est: (rows=18000)
+                  TableScan
+                      table: PUBLIC.ITEM
+                      fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                      est: (rows=18000)
+        ColocatedHashAggregate
+            fieldNames: [ITEM_ID, WR_ITEM_QTY]
+            group: [ITEM_ID]
+            aggregation: [SUM(WR_RETURN_QUANTITY)]
+            est: (rows=52435917549)
+          Project
+              fieldNames: [ITEM_ID, WR_RETURN_QUANTITY]
+              projection: [I_ITEM_ID, WR_RETURN_QUANTITY]
+              est: (rows=262179587743)
+            MergeJoin
+                predicate: =(WR_ITEM_SK, I_ITEM_SK)
+                type: inner
+                est: (rows=262179587743)
+              Exchange
+                  distribution: single
+                  est: (rows=18000)
+                Sort
+                    collation: [I_ITEM_SK ASC]
+                    est: (rows=18000)
+                  TableScan
+                      table: PUBLIC.ITEM
+                      fieldNames: [I_ITEM_SK, I_ITEM_ID]
+                      est: (rows=18000)
+              HashJoin
+                  predicate: =(D_DATE, D_DATE$0)
+                  fieldNames: [D_DATE_SK, D_DATE, WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_RETURN_QUANTITY, D_DATE$0]
+                  type: inner
+                  est: (rows=262179587743)
+                Sort
+                    collation: [WR_ITEM_SK ASC]
+                    est: (rows=71763)
+                  HashJoin
+                      predicate: =(WR_RETURNED_DATE_SK, D_DATE_SK)
+                      type: inner
+                      est: (rows=71763)
+                    Exchange
+                        distribution: single
+                        est: (rows=73049)
+                      TableScan
+                          table: PUBLIC.DATE_DIM
+                          fieldNames: [D_DATE_SK, D_DATE]
+                          est: (rows=73049)
+                    Exchange
+                        distribution: single
+                        est: (rows=71763)
+                      TableScan
+                          table: PUBLIC.WEB_RETURNS
+                          fieldNames: [WR_RETURNED_DATE_SK, WR_ITEM_SK, WR_RETURN_QUANTITY]
+                          est: (rows=71763)
+                ColocatedSortAggregate
+                    collation: [D_DATE ASC]
+                    group: [D_DATE]
+                    aggregation: []
+                    est: (rows=24356060)
+                  Project
+                      fieldNames: [D_DATE]
+                      projection: [D_DATE]
+                      est: (rows=121780299)
+                    HashJoin
+                        predicate: =(D_WEEK_SEQ, D_WEEK_SEQ$0)
+                        fieldNames: [D_DATE, D_WEEK_SEQ, D_WEEK_SEQ$0]
+                        type: inner
+                        est: (rows=121780299)
+                      Exchange
+                          distribution: single
+                          est: (rows=73049)
+                        Sort
+                            collation: [D_DATE ASC]
+                            est: (rows=73049)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              fieldNames: [D_DATE, D_WEEK_SEQ]
+                              est: (rows=73049)
+                      ReduceHashAggregate
+                          fieldNames: [D_WEEK_SEQ]
+                          group: [D_WEEK_SEQ]
+                          aggregation: []
+                          est: (rows=11114)
+                        Exchange
+                            distribution: single
+                            est: (rows=11114)
+                          MapHashAggregate
+                              fieldNames: [D_WEEK_SEQ, _GROUP_ID]
+                              group: [D_WEEK_SEQ]
+                              aggregation: []
+                              est: (rows=11114)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: SEARCH(D_DATE, Sarg[2000-06-17, 2000-08-22, 2000-11-17])
+                                fieldNames: [D_WEEK_SEQ]
+                                est: (rows=55570)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q92.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q92.plan
new file mode 100644
index 00000000000..dd8367471cc
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q92.plan
@@ -0,0 +1,104 @@
+Sort
+    collation: [Excess Discount Amount ASC]
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [Excess Discount Amount]
+      group: []
+      aggregation: [SUM(WS_EXT_DISCOUNT_AMT)]
+      est: (rows=1)
+    Project
+        fieldNames: [WS_EXT_DISCOUNT_AMT]
+        projection: [WS_EXT_DISCOUNT_AMT]
+        est: (rows=29944)
+      Filter
+          predicate: >(CAST(WS_EXT_DISCOUNT_AMT):DECIMAL(23, 17), EXPR$0)
+          est: (rows=29944)
+        CorrelatedNestedLoopJoin
+            predicate: true
+            type: left
+            correlates: [$cor1]
+            est: (rows=59889)
+          Project
+              fieldNames: [WS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              projection: [WS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              est: (rows=59889)
+            HashJoin
+                predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                type: inner
+                est: (rows=59889)
+              HashJoin
+                  predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                  type: inner
+                  est: (rows=179846)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  TableScan
+                      table: PUBLIC.WEB_SALES
+                      fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_DISCOUNT_AMT]
+                      est: (rows=719384)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2001-03-12), <=(D_DATE, +(2001-03-12, *(90, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=5994)
+                TableScan
+                    table: PUBLIC.ITEM
+                    predicate: =(I_MANUFACT_ID, 356)
+                    fieldNames: [I_ITEM_SK, I_MANUFACT_ID]
+                    est: (rows=5994)
+          Project
+              fieldNames: [EXPR$0]
+              projection: [*(1.3:DECIMAL(2, 1), $f0)]
+              est: (rows=1)
+            Project
+                fieldNames: [$f0]
+                projection: [CASE(=(f0_0, 0:DECIMAL(32767, 0)), null:DECIMAL(21, 16), DECIMAL_DIVIDE(f0_0, f1_1, 21, 16))]
+                est: (rows=1)
+              ReduceSortAggregate
+                  fieldNames: [f0_0, f1_1]
+                  collation: []
+                  group: []
+                  aggregation: [SUM(0), $SUM0(1)]
+                  est: (rows=1)
+                Project
+                    fieldNames: [0, 1]
+                    projection: [_ACC0, CAST(_ACC1):DECIMAL(32767, 0) NOT NULL]
+                    est: (rows=1)
+                  Exchange
+                      distribution: single
+                      est: (rows=1)
+                    MapSortAggregate
+                        fieldNames: [_ACC0, _ACC1]
+                        collation: []
+                        group: []
+                        aggregation: [SUM(WS_EXT_DISCOUNT_AMT), COUNT(WS_EXT_DISCOUNT_AMT)]
+                        est: (rows=1)
+                      Project
+                          fieldNames: [WS_EXT_DISCOUNT_AMT]
+                          projection: [WS_EXT_DISCOUNT_AMT]
+                          est: (rows=59889)
+                        HashJoin
+                            predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                            type: inner
+                            est: (rows=59889)
+                          Exchange
+                              distribution: table PUBLIC.DATE_DIM in zone "Default" by [WS_SOLD_DATE_SK]
+                              est: (rows=239555)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                predicate: =(WS_ITEM_SK, $cor1.I_ITEM_SK)
+                                fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_DISCOUNT_AMT]
+                                est: (rows=239555)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(>=(D_DATE, 2001-03-12), <=(D_DATE, +(2001-03-12, *(90, 86400000:INTERVAL DAY))))
+                              fieldNames: [D_DATE_SK, D_DATE]
+                              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q92_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q92_colocated.plan
new file mode 100644
index 00000000000..dd8367471cc
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q92_colocated.plan
@@ -0,0 +1,104 @@
+Sort
+    collation: [Excess Discount Amount ASC]
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [Excess Discount Amount]
+      group: []
+      aggregation: [SUM(WS_EXT_DISCOUNT_AMT)]
+      est: (rows=1)
+    Project
+        fieldNames: [WS_EXT_DISCOUNT_AMT]
+        projection: [WS_EXT_DISCOUNT_AMT]
+        est: (rows=29944)
+      Filter
+          predicate: >(CAST(WS_EXT_DISCOUNT_AMT):DECIMAL(23, 17), EXPR$0)
+          est: (rows=29944)
+        CorrelatedNestedLoopJoin
+            predicate: true
+            type: left
+            correlates: [$cor1]
+            est: (rows=59889)
+          Project
+              fieldNames: [WS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              projection: [WS_EXT_DISCOUNT_AMT, I_ITEM_SK]
+              est: (rows=59889)
+            HashJoin
+                predicate: =(I_ITEM_SK, WS_ITEM_SK)
+                type: inner
+                est: (rows=59889)
+              HashJoin
+                  predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                  type: inner
+                  est: (rows=179846)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  TableScan
+                      table: PUBLIC.WEB_SALES
+                      fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_DISCOUNT_AMT]
+                      est: (rows=719384)
+                Exchange
+                    distribution: single
+                    est: (rows=18262)
+                  TableScan
+                      table: PUBLIC.DATE_DIM
+                      predicate: AND(>=(D_DATE, 2001-03-12), <=(D_DATE, +(2001-03-12, *(90, 86400000:INTERVAL DAY))))
+                      fieldNames: [D_DATE_SK, D_DATE]
+                      est: (rows=18262)
+              Exchange
+                  distribution: single
+                  est: (rows=5994)
+                TableScan
+                    table: PUBLIC.ITEM
+                    predicate: =(I_MANUFACT_ID, 356)
+                    fieldNames: [I_ITEM_SK, I_MANUFACT_ID]
+                    est: (rows=5994)
+          Project
+              fieldNames: [EXPR$0]
+              projection: [*(1.3:DECIMAL(2, 1), $f0)]
+              est: (rows=1)
+            Project
+                fieldNames: [$f0]
+                projection: [CASE(=(f0_0, 0:DECIMAL(32767, 0)), null:DECIMAL(21, 16), DECIMAL_DIVIDE(f0_0, f1_1, 21, 16))]
+                est: (rows=1)
+              ReduceSortAggregate
+                  fieldNames: [f0_0, f1_1]
+                  collation: []
+                  group: []
+                  aggregation: [SUM(0), $SUM0(1)]
+                  est: (rows=1)
+                Project
+                    fieldNames: [0, 1]
+                    projection: [_ACC0, CAST(_ACC1):DECIMAL(32767, 0) NOT NULL]
+                    est: (rows=1)
+                  Exchange
+                      distribution: single
+                      est: (rows=1)
+                    MapSortAggregate
+                        fieldNames: [_ACC0, _ACC1]
+                        collation: []
+                        group: []
+                        aggregation: [SUM(WS_EXT_DISCOUNT_AMT), COUNT(WS_EXT_DISCOUNT_AMT)]
+                        est: (rows=1)
+                      Project
+                          fieldNames: [WS_EXT_DISCOUNT_AMT]
+                          projection: [WS_EXT_DISCOUNT_AMT]
+                          est: (rows=59889)
+                        HashJoin
+                            predicate: =(D_DATE_SK, WS_SOLD_DATE_SK)
+                            type: inner
+                            est: (rows=59889)
+                          Exchange
+                              distribution: table PUBLIC.DATE_DIM in zone "Default" by [WS_SOLD_DATE_SK]
+                              est: (rows=239555)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                predicate: =(WS_ITEM_SK, $cor1.I_ITEM_SK)
+                                fieldNames: [WS_SOLD_DATE_SK, WS_ITEM_SK, WS_EXT_DISCOUNT_AMT]
+                                est: (rows=239555)
+                          TableScan
+                              table: PUBLIC.DATE_DIM
+                              predicate: AND(>=(D_DATE, 2001-03-12), <=(D_DATE, +(2001-03-12, *(90, 86400000:INTERVAL DAY))))
+                              fieldNames: [D_DATE_SK, D_DATE]
+                              est: (rows=18262)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
new file mode 100644
index 00000000000..3ffd77615bf
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q94.plan
@@ -0,0 +1,129 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=100)
+  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=114166602536)
+    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=114166602536)
+      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=570833012679)
+        Filter
+            predicate: IS NULL(i)
+            est: (rows=570833012679)
+          CorrelatedNestedLoopJoin
+              predicate: true
+              type: left
+              correlates: [$cor4]
+              est: (rows=2283332050716)
+            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=477742918)
+              CorrelatedNestedLoopJoin
+                  predicate: true
+                  type: inner
+                  correlates: [$cor5]
+                  est: (rows=477742918)
+                Sort
+                    collation: [WS_ORDER_NUMBER ASC]
+                    est: (rows=19943)
+                  Project
+                      fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                      projection: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                      est: (rows=19943)
+                    HashJoin
+                        predicate: =(WS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+                        type: inner
+                        est: (rows=19943)
+                      HashJoin
+                          predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+                          type: inner
+                          est: (rows=59889)
+                        HashJoin
+                            predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=179846)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                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)
+                          Exchange
+                              distribution: single
+                              est: (rows=18262)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(>=(D_DATE, 1999-04-01), <=(D_DATE, +(1999-04-01, *(60, 86400000:INTERVAL DAY))))
+                                fieldNames: [D_DATE_SK, D_DATE]
+                                est: (rows=18262)
+                        Exchange
+                            distribution: single
+                            est: (rows=10)
+                          TableScan
+                              table: PUBLIC.WEB_SITE
+                              predicate: =(WEB_COMPANY_NAME, _UTF-8'pri')
+                              fieldNames: [WEB_SITE_SK, WEB_COMPANY_NAME]
+                              est: (rows=10)
+                      Exchange
+                          distribution: single
+                          est: (rows=16650)
+                        TableScan
+                            table: PUBLIC.CUSTOMER_ADDRESS
+                            predicate: =(CA_STATE, _UTF-8'NE')
+                            fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                            est: (rows=16650)
+                Project
+                    fieldNames: []
+                    projection: []
+                    est: (rows=23955)
+                  ReduceHashAggregate
+                      fieldNames: [i]
+                      group: [i]
+                      aggregation: []
+                      est: (rows=23955)
+                    Exchange
+                        distribution: single
+                        est: (rows=23955)
+                      MapHashAggregate
+                          fieldNames: [i, _GROUP_ID]
+                          group: [i]
+                          aggregation: []
+                          est: (rows=23955)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            predicate: AND(=($cor5.WS_ORDER_NUMBER, WS_ORDER_NUMBER), <>($cor5.WS_WAREHOUSE_SK, WS_WAREHOUSE_SK))
+                            fieldNames: [i]
+                            projection: [true]
+                            est: (rows=119777)
+            ReduceHashAggregate
+                fieldNames: [i]
+                group: [i]
+                aggregation: []
+                est: (rows=4779)
+              Exchange
+                  distribution: single
+                  est: (rows=4779)
+                MapHashAggregate
+                    fieldNames: [i, _GROUP_ID]
+                    group: [i]
+                    aggregation: []
+                    est: (rows=4779)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      predicate: =($cor4.WS_ORDER_NUMBER, WR_ORDER_NUMBER)
+                      fieldNames: [i]
+                      projection: [true]
+                      est: (rows=23897)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q94_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q94_colocated.plan
new file mode 100644
index 00000000000..3ffd77615bf
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q94_colocated.plan
@@ -0,0 +1,129 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=100)
+  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=114166602536)
+    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=114166602536)
+      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=570833012679)
+        Filter
+            predicate: IS NULL(i)
+            est: (rows=570833012679)
+          CorrelatedNestedLoopJoin
+              predicate: true
+              type: left
+              correlates: [$cor4]
+              est: (rows=2283332050716)
+            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=477742918)
+              CorrelatedNestedLoopJoin
+                  predicate: true
+                  type: inner
+                  correlates: [$cor5]
+                  est: (rows=477742918)
+                Sort
+                    collation: [WS_ORDER_NUMBER ASC]
+                    est: (rows=19943)
+                  Project
+                      fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                      projection: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                      est: (rows=19943)
+                    HashJoin
+                        predicate: =(WS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+                        type: inner
+                        est: (rows=19943)
+                      HashJoin
+                          predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+                          type: inner
+                          est: (rows=59889)
+                        HashJoin
+                            predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+                            type: inner
+                            est: (rows=179846)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                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)
+                          Exchange
+                              distribution: single
+                              est: (rows=18262)
+                            TableScan
+                                table: PUBLIC.DATE_DIM
+                                predicate: AND(>=(D_DATE, 1999-04-01), <=(D_DATE, +(1999-04-01, *(60, 86400000:INTERVAL DAY))))
+                                fieldNames: [D_DATE_SK, D_DATE]
+                                est: (rows=18262)
+                        Exchange
+                            distribution: single
+                            est: (rows=10)
+                          TableScan
+                              table: PUBLIC.WEB_SITE
+                              predicate: =(WEB_COMPANY_NAME, _UTF-8'pri')
+                              fieldNames: [WEB_SITE_SK, WEB_COMPANY_NAME]
+                              est: (rows=10)
+                      Exchange
+                          distribution: single
+                          est: (rows=16650)
+                        TableScan
+                            table: PUBLIC.CUSTOMER_ADDRESS
+                            predicate: =(CA_STATE, _UTF-8'NE')
+                            fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                            est: (rows=16650)
+                Project
+                    fieldNames: []
+                    projection: []
+                    est: (rows=23955)
+                  ReduceHashAggregate
+                      fieldNames: [i]
+                      group: [i]
+                      aggregation: []
+                      est: (rows=23955)
+                    Exchange
+                        distribution: single
+                        est: (rows=23955)
+                      MapHashAggregate
+                          fieldNames: [i, _GROUP_ID]
+                          group: [i]
+                          aggregation: []
+                          est: (rows=23955)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            predicate: AND(=($cor5.WS_ORDER_NUMBER, WS_ORDER_NUMBER), <>($cor5.WS_WAREHOUSE_SK, WS_WAREHOUSE_SK))
+                            fieldNames: [i]
+                            projection: [true]
+                            est: (rows=119777)
+            ReduceHashAggregate
+                fieldNames: [i]
+                group: [i]
+                aggregation: []
+                est: (rows=4779)
+              Exchange
+                  distribution: single
+                  est: (rows=4779)
+                MapHashAggregate
+                    fieldNames: [i, _GROUP_ID]
+                    group: [i]
+                    aggregation: []
+                    est: (rows=4779)
+                  TableScan
+                      table: PUBLIC.WEB_RETURNS
+                      predicate: =($cor4.WS_ORDER_NUMBER, WR_ORDER_NUMBER)
+                      fieldNames: [i]
+                      projection: [true]
+                      est: (rows=23897)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q95.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q95.plan
new file mode 100644
index 00000000000..f48a8b08424
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q95.plan
@@ -0,0 +1,151 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [order count, total shipping cost, total net profit]
+      group: []
+      aggregation: [COUNT(DISTINCT WS_ORDER_NUMBER), SUM(WS_EXT_SHIP_COST), SUM(WS_NET_PROFIT)]
+      est: (rows=1)
+    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=291064492602986630000000000)
+      HashJoin
+          predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+          type: inner
+          est: (rows=291064492602986630000000000)
+        HashJoin
+            predicate: =(WS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+            type: inner
+            est: (rows=874067545354314200000000000)
+          Exchange
+              distribution: single
+              est: (rows=16650)
+            TableScan
+                table: PUBLIC.CUSTOMER_ADDRESS
+                predicate: =(CA_STATE, _UTF-8'AL')
+                fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                est: (rows=16650)
+          MergeJoin
+              predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=2624827463526469000000000000)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              Sort
+                  collation: [D_DATE_SK ASC]
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_DATE, 2002-04-01), <=(D_DATE, +(2002-04-01, *(60, 86400000:INTERVAL DAY))))
+                    fieldNames: [D_DATE_SK, D_DATE]
+                    est: (rows=18262)
+            HashJoin
+                predicate: =(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0)
+                fieldNames: [WS_SHIP_DATE_SK, WS_SHIP_ADDR_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT, WR_ORDER_NUMBER, WS_ORDER_NUMBER$0]
+                type: inner
+                est: (rows=10499309854105876000000000000)
+              HashJoin
+                  predicate: =(WS_ORDER_NUMBER, WR_ORDER_NUMBER)
+                  type: inner
+                  est: (rows=9016888221786429000)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  Sort
+                      collation: [WS_SHIP_DATE_SK ASC]
+                      est: (rows=719384)
+                    TableScan
+                        table: PUBLIC.WEB_SALES
+                        fieldNames: [WS_SHIP_DATE_SK, WS_SHIP_ADDR_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                        est: (rows=719384)
+                ColocatedSortAggregate
+                    collation: [WR_ORDER_NUMBER ASC]
+                    group: [WR_ORDER_NUMBER]
+                    aggregation: []
+                    est: (rows=83561197003607)
+                  Project
+                      fieldNames: [WR_ORDER_NUMBER]
+                      projection: [WR_ORDER_NUMBER]
+                      est: (rows=417805985018035)
+                    MergeJoin
+                        predicate: =(WR_ORDER_NUMBER, WS_ORDER_NUMBER)
+                        type: inner
+                        est: (rows=417805985018035)
+                      Exchange
+                          distribution: single
+                          est: (rows=71763)
+                        Sort
+                            collation: [WR_ORDER_NUMBER ASC]
+                            est: (rows=71763)
+                          TableScan
+                              table: PUBLIC.WEB_RETURNS
+                              fieldNames: [WR_ORDER_NUMBER]
+                              est: (rows=71763)
+                      Project
+                          fieldNames: [WS_ORDER_NUMBER]
+                          projection: [WS_ORDER_NUMBER]
+                          est: (rows=38813500459)
+                        HashJoin
+                            predicate: AND(=(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0), <>(WS_WAREHOUSE_SK, WS_WAREHOUSE_SK$0))
+                            fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_WAREHOUSE_SK$0, WS_ORDER_NUMBER$0]
+                            type: inner
+                            est: (rows=38813500459)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            Sort
+                                collation: [WS_ORDER_NUMBER ASC]
+                                est: (rows=719384)
+                              TableScan
+                                  table: PUBLIC.WEB_SALES
+                                  fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                                  est: (rows=719384)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                                est: (rows=719384)
+              ColocatedSortAggregate
+                  collation: [WS_ORDER_NUMBER ASC]
+                  group: [WS_ORDER_NUMBER]
+                  aggregation: []
+                  est: (rows=7762700092)
+                Project
+                    fieldNames: [WS_ORDER_NUMBER]
+                    projection: [WS_ORDER_NUMBER]
+                    est: (rows=38813500459)
+                  HashJoin
+                      predicate: AND(=(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0), <>(WS_WAREHOUSE_SK, WS_WAREHOUSE_SK$0))
+                      fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_WAREHOUSE_SK$0, WS_ORDER_NUMBER$0]
+                      type: inner
+                      est: (rows=38813500459)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      Sort
+                          collation: [WS_ORDER_NUMBER ASC]
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                            est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                          est: (rows=719384)
+        Exchange
+            distribution: single
+            est: (rows=10)
+          TableScan
+              table: PUBLIC.WEB_SITE
+              predicate: =(WEB_COMPANY_NAME, _UTF-8'pri')
+              fieldNames: [WEB_SITE_SK, WEB_COMPANY_NAME]
+              est: (rows=10)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q95_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q95_colocated.plan
new file mode 100644
index 00000000000..f48a8b08424
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q95_colocated.plan
@@ -0,0 +1,151 @@
+Sort
+    collation: [order count ASC]
+    fetch: 100
+    est: (rows=1)
+  ColocatedHashAggregate
+      fieldNames: [order count, total shipping cost, total net profit]
+      group: []
+      aggregation: [COUNT(DISTINCT WS_ORDER_NUMBER), SUM(WS_EXT_SHIP_COST), SUM(WS_NET_PROFIT)]
+      est: (rows=1)
+    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=291064492602986630000000000)
+      HashJoin
+          predicate: =(WS_WEB_SITE_SK, WEB_SITE_SK)
+          type: inner
+          est: (rows=291064492602986630000000000)
+        HashJoin
+            predicate: =(WS_SHIP_ADDR_SK, CA_ADDRESS_SK)
+            type: inner
+            est: (rows=874067545354314200000000000)
+          Exchange
+              distribution: single
+              est: (rows=16650)
+            TableScan
+                table: PUBLIC.CUSTOMER_ADDRESS
+                predicate: =(CA_STATE, _UTF-8'AL')
+                fieldNames: [CA_ADDRESS_SK, CA_STATE]
+                est: (rows=16650)
+          MergeJoin
+              predicate: =(WS_SHIP_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=2624827463526469000000000000)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              Sort
+                  collation: [D_DATE_SK ASC]
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_DATE, 2002-04-01), <=(D_DATE, +(2002-04-01, *(60, 86400000:INTERVAL DAY))))
+                    fieldNames: [D_DATE_SK, D_DATE]
+                    est: (rows=18262)
+            HashJoin
+                predicate: =(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0)
+                fieldNames: [WS_SHIP_DATE_SK, WS_SHIP_ADDR_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT, WR_ORDER_NUMBER, WS_ORDER_NUMBER$0]
+                type: inner
+                est: (rows=10499309854105876000000000000)
+              HashJoin
+                  predicate: =(WS_ORDER_NUMBER, WR_ORDER_NUMBER)
+                  type: inner
+                  est: (rows=9016888221786429000)
+                Exchange
+                    distribution: single
+                    est: (rows=719384)
+                  Sort
+                      collation: [WS_SHIP_DATE_SK ASC]
+                      est: (rows=719384)
+                    TableScan
+                        table: PUBLIC.WEB_SALES
+                        fieldNames: [WS_SHIP_DATE_SK, WS_SHIP_ADDR_SK, WS_WEB_SITE_SK, WS_ORDER_NUMBER, WS_EXT_SHIP_COST, WS_NET_PROFIT]
+                        est: (rows=719384)
+                ColocatedSortAggregate
+                    collation: [WR_ORDER_NUMBER ASC]
+                    group: [WR_ORDER_NUMBER]
+                    aggregation: []
+                    est: (rows=83561197003607)
+                  Project
+                      fieldNames: [WR_ORDER_NUMBER]
+                      projection: [WR_ORDER_NUMBER]
+                      est: (rows=417805985018035)
+                    MergeJoin
+                        predicate: =(WR_ORDER_NUMBER, WS_ORDER_NUMBER)
+                        type: inner
+                        est: (rows=417805985018035)
+                      Exchange
+                          distribution: single
+                          est: (rows=71763)
+                        Sort
+                            collation: [WR_ORDER_NUMBER ASC]
+                            est: (rows=71763)
+                          TableScan
+                              table: PUBLIC.WEB_RETURNS
+                              fieldNames: [WR_ORDER_NUMBER]
+                              est: (rows=71763)
+                      Project
+                          fieldNames: [WS_ORDER_NUMBER]
+                          projection: [WS_ORDER_NUMBER]
+                          est: (rows=38813500459)
+                        HashJoin
+                            predicate: AND(=(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0), <>(WS_WAREHOUSE_SK, WS_WAREHOUSE_SK$0))
+                            fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_WAREHOUSE_SK$0, WS_ORDER_NUMBER$0]
+                            type: inner
+                            est: (rows=38813500459)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            Sort
+                                collation: [WS_ORDER_NUMBER ASC]
+                                est: (rows=719384)
+                              TableScan
+                                  table: PUBLIC.WEB_SALES
+                                  fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                                  est: (rows=719384)
+                          Exchange
+                              distribution: single
+                              est: (rows=719384)
+                            TableScan
+                                table: PUBLIC.WEB_SALES
+                                fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                                est: (rows=719384)
+              ColocatedSortAggregate
+                  collation: [WS_ORDER_NUMBER ASC]
+                  group: [WS_ORDER_NUMBER]
+                  aggregation: []
+                  est: (rows=7762700092)
+                Project
+                    fieldNames: [WS_ORDER_NUMBER]
+                    projection: [WS_ORDER_NUMBER]
+                    est: (rows=38813500459)
+                  HashJoin
+                      predicate: AND(=(WS_ORDER_NUMBER, WS_ORDER_NUMBER$0), <>(WS_WAREHOUSE_SK, WS_WAREHOUSE_SK$0))
+                      fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER, WS_WAREHOUSE_SK$0, WS_ORDER_NUMBER$0]
+                      type: inner
+                      est: (rows=38813500459)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      Sort
+                          collation: [WS_ORDER_NUMBER ASC]
+                          est: (rows=719384)
+                        TableScan
+                            table: PUBLIC.WEB_SALES
+                            fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                            est: (rows=719384)
+                    Exchange
+                        distribution: single
+                        est: (rows=719384)
+                      TableScan
+                          table: PUBLIC.WEB_SALES
+                          fieldNames: [WS_WAREHOUSE_SK, WS_ORDER_NUMBER]
+                          est: (rows=719384)
+        Exchange
+            distribution: single
+            est: (rows=10)
+          TableScan
+              table: PUBLIC.WEB_SITE
+              predicate: =(WEB_COMPANY_NAME, _UTF-8'pri')
+              fieldNames: [WEB_SITE_SK, WEB_COMPANY_NAME]
+              est: (rows=10)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q98.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q98.plan
new file mode 100644
index 00000000000..144a59f82c8
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q98.plan
@@ -0,0 +1,47 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    est: (rows=368296)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=368296)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(SS_EXT_SALES_PRICE)]
+        est: (rows=368296)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, SS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, SS_EXT_SALES_PRICE]
+          est: (rows=547798)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=547798)
+          HashJoin
+              predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=720101)
+            Exchange
+                distribution: single
+                est: (rows=2880404)
+              TableScan
+                  table: PUBLIC.STORE_SALES
+                  fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_EXT_SALES_PRICE]
+                  est: (rows=2880404)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 2002-01-05), <=(D_DATE, +(2002-01-05, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Home':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Men':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Sports':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q98_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q98_colocated.plan
new file mode 100644
index 00000000000..144a59f82c8
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q98_colocated.plan
@@ -0,0 +1,47 @@
+Sort
+    collation: [I_CATEGORY ASC, I_CLASS ASC, I_ITEM_ID ASC, I_ITEM_DESC ASC, REVENUERATIO ASC]
+    est: (rows=368296)
+  Project
+      fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, REVENUERATIO]
+      projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE, /(*(ITEMREVENUE, 100), CASE(>(COUNT(ITEMREVENUE) OVER (PARTITION BY I_CLASS), 0), CAST(SUM(ITEMREVENUE) OVER (PARTITION BY I_CLASS)):DECIMAL(32767, 2), null:DECIMAL(32767, 2)))]
+      est: (rows=368296)
+    ColocatedHashAggregate
+        fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, ITEMREVENUE]
+        group: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE]
+        aggregation: [SUM(SS_EXT_SALES_PRICE)]
+        est: (rows=368296)
+      Project
+          fieldNames: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, SS_EXT_SALES_PRICE]
+          projection: [I_ITEM_ID, I_ITEM_DESC, I_CATEGORY, I_CLASS, I_CURRENT_PRICE, SS_EXT_SALES_PRICE]
+          est: (rows=547798)
+        HashJoin
+            predicate: =(SS_ITEM_SK, I_ITEM_SK)
+            type: inner
+            est: (rows=547798)
+          HashJoin
+              predicate: =(SS_SOLD_DATE_SK, D_DATE_SK)
+              type: inner
+              est: (rows=720101)
+            Exchange
+                distribution: single
+                est: (rows=2880404)
+              TableScan
+                  table: PUBLIC.STORE_SALES
+                  fieldNames: [SS_SOLD_DATE_SK, SS_ITEM_SK, SS_EXT_SALES_PRICE]
+                  est: (rows=2880404)
+            Exchange
+                distribution: single
+                est: (rows=18262)
+              TableScan
+                  table: PUBLIC.DATE_DIM
+                  predicate: AND(>=(D_DATE, 2002-01-05), <=(D_DATE, +(2002-01-05, *(30, 86400000:INTERVAL DAY))))
+                  fieldNames: [D_DATE_SK, D_DATE]
+                  est: (rows=18262)
+          Exchange
+              distribution: single
+              est: (rows=13693)
+            TableScan
+                table: PUBLIC.ITEM
+                predicate: SEARCH(I_CATEGORY, Sarg[_UTF-8'Home':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Men':VARCHAR(50) CHARACTER SET "UTF-8", _UTF-8'Sports':VARCHAR(50) CHARACTER SET "UTF-8"]:VARCHAR(50) CHARACTER SET "UTF-8")
+                fieldNames: [I_ITEM_SK, I_ITEM_ID, I_ITEM_DESC, I_CURRENT_PRICE, I_CLASS, I_CATEGORY]
+                est: (rows=13693)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q99.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q99.plan
new file mode 100644
index 00000000000..4f9da7b2141
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q99.plan
@@ -0,0 +1,65 @@
+Sort
+    collation: [EXPR$0 ASC, SM_TYPE ASC, CC_NAME ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [EXPR$0, SM_TYPE, CC_NAME, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [EXPR$0, SM_TYPE, CC_NAME]
+      aggregation: [SUM($f3), SUM($f4), SUM($f5), SUM($f6), SUM($f7)]
+      est: (rows=175869)
+    Project
+        fieldNames: [EXPR$0, SM_TYPE, CC_NAME, $f3, $f4, $f5, $f6, $f7]
+        projection: [SUBSTR(W_WAREHOUSE_NAME, 1, 20), SM_TYPE, CC_NAME, CASE(<=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 30), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 60), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 90), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 120)), 1, 0), CASE(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK),  [...]
+        est: (rows=360387)
+      HashJoin
+          predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+          type: inner
+          est: (rows=360387)
+        HashJoin
+            predicate: =(CS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+            type: inner
+            est: (rows=360387)
+          HashJoin
+              predicate: =(CS_CALL_CENTER_SK, CC_CALL_CENTER_SK)
+              type: inner
+              est: (rows=360387)
+            HashJoin
+                predicate: =(CS_SHIP_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=360387)
+              Exchange
+                  distribution: single
+                  est: (rows=1441548)
+                TableScan
+                    table: PUBLIC.CATALOG_SALES
+                    fieldNames: [CS_SOLD_DATE_SK, CS_SHIP_DATE_SK, CS_CALL_CENTER_SK, CS_SHIP_MODE_SK, CS_WAREHOUSE_SK]
+                    est: (rows=1441548)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_MONTH_SEQ, 1178), <=(D_MONTH_SEQ, +(1178, 11)))
+                    fieldNames: [D_DATE_SK, D_MONTH_SEQ]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=6)
+              TableScan
+                  table: PUBLIC.CALL_CENTER
+                  fieldNames: [CC_CALL_CENTER_SK, CC_NAME]
+                  est: (rows=6)
+          Exchange
+              distribution: single
+              est: (rows=20)
+            TableScan
+                table: PUBLIC.SHIP_MODE
+                fieldNames: [SM_SHIP_MODE_SK, SM_TYPE]
+                est: (rows=20)
+        Exchange
+            distribution: single
+            est: (rows=5)
+          TableScan
+              table: PUBLIC.WAREHOUSE
+              fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+              est: (rows=5)
diff --git a/modules/sql-engine/src/test/resources/tpcds/plan/q99_colocated.plan b/modules/sql-engine/src/test/resources/tpcds/plan/q99_colocated.plan
new file mode 100644
index 00000000000..4f9da7b2141
--- /dev/null
+++ b/modules/sql-engine/src/test/resources/tpcds/plan/q99_colocated.plan
@@ -0,0 +1,65 @@
+Sort
+    collation: [EXPR$0 ASC, SM_TYPE ASC, CC_NAME ASC]
+    fetch: 100
+    est: (rows=100)
+  ColocatedHashAggregate
+      fieldNames: [EXPR$0, SM_TYPE, CC_NAME, 30 days, 31-60 days, 61-90 days, 91-120 days, >120 days]
+      group: [EXPR$0, SM_TYPE, CC_NAME]
+      aggregation: [SUM($f3), SUM($f4), SUM($f5), SUM($f6), SUM($f7)]
+      est: (rows=175869)
+    Project
+        fieldNames: [EXPR$0, SM_TYPE, CC_NAME, $f3, $f4, $f5, $f6, $f7]
+        projection: [SUBSTR(W_WAREHOUSE_NAME, 1, 20), SM_TYPE, CC_NAME, CASE(<=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 30), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 30), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 60)), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 60), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 90)), 1, 0), CASE(AND(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 90), <=(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK), 120)), 1, 0), CASE(>(-(CS_SHIP_DATE_SK, CS_SOLD_DATE_SK),  [...]
+        est: (rows=360387)
+      HashJoin
+          predicate: =(CS_WAREHOUSE_SK, W_WAREHOUSE_SK)
+          type: inner
+          est: (rows=360387)
+        HashJoin
+            predicate: =(CS_SHIP_MODE_SK, SM_SHIP_MODE_SK)
+            type: inner
+            est: (rows=360387)
+          HashJoin
+              predicate: =(CS_CALL_CENTER_SK, CC_CALL_CENTER_SK)
+              type: inner
+              est: (rows=360387)
+            HashJoin
+                predicate: =(CS_SHIP_DATE_SK, D_DATE_SK)
+                type: inner
+                est: (rows=360387)
+              Exchange
+                  distribution: single
+                  est: (rows=1441548)
+                TableScan
+                    table: PUBLIC.CATALOG_SALES
+                    fieldNames: [CS_SOLD_DATE_SK, CS_SHIP_DATE_SK, CS_CALL_CENTER_SK, CS_SHIP_MODE_SK, CS_WAREHOUSE_SK]
+                    est: (rows=1441548)
+              Exchange
+                  distribution: single
+                  est: (rows=18262)
+                TableScan
+                    table: PUBLIC.DATE_DIM
+                    predicate: AND(>=(D_MONTH_SEQ, 1178), <=(D_MONTH_SEQ, +(1178, 11)))
+                    fieldNames: [D_DATE_SK, D_MONTH_SEQ]
+                    est: (rows=18262)
+            Exchange
+                distribution: single
+                est: (rows=6)
+              TableScan
+                  table: PUBLIC.CALL_CENTER
+                  fieldNames: [CC_CALL_CENTER_SK, CC_NAME]
+                  est: (rows=6)
+          Exchange
+              distribution: single
+              est: (rows=20)
+            TableScan
+                table: PUBLIC.SHIP_MODE
+                fieldNames: [SM_SHIP_MODE_SK, SM_TYPE]
+                est: (rows=20)
+        Exchange
+            distribution: single
+            est: (rows=5)
+          TableScan
+              table: PUBLIC.WAREHOUSE
+              fieldNames: [W_WAREHOUSE_SK, W_WAREHOUSE_NAME]
+              est: (rows=5)
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query12.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query12.sql
index 3267c967590..29e33f91f3c 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query12.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query12.sql
@@ -16,7 +16,7 @@ where
   	and i_category in ('Electronics', 'Books', 'Women')
   	and ws_sold_date_sk = d_date_sk
 	and d_date between cast('1998-01-06' as date) 
-				and (cast('1998-01-06' as date) + 30 days)
+				and (cast('1998-01-06' as date) + interval 30 days)
 group by 
 	i_item_id
         ,i_item_desc 
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query16.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query16.sql
index affb71eb24b..32cf8040442 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query16.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query16.sql
@@ -1,8 +1,8 @@
 -- start query 1 in stream 0 using template query16.tpl and seed 171719422
 select  
-   count(distinct cs_order_number) as `order count`
-  ,sum(cs_ext_ship_cost) as `total shipping cost`
-  ,sum(cs_net_profit) as `total net profit`
+   count(distinct cs_order_number) as "order count"
+  ,sum(cs_ext_ship_cost) as "total shipping cost"
+  ,sum(cs_net_profit) as "total net profit"
 from
    catalog_sales cs1
   ,date_dim
@@ -10,7 +10,7 @@ from
   ,call_center
 where
     d_date between '1999-4-01' and 
-           (cast('1999-4-01' as date) + 60 days)
+           (cast('1999-4-01' as date) + interval 60 days)
 and cs1.cs_ship_date_sk = d_date_sk
 and cs1.cs_ship_addr_sk = ca_address_sk
 and ca_state = 'IL'
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query20.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query20.sql
index f6e7e46128c..a7b19020705 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query20.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query20.sql
@@ -14,7 +14,7 @@ select  i_item_id
    and i_category in ('Shoes', 'Electronics', 'Children')
    and cs_sold_date_sk = d_date_sk
  and d_date between cast('2001-03-14' as date) 
- 				and (cast('2001-03-14' as date) + 30 days)
+ 				and (cast('2001-03-14' as date) + interval 30 days)
  group by i_item_id
          ,i_item_desc 
          ,i_category
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query21.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query21.sql
index 372fcd781a0..02a461fd0e1 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query21.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query21.sql
@@ -16,8 +16,8 @@ select  *
      and i_item_sk          = inv_item_sk
      and inv_warehouse_sk   = w_warehouse_sk
      and inv_date_sk    = d_date_sk
-     and d_date between (cast ('1999-03-20' as date) - 30 days)
-                    and (cast ('1999-03-20' as date) + 30 days)
+     and d_date between (cast ('1999-03-20' as date) - interval 30 days)
+                    and (cast ('1999-03-20' as date) + interval 30 days)
    group by w_warehouse_name, i_item_id) x
  where (case when inv_before > 0 
              then inv_after / inv_before 
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query27.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query27.sql
index 9a906c4a026..6d6ceb79040 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query27.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query27.sql
@@ -1,6 +1,6 @@
 -- start query 1 in stream 0 using template query27.tpl and seed 2017787633
 select  i_item_id,
-        s_state, grouping(s_state) g_state,
+        s_state, grouping(s_state) as g_state,
         avg(ss_quantity) agg1,
         avg(ss_list_price) agg2,
         avg(ss_coupon_amt) agg3,
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query32.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query32.sql
index f1f8098ca3a..5e997a5b264 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query32.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query32.sql
@@ -1,5 +1,5 @@
 -- start query 1 in stream 0 using template query32.tpl and seed 2031708268
-select  sum(cs_ext_discount_amt)  as `excess discount amount` 
+select  sum(cs_ext_discount_amt)  as "excess discount amount"
 from 
    catalog_sales 
    ,item 
@@ -8,7 +8,7 @@ where
 i_manufact_id = 66
 and i_item_sk = cs_item_sk 
 and d_date between '2002-03-29' and 
-        (cast('2002-03-29' as date) + 90 days)
+        (cast('2002-03-29' as date) + interval 90 days)
 and d_date_sk = cs_sold_date_sk 
 and cs_ext_discount_amt  
      > ( 
@@ -20,7 +20,7 @@ and cs_ext_discount_amt
          where 
               cs_item_sk = i_item_sk 
           and d_date between '2002-03-29' and
-                             (cast('2002-03-29' as date) + 90 days)
+                             (cast('2002-03-29' as date) + interval 90 days)
           and d_date_sk = cs_sold_date_sk 
       ) 
 limit 100;
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query37.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query37.sql
index 78960dba87e..18ce2e8d003 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query37.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query37.sql
@@ -6,7 +6,7 @@ select  i_item_id
  where i_current_price between 39 and 39 + 30
  and inv_item_sk = i_item_sk
  and d_date_sk=inv_date_sk
- and d_date between cast('2001-01-16' as date) and (cast('2001-01-16' as date) +  60 days)
+ and d_date between cast('2001-01-16' as date) and (cast('2001-01-16' as date) + interval 60 days)
  and i_manufact_id in (765,886,889,728)
  and inv_quantity_on_hand between 100 and 500
  and cs_item_sk = i_item_sk
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query40.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query40.sql
index 333dc7fd38e..cfc2d43ffe0 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query40.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query40.sql
@@ -18,8 +18,8 @@ select
  and i_item_sk          = cs_item_sk
  and cs_warehouse_sk    = w_warehouse_sk 
  and cs_sold_date_sk    = d_date_sk
- and d_date between (cast ('2000-03-18' as date) - 30 days)
-                and (cast ('2000-03-18' as date) + 30 days) 
+ and d_date between (cast ('2000-03-18' as date) - interval 30 days)
+                and (cast ('2000-03-18' as date) + interval 30 days)
  group by
     w_state,i_item_id
  order by w_state,i_item_id
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query5.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query5.sql
index f8428f6e547..994b211326b 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query5.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query5.sql
@@ -26,7 +26,7 @@ with ssr as
      store
  where date_sk = d_date_sk
        and d_date between cast('2000-08-19' as date) 
-                  and (cast('2000-08-19' as date) +  14 days)
+                  and (cast('2000-08-19' as date) + interval 14 days)
        and store_sk = s_store_sk
  group by s_store_id)
  ,
@@ -57,7 +57,7 @@ with ssr as
      catalog_page
  where date_sk = d_date_sk
        and d_date between cast('2000-08-19' as date)
-                  and (cast('2000-08-19' as date) +  14 days)
+                  and (cast('2000-08-19' as date) + interval 14 days)
        and page_sk = cp_catalog_page_sk
  group by cp_catalog_page_id)
  ,
@@ -90,7 +90,7 @@ with ssr as
      web_site
  where date_sk = d_date_sk
        and d_date between cast('2000-08-19' as date)
-                  and (cast('2000-08-19' as date) +  14 days)
+                  and (cast('2000-08-19' as date) + interval 14 days)
        and wsr_web_site_sk = web_site_sk
  group by web_site_id)
   select  channel
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query50.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query50.sql
index ea694397af1..206432b8ea6 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query50.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query50.sql
@@ -10,14 +10,14 @@ select
   ,s_county
   ,s_state
   ,s_zip
-  ,sum(case when (sr_returned_date_sk - ss_sold_date_sk <= 30 ) then 1 else 0 end)  as `30 days` 
+  ,sum(case when (sr_returned_date_sk - ss_sold_date_sk <= 30 ) then 1 else 0 end)  as "30 days" 
   ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 30) and 
-                 (sr_returned_date_sk - ss_sold_date_sk <= 60) then 1 else 0 end )  as `31-60 days` 
+                 (sr_returned_date_sk - ss_sold_date_sk <= 60) then 1 else 0 end )  as "31-60 days" 
   ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 60) and 
-                 (sr_returned_date_sk - ss_sold_date_sk <= 90) then 1 else 0 end)  as `61-90 days` 
+                 (sr_returned_date_sk - ss_sold_date_sk <= 90) then 1 else 0 end)  as "61-90 days" 
   ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 90) and
-                 (sr_returned_date_sk - ss_sold_date_sk <= 120) then 1 else 0 end)  as `91-120 days` 
-  ,sum(case when (sr_returned_date_sk - ss_sold_date_sk  > 120) then 1 else 0 end)  as `>120 days` 
+                 (sr_returned_date_sk - ss_sold_date_sk <= 120) then 1 else 0 end)  as "91-120 days" 
+  ,sum(case when (sr_returned_date_sk - ss_sold_date_sk  > 120) then 1 else 0 end)  as ">120 days" 
 from
    store_sales
   ,store_returns
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query58.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query58.sql
index 36a4359807d..2d132d19c92 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query58.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query58.sql
@@ -10,7 +10,7 @@ with ss_items as
                   from date_dim
                   where d_week_seq = (select d_week_seq 
                                       from date_dim
-                                      where d_date = '1998-02-21'))
+                                      where d_date = date '1998-02-21'))
    and ss_sold_date_sk   = d_date_sk
  group by i_item_id),
  cs_items as
@@ -24,7 +24,7 @@ with ss_items as
                   from date_dim
                   where d_week_seq = (select d_week_seq 
                                       from date_dim
-                                      where d_date = '1998-02-21'))
+                                      where d_date = date '1998-02-21'))
   and  cs_sold_date_sk = d_date_sk
  group by i_item_id),
  ws_items as
@@ -38,7 +38,7 @@ with ss_items as
                   from date_dim
                   where d_week_seq =(select d_week_seq 
                                      from date_dim
-                                     where d_date = '1998-02-21'))
+                                     where d_date = date '1998-02-21'))
   and ws_sold_date_sk   = d_date_sk
  group by i_item_id)
   select  ss_items.item_id
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query62.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query62.sql
index 374256db8b6..0f8c79422db 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query62.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query62.sql
@@ -3,14 +3,14 @@ select
    substr(w_warehouse_name,1,20)
   ,sm_type
   ,web_name
-  ,sum(case when (ws_ship_date_sk - ws_sold_date_sk <= 30 ) then 1 else 0 end)  as `30 days` 
+  ,sum(case when (ws_ship_date_sk - ws_sold_date_sk <= 30 ) then 1 else 0 end)  as "30 days" 
   ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 30) and 
-                 (ws_ship_date_sk - ws_sold_date_sk <= 60) then 1 else 0 end )  as `31-60 days` 
+                 (ws_ship_date_sk - ws_sold_date_sk <= 60) then 1 else 0 end )  as "31-60 days" 
   ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 60) and 
-                 (ws_ship_date_sk - ws_sold_date_sk <= 90) then 1 else 0 end)  as `61-90 days` 
+                 (ws_ship_date_sk - ws_sold_date_sk <= 90) then 1 else 0 end)  as "61-90 days" 
   ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 90) and
-                 (ws_ship_date_sk - ws_sold_date_sk <= 120) then 1 else 0 end)  as `91-120 days` 
-  ,sum(case when (ws_ship_date_sk - ws_sold_date_sk  > 120) then 1 else 0 end)  as `>120 days` 
+                 (ws_ship_date_sk - ws_sold_date_sk <= 120) then 1 else 0 end)  as "91-120 days" 
+  ,sum(case when (ws_ship_date_sk - ws_sold_date_sk  > 120) then 1 else 0 end)  as ">120 days" 
 from
    web_sales
   ,warehouse
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query66.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query66.sql
index 987238b1258..1451d85b814 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query66.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query66.sql
@@ -7,7 +7,7 @@ select
  	,w_state
  	,w_country
         ,ship_carriers
-        ,year
+        ,"year"
  	,sum(jan_sales) as jan_sales
  	,sum(feb_sales) as feb_sales
  	,sum(mar_sales) as mar_sales
@@ -53,7 +53,7 @@ select
  	,w_state
  	,w_country
  	,'MSC' || ',' || 'GERMA' as ship_carriers
-       ,d_year as year
+       ,d_year as "year"
  	,sum(case when d_moy = 1 
  		then ws_sales_price* ws_quantity else 0 end) as jan_sales
  	,sum(case when d_moy = 2 
@@ -133,7 +133,7 @@ select
  	,w_state
  	,w_country
  	,'MSC' || ',' || 'GERMA' as ship_carriers
-       ,d_year as year
+       ,d_year as "year"
  	,sum(case when d_moy = 1 
  		then cs_ext_list_price* cs_quantity else 0 end) as jan_sales
  	,sum(case when d_moy = 2 
@@ -213,7 +213,7 @@ select
  	,w_state
  	,w_country
  	,ship_carriers
-       ,year
+       ,"year"
  order by w_warehouse_name
  limit 100;
 
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query74.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query74.sql
index d44235f5cd6..b461cfbdf47 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query74.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query74.sql
@@ -3,7 +3,7 @@ with year_total as (
  select c_customer_id customer_id
        ,c_first_name customer_first_name
        ,c_last_name customer_last_name
-       ,d_year as year
+       ,d_year as "year"
        ,sum(ss_net_paid) year_total
        ,'s' sale_type
  from customer
@@ -20,7 +20,7 @@ with year_total as (
  select c_customer_id customer_id
        ,c_first_name customer_first_name
        ,c_last_name customer_last_name
-       ,d_year as year
+       ,d_year as "year"
        ,sum(ws_net_paid) year_total
        ,'w' sale_type
  from customer
@@ -47,10 +47,10 @@ with year_total as (
          and t_w_firstyear.sale_type = 'w'
          and t_s_secyear.sale_type = 's'
          and t_w_secyear.sale_type = 'w'
-         and t_s_firstyear.year = 1998
-         and t_s_secyear.year = 1998+1
-         and t_w_firstyear.year = 1998
-         and t_w_secyear.year = 1998+1
+         and t_s_firstyear."year" = 1998
+         and t_s_secyear."year" = 1998+1
+         and t_w_firstyear."year" = 1998
+         and t_w_secyear."year" = 1998+1
          and t_s_firstyear.year_total > 0
          and t_w_firstyear.year_total > 0
          and case when t_w_firstyear.year_total > 0 then t_w_secyear.year_total / t_w_firstyear.year_total else null end
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query75.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query75.sql
index 50b507e1b5a..a9c8bf43925 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query75.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query75.sql
@@ -47,7 +47,7 @@ WITH all_sales AS (
        WHERE i_category='Sports') sales_detail
  GROUP BY d_year, i_brand_id, i_class_id, i_category_id, i_manufact_id)
  SELECT  prev_yr.d_year AS prev_year
-                          ,curr_yr.d_year AS year
+                          ,curr_yr.d_year AS "year"
                           ,curr_yr.i_brand_id
                           ,curr_yr.i_class_id
                           ,curr_yr.i_category_id
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query77.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query77.sql
index ce875c85b02..3762ac4af5a 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query77.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query77.sql
@@ -8,7 +8,7 @@ with ss as
       store
  where ss_sold_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date) 
-                  and (cast('2000-08-16' as date) +  30 days) 
+                  and (cast('2000-08-16' as date) + interval 30 days)
        and ss_store_sk = s_store_sk
  group by s_store_sk)
  ,
@@ -21,7 +21,7 @@ with ss as
       store
  where sr_returned_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date)
-                  and (cast('2000-08-16' as date) +  30 days)
+                  and (cast('2000-08-16' as date) + interval 30 days)
        and sr_store_sk = s_store_sk
  group by s_store_sk), 
  cs as
@@ -32,7 +32,7 @@ with ss as
       date_dim
  where cs_sold_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date)
-                  and (cast('2000-08-16' as date) +  30 days)
+                  and (cast('2000-08-16' as date) + interval 30 days)
  group by cs_call_center_sk 
  ), 
  cr as
@@ -43,7 +43,7 @@ with ss as
       date_dim
  where cr_returned_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date)
-                  and (cast('2000-08-16' as date) +  30 days)
+                  and (cast('2000-08-16' as date) + interval 30 days)
  group by cr_call_center_sk
  ), 
  ws as
@@ -55,7 +55,7 @@ with ss as
       web_page
  where ws_sold_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date)
-                  and (cast('2000-08-16' as date) +  30 days)
+                  and (cast('2000-08-16' as date) + interval 30 days)
        and ws_web_page_sk = wp_web_page_sk
  group by wp_web_page_sk), 
  wr as
@@ -67,7 +67,7 @@ with ss as
       web_page
  where wr_returned_date_sk = d_date_sk
        and d_date between cast('2000-08-16' as date)
-                  and (cast('2000-08-16' as date) +  30 days)
+                  and (cast('2000-08-16' as date) + interval 30 days)
        and wr_web_page_sk = wp_web_page_sk
  group by wp_web_page_sk)
   select  channel
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query80.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query80.sql
index 522f9e0c3c8..154350c1c6c 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query80.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query80.sql
@@ -12,7 +12,7 @@ with ssr as
      promotion
  where ss_sold_date_sk = d_date_sk
        and d_date between cast('2002-08-06' as date) 
-                  and (cast('2002-08-06' as date) +  30 days)
+                  and (cast('2002-08-06' as date) + interval 30 days)
        and ss_store_sk = s_store_sk
        and ss_item_sk = i_item_sk
        and i_current_price > 50
@@ -33,7 +33,7 @@ with ssr as
      promotion
  where cs_sold_date_sk = d_date_sk
        and d_date between cast('2002-08-06' as date)
-                  and (cast('2002-08-06' as date) +  30 days)
+                  and (cast('2002-08-06' as date) + interval 30 days)
         and cs_catalog_page_sk = cp_catalog_page_sk
        and cs_item_sk = i_item_sk
        and i_current_price > 50
@@ -54,7 +54,7 @@ group by cp_catalog_page_id)
      promotion
  where ws_sold_date_sk = d_date_sk
        and d_date between cast('2002-08-06' as date)
-                  and (cast('2002-08-06' as date) +  30 days)
+                  and (cast('2002-08-06' as date) + interval 30 days)
         and ws_web_site_sk = web_site_sk
        and ws_item_sk = i_item_sk
        and i_current_price > 50
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query82.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query82.sql
index fd83a7833c4..263bc6fc888 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query82.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query82.sql
@@ -6,7 +6,7 @@ select  i_item_id
  where i_current_price between 49 and 49+30
  and inv_item_sk = i_item_sk
  and d_date_sk=inv_date_sk
- and d_date between cast('2001-01-28' as date) and (cast('2001-01-28' as date) +  60 days)
+ and d_date between cast('2001-01-28' as date) and (cast('2001-01-28' as date) + interval 60 days)
  and i_manufact_id in (80,675,292,17)
  and inv_quantity_on_hand between 100 and 500
  and ss_item_sk = i_item_sk
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query83.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query83.sql
index 49d5bc199b6..139d34c121b 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query83.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query83.sql
@@ -12,7 +12,7 @@ with sr_items as
 	where d_week_seq in 
 		(select d_week_seq
 		from date_dim
-	  where d_date in ('2000-06-17','2000-08-22','2000-11-17')))
+	  where d_date in (date '2000-06-17',date '2000-08-22',date '2000-11-17')))
  and   sr_returned_date_sk   = d_date_sk
  group by i_item_id),
  cr_items as
@@ -28,7 +28,7 @@ with sr_items as
 	where d_week_seq in 
 		(select d_week_seq
 		from date_dim
-	  where d_date in ('2000-06-17','2000-08-22','2000-11-17')))
+	  where d_date in (date '2000-06-17',date '2000-08-22',date '2000-11-17')))
  and   cr_returned_date_sk   = d_date_sk
  group by i_item_id),
  wr_items as
@@ -44,7 +44,7 @@ with sr_items as
 	where d_week_seq in 
 		(select d_week_seq
 		from date_dim
-		where d_date in ('2000-06-17','2000-08-22','2000-11-17')))
+		where d_date in (date '2000-06-17',date '2000-08-22',date '2000-11-17')))
  and   wr_returned_date_sk   = d_date_sk
  group by i_item_id)
   select  sr_items.item_id
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query92.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query92.sql
index 3f83e0ea764..c67af17d75a 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query92.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query92.sql
@@ -1,6 +1,6 @@
 -- start query 1 in stream 0 using template query92.tpl and seed 2031708268
 select  
-   sum(ws_ext_discount_amt)  as `Excess Discount Amount` 
+   sum(ws_ext_discount_amt)  as "Excess Discount Amount"
 from 
     web_sales 
    ,item 
@@ -9,7 +9,7 @@ where
 i_manufact_id = 356
 and i_item_sk = ws_item_sk 
 and d_date between '2001-03-12' and 
-        (cast('2001-03-12' as date) + 90 days)
+        (cast('2001-03-12' as date) + interval 90 days)
 and d_date_sk = ws_sold_date_sk 
 and ws_ext_discount_amt  
      > ( 
@@ -21,7 +21,7 @@ and ws_ext_discount_amt
          WHERE 
               ws_item_sk = i_item_sk 
           and d_date between '2001-03-12' and
-                             (cast('2001-03-12' as date) + 90 days)
+                             (cast('2001-03-12' as date) + interval 90 days)
           and d_date_sk = ws_sold_date_sk 
       ) 
 order by sum(ws_ext_discount_amt)
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query94.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query94.sql
index 76783ba71a6..ad28042276a 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query94.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query94.sql
@@ -1,8 +1,8 @@
 -- start query 1 in stream 0 using template query94.tpl and seed 2031708268
 select  
-   count(distinct ws_order_number) as `order count`
-  ,sum(ws_ext_ship_cost) as `total shipping cost`
-  ,sum(ws_net_profit) as `total net profit`
+   count(distinct ws_order_number) as "order count"
+  ,sum(ws_ext_ship_cost) as "total shipping cost"
+  ,sum(ws_net_profit) as "total net profit"
 from
    web_sales ws1
   ,date_dim
@@ -10,7 +10,7 @@ from
   ,web_site
 where
     d_date between '1999-4-01' and 
-           (cast('1999-4-01' as date) + 60 days)
+           (cast('1999-4-01' as date) + interval 60 days)
 and ws1.ws_ship_date_sk = d_date_sk
 and ws1.ws_ship_addr_sk = ca_address_sk
 and ca_state = 'NE'
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query95.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query95.sql
index e8e9063fbd3..bdc71ee189e 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query95.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query95.sql
@@ -5,9 +5,9 @@ with ws_wh as
  where ws1.ws_order_number = ws2.ws_order_number
    and ws1.ws_warehouse_sk <> ws2.ws_warehouse_sk)
  select  
-   count(distinct ws_order_number) as `order count`
-  ,sum(ws_ext_ship_cost) as `total shipping cost`
-  ,sum(ws_net_profit) as `total net profit`
+   count(distinct ws_order_number) as "order count"
+  ,sum(ws_ext_ship_cost) as "total shipping cost"
+  ,sum(ws_net_profit) as "total net profit"
 from
    web_sales ws1
   ,date_dim
@@ -15,7 +15,7 @@ from
   ,web_site
 where
     d_date between '2002-4-01' and 
-           (cast('2002-4-01' as date) + 60 days)
+           (cast('2002-4-01' as date) + interval 60 days)
 and ws1.ws_ship_date_sk = d_date_sk
 and ws1.ws_ship_addr_sk = ca_address_sk
 and ca_state = 'AL'
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query98.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query98.sql
index e167dd989aa..4a043f67cf5 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query98.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query98.sql
@@ -16,7 +16,7 @@ where
   	and i_category in ('Home', 'Sports', 'Men')
   	and ss_sold_date_sk = d_date_sk
 	and d_date between cast('2002-01-05' as date) 
-				and (cast('2002-01-05' as date) + 30 days)
+				and (cast('2002-01-05' as date) + interval 30 days)
 group by 
 	i_item_id
         ,i_item_desc 
diff --git a/modules/sql-engine/src/testFixtures/resources/tpcds/query99.sql b/modules/sql-engine/src/testFixtures/resources/tpcds/query99.sql
index 0f420a9eba9..95db9ab3e17 100644
--- a/modules/sql-engine/src/testFixtures/resources/tpcds/query99.sql
+++ b/modules/sql-engine/src/testFixtures/resources/tpcds/query99.sql
@@ -3,14 +3,14 @@ select
    substr(w_warehouse_name,1,20)
   ,sm_type
   ,cc_name
-  ,sum(case when (cs_ship_date_sk - cs_sold_date_sk <= 30 ) then 1 else 0 end)  as `30 days` 
+  ,sum(case when (cs_ship_date_sk - cs_sold_date_sk <= 30 ) then 1 else 0 end)  as "30 days"
   ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 30) and 
-                 (cs_ship_date_sk - cs_sold_date_sk <= 60) then 1 else 0 end )  as `31-60 days` 
+                 (cs_ship_date_sk - cs_sold_date_sk <= 60) then 1 else 0 end )  as "31-60 days"
   ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 60) and 
-                 (cs_ship_date_sk - cs_sold_date_sk <= 90) then 1 else 0 end)  as `61-90 days` 
+                 (cs_ship_date_sk - cs_sold_date_sk <= 90) then 1 else 0 end)  as "61-90 days"
   ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 90) and
-                 (cs_ship_date_sk - cs_sold_date_sk <= 120) then 1 else 0 end)  as `91-120 days` 
-  ,sum(case when (cs_ship_date_sk - cs_sold_date_sk  > 120) then 1 else 0 end)  as `>120 days` 
+                 (cs_ship_date_sk - cs_sold_date_sk <= 120) then 1 else 0 end)  as "91-120 days"
+  ,sum(case when (cs_ship_date_sk - cs_sold_date_sk  > 120) then 1 else 0 end)  as ">120 days"
 from
    catalog_sales
   ,warehouse