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

changchen pushed a commit to branch feature/ansi-ci-baseline
in repository https://gitbox.apache.org/repos/asf/gluten.git

commit 89ef1d04cb4f8f937ee26e76cca6e9bdc45dab67
Author: Chang chen <[email protected]>
AuthorDate: Fri Apr 10 12:18:03 2026 +0000

    [GLUTEN-10134][VL] Add ANSI golden files for TPCDS q83 plan stability tests
    
    ANSI mode changes the optimizer's type coercion for q83: `cast(d_date as
    string) IN (...)` becomes `d_date IN (...)`, which also enables predicate
    pushdown. This mirrors Spark's own approvedAnsiPlans mechanism — when ANSI
    is enabled, golden files are read from q83.ansi/ instead of q83/.
    
    Co-Authored-By: Claude Opus 4 <[email protected]>
---
 .../q83.ansi/explain.txt                           | 509 +++++++++++++++++++++
 .../q83.ansi/simplified.txt                        | 101 ++++
 .../q83.sf100.ansi/explain.txt                     | 509 +++++++++++++++++++++
 .../q83.sf100.ansi/simplified.txt                  | 101 ++++
 .../spark/sql/GlutenPlanStabilitySuite.scala       |  13 +-
 .../q83.ansi/explain.txt                           | 509 +++++++++++++++++++++
 .../q83.ansi/simplified.txt                        | 101 ++++
 .../q83.sf100.ansi/explain.txt                     | 509 +++++++++++++++++++++
 .../q83.sf100.ansi/simplified.txt                  | 101 ++++
 .../spark/sql/GlutenPlanStabilitySuite.scala       |  13 +-
 10 files changed, 2464 insertions(+), 2 deletions(-)

diff --git 
a/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
new file mode 100644
index 0000000000..e7c8b9cb95
--- /dev/null
+++ 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
@@ -0,0 +1,509 @@
+== Physical Plan ==
+VeloxColumnarToRow (78)
++- TakeOrderedAndProjectExecTransformer (77)
+   +- ^ ProjectExecTransformer (75)
+      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (74)
+         :- ^ ProjectExecTransformer (49)
+         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (48)
+         :     :- ^ RegularHashAggregateExecTransformer (23)
+         :     :  +- ^ InputIteratorTransformer (22)
+         :     :     +- ColumnarExchange (20)
+         :     :        +- VeloxResizeBatches (19)
+         :     :           +- ^ ProjectExecTransformer (17)
+         :     :              +- ^ FlushableHashAggregateExecTransformer (16)
+         :     :                 +- ^ ProjectExecTransformer (15)
+         :     :                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (14)
+         :     :                       :- ^ ProjectExecTransformer (10)
+         :     :                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (9)
+         :     :                       :     :- ^ FilterExecTransformer (2)
+         :     :                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.store_returns (1)
+         :     :                       :     +- ^ InputIteratorTransformer (8)
+         :     :                       :        +- ColumnarBroadcastExchange 
(6)
+         :     :                       :           +- ^ FilterExecTransformer 
(4)
+         :     :                       :              +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.item (3)
+         :     :                       +- ^ InputIteratorTransformer (13)
+         :     :                          +- ReusedExchange (11)
+         :     +- ^ InputIteratorTransformer (47)
+         :        +- ColumnarBroadcastExchange (45)
+         :           +- ^ RegularHashAggregateExecTransformer (43)
+         :              +- ^ InputIteratorTransformer (42)
+         :                 +- ColumnarExchange (40)
+         :                    +- VeloxResizeBatches (39)
+         :                       +- ^ ProjectExecTransformer (37)
+         :                          +- ^ FlushableHashAggregateExecTransformer 
(36)
+         :                             +- ^ ProjectExecTransformer (35)
+         :                                +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (34)
+         :                                   :- ^ ProjectExecTransformer (30)
+         :                                   :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (29)
+         :                                   :     :- ^ FilterExecTransformer 
(25)
+         :                                   :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.catalog_returns (24)
+         :                                   :     +- ^ 
InputIteratorTransformer (28)
+         :                                   :        +- ReusedExchange (26)
+         :                                   +- ^ InputIteratorTransformer (33)
+         :                                      +- ReusedExchange (31)
+         +- ^ InputIteratorTransformer (73)
+            +- ColumnarBroadcastExchange (71)
+               +- ^ RegularHashAggregateExecTransformer (69)
+                  +- ^ InputIteratorTransformer (68)
+                     +- ColumnarExchange (66)
+                        +- VeloxResizeBatches (65)
+                           +- ^ ProjectExecTransformer (63)
+                              +- ^ FlushableHashAggregateExecTransformer (62)
+                                 +- ^ ProjectExecTransformer (61)
+                                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (60)
+                                       :- ^ ProjectExecTransformer (56)
+                                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (55)
+                                       :     :- ^ FilterExecTransformer (51)
+                                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.web_returns (50)
+                                       :     +- ^ InputIteratorTransformer (54)
+                                       :        +- ReusedExchange (52)
+                                       +- ^ InputIteratorTransformer (59)
+                                          +- ReusedExchange (57)
+
+
+(1) FileSourceScanExecTransformer parquet spark_catalog.default.store_returns
+Output [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(sr_returned_date_sk#3), 
dynamicpruningexpression(sr_returned_date_sk#3 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(sr_item_sk)]
+ReadSchema: struct<sr_item_sk:int,sr_return_quantity:int>
+
+(2) FilterExecTransformer
+Input [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Arguments: isnotnull(sr_item_sk#1)
+
+(3) FileSourceScanExecTransformer parquet spark_catalog.default.item
+Output [2]: [i_item_sk#5, i_item_id#6]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/item]
+PushedFilters: [IsNotNull(i_item_sk), IsNotNull(i_item_id)]
+ReadSchema: struct<i_item_sk:int,i_item_id:string>
+
+(4) FilterExecTransformer
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: (isnotnull(i_item_sk#5) AND isnotnull(i_item_id#6))
+
+(5) WholeStageCodegenTransformer (4)
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: false
+
+(6) ColumnarBroadcastExchange
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as 
bigint)),false), [plan_id=1]
+
+(7) InputAdapter
+Input [2]: [i_item_sk#5, i_item_id#6]
+
+(8) InputIteratorTransformer
+Input [2]: [i_item_sk#5, i_item_id#6]
+
+(9) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_item_sk#1]
+Right keys [1]: [i_item_sk#5]
+Join type: Inner
+Join condition: None
+
+(10) ProjectExecTransformer
+Output [3]: [sr_return_quantity#2, sr_returned_date_sk#3, i_item_id#6]
+Input [5]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3, 
i_item_sk#5, i_item_id#6]
+
+(11) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#7]
+
+(12) InputAdapter
+Input [1]: [d_date_sk#7]
+
+(13) InputIteratorTransformer
+Input [1]: [d_date_sk#7]
+
+(14) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_returned_date_sk#3]
+Right keys [1]: [d_date_sk#7]
+Join type: Inner
+Join condition: None
+
+(15) ProjectExecTransformer
+Output [2]: [sr_return_quantity#2, i_item_id#6]
+Input [4]: [sr_return_quantity#2, sr_returned_date_sk#3, i_item_id#6, 
d_date_sk#7]
+
+(16) FlushableHashAggregateExecTransformer
+Input [2]: [sr_return_quantity#2, i_item_id#6]
+Keys [1]: [i_item_id#6]
+Functions [1]: [partial_sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum#8]
+Results [2]: [i_item_id#6, sum#9]
+
+(17) ProjectExecTransformer
+Output [3]: [hash(i_item_id#6, 42) AS hash_partition_key#10, i_item_id#6, 
sum#9]
+Input [2]: [i_item_id#6, sum#9]
+
+(18) WholeStageCodegenTransformer (8)
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: false
+
+(19) VeloxResizeBatches
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: 1024, 2147483647, 10485760
+
+(20) ColumnarExchange
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: hashpartitioning(i_item_id#6, 1), ENSURE_REQUIREMENTS, 
[i_item_id#6, sum#9], [plan_id=2], [shuffle_writer_type=hash]
+
+(21) InputAdapter
+Input [2]: [i_item_id#6, sum#9]
+
+(22) InputIteratorTransformer
+Input [2]: [i_item_id#6, sum#9]
+
+(23) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#6, sum#9]
+Keys [1]: [i_item_id#6]
+Functions [1]: [sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum(sr_return_quantity#2)#11]
+Results [2]: [i_item_id#6 AS item_id#12, sum(sr_return_quantity#2)#11 AS 
sr_item_qty#13]
+
+(24) FileSourceScanExecTransformer parquet 
spark_catalog.default.catalog_returns
+Output [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(cr_returned_date_sk#16), 
dynamicpruningexpression(cr_returned_date_sk#16 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(cr_item_sk)]
+ReadSchema: struct<cr_item_sk:int,cr_return_quantity:int>
+
+(25) FilterExecTransformer
+Input [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Arguments: isnotnull(cr_item_sk#14)
+
+(26) ReusedExchange [Reuses operator id: 6]
+Output [2]: [i_item_sk#17, i_item_id#18]
+
+(27) InputAdapter
+Input [2]: [i_item_sk#17, i_item_id#18]
+
+(28) InputIteratorTransformer
+Input [2]: [i_item_sk#17, i_item_id#18]
+
+(29) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_item_sk#14]
+Right keys [1]: [i_item_sk#17]
+Join type: Inner
+Join condition: None
+
+(30) ProjectExecTransformer
+Output [3]: [cr_return_quantity#15, cr_returned_date_sk#16, i_item_id#18]
+Input [5]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16, 
i_item_sk#17, i_item_id#18]
+
+(31) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#19]
+
+(32) InputAdapter
+Input [1]: [d_date_sk#19]
+
+(33) InputIteratorTransformer
+Input [1]: [d_date_sk#19]
+
+(34) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_returned_date_sk#16]
+Right keys [1]: [d_date_sk#19]
+Join type: Inner
+Join condition: None
+
+(35) ProjectExecTransformer
+Output [2]: [cr_return_quantity#15, i_item_id#18]
+Input [4]: [cr_return_quantity#15, cr_returned_date_sk#16, i_item_id#18, 
d_date_sk#19]
+
+(36) FlushableHashAggregateExecTransformer
+Input [2]: [cr_return_quantity#15, i_item_id#18]
+Keys [1]: [i_item_id#18]
+Functions [1]: [partial_sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum#20]
+Results [2]: [i_item_id#18, sum#21]
+
+(37) ProjectExecTransformer
+Output [3]: [hash(i_item_id#18, 42) AS hash_partition_key#22, i_item_id#18, 
sum#21]
+Input [2]: [i_item_id#18, sum#21]
+
+(38) WholeStageCodegenTransformer (16)
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: false
+
+(39) VeloxResizeBatches
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: 1024, 2147483647, 10485760
+
+(40) ColumnarExchange
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: hashpartitioning(i_item_id#18, 1), ENSURE_REQUIREMENTS, 
[i_item_id#18, sum#21], [plan_id=3], [shuffle_writer_type=hash]
+
+(41) InputAdapter
+Input [2]: [i_item_id#18, sum#21]
+
+(42) InputIteratorTransformer
+Input [2]: [i_item_id#18, sum#21]
+
+(43) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#18, sum#21]
+Keys [1]: [i_item_id#18]
+Functions [1]: [sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum(cr_return_quantity#15)#23]
+Results [2]: [i_item_id#18 AS item_id#24, sum(cr_return_quantity#15)#23 AS 
cr_item_qty#25]
+
+(44) WholeStageCodegenTransformer (17)
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: false
+
+(45) ColumnarBroadcastExchange
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=4]
+
+(46) InputAdapter
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(47) InputIteratorTransformer
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(48) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#24]
+Join type: Inner
+Join condition: None
+
+(49) ProjectExecTransformer
+Output [3]: [item_id#12, sr_item_qty#13, cr_item_qty#25]
+Input [4]: [item_id#12, sr_item_qty#13, item_id#24, cr_item_qty#25]
+
+(50) FileSourceScanExecTransformer parquet spark_catalog.default.web_returns
+Output [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(wr_returned_date_sk#28), 
dynamicpruningexpression(wr_returned_date_sk#28 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(wr_item_sk)]
+ReadSchema: struct<wr_item_sk:int,wr_return_quantity:int>
+
+(51) FilterExecTransformer
+Input [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Arguments: isnotnull(wr_item_sk#26)
+
+(52) ReusedExchange [Reuses operator id: 6]
+Output [2]: [i_item_sk#29, i_item_id#30]
+
+(53) InputAdapter
+Input [2]: [i_item_sk#29, i_item_id#30]
+
+(54) InputIteratorTransformer
+Input [2]: [i_item_sk#29, i_item_id#30]
+
+(55) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_item_sk#26]
+Right keys [1]: [i_item_sk#29]
+Join type: Inner
+Join condition: None
+
+(56) ProjectExecTransformer
+Output [3]: [wr_return_quantity#27, wr_returned_date_sk#28, i_item_id#30]
+Input [5]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28, 
i_item_sk#29, i_item_id#30]
+
+(57) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#31]
+
+(58) InputAdapter
+Input [1]: [d_date_sk#31]
+
+(59) InputIteratorTransformer
+Input [1]: [d_date_sk#31]
+
+(60) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_returned_date_sk#28]
+Right keys [1]: [d_date_sk#31]
+Join type: Inner
+Join condition: None
+
+(61) ProjectExecTransformer
+Output [2]: [wr_return_quantity#27, i_item_id#30]
+Input [4]: [wr_return_quantity#27, wr_returned_date_sk#28, i_item_id#30, 
d_date_sk#31]
+
+(62) FlushableHashAggregateExecTransformer
+Input [2]: [wr_return_quantity#27, i_item_id#30]
+Keys [1]: [i_item_id#30]
+Functions [1]: [partial_sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum#32]
+Results [2]: [i_item_id#30, sum#33]
+
+(63) ProjectExecTransformer
+Output [3]: [hash(i_item_id#30, 42) AS hash_partition_key#34, i_item_id#30, 
sum#33]
+Input [2]: [i_item_id#30, sum#33]
+
+(64) WholeStageCodegenTransformer (25)
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: false
+
+(65) VeloxResizeBatches
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: 1024, 2147483647, 10485760
+
+(66) ColumnarExchange
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: hashpartitioning(i_item_id#30, 1), ENSURE_REQUIREMENTS, 
[i_item_id#30, sum#33], [plan_id=5], [shuffle_writer_type=hash]
+
+(67) InputAdapter
+Input [2]: [i_item_id#30, sum#33]
+
+(68) InputIteratorTransformer
+Input [2]: [i_item_id#30, sum#33]
+
+(69) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#30, sum#33]
+Keys [1]: [i_item_id#30]
+Functions [1]: [sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum(wr_return_quantity#27)#35]
+Results [2]: [i_item_id#30 AS item_id#36, sum(wr_return_quantity#27)#35 AS 
wr_item_qty#37]
+
+(70) WholeStageCodegenTransformer (26)
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: false
+
+(71) ColumnarBroadcastExchange
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=6]
+
+(72) InputAdapter
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(73) InputIteratorTransformer
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(74) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#36]
+Join type: Inner
+Join condition: None
+
+(75) ProjectExecTransformer
+Output [8]: [item_id#12, sr_item_qty#13, (((cast(sr_item_qty#13 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS sr_dev#38, cr_item_qty#25, (((cast(cr_item_qty#25 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS cr_dev#39, wr_item_qty#37, (((cast(wr_item_qty#37 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS wr_dev#40, (cast(((sr_ [...]
+Input [5]: [item_id#12, sr_item_qty#13, cr_item_qty#25, item_id#36, 
wr_item_qty#37]
+
+(76) WholeStageCodegenTransformer (27)
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: false
+
+(77) TakeOrderedAndProjectExecTransformer
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: 100, [item_id#12 ASC NULLS FIRST, sr_item_qty#13 ASC NULLS FIRST], 
[item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41], 0
+
+(78) VeloxColumnarToRow
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+
+===== Subqueries =====
+
+Subquery:1 Hosting operator id = 1 Hosting Expression = sr_returned_date_sk#3 
IN dynamicpruning#4
+ColumnarBroadcastExchange (98)
++- ^ ProjectExecTransformer (96)
+   +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (95)
+      :- ^ FilterExecTransformer (80)
+      :  +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (79)
+      +- ^ InputIteratorTransformer (94)
+         +- ColumnarBroadcastExchange (92)
+            +- ^ ProjectExecTransformer (90)
+               +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (89)
+                  :- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (81)
+                  +- ^ InputIteratorTransformer (88)
+                     +- ColumnarBroadcastExchange (86)
+                        +- ^ ProjectExecTransformer (84)
+                           +- ^ FilterExecTransformer (83)
+                              +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (82)
+
+
+(79) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date_sk#7, d_date#42]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [IsNotNull(d_date_sk)]
+ReadSchema: struct<d_date_sk:int,d_date:date>
+
+(80) FilterExecTransformer
+Input [2]: [d_date_sk#7, d_date#42]
+Arguments: isnotnull(d_date_sk#7)
+
+(81) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#43, d_week_seq#44]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(82) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#45, d_week_seq#46]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [In(d_date, [2000-06-30,2000-09-27,2000-11-17])]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(83) FilterExecTransformer
+Input [2]: [d_date#45, d_week_seq#46]
+Arguments: d_date#45 IN (2000-06-30,2000-09-27,2000-11-17)
+
+(84) ProjectExecTransformer
+Output [1]: [d_week_seq#46]
+Input [2]: [d_date#45, d_week_seq#46]
+
+(85) WholeStageCodegenTransformer (1)
+Input [1]: [d_week_seq#46]
+Arguments: false
+
+(86) ColumnarBroadcastExchange
+Input [1]: [d_week_seq#46]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=7]
+
+(87) InputAdapter
+Input [1]: [d_week_seq#46]
+
+(88) InputIteratorTransformer
+Input [1]: [d_week_seq#46]
+
+(89) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_week_seq#44]
+Right keys [1]: [d_week_seq#46]
+Join type: LeftSemi
+Join condition: None
+
+(90) ProjectExecTransformer
+Output [1]: [d_date#43]
+Input [2]: [d_date#43, d_week_seq#44]
+
+(91) WholeStageCodegenTransformer (2)
+Input [1]: [d_date#43]
+Arguments: false
+
+(92) ColumnarBroadcastExchange
+Input [1]: [d_date#43]
+Arguments: HashedRelationBroadcastMode(List(input[0, date, true]),false), 
[plan_id=8]
+
+(93) InputAdapter
+Input [1]: [d_date#43]
+
+(94) InputIteratorTransformer
+Input [1]: [d_date#43]
+
+(95) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_date#42]
+Right keys [1]: [d_date#43]
+Join type: LeftSemi
+Join condition: None
+
+(96) ProjectExecTransformer
+Output [1]: [d_date_sk#7]
+Input [2]: [d_date_sk#7, d_date#42]
+
+(97) WholeStageCodegenTransformer (3)
+Input [1]: [d_date_sk#7]
+Arguments: false
+
+(98) ColumnarBroadcastExchange
+Input [1]: [d_date_sk#7]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=9]
+
+Subquery:2 Hosting operator id = 24 Hosting Expression = 
cr_returned_date_sk#16 IN dynamicpruning#4
+
+Subquery:3 Hosting operator id = 50 Hosting Expression = 
wr_returned_date_sk#28 IN dynamicpruning#4
+
+
diff --git 
a/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
new file mode 100644
index 0000000000..64c8b16867
--- /dev/null
+++ 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
@@ -0,0 +1,101 @@
+VeloxColumnarToRow
+  TakeOrderedAndProjectExecTransformer 
[item_id,sr_item_qty,sr_dev,cr_item_qty,cr_dev,wr_item_qty,wr_dev,average]
+    WholeStageCodegenTransformer (27)
+      ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty,wr_item_qty]
+        BroadcastHashJoinExecTransformer [item_id,item_id]
+          ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty]
+            BroadcastHashJoinExecTransformer [item_id,item_id]
+              RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(sr_return_quantity),item_id,sr_item_qty,sum]
+                InputIteratorTransformer
+                  InputAdapter
+                    ColumnarExchange [i_item_id,sum] #1
+                      VeloxResizeBatches
+                        WholeStageCodegenTransformer (8)
+                          ProjectExecTransformer [i_item_id,sum]
+                            FlushableHashAggregateExecTransformer 
[i_item_id,sr_return_quantity] [sum,sum]
+                              ProjectExecTransformer 
[sr_return_quantity,i_item_id]
+                                BroadcastHashJoinExecTransformer 
[sr_returned_date_sk,d_date_sk]
+                                  ProjectExecTransformer 
[sr_return_quantity,sr_returned_date_sk,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[sr_item_sk,i_item_sk]
+                                      FilterExecTransformer [sr_item_sk]
+                                        FileSourceScanExecTransformer parquet 
spark_catalog.default.store_returns 
[sr_item_sk,sr_return_quantity,sr_returned_date_sk]
+                                          ColumnarSubqueryBroadcast 
[d_date_sk] #1
+                                            ColumnarBroadcastExchange #2
+                                              WholeStageCodegenTransformer (3)
+                                                ProjectExecTransformer 
[d_date_sk]
+                                                  
BroadcastHashJoinExecTransformer [d_date,d_date]
+                                                    FilterExecTransformer 
[d_date_sk]
+                                                      
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date_sk,d_date]
+                                                    InputIteratorTransformer
+                                                      InputAdapter
+                                                        
ColumnarBroadcastExchange #3
+                                                          
WholeStageCodegenTransformer (2)
+                                                            
ProjectExecTransformer [d_date]
+                                                              
BroadcastHashJoinExecTransformer [d_week_seq,d_week_seq]
+                                                                
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                                                
InputIteratorTransformer
+                                                                  InputAdapter
+                                                                    
ColumnarBroadcastExchange #4
+                                                                      
WholeStageCodegenTransformer (1)
+                                                                        
ProjectExecTransformer [d_week_seq]
+                                                                          
FilterExecTransformer [d_date]
+                                                                            
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ColumnarBroadcastExchange #5
+                                            WholeStageCodegenTransformer (4)
+                                              FilterExecTransformer 
[i_item_sk,i_item_id]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.item [i_item_sk,i_item_id]
+                                  InputIteratorTransformer
+                                    InputAdapter
+                                      ReusedExchange [d_date_sk] #2
+              InputIteratorTransformer
+                InputAdapter
+                  ColumnarBroadcastExchange #6
+                    WholeStageCodegenTransformer (17)
+                      RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(cr_return_quantity),item_id,cr_item_qty,sum]
+                        InputIteratorTransformer
+                          InputAdapter
+                            ColumnarExchange [i_item_id,sum] #7
+                              VeloxResizeBatches
+                                WholeStageCodegenTransformer (16)
+                                  ProjectExecTransformer [i_item_id,sum]
+                                    FlushableHashAggregateExecTransformer 
[i_item_id,cr_return_quantity] [sum,sum]
+                                      ProjectExecTransformer 
[cr_return_quantity,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[cr_returned_date_sk,d_date_sk]
+                                          ProjectExecTransformer 
[cr_return_quantity,cr_returned_date_sk,i_item_id]
+                                            BroadcastHashJoinExecTransformer 
[cr_item_sk,i_item_sk]
+                                              FilterExecTransformer 
[cr_item_sk]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.catalog_returns 
[cr_item_sk,cr_return_quantity,cr_returned_date_sk]
+                                                  ReusedSubquery [d_date_sk] #1
+                                              InputIteratorTransformer
+                                                InputAdapter
+                                                  ReusedExchange 
[i_item_sk,i_item_id] #5
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange [d_date_sk] #2
+          InputIteratorTransformer
+            InputAdapter
+              ColumnarBroadcastExchange #8
+                WholeStageCodegenTransformer (26)
+                  RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(wr_return_quantity),item_id,wr_item_qty,sum]
+                    InputIteratorTransformer
+                      InputAdapter
+                        ColumnarExchange [i_item_id,sum] #9
+                          VeloxResizeBatches
+                            WholeStageCodegenTransformer (25)
+                              ProjectExecTransformer [i_item_id,sum]
+                                FlushableHashAggregateExecTransformer 
[i_item_id,wr_return_quantity] [sum,sum]
+                                  ProjectExecTransformer 
[wr_return_quantity,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[wr_returned_date_sk,d_date_sk]
+                                      ProjectExecTransformer 
[wr_return_quantity,wr_returned_date_sk,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[wr_item_sk,i_item_sk]
+                                          FilterExecTransformer [wr_item_sk]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.web_returns 
[wr_item_sk,wr_return_quantity,wr_returned_date_sk]
+                                              ReusedSubquery [d_date_sk] #1
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange 
[i_item_sk,i_item_id] #5
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [d_date_sk] #2
diff --git 
a/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
new file mode 100644
index 0000000000..cd2b8440e3
--- /dev/null
+++ 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
@@ -0,0 +1,509 @@
+== Physical Plan ==
+VeloxColumnarToRow (78)
++- TakeOrderedAndProjectExecTransformer (77)
+   +- ^ ProjectExecTransformer (75)
+      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (74)
+         :- ^ ProjectExecTransformer (49)
+         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (48)
+         :     :- ^ RegularHashAggregateExecTransformer (23)
+         :     :  +- ^ InputIteratorTransformer (22)
+         :     :     +- ColumnarExchange (20)
+         :     :        +- VeloxResizeBatches (19)
+         :     :           +- ^ ProjectExecTransformer (17)
+         :     :              +- ^ FlushableHashAggregateExecTransformer (16)
+         :     :                 +- ^ ProjectExecTransformer (15)
+         :     :                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (14)
+         :     :                       :- ^ ProjectExecTransformer (7)
+         :     :                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (6)
+         :     :                       :     :- ^ FilterExecTransformer (2)
+         :     :                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.store_returns (1)
+         :     :                       :     +- ^ InputIteratorTransformer (5)
+         :     :                       :        +- ReusedExchange (3)
+         :     :                       +- ^ InputIteratorTransformer (13)
+         :     :                          +- ColumnarBroadcastExchange (11)
+         :     :                             +- ^ FilterExecTransformer (9)
+         :     :                                +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.item (8)
+         :     +- ^ InputIteratorTransformer (47)
+         :        +- ColumnarBroadcastExchange (45)
+         :           +- ^ RegularHashAggregateExecTransformer (43)
+         :              +- ^ InputIteratorTransformer (42)
+         :                 +- ColumnarExchange (40)
+         :                    +- VeloxResizeBatches (39)
+         :                       +- ^ ProjectExecTransformer (37)
+         :                          +- ^ FlushableHashAggregateExecTransformer 
(36)
+         :                             +- ^ ProjectExecTransformer (35)
+         :                                +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (34)
+         :                                   :- ^ ProjectExecTransformer (30)
+         :                                   :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (29)
+         :                                   :     :- ^ FilterExecTransformer 
(25)
+         :                                   :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.catalog_returns (24)
+         :                                   :     +- ^ 
InputIteratorTransformer (28)
+         :                                   :        +- ReusedExchange (26)
+         :                                   +- ^ InputIteratorTransformer (33)
+         :                                      +- ReusedExchange (31)
+         +- ^ InputIteratorTransformer (73)
+            +- ColumnarBroadcastExchange (71)
+               +- ^ RegularHashAggregateExecTransformer (69)
+                  +- ^ InputIteratorTransformer (68)
+                     +- ColumnarExchange (66)
+                        +- VeloxResizeBatches (65)
+                           +- ^ ProjectExecTransformer (63)
+                              +- ^ FlushableHashAggregateExecTransformer (62)
+                                 +- ^ ProjectExecTransformer (61)
+                                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (60)
+                                       :- ^ ProjectExecTransformer (56)
+                                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (55)
+                                       :     :- ^ FilterExecTransformer (51)
+                                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.web_returns (50)
+                                       :     +- ^ InputIteratorTransformer (54)
+                                       :        +- ReusedExchange (52)
+                                       +- ^ InputIteratorTransformer (59)
+                                          +- ReusedExchange (57)
+
+
+(1) FileSourceScanExecTransformer parquet spark_catalog.default.store_returns
+Output [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(sr_returned_date_sk#3), 
dynamicpruningexpression(sr_returned_date_sk#3 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(sr_item_sk)]
+ReadSchema: struct<sr_item_sk:int,sr_return_quantity:int>
+
+(2) FilterExecTransformer
+Input [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Arguments: isnotnull(sr_item_sk#1)
+
+(3) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#5]
+
+(4) InputAdapter
+Input [1]: [d_date_sk#5]
+
+(5) InputIteratorTransformer
+Input [1]: [d_date_sk#5]
+
+(6) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_returned_date_sk#3]
+Right keys [1]: [d_date_sk#5]
+Join type: Inner
+Join condition: None
+
+(7) ProjectExecTransformer
+Output [2]: [sr_item_sk#1, sr_return_quantity#2]
+Input [4]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3, 
d_date_sk#5]
+
+(8) FileSourceScanExecTransformer parquet spark_catalog.default.item
+Output [2]: [i_item_sk#6, i_item_id#7]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/item]
+PushedFilters: [IsNotNull(i_item_sk), IsNotNull(i_item_id)]
+ReadSchema: struct<i_item_sk:int,i_item_id:string>
+
+(9) FilterExecTransformer
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: (isnotnull(i_item_sk#6) AND isnotnull(i_item_id#7))
+
+(10) WholeStageCodegenTransformer (7)
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: false
+
+(11) ColumnarBroadcastExchange
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as 
bigint)),false), [plan_id=1]
+
+(12) InputAdapter
+Input [2]: [i_item_sk#6, i_item_id#7]
+
+(13) InputIteratorTransformer
+Input [2]: [i_item_sk#6, i_item_id#7]
+
+(14) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_item_sk#1]
+Right keys [1]: [i_item_sk#6]
+Join type: Inner
+Join condition: None
+
+(15) ProjectExecTransformer
+Output [2]: [sr_return_quantity#2, i_item_id#7]
+Input [4]: [sr_item_sk#1, sr_return_quantity#2, i_item_sk#6, i_item_id#7]
+
+(16) FlushableHashAggregateExecTransformer
+Input [2]: [sr_return_quantity#2, i_item_id#7]
+Keys [1]: [i_item_id#7]
+Functions [1]: [partial_sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum#8]
+Results [2]: [i_item_id#7, sum#9]
+
+(17) ProjectExecTransformer
+Output [3]: [hash(i_item_id#7, 42) AS hash_partition_key#10, i_item_id#7, 
sum#9]
+Input [2]: [i_item_id#7, sum#9]
+
+(18) WholeStageCodegenTransformer (8)
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: false
+
+(19) VeloxResizeBatches
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: 1024, 2147483647, 10485760
+
+(20) ColumnarExchange
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: hashpartitioning(i_item_id#7, 1), ENSURE_REQUIREMENTS, 
[i_item_id#7, sum#9], [plan_id=2], [shuffle_writer_type=hash]
+
+(21) InputAdapter
+Input [2]: [i_item_id#7, sum#9]
+
+(22) InputIteratorTransformer
+Input [2]: [i_item_id#7, sum#9]
+
+(23) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#7, sum#9]
+Keys [1]: [i_item_id#7]
+Functions [1]: [sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum(sr_return_quantity#2)#11]
+Results [2]: [i_item_id#7 AS item_id#12, sum(sr_return_quantity#2)#11 AS 
sr_item_qty#13]
+
+(24) FileSourceScanExecTransformer parquet 
spark_catalog.default.catalog_returns
+Output [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(cr_returned_date_sk#16), 
dynamicpruningexpression(cr_returned_date_sk#16 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(cr_item_sk)]
+ReadSchema: struct<cr_item_sk:int,cr_return_quantity:int>
+
+(25) FilterExecTransformer
+Input [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Arguments: isnotnull(cr_item_sk#14)
+
+(26) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#17]
+
+(27) InputAdapter
+Input [1]: [d_date_sk#17]
+
+(28) InputIteratorTransformer
+Input [1]: [d_date_sk#17]
+
+(29) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_returned_date_sk#16]
+Right keys [1]: [d_date_sk#17]
+Join type: Inner
+Join condition: None
+
+(30) ProjectExecTransformer
+Output [2]: [cr_item_sk#14, cr_return_quantity#15]
+Input [4]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16, 
d_date_sk#17]
+
+(31) ReusedExchange [Reuses operator id: 11]
+Output [2]: [i_item_sk#18, i_item_id#19]
+
+(32) InputAdapter
+Input [2]: [i_item_sk#18, i_item_id#19]
+
+(33) InputIteratorTransformer
+Input [2]: [i_item_sk#18, i_item_id#19]
+
+(34) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_item_sk#14]
+Right keys [1]: [i_item_sk#18]
+Join type: Inner
+Join condition: None
+
+(35) ProjectExecTransformer
+Output [2]: [cr_return_quantity#15, i_item_id#19]
+Input [4]: [cr_item_sk#14, cr_return_quantity#15, i_item_sk#18, i_item_id#19]
+
+(36) FlushableHashAggregateExecTransformer
+Input [2]: [cr_return_quantity#15, i_item_id#19]
+Keys [1]: [i_item_id#19]
+Functions [1]: [partial_sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum#20]
+Results [2]: [i_item_id#19, sum#21]
+
+(37) ProjectExecTransformer
+Output [3]: [hash(i_item_id#19, 42) AS hash_partition_key#22, i_item_id#19, 
sum#21]
+Input [2]: [i_item_id#19, sum#21]
+
+(38) WholeStageCodegenTransformer (16)
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: false
+
+(39) VeloxResizeBatches
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: 1024, 2147483647, 10485760
+
+(40) ColumnarExchange
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: hashpartitioning(i_item_id#19, 1), ENSURE_REQUIREMENTS, 
[i_item_id#19, sum#21], [plan_id=3], [shuffle_writer_type=hash]
+
+(41) InputAdapter
+Input [2]: [i_item_id#19, sum#21]
+
+(42) InputIteratorTransformer
+Input [2]: [i_item_id#19, sum#21]
+
+(43) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#19, sum#21]
+Keys [1]: [i_item_id#19]
+Functions [1]: [sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum(cr_return_quantity#15)#23]
+Results [2]: [i_item_id#19 AS item_id#24, sum(cr_return_quantity#15)#23 AS 
cr_item_qty#25]
+
+(44) WholeStageCodegenTransformer (17)
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: false
+
+(45) ColumnarBroadcastExchange
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=4]
+
+(46) InputAdapter
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(47) InputIteratorTransformer
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(48) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#24]
+Join type: Inner
+Join condition: None
+
+(49) ProjectExecTransformer
+Output [3]: [item_id#12, sr_item_qty#13, cr_item_qty#25]
+Input [4]: [item_id#12, sr_item_qty#13, item_id#24, cr_item_qty#25]
+
+(50) FileSourceScanExecTransformer parquet spark_catalog.default.web_returns
+Output [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(wr_returned_date_sk#28), 
dynamicpruningexpression(wr_returned_date_sk#28 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(wr_item_sk)]
+ReadSchema: struct<wr_item_sk:int,wr_return_quantity:int>
+
+(51) FilterExecTransformer
+Input [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Arguments: isnotnull(wr_item_sk#26)
+
+(52) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#29]
+
+(53) InputAdapter
+Input [1]: [d_date_sk#29]
+
+(54) InputIteratorTransformer
+Input [1]: [d_date_sk#29]
+
+(55) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_returned_date_sk#28]
+Right keys [1]: [d_date_sk#29]
+Join type: Inner
+Join condition: None
+
+(56) ProjectExecTransformer
+Output [2]: [wr_item_sk#26, wr_return_quantity#27]
+Input [4]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28, 
d_date_sk#29]
+
+(57) ReusedExchange [Reuses operator id: 11]
+Output [2]: [i_item_sk#30, i_item_id#31]
+
+(58) InputAdapter
+Input [2]: [i_item_sk#30, i_item_id#31]
+
+(59) InputIteratorTransformer
+Input [2]: [i_item_sk#30, i_item_id#31]
+
+(60) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_item_sk#26]
+Right keys [1]: [i_item_sk#30]
+Join type: Inner
+Join condition: None
+
+(61) ProjectExecTransformer
+Output [2]: [wr_return_quantity#27, i_item_id#31]
+Input [4]: [wr_item_sk#26, wr_return_quantity#27, i_item_sk#30, i_item_id#31]
+
+(62) FlushableHashAggregateExecTransformer
+Input [2]: [wr_return_quantity#27, i_item_id#31]
+Keys [1]: [i_item_id#31]
+Functions [1]: [partial_sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum#32]
+Results [2]: [i_item_id#31, sum#33]
+
+(63) ProjectExecTransformer
+Output [3]: [hash(i_item_id#31, 42) AS hash_partition_key#34, i_item_id#31, 
sum#33]
+Input [2]: [i_item_id#31, sum#33]
+
+(64) WholeStageCodegenTransformer (25)
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: false
+
+(65) VeloxResizeBatches
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: 1024, 2147483647, 10485760
+
+(66) ColumnarExchange
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: hashpartitioning(i_item_id#31, 1), ENSURE_REQUIREMENTS, 
[i_item_id#31, sum#33], [plan_id=5], [shuffle_writer_type=hash]
+
+(67) InputAdapter
+Input [2]: [i_item_id#31, sum#33]
+
+(68) InputIteratorTransformer
+Input [2]: [i_item_id#31, sum#33]
+
+(69) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#31, sum#33]
+Keys [1]: [i_item_id#31]
+Functions [1]: [sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum(wr_return_quantity#27)#35]
+Results [2]: [i_item_id#31 AS item_id#36, sum(wr_return_quantity#27)#35 AS 
wr_item_qty#37]
+
+(70) WholeStageCodegenTransformer (26)
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: false
+
+(71) ColumnarBroadcastExchange
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=6]
+
+(72) InputAdapter
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(73) InputIteratorTransformer
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(74) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#36]
+Join type: Inner
+Join condition: None
+
+(75) ProjectExecTransformer
+Output [8]: [item_id#12, sr_item_qty#13, (((cast(sr_item_qty#13 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS sr_dev#38, cr_item_qty#25, (((cast(cr_item_qty#25 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS cr_dev#39, wr_item_qty#37, (((cast(wr_item_qty#37 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS wr_dev#40, (cast(((sr_ [...]
+Input [5]: [item_id#12, sr_item_qty#13, cr_item_qty#25, item_id#36, 
wr_item_qty#37]
+
+(76) WholeStageCodegenTransformer (27)
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: false
+
+(77) TakeOrderedAndProjectExecTransformer
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: 100, [item_id#12 ASC NULLS FIRST, sr_item_qty#13 ASC NULLS FIRST], 
[item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41], 0
+
+(78) VeloxColumnarToRow
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+
+===== Subqueries =====
+
+Subquery:1 Hosting operator id = 1 Hosting Expression = sr_returned_date_sk#3 
IN dynamicpruning#4
+ColumnarBroadcastExchange (98)
++- ^ ProjectExecTransformer (96)
+   +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (95)
+      :- ^ FilterExecTransformer (80)
+      :  +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (79)
+      +- ^ InputIteratorTransformer (94)
+         +- ColumnarBroadcastExchange (92)
+            +- ^ ProjectExecTransformer (90)
+               +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (89)
+                  :- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (81)
+                  +- ^ InputIteratorTransformer (88)
+                     +- ColumnarBroadcastExchange (86)
+                        +- ^ ProjectExecTransformer (84)
+                           +- ^ FilterExecTransformer (83)
+                              +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (82)
+
+
+(79) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date_sk#5, d_date#42]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [IsNotNull(d_date_sk)]
+ReadSchema: struct<d_date_sk:int,d_date:date>
+
+(80) FilterExecTransformer
+Input [2]: [d_date_sk#5, d_date#42]
+Arguments: isnotnull(d_date_sk#5)
+
+(81) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#43, d_week_seq#44]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(82) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#45, d_week_seq#46]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [In(d_date, [2000-06-30,2000-09-27,2000-11-17])]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(83) FilterExecTransformer
+Input [2]: [d_date#45, d_week_seq#46]
+Arguments: d_date#45 IN (2000-06-30,2000-09-27,2000-11-17)
+
+(84) ProjectExecTransformer
+Output [1]: [d_week_seq#46]
+Input [2]: [d_date#45, d_week_seq#46]
+
+(85) WholeStageCodegenTransformer (1)
+Input [1]: [d_week_seq#46]
+Arguments: false
+
+(86) ColumnarBroadcastExchange
+Input [1]: [d_week_seq#46]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=7]
+
+(87) InputAdapter
+Input [1]: [d_week_seq#46]
+
+(88) InputIteratorTransformer
+Input [1]: [d_week_seq#46]
+
+(89) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_week_seq#44]
+Right keys [1]: [d_week_seq#46]
+Join type: LeftSemi
+Join condition: None
+
+(90) ProjectExecTransformer
+Output [1]: [d_date#43]
+Input [2]: [d_date#43, d_week_seq#44]
+
+(91) WholeStageCodegenTransformer (2)
+Input [1]: [d_date#43]
+Arguments: false
+
+(92) ColumnarBroadcastExchange
+Input [1]: [d_date#43]
+Arguments: HashedRelationBroadcastMode(List(input[0, date, true]),false), 
[plan_id=8]
+
+(93) InputAdapter
+Input [1]: [d_date#43]
+
+(94) InputIteratorTransformer
+Input [1]: [d_date#43]
+
+(95) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_date#42]
+Right keys [1]: [d_date#43]
+Join type: LeftSemi
+Join condition: None
+
+(96) ProjectExecTransformer
+Output [1]: [d_date_sk#5]
+Input [2]: [d_date_sk#5, d_date#42]
+
+(97) WholeStageCodegenTransformer (3)
+Input [1]: [d_date_sk#5]
+Arguments: false
+
+(98) ColumnarBroadcastExchange
+Input [1]: [d_date_sk#5]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=9]
+
+Subquery:2 Hosting operator id = 24 Hosting Expression = 
cr_returned_date_sk#16 IN dynamicpruning#4
+
+Subquery:3 Hosting operator id = 50 Hosting Expression = 
wr_returned_date_sk#28 IN dynamicpruning#4
+
+
diff --git 
a/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
new file mode 100644
index 0000000000..f38594bbd1
--- /dev/null
+++ 
b/gluten-ut/spark40/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
@@ -0,0 +1,101 @@
+VeloxColumnarToRow
+  TakeOrderedAndProjectExecTransformer 
[item_id,sr_item_qty,sr_dev,cr_item_qty,cr_dev,wr_item_qty,wr_dev,average]
+    WholeStageCodegenTransformer (27)
+      ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty,wr_item_qty]
+        BroadcastHashJoinExecTransformer [item_id,item_id]
+          ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty]
+            BroadcastHashJoinExecTransformer [item_id,item_id]
+              RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(sr_return_quantity),item_id,sr_item_qty,sum]
+                InputIteratorTransformer
+                  InputAdapter
+                    ColumnarExchange [i_item_id,sum] #1
+                      VeloxResizeBatches
+                        WholeStageCodegenTransformer (8)
+                          ProjectExecTransformer [i_item_id,sum]
+                            FlushableHashAggregateExecTransformer 
[i_item_id,sr_return_quantity] [sum,sum]
+                              ProjectExecTransformer 
[sr_return_quantity,i_item_id]
+                                BroadcastHashJoinExecTransformer 
[sr_item_sk,i_item_sk]
+                                  ProjectExecTransformer 
[sr_item_sk,sr_return_quantity]
+                                    BroadcastHashJoinExecTransformer 
[sr_returned_date_sk,d_date_sk]
+                                      FilterExecTransformer [sr_item_sk]
+                                        FileSourceScanExecTransformer parquet 
spark_catalog.default.store_returns 
[sr_item_sk,sr_return_quantity,sr_returned_date_sk]
+                                          ColumnarSubqueryBroadcast 
[d_date_sk] #1
+                                            ColumnarBroadcastExchange #2
+                                              WholeStageCodegenTransformer (3)
+                                                ProjectExecTransformer 
[d_date_sk]
+                                                  
BroadcastHashJoinExecTransformer [d_date,d_date]
+                                                    FilterExecTransformer 
[d_date_sk]
+                                                      
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date_sk,d_date]
+                                                    InputIteratorTransformer
+                                                      InputAdapter
+                                                        
ColumnarBroadcastExchange #3
+                                                          
WholeStageCodegenTransformer (2)
+                                                            
ProjectExecTransformer [d_date]
+                                                              
BroadcastHashJoinExecTransformer [d_week_seq,d_week_seq]
+                                                                
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                                                
InputIteratorTransformer
+                                                                  InputAdapter
+                                                                    
ColumnarBroadcastExchange #4
+                                                                      
WholeStageCodegenTransformer (1)
+                                                                        
ProjectExecTransformer [d_week_seq]
+                                                                          
FilterExecTransformer [d_date]
+                                                                            
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [d_date_sk] #2
+                                  InputIteratorTransformer
+                                    InputAdapter
+                                      ColumnarBroadcastExchange #5
+                                        WholeStageCodegenTransformer (7)
+                                          FilterExecTransformer 
[i_item_sk,i_item_id]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.item [i_item_sk,i_item_id]
+              InputIteratorTransformer
+                InputAdapter
+                  ColumnarBroadcastExchange #6
+                    WholeStageCodegenTransformer (17)
+                      RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(cr_return_quantity),item_id,cr_item_qty,sum]
+                        InputIteratorTransformer
+                          InputAdapter
+                            ColumnarExchange [i_item_id,sum] #7
+                              VeloxResizeBatches
+                                WholeStageCodegenTransformer (16)
+                                  ProjectExecTransformer [i_item_id,sum]
+                                    FlushableHashAggregateExecTransformer 
[i_item_id,cr_return_quantity] [sum,sum]
+                                      ProjectExecTransformer 
[cr_return_quantity,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[cr_item_sk,i_item_sk]
+                                          ProjectExecTransformer 
[cr_item_sk,cr_return_quantity]
+                                            BroadcastHashJoinExecTransformer 
[cr_returned_date_sk,d_date_sk]
+                                              FilterExecTransformer 
[cr_item_sk]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.catalog_returns 
[cr_item_sk,cr_return_quantity,cr_returned_date_sk]
+                                                  ReusedSubquery [d_date_sk] #1
+                                              InputIteratorTransformer
+                                                InputAdapter
+                                                  ReusedExchange [d_date_sk] #2
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange 
[i_item_sk,i_item_id] #5
+          InputIteratorTransformer
+            InputAdapter
+              ColumnarBroadcastExchange #8
+                WholeStageCodegenTransformer (26)
+                  RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(wr_return_quantity),item_id,wr_item_qty,sum]
+                    InputIteratorTransformer
+                      InputAdapter
+                        ColumnarExchange [i_item_id,sum] #9
+                          VeloxResizeBatches
+                            WholeStageCodegenTransformer (25)
+                              ProjectExecTransformer [i_item_id,sum]
+                                FlushableHashAggregateExecTransformer 
[i_item_id,wr_return_quantity] [sum,sum]
+                                  ProjectExecTransformer 
[wr_return_quantity,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[wr_item_sk,i_item_sk]
+                                      ProjectExecTransformer 
[wr_item_sk,wr_return_quantity]
+                                        BroadcastHashJoinExecTransformer 
[wr_returned_date_sk,d_date_sk]
+                                          FilterExecTransformer [wr_item_sk]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.web_returns 
[wr_item_sk,wr_return_quantity,wr_returned_date_sk]
+                                              ReusedSubquery [d_date_sk] #1
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange [d_date_sk] #2
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [i_item_sk,i_item_id] 
#5
diff --git 
a/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
 
b/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
index ee8ef27c22..d46efc92a0 100644
--- 
a/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
+++ 
b/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
@@ -111,8 +111,19 @@ trait GlutenPlanStabilityTestTrait {
     new File(backendDir, glutenParts.mkString(File.separator)).getAbsolutePath
   }
 
+  // Queries whose plans differ under ANSI mode (mirroring Spark's 
approvedAnsiPlans).
+  private val approvedAnsiPlans: Seq[String] = Seq(
+    "q83",
+    "q83.sf100"
+  )
+
   private def glutenGetDirForTest(name: String): File = {
-    new File(glutenGoldenFilePath, name)
+    val dirName = if (SQLConf.get.ansiEnabled && 
approvedAnsiPlans.contains(name)) {
+      name + ".ansi"
+    } else {
+      name
+    }
+    new File(glutenGoldenFilePath, dirName)
   }
 
   private def glutenIsApproved(
diff --git 
a/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
new file mode 100644
index 0000000000..e7c8b9cb95
--- /dev/null
+++ 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/explain.txt
@@ -0,0 +1,509 @@
+== Physical Plan ==
+VeloxColumnarToRow (78)
++- TakeOrderedAndProjectExecTransformer (77)
+   +- ^ ProjectExecTransformer (75)
+      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (74)
+         :- ^ ProjectExecTransformer (49)
+         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (48)
+         :     :- ^ RegularHashAggregateExecTransformer (23)
+         :     :  +- ^ InputIteratorTransformer (22)
+         :     :     +- ColumnarExchange (20)
+         :     :        +- VeloxResizeBatches (19)
+         :     :           +- ^ ProjectExecTransformer (17)
+         :     :              +- ^ FlushableHashAggregateExecTransformer (16)
+         :     :                 +- ^ ProjectExecTransformer (15)
+         :     :                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (14)
+         :     :                       :- ^ ProjectExecTransformer (10)
+         :     :                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (9)
+         :     :                       :     :- ^ FilterExecTransformer (2)
+         :     :                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.store_returns (1)
+         :     :                       :     +- ^ InputIteratorTransformer (8)
+         :     :                       :        +- ColumnarBroadcastExchange 
(6)
+         :     :                       :           +- ^ FilterExecTransformer 
(4)
+         :     :                       :              +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.item (3)
+         :     :                       +- ^ InputIteratorTransformer (13)
+         :     :                          +- ReusedExchange (11)
+         :     +- ^ InputIteratorTransformer (47)
+         :        +- ColumnarBroadcastExchange (45)
+         :           +- ^ RegularHashAggregateExecTransformer (43)
+         :              +- ^ InputIteratorTransformer (42)
+         :                 +- ColumnarExchange (40)
+         :                    +- VeloxResizeBatches (39)
+         :                       +- ^ ProjectExecTransformer (37)
+         :                          +- ^ FlushableHashAggregateExecTransformer 
(36)
+         :                             +- ^ ProjectExecTransformer (35)
+         :                                +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (34)
+         :                                   :- ^ ProjectExecTransformer (30)
+         :                                   :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (29)
+         :                                   :     :- ^ FilterExecTransformer 
(25)
+         :                                   :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.catalog_returns (24)
+         :                                   :     +- ^ 
InputIteratorTransformer (28)
+         :                                   :        +- ReusedExchange (26)
+         :                                   +- ^ InputIteratorTransformer (33)
+         :                                      +- ReusedExchange (31)
+         +- ^ InputIteratorTransformer (73)
+            +- ColumnarBroadcastExchange (71)
+               +- ^ RegularHashAggregateExecTransformer (69)
+                  +- ^ InputIteratorTransformer (68)
+                     +- ColumnarExchange (66)
+                        +- VeloxResizeBatches (65)
+                           +- ^ ProjectExecTransformer (63)
+                              +- ^ FlushableHashAggregateExecTransformer (62)
+                                 +- ^ ProjectExecTransformer (61)
+                                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (60)
+                                       :- ^ ProjectExecTransformer (56)
+                                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (55)
+                                       :     :- ^ FilterExecTransformer (51)
+                                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.web_returns (50)
+                                       :     +- ^ InputIteratorTransformer (54)
+                                       :        +- ReusedExchange (52)
+                                       +- ^ InputIteratorTransformer (59)
+                                          +- ReusedExchange (57)
+
+
+(1) FileSourceScanExecTransformer parquet spark_catalog.default.store_returns
+Output [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(sr_returned_date_sk#3), 
dynamicpruningexpression(sr_returned_date_sk#3 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(sr_item_sk)]
+ReadSchema: struct<sr_item_sk:int,sr_return_quantity:int>
+
+(2) FilterExecTransformer
+Input [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Arguments: isnotnull(sr_item_sk#1)
+
+(3) FileSourceScanExecTransformer parquet spark_catalog.default.item
+Output [2]: [i_item_sk#5, i_item_id#6]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/item]
+PushedFilters: [IsNotNull(i_item_sk), IsNotNull(i_item_id)]
+ReadSchema: struct<i_item_sk:int,i_item_id:string>
+
+(4) FilterExecTransformer
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: (isnotnull(i_item_sk#5) AND isnotnull(i_item_id#6))
+
+(5) WholeStageCodegenTransformer (4)
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: false
+
+(6) ColumnarBroadcastExchange
+Input [2]: [i_item_sk#5, i_item_id#6]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as 
bigint)),false), [plan_id=1]
+
+(7) InputAdapter
+Input [2]: [i_item_sk#5, i_item_id#6]
+
+(8) InputIteratorTransformer
+Input [2]: [i_item_sk#5, i_item_id#6]
+
+(9) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_item_sk#1]
+Right keys [1]: [i_item_sk#5]
+Join type: Inner
+Join condition: None
+
+(10) ProjectExecTransformer
+Output [3]: [sr_return_quantity#2, sr_returned_date_sk#3, i_item_id#6]
+Input [5]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3, 
i_item_sk#5, i_item_id#6]
+
+(11) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#7]
+
+(12) InputAdapter
+Input [1]: [d_date_sk#7]
+
+(13) InputIteratorTransformer
+Input [1]: [d_date_sk#7]
+
+(14) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_returned_date_sk#3]
+Right keys [1]: [d_date_sk#7]
+Join type: Inner
+Join condition: None
+
+(15) ProjectExecTransformer
+Output [2]: [sr_return_quantity#2, i_item_id#6]
+Input [4]: [sr_return_quantity#2, sr_returned_date_sk#3, i_item_id#6, 
d_date_sk#7]
+
+(16) FlushableHashAggregateExecTransformer
+Input [2]: [sr_return_quantity#2, i_item_id#6]
+Keys [1]: [i_item_id#6]
+Functions [1]: [partial_sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum#8]
+Results [2]: [i_item_id#6, sum#9]
+
+(17) ProjectExecTransformer
+Output [3]: [hash(i_item_id#6, 42) AS hash_partition_key#10, i_item_id#6, 
sum#9]
+Input [2]: [i_item_id#6, sum#9]
+
+(18) WholeStageCodegenTransformer (8)
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: false
+
+(19) VeloxResizeBatches
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: 1024, 2147483647, 10485760
+
+(20) ColumnarExchange
+Input [3]: [hash_partition_key#10, i_item_id#6, sum#9]
+Arguments: hashpartitioning(i_item_id#6, 1), ENSURE_REQUIREMENTS, 
[i_item_id#6, sum#9], [plan_id=2], [shuffle_writer_type=hash]
+
+(21) InputAdapter
+Input [2]: [i_item_id#6, sum#9]
+
+(22) InputIteratorTransformer
+Input [2]: [i_item_id#6, sum#9]
+
+(23) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#6, sum#9]
+Keys [1]: [i_item_id#6]
+Functions [1]: [sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum(sr_return_quantity#2)#11]
+Results [2]: [i_item_id#6 AS item_id#12, sum(sr_return_quantity#2)#11 AS 
sr_item_qty#13]
+
+(24) FileSourceScanExecTransformer parquet 
spark_catalog.default.catalog_returns
+Output [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(cr_returned_date_sk#16), 
dynamicpruningexpression(cr_returned_date_sk#16 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(cr_item_sk)]
+ReadSchema: struct<cr_item_sk:int,cr_return_quantity:int>
+
+(25) FilterExecTransformer
+Input [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Arguments: isnotnull(cr_item_sk#14)
+
+(26) ReusedExchange [Reuses operator id: 6]
+Output [2]: [i_item_sk#17, i_item_id#18]
+
+(27) InputAdapter
+Input [2]: [i_item_sk#17, i_item_id#18]
+
+(28) InputIteratorTransformer
+Input [2]: [i_item_sk#17, i_item_id#18]
+
+(29) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_item_sk#14]
+Right keys [1]: [i_item_sk#17]
+Join type: Inner
+Join condition: None
+
+(30) ProjectExecTransformer
+Output [3]: [cr_return_quantity#15, cr_returned_date_sk#16, i_item_id#18]
+Input [5]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16, 
i_item_sk#17, i_item_id#18]
+
+(31) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#19]
+
+(32) InputAdapter
+Input [1]: [d_date_sk#19]
+
+(33) InputIteratorTransformer
+Input [1]: [d_date_sk#19]
+
+(34) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_returned_date_sk#16]
+Right keys [1]: [d_date_sk#19]
+Join type: Inner
+Join condition: None
+
+(35) ProjectExecTransformer
+Output [2]: [cr_return_quantity#15, i_item_id#18]
+Input [4]: [cr_return_quantity#15, cr_returned_date_sk#16, i_item_id#18, 
d_date_sk#19]
+
+(36) FlushableHashAggregateExecTransformer
+Input [2]: [cr_return_quantity#15, i_item_id#18]
+Keys [1]: [i_item_id#18]
+Functions [1]: [partial_sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum#20]
+Results [2]: [i_item_id#18, sum#21]
+
+(37) ProjectExecTransformer
+Output [3]: [hash(i_item_id#18, 42) AS hash_partition_key#22, i_item_id#18, 
sum#21]
+Input [2]: [i_item_id#18, sum#21]
+
+(38) WholeStageCodegenTransformer (16)
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: false
+
+(39) VeloxResizeBatches
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: 1024, 2147483647, 10485760
+
+(40) ColumnarExchange
+Input [3]: [hash_partition_key#22, i_item_id#18, sum#21]
+Arguments: hashpartitioning(i_item_id#18, 1), ENSURE_REQUIREMENTS, 
[i_item_id#18, sum#21], [plan_id=3], [shuffle_writer_type=hash]
+
+(41) InputAdapter
+Input [2]: [i_item_id#18, sum#21]
+
+(42) InputIteratorTransformer
+Input [2]: [i_item_id#18, sum#21]
+
+(43) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#18, sum#21]
+Keys [1]: [i_item_id#18]
+Functions [1]: [sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum(cr_return_quantity#15)#23]
+Results [2]: [i_item_id#18 AS item_id#24, sum(cr_return_quantity#15)#23 AS 
cr_item_qty#25]
+
+(44) WholeStageCodegenTransformer (17)
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: false
+
+(45) ColumnarBroadcastExchange
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=4]
+
+(46) InputAdapter
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(47) InputIteratorTransformer
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(48) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#24]
+Join type: Inner
+Join condition: None
+
+(49) ProjectExecTransformer
+Output [3]: [item_id#12, sr_item_qty#13, cr_item_qty#25]
+Input [4]: [item_id#12, sr_item_qty#13, item_id#24, cr_item_qty#25]
+
+(50) FileSourceScanExecTransformer parquet spark_catalog.default.web_returns
+Output [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(wr_returned_date_sk#28), 
dynamicpruningexpression(wr_returned_date_sk#28 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(wr_item_sk)]
+ReadSchema: struct<wr_item_sk:int,wr_return_quantity:int>
+
+(51) FilterExecTransformer
+Input [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Arguments: isnotnull(wr_item_sk#26)
+
+(52) ReusedExchange [Reuses operator id: 6]
+Output [2]: [i_item_sk#29, i_item_id#30]
+
+(53) InputAdapter
+Input [2]: [i_item_sk#29, i_item_id#30]
+
+(54) InputIteratorTransformer
+Input [2]: [i_item_sk#29, i_item_id#30]
+
+(55) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_item_sk#26]
+Right keys [1]: [i_item_sk#29]
+Join type: Inner
+Join condition: None
+
+(56) ProjectExecTransformer
+Output [3]: [wr_return_quantity#27, wr_returned_date_sk#28, i_item_id#30]
+Input [5]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28, 
i_item_sk#29, i_item_id#30]
+
+(57) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#31]
+
+(58) InputAdapter
+Input [1]: [d_date_sk#31]
+
+(59) InputIteratorTransformer
+Input [1]: [d_date_sk#31]
+
+(60) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_returned_date_sk#28]
+Right keys [1]: [d_date_sk#31]
+Join type: Inner
+Join condition: None
+
+(61) ProjectExecTransformer
+Output [2]: [wr_return_quantity#27, i_item_id#30]
+Input [4]: [wr_return_quantity#27, wr_returned_date_sk#28, i_item_id#30, 
d_date_sk#31]
+
+(62) FlushableHashAggregateExecTransformer
+Input [2]: [wr_return_quantity#27, i_item_id#30]
+Keys [1]: [i_item_id#30]
+Functions [1]: [partial_sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum#32]
+Results [2]: [i_item_id#30, sum#33]
+
+(63) ProjectExecTransformer
+Output [3]: [hash(i_item_id#30, 42) AS hash_partition_key#34, i_item_id#30, 
sum#33]
+Input [2]: [i_item_id#30, sum#33]
+
+(64) WholeStageCodegenTransformer (25)
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: false
+
+(65) VeloxResizeBatches
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: 1024, 2147483647, 10485760
+
+(66) ColumnarExchange
+Input [3]: [hash_partition_key#34, i_item_id#30, sum#33]
+Arguments: hashpartitioning(i_item_id#30, 1), ENSURE_REQUIREMENTS, 
[i_item_id#30, sum#33], [plan_id=5], [shuffle_writer_type=hash]
+
+(67) InputAdapter
+Input [2]: [i_item_id#30, sum#33]
+
+(68) InputIteratorTransformer
+Input [2]: [i_item_id#30, sum#33]
+
+(69) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#30, sum#33]
+Keys [1]: [i_item_id#30]
+Functions [1]: [sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum(wr_return_quantity#27)#35]
+Results [2]: [i_item_id#30 AS item_id#36, sum(wr_return_quantity#27)#35 AS 
wr_item_qty#37]
+
+(70) WholeStageCodegenTransformer (26)
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: false
+
+(71) ColumnarBroadcastExchange
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=6]
+
+(72) InputAdapter
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(73) InputIteratorTransformer
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(74) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#36]
+Join type: Inner
+Join condition: None
+
+(75) ProjectExecTransformer
+Output [8]: [item_id#12, sr_item_qty#13, (((cast(sr_item_qty#13 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS sr_dev#38, cr_item_qty#25, (((cast(cr_item_qty#25 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS cr_dev#39, wr_item_qty#37, (((cast(wr_item_qty#37 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS wr_dev#40, (cast(((sr_ [...]
+Input [5]: [item_id#12, sr_item_qty#13, cr_item_qty#25, item_id#36, 
wr_item_qty#37]
+
+(76) WholeStageCodegenTransformer (27)
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: false
+
+(77) TakeOrderedAndProjectExecTransformer
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: 100, [item_id#12 ASC NULLS FIRST, sr_item_qty#13 ASC NULLS FIRST], 
[item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41], 0
+
+(78) VeloxColumnarToRow
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+
+===== Subqueries =====
+
+Subquery:1 Hosting operator id = 1 Hosting Expression = sr_returned_date_sk#3 
IN dynamicpruning#4
+ColumnarBroadcastExchange (98)
++- ^ ProjectExecTransformer (96)
+   +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (95)
+      :- ^ FilterExecTransformer (80)
+      :  +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (79)
+      +- ^ InputIteratorTransformer (94)
+         +- ColumnarBroadcastExchange (92)
+            +- ^ ProjectExecTransformer (90)
+               +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (89)
+                  :- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (81)
+                  +- ^ InputIteratorTransformer (88)
+                     +- ColumnarBroadcastExchange (86)
+                        +- ^ ProjectExecTransformer (84)
+                           +- ^ FilterExecTransformer (83)
+                              +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (82)
+
+
+(79) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date_sk#7, d_date#42]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [IsNotNull(d_date_sk)]
+ReadSchema: struct<d_date_sk:int,d_date:date>
+
+(80) FilterExecTransformer
+Input [2]: [d_date_sk#7, d_date#42]
+Arguments: isnotnull(d_date_sk#7)
+
+(81) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#43, d_week_seq#44]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(82) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#45, d_week_seq#46]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [In(d_date, [2000-06-30,2000-09-27,2000-11-17])]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(83) FilterExecTransformer
+Input [2]: [d_date#45, d_week_seq#46]
+Arguments: d_date#45 IN (2000-06-30,2000-09-27,2000-11-17)
+
+(84) ProjectExecTransformer
+Output [1]: [d_week_seq#46]
+Input [2]: [d_date#45, d_week_seq#46]
+
+(85) WholeStageCodegenTransformer (1)
+Input [1]: [d_week_seq#46]
+Arguments: false
+
+(86) ColumnarBroadcastExchange
+Input [1]: [d_week_seq#46]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=7]
+
+(87) InputAdapter
+Input [1]: [d_week_seq#46]
+
+(88) InputIteratorTransformer
+Input [1]: [d_week_seq#46]
+
+(89) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_week_seq#44]
+Right keys [1]: [d_week_seq#46]
+Join type: LeftSemi
+Join condition: None
+
+(90) ProjectExecTransformer
+Output [1]: [d_date#43]
+Input [2]: [d_date#43, d_week_seq#44]
+
+(91) WholeStageCodegenTransformer (2)
+Input [1]: [d_date#43]
+Arguments: false
+
+(92) ColumnarBroadcastExchange
+Input [1]: [d_date#43]
+Arguments: HashedRelationBroadcastMode(List(input[0, date, true]),false), 
[plan_id=8]
+
+(93) InputAdapter
+Input [1]: [d_date#43]
+
+(94) InputIteratorTransformer
+Input [1]: [d_date#43]
+
+(95) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_date#42]
+Right keys [1]: [d_date#43]
+Join type: LeftSemi
+Join condition: None
+
+(96) ProjectExecTransformer
+Output [1]: [d_date_sk#7]
+Input [2]: [d_date_sk#7, d_date#42]
+
+(97) WholeStageCodegenTransformer (3)
+Input [1]: [d_date_sk#7]
+Arguments: false
+
+(98) ColumnarBroadcastExchange
+Input [1]: [d_date_sk#7]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=9]
+
+Subquery:2 Hosting operator id = 24 Hosting Expression = 
cr_returned_date_sk#16 IN dynamicpruning#4
+
+Subquery:3 Hosting operator id = 50 Hosting Expression = 
wr_returned_date_sk#28 IN dynamicpruning#4
+
+
diff --git 
a/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
new file mode 100644
index 0000000000..64c8b16867
--- /dev/null
+++ 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.ansi/simplified.txt
@@ -0,0 +1,101 @@
+VeloxColumnarToRow
+  TakeOrderedAndProjectExecTransformer 
[item_id,sr_item_qty,sr_dev,cr_item_qty,cr_dev,wr_item_qty,wr_dev,average]
+    WholeStageCodegenTransformer (27)
+      ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty,wr_item_qty]
+        BroadcastHashJoinExecTransformer [item_id,item_id]
+          ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty]
+            BroadcastHashJoinExecTransformer [item_id,item_id]
+              RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(sr_return_quantity),item_id,sr_item_qty,sum]
+                InputIteratorTransformer
+                  InputAdapter
+                    ColumnarExchange [i_item_id,sum] #1
+                      VeloxResizeBatches
+                        WholeStageCodegenTransformer (8)
+                          ProjectExecTransformer [i_item_id,sum]
+                            FlushableHashAggregateExecTransformer 
[i_item_id,sr_return_quantity] [sum,sum]
+                              ProjectExecTransformer 
[sr_return_quantity,i_item_id]
+                                BroadcastHashJoinExecTransformer 
[sr_returned_date_sk,d_date_sk]
+                                  ProjectExecTransformer 
[sr_return_quantity,sr_returned_date_sk,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[sr_item_sk,i_item_sk]
+                                      FilterExecTransformer [sr_item_sk]
+                                        FileSourceScanExecTransformer parquet 
spark_catalog.default.store_returns 
[sr_item_sk,sr_return_quantity,sr_returned_date_sk]
+                                          ColumnarSubqueryBroadcast 
[d_date_sk] #1
+                                            ColumnarBroadcastExchange #2
+                                              WholeStageCodegenTransformer (3)
+                                                ProjectExecTransformer 
[d_date_sk]
+                                                  
BroadcastHashJoinExecTransformer [d_date,d_date]
+                                                    FilterExecTransformer 
[d_date_sk]
+                                                      
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date_sk,d_date]
+                                                    InputIteratorTransformer
+                                                      InputAdapter
+                                                        
ColumnarBroadcastExchange #3
+                                                          
WholeStageCodegenTransformer (2)
+                                                            
ProjectExecTransformer [d_date]
+                                                              
BroadcastHashJoinExecTransformer [d_week_seq,d_week_seq]
+                                                                
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                                                
InputIteratorTransformer
+                                                                  InputAdapter
+                                                                    
ColumnarBroadcastExchange #4
+                                                                      
WholeStageCodegenTransformer (1)
+                                                                        
ProjectExecTransformer [d_week_seq]
+                                                                          
FilterExecTransformer [d_date]
+                                                                            
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ColumnarBroadcastExchange #5
+                                            WholeStageCodegenTransformer (4)
+                                              FilterExecTransformer 
[i_item_sk,i_item_id]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.item [i_item_sk,i_item_id]
+                                  InputIteratorTransformer
+                                    InputAdapter
+                                      ReusedExchange [d_date_sk] #2
+              InputIteratorTransformer
+                InputAdapter
+                  ColumnarBroadcastExchange #6
+                    WholeStageCodegenTransformer (17)
+                      RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(cr_return_quantity),item_id,cr_item_qty,sum]
+                        InputIteratorTransformer
+                          InputAdapter
+                            ColumnarExchange [i_item_id,sum] #7
+                              VeloxResizeBatches
+                                WholeStageCodegenTransformer (16)
+                                  ProjectExecTransformer [i_item_id,sum]
+                                    FlushableHashAggregateExecTransformer 
[i_item_id,cr_return_quantity] [sum,sum]
+                                      ProjectExecTransformer 
[cr_return_quantity,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[cr_returned_date_sk,d_date_sk]
+                                          ProjectExecTransformer 
[cr_return_quantity,cr_returned_date_sk,i_item_id]
+                                            BroadcastHashJoinExecTransformer 
[cr_item_sk,i_item_sk]
+                                              FilterExecTransformer 
[cr_item_sk]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.catalog_returns 
[cr_item_sk,cr_return_quantity,cr_returned_date_sk]
+                                                  ReusedSubquery [d_date_sk] #1
+                                              InputIteratorTransformer
+                                                InputAdapter
+                                                  ReusedExchange 
[i_item_sk,i_item_id] #5
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange [d_date_sk] #2
+          InputIteratorTransformer
+            InputAdapter
+              ColumnarBroadcastExchange #8
+                WholeStageCodegenTransformer (26)
+                  RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(wr_return_quantity),item_id,wr_item_qty,sum]
+                    InputIteratorTransformer
+                      InputAdapter
+                        ColumnarExchange [i_item_id,sum] #9
+                          VeloxResizeBatches
+                            WholeStageCodegenTransformer (25)
+                              ProjectExecTransformer [i_item_id,sum]
+                                FlushableHashAggregateExecTransformer 
[i_item_id,wr_return_quantity] [sum,sum]
+                                  ProjectExecTransformer 
[wr_return_quantity,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[wr_returned_date_sk,d_date_sk]
+                                      ProjectExecTransformer 
[wr_return_quantity,wr_returned_date_sk,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[wr_item_sk,i_item_sk]
+                                          FilterExecTransformer [wr_item_sk]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.web_returns 
[wr_item_sk,wr_return_quantity,wr_returned_date_sk]
+                                              ReusedSubquery [d_date_sk] #1
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange 
[i_item_sk,i_item_id] #5
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [d_date_sk] #2
diff --git 
a/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
new file mode 100644
index 0000000000..cd2b8440e3
--- /dev/null
+++ 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/explain.txt
@@ -0,0 +1,509 @@
+== Physical Plan ==
+VeloxColumnarToRow (78)
++- TakeOrderedAndProjectExecTransformer (77)
+   +- ^ ProjectExecTransformer (75)
+      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (74)
+         :- ^ ProjectExecTransformer (49)
+         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (48)
+         :     :- ^ RegularHashAggregateExecTransformer (23)
+         :     :  +- ^ InputIteratorTransformer (22)
+         :     :     +- ColumnarExchange (20)
+         :     :        +- VeloxResizeBatches (19)
+         :     :           +- ^ ProjectExecTransformer (17)
+         :     :              +- ^ FlushableHashAggregateExecTransformer (16)
+         :     :                 +- ^ ProjectExecTransformer (15)
+         :     :                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (14)
+         :     :                       :- ^ ProjectExecTransformer (7)
+         :     :                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (6)
+         :     :                       :     :- ^ FilterExecTransformer (2)
+         :     :                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.store_returns (1)
+         :     :                       :     +- ^ InputIteratorTransformer (5)
+         :     :                       :        +- ReusedExchange (3)
+         :     :                       +- ^ InputIteratorTransformer (13)
+         :     :                          +- ColumnarBroadcastExchange (11)
+         :     :                             +- ^ FilterExecTransformer (9)
+         :     :                                +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.item (8)
+         :     +- ^ InputIteratorTransformer (47)
+         :        +- ColumnarBroadcastExchange (45)
+         :           +- ^ RegularHashAggregateExecTransformer (43)
+         :              +- ^ InputIteratorTransformer (42)
+         :                 +- ColumnarExchange (40)
+         :                    +- VeloxResizeBatches (39)
+         :                       +- ^ ProjectExecTransformer (37)
+         :                          +- ^ FlushableHashAggregateExecTransformer 
(36)
+         :                             +- ^ ProjectExecTransformer (35)
+         :                                +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (34)
+         :                                   :- ^ ProjectExecTransformer (30)
+         :                                   :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (29)
+         :                                   :     :- ^ FilterExecTransformer 
(25)
+         :                                   :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.catalog_returns (24)
+         :                                   :     +- ^ 
InputIteratorTransformer (28)
+         :                                   :        +- ReusedExchange (26)
+         :                                   +- ^ InputIteratorTransformer (33)
+         :                                      +- ReusedExchange (31)
+         +- ^ InputIteratorTransformer (73)
+            +- ColumnarBroadcastExchange (71)
+               +- ^ RegularHashAggregateExecTransformer (69)
+                  +- ^ InputIteratorTransformer (68)
+                     +- ColumnarExchange (66)
+                        +- VeloxResizeBatches (65)
+                           +- ^ ProjectExecTransformer (63)
+                              +- ^ FlushableHashAggregateExecTransformer (62)
+                                 +- ^ ProjectExecTransformer (61)
+                                    +- ^ BroadcastHashJoinExecTransformer 
Inner BuildRight (60)
+                                       :- ^ ProjectExecTransformer (56)
+                                       :  +- ^ 
BroadcastHashJoinExecTransformer Inner BuildRight (55)
+                                       :     :- ^ FilterExecTransformer (51)
+                                       :     :  +- ^ 
FileSourceScanExecTransformer parquet spark_catalog.default.web_returns (50)
+                                       :     +- ^ InputIteratorTransformer (54)
+                                       :        +- ReusedExchange (52)
+                                       +- ^ InputIteratorTransformer (59)
+                                          +- ReusedExchange (57)
+
+
+(1) FileSourceScanExecTransformer parquet spark_catalog.default.store_returns
+Output [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(sr_returned_date_sk#3), 
dynamicpruningexpression(sr_returned_date_sk#3 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(sr_item_sk)]
+ReadSchema: struct<sr_item_sk:int,sr_return_quantity:int>
+
+(2) FilterExecTransformer
+Input [3]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3]
+Arguments: isnotnull(sr_item_sk#1)
+
+(3) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#5]
+
+(4) InputAdapter
+Input [1]: [d_date_sk#5]
+
+(5) InputIteratorTransformer
+Input [1]: [d_date_sk#5]
+
+(6) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_returned_date_sk#3]
+Right keys [1]: [d_date_sk#5]
+Join type: Inner
+Join condition: None
+
+(7) ProjectExecTransformer
+Output [2]: [sr_item_sk#1, sr_return_quantity#2]
+Input [4]: [sr_item_sk#1, sr_return_quantity#2, sr_returned_date_sk#3, 
d_date_sk#5]
+
+(8) FileSourceScanExecTransformer parquet spark_catalog.default.item
+Output [2]: [i_item_sk#6, i_item_id#7]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/item]
+PushedFilters: [IsNotNull(i_item_sk), IsNotNull(i_item_id)]
+ReadSchema: struct<i_item_sk:int,i_item_id:string>
+
+(9) FilterExecTransformer
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: (isnotnull(i_item_sk#6) AND isnotnull(i_item_id#7))
+
+(10) WholeStageCodegenTransformer (7)
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: false
+
+(11) ColumnarBroadcastExchange
+Input [2]: [i_item_sk#6, i_item_id#7]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as 
bigint)),false), [plan_id=1]
+
+(12) InputAdapter
+Input [2]: [i_item_sk#6, i_item_id#7]
+
+(13) InputIteratorTransformer
+Input [2]: [i_item_sk#6, i_item_id#7]
+
+(14) BroadcastHashJoinExecTransformer
+Left keys [1]: [sr_item_sk#1]
+Right keys [1]: [i_item_sk#6]
+Join type: Inner
+Join condition: None
+
+(15) ProjectExecTransformer
+Output [2]: [sr_return_quantity#2, i_item_id#7]
+Input [4]: [sr_item_sk#1, sr_return_quantity#2, i_item_sk#6, i_item_id#7]
+
+(16) FlushableHashAggregateExecTransformer
+Input [2]: [sr_return_quantity#2, i_item_id#7]
+Keys [1]: [i_item_id#7]
+Functions [1]: [partial_sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum#8]
+Results [2]: [i_item_id#7, sum#9]
+
+(17) ProjectExecTransformer
+Output [3]: [hash(i_item_id#7, 42) AS hash_partition_key#10, i_item_id#7, 
sum#9]
+Input [2]: [i_item_id#7, sum#9]
+
+(18) WholeStageCodegenTransformer (8)
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: false
+
+(19) VeloxResizeBatches
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: 1024, 2147483647, 10485760
+
+(20) ColumnarExchange
+Input [3]: [hash_partition_key#10, i_item_id#7, sum#9]
+Arguments: hashpartitioning(i_item_id#7, 1), ENSURE_REQUIREMENTS, 
[i_item_id#7, sum#9], [plan_id=2], [shuffle_writer_type=hash]
+
+(21) InputAdapter
+Input [2]: [i_item_id#7, sum#9]
+
+(22) InputIteratorTransformer
+Input [2]: [i_item_id#7, sum#9]
+
+(23) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#7, sum#9]
+Keys [1]: [i_item_id#7]
+Functions [1]: [sum(sr_return_quantity#2)]
+Aggregate Attributes [1]: [sum(sr_return_quantity#2)#11]
+Results [2]: [i_item_id#7 AS item_id#12, sum(sr_return_quantity#2)#11 AS 
sr_item_qty#13]
+
+(24) FileSourceScanExecTransformer parquet 
spark_catalog.default.catalog_returns
+Output [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(cr_returned_date_sk#16), 
dynamicpruningexpression(cr_returned_date_sk#16 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(cr_item_sk)]
+ReadSchema: struct<cr_item_sk:int,cr_return_quantity:int>
+
+(25) FilterExecTransformer
+Input [3]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16]
+Arguments: isnotnull(cr_item_sk#14)
+
+(26) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#17]
+
+(27) InputAdapter
+Input [1]: [d_date_sk#17]
+
+(28) InputIteratorTransformer
+Input [1]: [d_date_sk#17]
+
+(29) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_returned_date_sk#16]
+Right keys [1]: [d_date_sk#17]
+Join type: Inner
+Join condition: None
+
+(30) ProjectExecTransformer
+Output [2]: [cr_item_sk#14, cr_return_quantity#15]
+Input [4]: [cr_item_sk#14, cr_return_quantity#15, cr_returned_date_sk#16, 
d_date_sk#17]
+
+(31) ReusedExchange [Reuses operator id: 11]
+Output [2]: [i_item_sk#18, i_item_id#19]
+
+(32) InputAdapter
+Input [2]: [i_item_sk#18, i_item_id#19]
+
+(33) InputIteratorTransformer
+Input [2]: [i_item_sk#18, i_item_id#19]
+
+(34) BroadcastHashJoinExecTransformer
+Left keys [1]: [cr_item_sk#14]
+Right keys [1]: [i_item_sk#18]
+Join type: Inner
+Join condition: None
+
+(35) ProjectExecTransformer
+Output [2]: [cr_return_quantity#15, i_item_id#19]
+Input [4]: [cr_item_sk#14, cr_return_quantity#15, i_item_sk#18, i_item_id#19]
+
+(36) FlushableHashAggregateExecTransformer
+Input [2]: [cr_return_quantity#15, i_item_id#19]
+Keys [1]: [i_item_id#19]
+Functions [1]: [partial_sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum#20]
+Results [2]: [i_item_id#19, sum#21]
+
+(37) ProjectExecTransformer
+Output [3]: [hash(i_item_id#19, 42) AS hash_partition_key#22, i_item_id#19, 
sum#21]
+Input [2]: [i_item_id#19, sum#21]
+
+(38) WholeStageCodegenTransformer (16)
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: false
+
+(39) VeloxResizeBatches
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: 1024, 2147483647, 10485760
+
+(40) ColumnarExchange
+Input [3]: [hash_partition_key#22, i_item_id#19, sum#21]
+Arguments: hashpartitioning(i_item_id#19, 1), ENSURE_REQUIREMENTS, 
[i_item_id#19, sum#21], [plan_id=3], [shuffle_writer_type=hash]
+
+(41) InputAdapter
+Input [2]: [i_item_id#19, sum#21]
+
+(42) InputIteratorTransformer
+Input [2]: [i_item_id#19, sum#21]
+
+(43) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#19, sum#21]
+Keys [1]: [i_item_id#19]
+Functions [1]: [sum(cr_return_quantity#15)]
+Aggregate Attributes [1]: [sum(cr_return_quantity#15)#23]
+Results [2]: [i_item_id#19 AS item_id#24, sum(cr_return_quantity#15)#23 AS 
cr_item_qty#25]
+
+(44) WholeStageCodegenTransformer (17)
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: false
+
+(45) ColumnarBroadcastExchange
+Input [2]: [item_id#24, cr_item_qty#25]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=4]
+
+(46) InputAdapter
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(47) InputIteratorTransformer
+Input [2]: [item_id#24, cr_item_qty#25]
+
+(48) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#24]
+Join type: Inner
+Join condition: None
+
+(49) ProjectExecTransformer
+Output [3]: [item_id#12, sr_item_qty#13, cr_item_qty#25]
+Input [4]: [item_id#12, sr_item_qty#13, item_id#24, cr_item_qty#25]
+
+(50) FileSourceScanExecTransformer parquet spark_catalog.default.web_returns
+Output [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Batched: true
+Location: InMemoryFileIndex []
+PartitionFilters: [isnotnull(wr_returned_date_sk#28), 
dynamicpruningexpression(wr_returned_date_sk#28 IN dynamicpruning#4)]
+PushedFilters: [IsNotNull(wr_item_sk)]
+ReadSchema: struct<wr_item_sk:int,wr_return_quantity:int>
+
+(51) FilterExecTransformer
+Input [3]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28]
+Arguments: isnotnull(wr_item_sk#26)
+
+(52) ReusedExchange [Reuses operator id: 98]
+Output [1]: [d_date_sk#29]
+
+(53) InputAdapter
+Input [1]: [d_date_sk#29]
+
+(54) InputIteratorTransformer
+Input [1]: [d_date_sk#29]
+
+(55) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_returned_date_sk#28]
+Right keys [1]: [d_date_sk#29]
+Join type: Inner
+Join condition: None
+
+(56) ProjectExecTransformer
+Output [2]: [wr_item_sk#26, wr_return_quantity#27]
+Input [4]: [wr_item_sk#26, wr_return_quantity#27, wr_returned_date_sk#28, 
d_date_sk#29]
+
+(57) ReusedExchange [Reuses operator id: 11]
+Output [2]: [i_item_sk#30, i_item_id#31]
+
+(58) InputAdapter
+Input [2]: [i_item_sk#30, i_item_id#31]
+
+(59) InputIteratorTransformer
+Input [2]: [i_item_sk#30, i_item_id#31]
+
+(60) BroadcastHashJoinExecTransformer
+Left keys [1]: [wr_item_sk#26]
+Right keys [1]: [i_item_sk#30]
+Join type: Inner
+Join condition: None
+
+(61) ProjectExecTransformer
+Output [2]: [wr_return_quantity#27, i_item_id#31]
+Input [4]: [wr_item_sk#26, wr_return_quantity#27, i_item_sk#30, i_item_id#31]
+
+(62) FlushableHashAggregateExecTransformer
+Input [2]: [wr_return_quantity#27, i_item_id#31]
+Keys [1]: [i_item_id#31]
+Functions [1]: [partial_sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum#32]
+Results [2]: [i_item_id#31, sum#33]
+
+(63) ProjectExecTransformer
+Output [3]: [hash(i_item_id#31, 42) AS hash_partition_key#34, i_item_id#31, 
sum#33]
+Input [2]: [i_item_id#31, sum#33]
+
+(64) WholeStageCodegenTransformer (25)
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: false
+
+(65) VeloxResizeBatches
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: 1024, 2147483647, 10485760
+
+(66) ColumnarExchange
+Input [3]: [hash_partition_key#34, i_item_id#31, sum#33]
+Arguments: hashpartitioning(i_item_id#31, 1), ENSURE_REQUIREMENTS, 
[i_item_id#31, sum#33], [plan_id=5], [shuffle_writer_type=hash]
+
+(67) InputAdapter
+Input [2]: [i_item_id#31, sum#33]
+
+(68) InputIteratorTransformer
+Input [2]: [i_item_id#31, sum#33]
+
+(69) RegularHashAggregateExecTransformer
+Input [2]: [i_item_id#31, sum#33]
+Keys [1]: [i_item_id#31]
+Functions [1]: [sum(wr_return_quantity#27)]
+Aggregate Attributes [1]: [sum(wr_return_quantity#27)#35]
+Results [2]: [i_item_id#31 AS item_id#36, sum(wr_return_quantity#27)#35 AS 
wr_item_qty#37]
+
+(70) WholeStageCodegenTransformer (26)
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: false
+
+(71) ColumnarBroadcastExchange
+Input [2]: [item_id#36, wr_item_qty#37]
+Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), 
[plan_id=6]
+
+(72) InputAdapter
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(73) InputIteratorTransformer
+Input [2]: [item_id#36, wr_item_qty#37]
+
+(74) BroadcastHashJoinExecTransformer
+Left keys [1]: [item_id#12]
+Right keys [1]: [item_id#36]
+Join type: Inner
+Join condition: None
+
+(75) ProjectExecTransformer
+Output [8]: [item_id#12, sr_item_qty#13, (((cast(sr_item_qty#13 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS sr_dev#38, cr_item_qty#25, (((cast(cr_item_qty#25 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS cr_dev#39, wr_item_qty#37, (((cast(wr_item_qty#37 as double) / 
cast(((sr_item_qty#13 + cr_item_qty#25) + wr_item_qty#37) as double)) / 3.0) * 
100.0) AS wr_dev#40, (cast(((sr_ [...]
+Input [5]: [item_id#12, sr_item_qty#13, cr_item_qty#25, item_id#36, 
wr_item_qty#37]
+
+(76) WholeStageCodegenTransformer (27)
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: false
+
+(77) TakeOrderedAndProjectExecTransformer
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+Arguments: 100, [item_id#12 ASC NULLS FIRST, sr_item_qty#13 ASC NULLS FIRST], 
[item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41], 0
+
+(78) VeloxColumnarToRow
+Input [8]: [item_id#12, sr_item_qty#13, sr_dev#38, cr_item_qty#25, cr_dev#39, 
wr_item_qty#37, wr_dev#40, average#41]
+
+===== Subqueries =====
+
+Subquery:1 Hosting operator id = 1 Hosting Expression = sr_returned_date_sk#3 
IN dynamicpruning#4
+ColumnarBroadcastExchange (98)
++- ^ ProjectExecTransformer (96)
+   +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (95)
+      :- ^ FilterExecTransformer (80)
+      :  +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (79)
+      +- ^ InputIteratorTransformer (94)
+         +- ColumnarBroadcastExchange (92)
+            +- ^ ProjectExecTransformer (90)
+               +- ^ BroadcastHashJoinExecTransformer LeftSemi BuildRight (89)
+                  :- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (81)
+                  +- ^ InputIteratorTransformer (88)
+                     +- ColumnarBroadcastExchange (86)
+                        +- ^ ProjectExecTransformer (84)
+                           +- ^ FilterExecTransformer (83)
+                              +- ^ FileSourceScanExecTransformer parquet 
spark_catalog.default.date_dim (82)
+
+
+(79) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date_sk#5, d_date#42]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [IsNotNull(d_date_sk)]
+ReadSchema: struct<d_date_sk:int,d_date:date>
+
+(80) FilterExecTransformer
+Input [2]: [d_date_sk#5, d_date#42]
+Arguments: isnotnull(d_date_sk#5)
+
+(81) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#43, d_week_seq#44]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(82) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
+Output [2]: [d_date#45, d_week_seq#46]
+Batched: true
+Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
+PushedFilters: [In(d_date, [2000-06-30,2000-09-27,2000-11-17])]
+ReadSchema: struct<d_date:date,d_week_seq:int>
+
+(83) FilterExecTransformer
+Input [2]: [d_date#45, d_week_seq#46]
+Arguments: d_date#45 IN (2000-06-30,2000-09-27,2000-11-17)
+
+(84) ProjectExecTransformer
+Output [1]: [d_week_seq#46]
+Input [2]: [d_date#45, d_week_seq#46]
+
+(85) WholeStageCodegenTransformer (1)
+Input [1]: [d_week_seq#46]
+Arguments: false
+
+(86) ColumnarBroadcastExchange
+Input [1]: [d_week_seq#46]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=7]
+
+(87) InputAdapter
+Input [1]: [d_week_seq#46]
+
+(88) InputIteratorTransformer
+Input [1]: [d_week_seq#46]
+
+(89) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_week_seq#44]
+Right keys [1]: [d_week_seq#46]
+Join type: LeftSemi
+Join condition: None
+
+(90) ProjectExecTransformer
+Output [1]: [d_date#43]
+Input [2]: [d_date#43, d_week_seq#44]
+
+(91) WholeStageCodegenTransformer (2)
+Input [1]: [d_date#43]
+Arguments: false
+
+(92) ColumnarBroadcastExchange
+Input [1]: [d_date#43]
+Arguments: HashedRelationBroadcastMode(List(input[0, date, true]),false), 
[plan_id=8]
+
+(93) InputAdapter
+Input [1]: [d_date#43]
+
+(94) InputIteratorTransformer
+Input [1]: [d_date#43]
+
+(95) BroadcastHashJoinExecTransformer
+Left keys [1]: [d_date#42]
+Right keys [1]: [d_date#43]
+Join type: LeftSemi
+Join condition: None
+
+(96) ProjectExecTransformer
+Output [1]: [d_date_sk#5]
+Input [2]: [d_date_sk#5, d_date#42]
+
+(97) WholeStageCodegenTransformer (3)
+Input [1]: [d_date_sk#5]
+Arguments: false
+
+(98) ColumnarBroadcastExchange
+Input [1]: [d_date_sk#5]
+Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as 
bigint)),false), [plan_id=9]
+
+Subquery:2 Hosting operator id = 24 Hosting Expression = 
cr_returned_date_sk#16 IN dynamicpruning#4
+
+Subquery:3 Hosting operator id = 50 Hosting Expression = 
wr_returned_date_sk#28 IN dynamicpruning#4
+
+
diff --git 
a/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
new file mode 100644
index 0000000000..f38594bbd1
--- /dev/null
+++ 
b/gluten-ut/spark41/src/test/resources/backends-velox/tpcds-plan-stability/gluten-approved-plans-v1_4/q83.sf100.ansi/simplified.txt
@@ -0,0 +1,101 @@
+VeloxColumnarToRow
+  TakeOrderedAndProjectExecTransformer 
[item_id,sr_item_qty,sr_dev,cr_item_qty,cr_dev,wr_item_qty,wr_dev,average]
+    WholeStageCodegenTransformer (27)
+      ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty,wr_item_qty]
+        BroadcastHashJoinExecTransformer [item_id,item_id]
+          ProjectExecTransformer [item_id,sr_item_qty,cr_item_qty]
+            BroadcastHashJoinExecTransformer [item_id,item_id]
+              RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(sr_return_quantity),item_id,sr_item_qty,sum]
+                InputIteratorTransformer
+                  InputAdapter
+                    ColumnarExchange [i_item_id,sum] #1
+                      VeloxResizeBatches
+                        WholeStageCodegenTransformer (8)
+                          ProjectExecTransformer [i_item_id,sum]
+                            FlushableHashAggregateExecTransformer 
[i_item_id,sr_return_quantity] [sum,sum]
+                              ProjectExecTransformer 
[sr_return_quantity,i_item_id]
+                                BroadcastHashJoinExecTransformer 
[sr_item_sk,i_item_sk]
+                                  ProjectExecTransformer 
[sr_item_sk,sr_return_quantity]
+                                    BroadcastHashJoinExecTransformer 
[sr_returned_date_sk,d_date_sk]
+                                      FilterExecTransformer [sr_item_sk]
+                                        FileSourceScanExecTransformer parquet 
spark_catalog.default.store_returns 
[sr_item_sk,sr_return_quantity,sr_returned_date_sk]
+                                          ColumnarSubqueryBroadcast 
[d_date_sk] #1
+                                            ColumnarBroadcastExchange #2
+                                              WholeStageCodegenTransformer (3)
+                                                ProjectExecTransformer 
[d_date_sk]
+                                                  
BroadcastHashJoinExecTransformer [d_date,d_date]
+                                                    FilterExecTransformer 
[d_date_sk]
+                                                      
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date_sk,d_date]
+                                                    InputIteratorTransformer
+                                                      InputAdapter
+                                                        
ColumnarBroadcastExchange #3
+                                                          
WholeStageCodegenTransformer (2)
+                                                            
ProjectExecTransformer [d_date]
+                                                              
BroadcastHashJoinExecTransformer [d_week_seq,d_week_seq]
+                                                                
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                                                
InputIteratorTransformer
+                                                                  InputAdapter
+                                                                    
ColumnarBroadcastExchange #4
+                                                                      
WholeStageCodegenTransformer (1)
+                                                                        
ProjectExecTransformer [d_week_seq]
+                                                                          
FilterExecTransformer [d_date]
+                                                                            
FileSourceScanExecTransformer parquet spark_catalog.default.date_dim 
[d_date,d_week_seq]
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [d_date_sk] #2
+                                  InputIteratorTransformer
+                                    InputAdapter
+                                      ColumnarBroadcastExchange #5
+                                        WholeStageCodegenTransformer (7)
+                                          FilterExecTransformer 
[i_item_sk,i_item_id]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.item [i_item_sk,i_item_id]
+              InputIteratorTransformer
+                InputAdapter
+                  ColumnarBroadcastExchange #6
+                    WholeStageCodegenTransformer (17)
+                      RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(cr_return_quantity),item_id,cr_item_qty,sum]
+                        InputIteratorTransformer
+                          InputAdapter
+                            ColumnarExchange [i_item_id,sum] #7
+                              VeloxResizeBatches
+                                WholeStageCodegenTransformer (16)
+                                  ProjectExecTransformer [i_item_id,sum]
+                                    FlushableHashAggregateExecTransformer 
[i_item_id,cr_return_quantity] [sum,sum]
+                                      ProjectExecTransformer 
[cr_return_quantity,i_item_id]
+                                        BroadcastHashJoinExecTransformer 
[cr_item_sk,i_item_sk]
+                                          ProjectExecTransformer 
[cr_item_sk,cr_return_quantity]
+                                            BroadcastHashJoinExecTransformer 
[cr_returned_date_sk,d_date_sk]
+                                              FilterExecTransformer 
[cr_item_sk]
+                                                FileSourceScanExecTransformer 
parquet spark_catalog.default.catalog_returns 
[cr_item_sk,cr_return_quantity,cr_returned_date_sk]
+                                                  ReusedSubquery [d_date_sk] #1
+                                              InputIteratorTransformer
+                                                InputAdapter
+                                                  ReusedExchange [d_date_sk] #2
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange 
[i_item_sk,i_item_id] #5
+          InputIteratorTransformer
+            InputAdapter
+              ColumnarBroadcastExchange #8
+                WholeStageCodegenTransformer (26)
+                  RegularHashAggregateExecTransformer [i_item_id,sum] 
[sum(wr_return_quantity),item_id,wr_item_qty,sum]
+                    InputIteratorTransformer
+                      InputAdapter
+                        ColumnarExchange [i_item_id,sum] #9
+                          VeloxResizeBatches
+                            WholeStageCodegenTransformer (25)
+                              ProjectExecTransformer [i_item_id,sum]
+                                FlushableHashAggregateExecTransformer 
[i_item_id,wr_return_quantity] [sum,sum]
+                                  ProjectExecTransformer 
[wr_return_quantity,i_item_id]
+                                    BroadcastHashJoinExecTransformer 
[wr_item_sk,i_item_sk]
+                                      ProjectExecTransformer 
[wr_item_sk,wr_return_quantity]
+                                        BroadcastHashJoinExecTransformer 
[wr_returned_date_sk,d_date_sk]
+                                          FilterExecTransformer [wr_item_sk]
+                                            FileSourceScanExecTransformer 
parquet spark_catalog.default.web_returns 
[wr_item_sk,wr_return_quantity,wr_returned_date_sk]
+                                              ReusedSubquery [d_date_sk] #1
+                                          InputIteratorTransformer
+                                            InputAdapter
+                                              ReusedExchange [d_date_sk] #2
+                                      InputIteratorTransformer
+                                        InputAdapter
+                                          ReusedExchange [i_item_sk,i_item_id] 
#5
diff --git 
a/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
 
b/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
index 37ab99e470..8e87de4579 100644
--- 
a/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
+++ 
b/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/GlutenPlanStabilitySuite.scala
@@ -111,8 +111,19 @@ trait GlutenPlanStabilityTestTrait {
     new File(backendDir, glutenParts.mkString(File.separator)).getAbsolutePath
   }
 
+  // Queries whose plans differ under ANSI mode (mirroring Spark's 
approvedAnsiPlans).
+  private val approvedAnsiPlans: Seq[String] = Seq(
+    "q83",
+    "q83.sf100"
+  )
+
   private def glutenGetDirForTest(name: String): File = {
-    new File(glutenGoldenFilePath, name)
+    val dirName = if (SQLConf.get.ansiEnabled && 
approvedAnsiPlans.contains(name)) {
+      name + ".ansi"
+    } else {
+      name
+    }
+    new File(glutenGoldenFilePath, dirName)
   }
 
   private def glutenIsApproved(


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to