You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by hu...@apache.org on 2026/05/12 15:12:33 UTC

(doris) branch fe_local_shuffle updated (73f5abd220e -> 8ab2182213f)

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

924060929 pushed a change to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git


 discard 73f5abd220e [fix](local shuffle) Old Coordinator must disable FE local shuffle planner for BE
 discard 6b9352efd2a [fix](local shuffle) Old Coordinator must disable FE local shuffle planner for BE
 discard e158c2f82d5 [debug](local shuffle) Log pooling fragments with/without LE for hang diagnosis
 discard 16f044387c1 [debug](local shuffle) Add query_id to LE diagnostic logs
 discard ebea64a7436 [debug](local shuffle) Add diagnostic logging for merge_into LE investigation
 discard 6c777c7aaab [fix](profile) Enable profile collection for MergeIntoCommand
 discard af093e1dfda [opt](local shuffle) ADAPTIVE_PASSTHROUGH satisfies PASSTHROUGH requirement
 discard 209aa24a7b1 [refactor](local shuffle) Re-apply NLJ/ExchangeNode simplification
 discard cb9fd8e723d [fix](local shuffle) Fix COLOCATE JOIN wrong results with NLJ in probe subtree
 discard 4971f020c2f [refactor](local shuffle) Simplify NLJ and ExchangeNode local exchange planning
 discard cd34ddb7448 [fix](local shuffle) Fix serial AnalyticEval deadlock: return NOOP instead of PASSTHROUGH
 discard 4f37b1a6de0 [fix](local shuffle) Fix serial ancestor flag propagation for pipeline-splitting operators
 discard 0d89fabfcfb [fix](local shuffle) Restore ExchangeNode.isSerialNode() mergeInfo condition
 discard 2fe2d310d45 [fix](local shuffle) Fix BUCKET_SHUFFLE destination routing with pooling scan
 discard bb35e99d0c6 [fix](local shuffle) Fix operator_id collision causing INSERT crash on multi-BE
 discard 3021c60d41d [fix](local shuffle) Match BE toThrift serial condition in FE enforceRequire
 discard 45a53ce01e4 [fix](local shuffle) Restore _deferred_exchangers.empty() early return in propagation
 discard 65835667c21 [test](local shuffle) Add Bug 22 regression test + remove diagnostic logs
 discard bc6a98fb09b [fix](local shuffle) Fix ExchangeNode.isSerialOperator: restore mergeInfo != null condition
 discard 523b38af81e Revert "[fix](fe) Fix BUCKET_SHUFFLE data loss in serial exchange with FE-planned local shuffle"
 discard b03722b95e9 [fix](local shuffle) Propagate num_tasks from LOCAL_EXCHANGE to ancestor pipelines
 discard 782dc35888d [fix](fe) Fix BUCKET_SHUFFLE data loss in serial exchange with FE-planned local shuffle
 discard aae44ebd83a [fix](local shuffle) Fix NPE in ExchangeNode.enforceAndDeriveLocalExchange: null check before use
 discard b371842770b [fix](local shuffle) Fix NLJ childUsePoolingScan: use useSerialSource without hasSerialScanNode gate
 discard dc266467128 [test](local shuffle) Update UT expected values for enforceRequire refactoring
 discard b7f6226b334 [fix](local shuffle) Remove child-type skip in createLocalExchange
 discard 20d282ad2c0 [fix](local shuffle) Fix instanceCount check and ExchangeNode.isSerialOperator cycle
 discard b7d5e99b923 [test](local shuffle) Add comments for known instanceCount discrepancy cases
 discard 3a027cc5a8d [refactor](local shuffle) Unify enforceChild/enforceChildExchange/forceEnforceChildExchange into enforceRequire
 discard bfec51a69bb [fix](local shuffle) Fix HashJoin COREDUMP: isSerialChildInThrift skip non-ScanNode children
 discard d5a383d6a71 [fix](local shuffle) Fix NLJ COREDUMP: restrict childUsePoolingScan to ScanNode probe child
 discard 0f7acce7308 [fix](local shuffle) Fix COREDUMP/data-loss: skip LE for serial non-Scan children in insertLocalExchange
 discard 830128696c1 [fix](local shuffle) Fix COREDUMP: restrict AGG PASSTHROUGH to ScanNode children only
 discard 51a2eda72d6 [fix](local shuffle) Fix COREDUMP: don't insert PASSTHROUGH LE between Exchange and streaming AGG
 discard 602e6b178bc [fix](local shuffle) Fix COREDUMP: skip LE insertion when child is serial in enforceChild
 discard 1034371cdbd [fix](local shuffle) Fix hang/crash with use_serial_exchange=true in non-pooling fragments
 discard a2bfd923e97 [refactor](local shuffle) Refactor FE local exchange planning: extract helper, fix root PASSTHROUGH, fix ScanNode output
 discard 6e225bbd3b9 [fix](fe) Fix NLJ build-side source_deps crash when serial NLJ gets PASSTHROUGH
 discard b0475298d70 [fix](fe) Skip PASSTHROUGH LE wrapping for Exchange under serial ancestor
 discard b0a03afc7c6 [test](regression) Add regression tests for serial AnalyticEval crash and hang
 discard 3cd360be0db [fix](fe) Fix serial AnalyticEval crash and DataStreamSink hang in local shuffle
 discard 2ce4a0b52a9 [test](regression) Add Bug 15 regression test for BUCKET_SHUFFLE serial PASS_TO_ONE data loss
 discard e6f9a2526bb [fix](fe) Fix BUCKET_SHUFFLE join wrong results with serial exchange
 discard d9524ee3965 [fix](fe) Guard PASSTHROUGH insertion with useSerialSource() check
 discard fd797487d65 [fix](local shuffle) fix DistinctStreamingAgg hash requirement and add RQG regression tests
 discard d632320f8f6 [fix](local shuffle) fix NLJ COREDUMP: don't insert build-side BROADCAST for serial NLJ
 discard 298e0eb8c4f [fix](local shuffle) use requireHash() instead of requireGlobalExecutionHash() in HashJoinNode and PartitionSortNode
 discard 2fdef106fa4 [fix](local shuffle) fix computeDestIdToInstanceId picking wrong ExchangeNode for multi-input fragments
 discard 2fc59a7cf52 [test](local shuffle) add FE/BE consistency and RQG regression tests
 discard 5f5866cb969 [fix](local shuffle) StreamingAgg: use child.isSerialOperator() not fragment.useSerialSource()
 discard 212f2fb6570 [fix](local shuffle) align FE local exchange planning with BE pipeline model
 discard 2bac91f1a62 [fix](local shuffle) remove stale code in deriveAndEnforceChildLocalExchange
 discard 9214a5c0b43 [fix](local shuffle) fix downstream pipeline num_tasks in LOCAL_EXCHANGE_NODE handler
 discard 0a37e5aed0b Revert "[fix](local shuffle) fix num_senders for UNPARTITIONED sender fragments"
 discard bad00c5a199 [fix](local shuffle) fix num_senders for UNPARTITIONED sender fragments
 discard a767ada5d88 [fix](local shuffle) insert PASSTHROUGH after serial Exchange + revert BE raise
 discard ccf7874857b [fix](local shuffle) restore deferred exchanger num_tasks raise for non-scan serial operators
 discard 938de89b02b [fix](local shuffle) fix nested NLJ + pooling scan shared state error and test flakiness
 discard 43ab5eb269b [feat](profile) add Is Profile Collection Completed marker in profile text
 discard c0248ced8ad [test](local shuffle) fix flaky profile fetch in FE/BE consistency test
 discard 22b78ddeed1 [refactor](local shuffle) simplify FE local exchange enforcement helpers
 discard 3f4d03f5a1e [refactor](local shuffle) align FE local exchange planning with BE pipeline model
 discard 80541b0dd93 [fix](local shuffle) remove incorrect upstream num_tasks raise in deferred exchanger creation
 discard 4a875420efd [fix](build) fix macOS BE startup crash caused by fd_number overflow
 discard 2f39ab1f8fc [fix](build) resolve BE rebase conflicts after rebasing on apache/master
 discard 16d457c9e0b [fix](build) add -dead_strip on macOS to fix dyld cache crash for large BE binary
 discard 779a36d774e [refactor](local shuffle) align AggregationNode with BE three-operator-class model
 discard 166510be359 [refactor](local shuffle) align FE local exchange planning with BE pipeline model
 discard 4a46a657096 [refactor](local shuffle) Plan local exchanger in FE (FE part)
 discard d867c7e0adf [refactor](local shuffle) Plan local exchanger in FE (BE part)
     add 2b9a1a5523b [Bug](pipeline) fix wake up early without terminate call (#61679)
     add 07c9dd3386d [fix](build) add -dead_strip on macOS to fix dyld cache crash for large BE binary (#61742)
     add 65c1f7eb687 [fix](fe) Track external gensrc inputs in FE Maven build cache config (#61754)
     add 17e61ade574 [improvement](topn) check multiget result rows against request row id count and add be UT (#61758)
     add a9e11ed9e54 [feat](dynamic table) support stream part 1: stream meta data & basic DDL (#61382)
     add 9326ce79236 [Fix](pyudf) Fix concurrent race condition when import module (#61280)
     add b34106dcdf7 [Feature](func) Support table function json_each, json_each_text (#60910)
     add b9dacc700a4 [refactor](recursive-cte) Replace in-place PFC reset with full recreation between recursion rounds (#61130)
     add d65264275aa [fix](be) keep FlushToken running count symmetric on cancel (#61684)
     add ef549ec0345 [feature](docker) support mTLS for DCR entrypoint scripts (#61676)
     add 53795dbcf1b [feature](dbt) upgrade dbt-doris adapter to v1.0.0 (#61423)
     add 71951fe9f64 [refactor](fe) Replace TFunctionBinaryType with Function.BinaryType to decouple from Thrift (#61786)
     add 286d365bb83 [fix](regression) fix p2 (#61769)
     add d0d055b3d98 [upgrade](docker)upgrade iceberg docker spark version to 4.0 (#61149)
     add bece2401ac2 [fix](view) ALTER VIEW definition not synced to follower FE when COMMENT is specified (#61670)
     add be8322b49fe [Bug](sink) fix cancel_at_time not work at parallel_sink/parallel_outfile (#61739)
     add dd4baaea3a8 [test](improvment) add some ttl function cases (#61114)
     add 88518e36686 [opt](build) move out grpc into a seperate module to speed up compile (#61800)
     add c26652a9eda [Feature](tvf) Support cdc stream tvf for mysql and pg (#60116)
     add 98d05810d16 [opt](nereids)share topnFilterDescs among instances (#61648)
     add 1cac2c502a4 [fix](fe) Fix duplicate RelationId bug caused by subquery in simple case when (#61813)
     add f1e1020e6fc [fix](parquet)fix parquet write timestamp int96 type. (1/2) (#61760)
     add 7212e860ea3 [refactor](catalog) decouple Column from Non-essential classes (#61816)
     add 58938de7bcf [fix](filecache) pass tablet_id through FileReaderOptions instead of parsing from path (#61683)
     add f17f1bbe283 [fix](build) Fix compilation errors with implicit conversions and unnecessary virtual keywords (#61836)
     add 12a2029c213 [fix](azure) Fix incorrect modification timestamps in AzureObjStorage (#61790)
     add a6e657fde5b [tool](meta_tool) Add gen_empty_segment operation to generate empty segment files (#61703)
     add a22713e7960 [Enhancement](test) Add TPC-H SF10 MOR unique key regression tests (#61762)
     add e72c6c8b34e [fix](olap) Avoid polluting the schema cache in OlapScanner (#61510)
     add 018601c8eab [feat](iceberg) Support iceberg v3 row lineage (#61398)
     add 52ef5aab69f [fix](parquet)fix parquet write timestamp int96 type. (2/2) (#61832)
     add 135b777e72f [Exec](materialize) change the materialization_opertor logic of gc id_map (#60970)
     add a876fb43724 [fix](https) fix be to_load_error_http_path return  url in https mode (#61785)
     add 92c09beaf4c [opt](test)speed up increment create mv cases (#61290)
     add 0a4f3a9854c [fix](datetime) Replace legacy `from_date_str` with cast function (#61682)
     add 431223290f2 [env](compiler)Optimize the compilation time of aggregate_function_orthogonal_bitmap.cpp (#61606)
     add 9443e31683e [opt](load) disable enable_strict_consistency_dml by default in cloud mode (#61814)
     add e3f36619b36 [Chore](pipeline) some minor fix and refactor (#61768)
     add 87d592e4bff [fix](metric) Change partition near-limit metrics from counters to gauges (#61845)
     add f5feae9bc0e [opt](function) Eliminate redundant hash computation in AggregateFunctionUniq (#61730)
     add 391412885f9 [Enhancement](memory) Add ConcurrentLong2ObjectHashMap and ConcurrentLong2LongHashMap (#61332)
     add 5fc3698fa51 [Fix](pyudf) Fix error type conversion (#61729)
     add 598dfb99d92 [refactor](storage type) remove deepcopy from typeinfo (#61856)
     add 375965596cb [fix](fe) Fix Paimon JDBC driver registration for JNI scans (#61513)
     add 7827e1bd03a [Enhancement](mmhash) Support mmhash3_u64_v2 (#61846)
     add dace2b87c87 [fix](docker): Fix Hive3 docker OSS configuration to use Jindo fs (#61822)
     add 2f60973b98a [Refactor](variant) Promote enable_doc_mode from column-level to type-level  (#61895)
     add 443c2db39b4 [feat](cloud) drop instance should recycle the ancestors (#61882)
     add 1a1b62aad8f [env](compiler) Reduce template instantiations in predicate_creator.h for faster compilation (#61858)
     add 05b5689c14e [Improvement](function) support window funnel v2 (#61566)
     add 2438d784e80 [Exec](performance) speed up array element at performance (#56880)
     add 01fd7548315 [refine](expr) Migrate old VExpr execute interface to new execute_column (Part 1) (#61912)
     add 41762fc5553 [env](compiler)Optimize the compilation time of cast. (#61276)
     add 36311d42300 [fix](group commit) group commit select backend should consider isLoadAvailable (#61555)
     add 6402589c352 [CI](workflow) Switch code review model to GPT-5.4 and add suggested changes guidance (#61958)
     add 2f783c2ad99 [feat](test) Add skill documentation for docker-based regression testing (#61960)
     add 7e111e0b8bc [Feature](streamjob) Streaming job  support cdc_stream TVF  (#61826)
     add 09eb5877033 [fix](auto-partition) Register auto-partition tables with retention_count in DynamicPartitionScheduler on restart (#61954)
     add eea082b4540 [refactor](iceberg) Refactor iceberg system tables to use native table execution path (#61646)
     add 528a964e5f9 [improvement](fe) Migrate HMS client pool to Commons Pool (#61553)
     add 657db8089bf [chore](regression) Merge nereids_p0 test cases into query_p0 (#61842)
     add 7e364ebeec6 [env](compiler)Reduce window function template instantiations (#61232)
     add c8398175de2 [test](fe) Refine manual REST catalog test fixtures (#61948)
     add 70faf2a5b27 [fix](build) Fix JindoFS jar packaging (#61940)
     add d57851c8743 [fix](variant) reduce doc compaction writer peak memory (#61955)
     add 62d4ab47c6c [feature](ann-index) Support IVF on-disk index type for ANN vector search (#61160)
     add 3139ee1ad6a [opt](ci) cloud_p0 get jstack and jmap of fe after run regression (#61974)
     add 92f75f3d356 [feature](memory) Global mem control on scan nodes (#61271)
     add afb160157a9 [Improvement](scan) update limit pushdown to tablet reader (#61713)
     add 654da806dad [feat](memtable) support adaptive memtable flush thread pool adjustment (#60617)
     add 4ee7ef770f2 [refine](be) Deprecate TYPE_LAMBDA_FUNCTION in PrimitiveType enum (#61941)
     add 6e3c531c16a [minor](Prefetch) Revert some useless check (#59601)
     add 464a727a991 [enhancement](config) Change segments_key_bounds_truncation_threshold default to 36 (#61984)
     add eec6f33ee54 [fix](nereids) fix unstable case topNLazyMaterializationUsingIndex (#61865)
     add 0d269a46173 [chore](cloud) process_unknown add warning log and improve msg (#61695)
     add 0e4809dbe88 [chore](cloud) list_snapshot allow query parameter (#61885)
     add 5ff95583e88 [fix](snapshot) skip link binlog files if binlog is not enabled (#61949)
     add 3cdc4823194 [fix](cloud) Fix cloud not print ms log (#61766)
     add d55d4a40f4b (fix)[case] fix test_mow_compaction_and_rowset_not_exist (#61947)
     add e29efd9f27c [fix](cloud) add get_version and get_tablet_stats case (#61915)
     add 8b0332976e1 [improvement](build) Add Gitleaks PR workflow (#61987)
     add c6dea59bac6 [fix](streaming-job) Fix PG replication slot leak when streaming task is cancelled during pause/resume  (#62010)
     add 02b430fc015 [fix](iceberg) Avoid dict reads on mixed-encoding position delete files (#61759)
     add 7a7e7ab1406 [chore](ci)Add 'Check for secrets' to required status checks (#62029)
     add 24cde642443 [chore](ci) Update user ID conditions for branch-4.0 (#62038)
     add f5783c04a9c [opt](table-function) Optimize explode with block fast path (#60352)
     add 9ecfd409603 [fix](job) fix StreamingJob loadStatistic reset to zero after FE checkpoint restart   (#61997)
     add 8e706d1a076 [fix](job) fix StreamingInsertJob incorrectly counting canceled tasks (#61894)
     add 4434ba4e7b5 [refine](predicate) reduce HybridSet/InListPredicate template bloat and fix create_string_value_set bug (#61999)
     add d4c19dac5c6 [fix](regression) Add external regression stage timing summary (#61869)
     add 4eab83d0332 [improvement](build) Limit hive bootstrap data by version (#61852)
     add c1168522ed5 [feature](fe) Integrate OIDC authentication, MySQL login bridge, and role mapping (#61819)
     add e61837c24eb [fix](backup) Fix UnsupportedOperationException in RestoreCommand by copying properties before modification (#61890)
     add e4ed81fdb1b [fix](spill) Fix revocable_mem_size to return 0 when partition reaches max repartition depth (#61973)
     add 20b05a9a6d8 [chore](ci) Remove author association check from opencode-review workflow (#62074)
     add 0adc79074b1 [fix](variant) preserve subcolumns after row-store partial update (#62067)
     add 1ce2e40dc4f [fix](scan) Fix missing predicate filter when Native and JNI readers are mixed in FileScanner (#61929)
     add d5e95188554 [Bug](scan) Preserve IN_LIST runtime filter predicates when key range is a scope range (#62027)
     add 632f79197c2 [Exec](be) Support offset prue column and null column in BE (#61888)
     add 6fb376a094c [opt](memory) Remove unused indexId field from CloudReplica (#62080)
     add 84c1c36575e [fix](compaction) Remove upper limit for vertical_compaction_num_columns_per_group (#61992)
     add 977c1f1134c [Bug](pipeline) do not treat BLOCKED->FINISHED as error when wake_up_early is true (#61989)
     add ac27e4b7690 [env](compiler) Reduce compile time of aggregate_function_reader_replace.cpp (#62047)
     add 9689b8288df [fix](fe) Enable fuzzy for enable_query_cache (#62087)
     add 3160231a3e1 [Bug](pipeline) do not set shared hash table signaled when task terminated (#62056)
     add 186a53ebe7d [opt](memory) Remove unused dbId field from CloudReplica (#62079)
     add d1e09c408eb [feat](fe) Add ClusterGuard SPI interface for cluster-level policy enforcement (#62031)
     add a8c890545ec [fix](jdbc) Preserve query tvf column aliases across JDBC catalogs (#61939)
     add 157a35e2580 [opt](explode) Optimize explode_outer and posexplode (#62069)
     add 0a3bea51271 [refactor](fe) Decouple SlotRef dependencies: GlobalVariable, Column serialization, Expr visitor (#61918)
     add 405541b2de5 [fix](tvf) fix wrong backend assignment for insert into local tvf (#62143)
     add a770f16d9f3 [Feature](compaction) add CompactionTaskTracker with system table and HTTP API (#61696)
     add 4ad3989c712 [fix](fe) Fix null pointer exception in sessionVariables after upgrade (#61959)
     add 16682030e14 [bugfix] fix show partitions command for external catalog validations incompatible with partitions tvf (#62134)
     add d224c08fbb6 [opt](memory) Remove unused fields from CloudReplica (#62125)
     add f754d728b99 [refactor](build) Extract third-party filesystem JAR packaging into post-build.sh (#62144)
     add 03290d2399a [feature](tso) Add global monotonically increasing Timestamp Oracle(TSO) (#61199)
     add a0b9e3784f9 [Bug](function) fix wrong result of window funnel v2 + deduplication/fixed mode (#62043)
     add 9c7ec9e132c [fix](tpcds) Change sr_ticket_number and ss_ticket_number to bigint in SF10000 schema (#62158)
     add 2cf8a386e28 [fix](lineage) Propagate connectAttributes through FE forward path for scheduleInfo (#62082)
     add 958731935a3 [chore](beut) using uuid as dir name to make the test more stable (#62127)
     add 32d40262c3f [fix](metrics) Fix prepared statement QPS metrics not counted when audit log disabled (#61621)
     add 0e4ffd0b40a [refine](be) remove -Wno-deprecated-declarations and fix all deprecated usages (#62098)
     add 63654958c67 [fix](audit) Fix UnboundAlias digest when name comes from child (#62160)
     add 361bbed335a [fix](profile) populate inverted index metrics for SEARCH() query path (#62121)
     add 094438f551c [refactor](fe) Introduce pluggable filesystem SPI to unify cloud/storage and fe-core/fs (#62023)
     add a2bc37f021e [fix](auth) Fix HTTP API authentication framework for admin operations (#60761)
     add 0ba5b455250 [refactor](fe) Decouple DecimalLiteral from SessionVariable (#62166)
     add b31412ae784 [chore](cloud) Change range iterator check pattern from do...while() to while() to get better robustness (#59019)
     add 7bd2ddae9fc [bugfix] fix doris build failure because of no cuda support scene, and add FAISS_ENABLE_GPU switch to enable it or not by user, default value as OFF (#62133)
     add c39633520a0 [fix](fe) Fix NoSuchElementException when count with MATCH_ALL expression (#62172)
     add b95bf645c4b [refactor](fe) Decouple analysis.DateLiteral from nereids.util.DateUtils (#62154)
     add 7ad64890477 [fix](memtable) using memtable memory instead of load memory to calculate adaptive write buffer size (#62104)
     add 9c226f5bf0f [fix](regression) isolate ann_index_p0 table names (#62178)
     add ebf08f296db [fix](doris catalog) FragmentMgr should not cancel virtual doris cluster query (#62135)
     add e41a7fbe85e [chore](fe) clean some code (#62171)
     add 1cf74d131ef [fix](paimon) add jindo oss support and token propagation (#62106)
     add 6ea8fa5d44e [fix](pipeline) Prevent wake_up() from submitting finalized task to scheduler (#62155)
     add 629ab2fcae5 [improvement](be) Optimize array distance functions to avoid material… (#61969)
     add 2f172a943dd [refine](code) Add comments and benchmarks for ColumnView. (#61678)
     add c9c2a5c1353 [feature](RoutineLoad) Support RoutineLoad IAM auth (#61324)
     add 06d114b4ce1 [Fix](pyudf) Fix import conflicts for modules with the same top-level name (#62167)
     add ff36db5b6fb [fix](memory) track IO layer read buffers via MemTrackerLimiter using PODArray (#62032)
     add 78da3c9d4e2 [fix](delete) avoid quorum stalls on delete push failures (#61647)
     add bb217873838 [improve](job) Support internal pass-through properties with "__" prefix in streaming job (#62193)
     add 0ccaaf423da [fix](test) Make S3FileWriter boundary test multipart mock thread-safe (#62149)
     add 2ea624eb2e3 [chore](fe-dep)Update aircompressor version to 2.0.3 (#62239)
     add d2a9be1cb0d [fix](test) fix unstable test agg_strategy_variable (#62169)
     add 91d2bc2566c [opt](memory) limit max block bytes per batch in the write path (#61821)
     add dc9b25f1ca2 [chore](physcial plan) remove useless call of SlotDesc's parent (#62233)
     add 443ae22a7c1 [Chore](pipeline) make wake up do not return error (#62190)
     add 1063e2094c4 [chore](RF) use a mock tuple descriptor to init CTEScanNode (#62235)
     add dded5cd2898 [fix](auditlog) fix AuditLoaderPlugin occasional occurrence garbled Chinese characters in audit logs (#61902)
     add 589b6a551fd [fix](cloud) Avoid recycle the instance which has successor (#62234)
     add b6e5f22ff56 [fix](balance) Fix PartitionRebalancer generating invalid moves to BEs without required storage medium (#62206)
     add eb2567d97ea [opt](nereids) optimize length(str_col) by only read offset sub column (#62205)
     add 61b241ce8a6 [Enhancement](optimizer) Support multi-mode CTE inline strategy (#60601)
     add 2014238a5f6 [fix](fe) Fix SHOW BACKENDS field order mismatch (#62207)
     add fa7584cfa36 [opt](mv) simplify get base column names' way (#62228)
     add 8c53f070fb5 Support ANN index on MoW table (#61994)
     add 0f7a1c316da [opt](expr) Remove FixedContainer optimization for StringValueSet (#62243)
     add 791c56d85db [feature](inverted index) support DROP INDEX ON PARTITION for inverted index (#62181)
     add c2cc2998fed [chore](join node) remove useless innerRef field in JoinNodeBase (#62292)
     add 9fdcd552f5f [Chore](tool) enlarge tpch sf1000 supplier buckets number (#62214)
     add 11406e9d66e [refactor](Descriptor) remove TupleDescriptor's TableRefInfo (#62290)
     add e45d3cefda4 [refactor](desc) use TupleID in SlotDescriptor to avoid import TupleDescriptor in it (#62280)
     add 91d349c2fba [chore](expr) decouple Expr from unnecessary class (#62279)
     add 4813be5ba31 [improvement](fe) Enhance COALESCE simplification to remove all NullLiterals (#62266)
     add c2f9c2fa0b4  [fix](ldap) Improve LDAP authentication resiliency and diagnostics (#61673)
     add dd59f479af5 [fix](cloud) Delete local rowsets before add_rowsets in cloud schema change (#62256)
     add d23d9ca4d03 [fix](be) Restore workload group limit refresh after memory recovery (#62070)
     add e2e5159b98e [feature](fe) Add information_schema role mappings table (#62077)
     add a8ef64bc748 [fix](fe-dep) upgrade vulnerable dependencies (#62274)
     add 5d6478002e5 [config] Change default value of max_bucket_num_per_partition to 768 (#62286)
     add 7aa904c42ca [refine](function) split monolithic function_string.h into domain-specific files (#62262)
     add 61ab06990ec [fix](tvf) fix tvf return error since thrift message too large to reach limit (#61788)
     add 3d7594249fd [chore](build) Add code style enforcement documentation, skills, and clang-tidy script (#62307)
     add 6f21ae42659 [fix](cloud) Add predecessor instance id (#62276)
     add a39563954eb [test](regression) Shorten generated HMS and DLF identifiers in catalog case (#62313)
     add 8e7da140120 [improvement](be) Remove redundant compile check wrappers (#62300)
     add 60f736eea7a [chore](docker) Make DORIS_CLOUD_PREFIX unique with timestamp and UUID suffix (#62275)
     add 2a812342ba6 [fix](fe) Return early for non-master stream load precommit (#62109)
     add 000395ded91 [fix](fe) Fix redundant aggregation in agg-union query plan (#62231)
     add b74f32faf2e [Fix](compile) fix missing headers (#62340)
     add 795a4d06dcb [refactor](fe) Extract toThrift from descriptor classes into DescriptorToThriftConverter (#62312)
     add 5c560d4f083 [fix](fe) Preload paimon jindo for paimon scanner (#62350)
     add 13a1090f87c [fix] (storage) Fix pointer dereference bug in LocalFileSystem::list_impl (#60907)
     add 65d7ad88eac [doc](be) Add allocator-aware memory review guidance (#62382)
     add 61034e31b9b [fix](be) Keep workload group paused queries blocked when reserve still fails (#62285)
     add bcfcef3f11d [refactor](be) Replace std::unique_ptr with DorisUniqueBufferPtr in SingleValueDataString (#62374)
     add aa1e21db891 [refactor](scan) remove SchemaCache to fix concurrent crash in OlapScanner::prepare (#62327)
     add fcb72f570f9 [fix](decimalv2) fix wrong result of decimalv2 avg (#62346)
     add 0013e26953a [Update](p0) control python version via conf in p0-test (#62338)
     add 865e3b84208 [fix](fe) Fix PullUpPredicates losing NULL rows in INTERSECT/EXCEPT (#62299)
     add 01495e09a1f [fix](test) Fix wrong split count assertion in test_hive_compress_type_large_data (#62360)
     add d3eff595d9e [fix](be) Add missing SCOPED_ATTACH_TASK in download and move_dir callbacks (#62403)
     add 4e0f9bb21fe [fix](test) Fix flaky assertion in test_export_max_file_size (#62341)
     add 833a8a8f98b [refactor](fe) Replace all JMockit usage with Mockito and remove JMockit dependency (#62221)
     add 8a72d9527ee [fix](fe) Fix no_use_cbo_rule hint being silently ignored in EliminateLogicalSelectHint (#62358)
     add e881e452a57 [Improve](job) update flink cdc version for streaming job (#62212)
     add 5d8855d194f [fix](streaming-job) fix streaming job properties not parsed after FE restart (#62298)
     add 2729ddc12b2 [fix](build) improve python detection in clang-format scripts (#62009)
     add dbe5dd8c474 [test](regression) Enable standard URI parsing for OSS bucket-endpoin… (#62429)
     add 3de6d44e433 [feat](plugin) Support multi-root auth plugin loading and normalize OIDC access token auth (#62159)
     add 52da1d6c33e [chore](compaction) change time series threshold from 2000 to 1000 (#61979)
     add afad6967cdc [fix](regression) fix p2 opensky failure (#62447)
     add e8b4c75350b [fix](fe) Force copy-dependencies on cache hits (#62333)
     add d0e6271c6f0 [fix](eagerAgg) Fix eager aggregation incorrectly pushing agg(literal) to nullable side of outer joins (#62107)
     add 94fd23d53d2 [improvement](fe) Evaluate protobuf 4 with Arrow 19 (#61943)
     add 7ec32b4ac59 [Improvement](agg) Add a knob to control local exchange (#62438)
     add 39460636d80 [fix](fe) Fix struct field slot type in NestedColumnPruning for OFFSET-only access (#62446)
     add 18d1558828f [refine](sort) remove VSortExecExprs wrapper class (#62428)
     add f01d36c7baf [chore](ci) Remove Need_2_Approval from required status checks (#62467)
     add ea575d9ccb8 [chore](fe) clear cod under analysis package (#62448)
     add 191061a8003 [fix](be) Fix RuntimeFilter selectivity sampling_frequency lost during VExprContext recreation (#62355)
     add e89a16aec5e [chore](ci) refactor code review workflow to run on PR events with comment-triggered dispatch (#62369)
     add 568ba563ccf [chore](ci) Remove code-review from required status checks (#62470)
     add c63fad0a946 [chore](dep)upgrade vulnerable dependencies (#61893)
     add 8719d70ff3b [improve](ci) Use incremental license check for pull requests  (#62232)
     add df8e0a96833 [fix](ci) Change code-review workflow from approval-based to status-based tracking (#62469)
     add e984a38a7bd [Enhancement](doris-future) Support REGR_ARGX, REGR_ARGY, REGR_COUNT and REGR_R2 aggregate functions (#61352)
     add 50cbb9f82a1 [fix](regression) fix MissingPropertyException in test_query_stmt (#62455)
     add c4948920b5c Revert "[chore](ci) Remove code-review from required status checks" (#62472)
     add 443e1acf438 [Feature](multimodal_embed) Support multimodal(file) embed (#62147)
     add 39d8129ede5 [Bug](profile) Fix ScannerCpuTime profile counter reporting absurdly large values (#62258)
     add 52a0fdf15c2 [fix](regression) fix stale expected output for one_level_nestedtypes_with_s3data (#62488)
     add d3c5dcf6578 [refactor](Expr) move Expr and its related class to fe-catalog module (#62440)
     add 16f84fb31a7 [refactor](fe) Extract isDynamicScheduleTable method to reduce code duplication (#62477)
     add 73b231a82bc [improvement](be) Limit packed file writes to rowset first segment (#62342)
     add e4db8140ebd [fix](test) Rename tpch_sf10_unique_mor_p2 to sf100 and add missing .out files (#62335)
     add ab53cf311d9 [fix](compile) Remove stale compile_check includes from schema_role_mappings_scanner (#62343)
     add 8548d7b86c8 [fix](streaming-job) Fix NPE in StreamingInsertJob.replayOnCommitted during EditLog replay (#62416)
     add f70678ad79c [fix](streaming-job) fix S3 offset and job statistics lost after FE checkpoint restart (#62449)
     add 024614e3f07 [opt](fe)remove classhisto*=trace in JAVA_OPTS_FOR_JDK_17 to prevent printing class histogram in full gc (#62422)
     add 5cbaa4f8b97 [opt](function) simplify FunctionStringPad fast path (#62359)
     add 17bb2c04882 [fix](docker) dcr fe stop grace (#62466)
     add c693e72e3f1 [Enhancement](dependency)optimize the Lists package for unified reference (#62379)
     add 42bf5b2005d [refactor](be) Remove io_helper helper indirection from BE cast paths (#62179)
     add 61042c24be2 [improvement](ci) Enhance opencode review runner with stricter review requirements and higher model variant (#62528)
     add c491c8ad169 [ci](fix) license check (#62495)
     add c9e6e798055 [fix](runtime-filter) Fix race condition in Set operator runtime filter processing (#62434)
     add 4e81acee0d8 [refine](function) enforce `final` on CRTP aggregate function derived classes to enable compiler devirtualization (#62433)
     add 565ff39c24d [regression](load) add some p0 case for load strict mode (#62478)
     add 4eaa942f8ff [fix](Reliability)Fix Doris query service fails after the file handles on the BE node are used up (#62393)
     add 2e7e2a53f42 [fix](regression) Fix typo in different_serialize test data directory introduced by #59489 (#62480)
     add 08b6ecd5fdc [feature](function) support is_valid_utf8 function (#62515)
     add 7a7e70795de [regression](routine_load_p0)add routine load docker cases (#62481)
     add b6178dc4dd3 [fix](insert) fix INSERT job statistics lost in show load after FE restart (#62331)
     add 443158109a8 [Exec](set) use bitset container to speed up hash set (#62532)
     add 74a94d76a1a [refactor](fragment mgr) move report logic to pipeline fragment context to remove callback parameter from ctor (#62500)
     add 1e0af3f855e [ci](fix) license check (#62534)
     add fcf8ac85b6a [fix](ci) Add 'License Check' to required status checks (#62550)
     add 9d59244e352 [opt](ci) "skip buildall" can skip ai code review (#62552)
     add e2c47bb9dbe [chore](CI) Increase AI Review timeout to 120 minutes (#62554)
     add c64e31ebdad [enhance](agg) Optimize AGG shuffle key selection (#60572)
     add 4952cad5ebf [improvement](be) Add stampede protection for AnnIndexIVFListCache (#62442)
     add d88a3a80806 [fix](fe) Fix testExpiredJobCancellation hanging due to race condition with daemon thread (#62556)
     add 0a1d8424de5 [fix](rpc) Fix AutoReleaseClosure data race with callback reuse (#61782)
     add 23e81582aaa [fix](errmsg) Fix wrong error message of insert overwrite (#62555)
     add 817e5f5daa5 [Exec](status) materialization_opertor return the error status by row_id_fetcher (#62513)
     add e1b867605e5 [fix](column) Fix incorrect for-loop (#62517)
     add 9fcd7357ceb [opt](function) optimize `replace()` / `replace_empty()` string functions with columnar fast path (#62551)
     add f148e468f96 [Feature](agg) support bucketed agg operator (#61495)
     add e598b386686 [improvement](docker) Make thirdparty jar download mirror configurable (#62376)
     add 742c046ac17 [fix](fe) Fix view columns losing colUniqueId in lazy materialization (#62533)
     add 0882acce8e3 [fix](rpc) fix GenericPool reopen blocking 18min on stale TLS connections (#61951)
     add fd83868a07c [fix](filecache) reclaim expired tablet hotspot counters and compact sparse shards (#61833)
     add 4640c707e32 [refactor](compaction) submit manual full compaction task to thread pool instead of detached thread (#61222)
     add 2bc4487c624 [refactor](be) Split paused query handling logic (#62485)
     add 9e3d1f30e48 [refine](column) replace field-based nested default with column-level operation in ColumnVariant (#62547)
     add a1910e45de2 [fix](be) Validate stream load content length before group commit (#62110)
     add 4c421c0ae6f [fix](fe) Mask sensitive headers in stream load logs (#62108)
     add e053225f267 [Fix](CI) Make code-review pipeline not required (#62601)
     add 5c325655b8b [feature](fe) Introduce fe-connector SPI framework and migrate JDBC/ES catalogs to plugin-driven architecture (#62183)
     add 0d771c17368 [chore](http) Merge ms and recycler http skeleton (#61502)
     add 2355fcb33b9 [refactoring](multi-catalog)data_lake_reader_refactoring.  (#62306)
     add 4b49f85ec5a [doc](fe) Add fe-filesystem module README and translate ENV_TEST_README to English (#62511)
     add d15d71d21a2 [fix](test) Fix flaky assertion in test_streaming_insert_job_fetch_meta_error (#62499)
     add 708b86ca163 [fix](fe) Fix FE startup argument forwarding (#62587)
     add 3ada833714c [fix](variant) Fix compaction failure on no-key table with variant column uid=0 (#62571)
     add 372168340ce [fix](fe) Support IAM role auth in S3 filesystem (#62584)
     add f4b7509e364 [cleanup](segment)Remove dead get_first_value/get_last_value APIs from PageBuilder (#62493)
     add f334dbaf936 [opt](test) Support IAM Role for s3 client ut test (#62303)
     add cc07f10705e [fix](variant) normalize legacy single-part dot-key subcolumn paths on read (#62409)
     add 9857cb0c137 [fix](insert) fix InsertLoadJob memory leak caused by jobs permanently stuck in PENDING state (#62282)
     add 75854eeed05 [improvement](fe) Extend StringEmptyToLengthRule to handle non-SlotReference string expressions (#62315)
     add ffa7447d581 [tool](fe) add fast-compile-fe.sh for incremental FE compilation (#61429)
     add 7c89384b796 [opt](nerieds) PhysicalOlapScan and PhysicalFileScan should print its id in plan (#62509)
     add 673b028a5c8 [fix](mtmv) Infer null-reject from INNER JoinEdge for multi-hop outer join MV rewrite (#62492)
     add c84731883ac [fix](cloud) Add SC_COMPACTION_CONFLICT error code to retry cross-V1 compaction failures (#62272)
     add 48bad7694db [fix](cloud) Hide KV_TXN_MAYBE_COMMITTED from clients (#62244)
     add 5c4bf4fa7ab [fix](variant) Fix -Wtype-limits error in VariantStatsCaculator (#62632)
     add c3535180fad [upgrade](thirdparty) Add aws cpp sdk kinesis   (#62184)
     add 0f1a7ba172d [improvement](build) Simplify and speed up Hive docker startup workflow (#62103)
     add 4ed1f21a67f [feature](hive) Support LzoTextInputFormat and DeprecatedLzoTextInputFormat in Hive Catalog (#62439)
     add 9125b171710 [improvement](fe) Add current_database builtin alias (#62591)
     add 1c7e71ed5d3 [fix](scan) Fix OOB crash in partition column generation for Iceberg/Paimon tables (#62177)
     add 2a8afb9aa58 [Opt](ai-func) Improving AI function performance (#62494)
     add 1e1ac4fcbb7 [fix](test) Set parallel_pipeline_task_num explicitly in test_hive_compress_type_large_data.  (#62423)
     add 63621d308dd [improvement](fe) Skip zero-length files in FileSplitter to avoid sending empty splits to BE (#62482)
     add 7922905e0b6 [fix](profile) Fix wrong metrics (#62609)
     add 9ba05cd0ba5 [fix](fe) Fix isCountStar incorrectly treating count(null) as count(*) (#62548)
     add 456c0fb54dc [fix](test)Reduce Nested Loop Join data volume to prevent timeouts (#62479)
     add 2d8b326cc14 [feat](compaction) Support ADMIN COMPACT TABLE type='FULL' and enable it in cloud mode (#62596)
     add 369180ec0ed [fix](wal) Fix WAL replay loading 0 rows due to columns being marked as missing (#62658)
     add 7554ffb5acc [fix](docker) Stabilize external docker startup (#62664)
     add b613c3711c9 [feature](lance) Add Rust-based Lance format reader for AI-native dat… (#62182)
     add c3d692fa8bb [fix](case)fix iceberg & maxcompute p2 case. (#62483)
     add a700be3776f [fix](docker) Stabilize ClickHouse external startup (#62690)
     add 336bc563487 [opt](nereids) scale num_nulls in col stats when partition pruned (#62265)
     add 044b2cb9b50 [Profile][exec] The profile hitcache not correct in force refresh and sink id not correct (#62645)
     add abb323e7c02 [refactor](runtime filter) merge runtime filter generator v1 and v2 (#62383)
     add 91aada7b0a4 [fix](audit log) fix empty workload_group value __internal_schema.audit_log (#62651)
     add d3307691ffe [fix](fe-fs) Audit and fix correctness bugs across all FileSystem implementations (#62687)
     add bde883e2a00 [fix](doc) remove unsued docs (#62701)
     add c69976d1279 [opt](ci) Add condition to skip build for specific users (#62702)
     add 97c0b4af0c0 [refine](expr) Check type and column match in `VExpr::execute_column` (#62614)
     add 34b5c6c7c9a [feature](statistics) Skip collecting stats for long string columns (#62686)
     add 4b6ee1da5ee [Enhancement](ci) Support read user concern and history comment in AI Review (#62719)
     add c7ef91fef7a [feature](catalog) Unify ES catalog scan through FILE_SCAN path, eliminating PluginDrivenEsScanNode (#62602)
     add f30f0422d4a [fix](bug) Fix potential bugs (#62695)
     add 55ee1faa2f3 [fix](nereids) Block push-down of filters containing unique functions through Generate and CTE consumer (#62705)
     add 2912b75ce68 [fix](agg) fix redundant copy in collect_set merge (#62640)
     add 9bb13f2b01c [fix](sync) Treat empty cancel alter job list as all rollup jobs (#62712)
     add 7243d7e9ef0 [Fix](compile) Fix the FE compilation failure caused by mvn cache checksum composition error (#62725)
     add cb054446a97 [fix](eager-agg) push aggregation down through filter (#62669)
     add dd15d4faa9f [improve](compaction) Use segment footer raw_data_bytes for first-time batch size estimation (#62263)
     add af71398d290 [Fix](thirdparty) Fix pyudf core cased by Arrow Flight unstable status reconstruction (#62489)
     add e7afcac96d6 [Chore](check) add some Sanity-check for avoid npe (#62691)
     add e143cb2019b [fix](fe) Fix nested column pruning OFFSET dedup crash on array<struct> (#62631)
     add 788e76a3c8c [fix](query) avoid missing result packet for query during master switch (#62721)
     add f554b258e4a [opt](point query) reduce fe CPU usage by eliminating unnecessary operation (#62670)
     add 7dbb507e379 [fix](be) Refine revocable memory accounting for spill (#62581)
     add ac6d2826710 [Opt](func) Improve AggFunc Percentile performance (#62520)
     add 6e655c35357 [fix](datetime)Require exact match in DateTimeV2Type.acceptsType (#62201)
     add 608cfd3ea17 [improve](streaming-job) Add per-job metrics for streaming insert jobs (#62224)
     add 17bde24c151 [improve](StreamingJob) Add lag method for CDC data sources (#62269)
     add d621b937938 [fix](streamingjob) close snapshot readers on re-prepare and harden REST error handling (#62337)
     add eefdcffde10 [Improve](streaming-job) use per-table publication instead of ALL TABLES for PostgreSQL CDC (#62526)
     add 66eaf669810 [fix](streaming-job) roll sample window before accumulating in checkDataQuality (#62636)
     add f3a591ba003 [improve](profile) Skip _init_profile in load_v1 when enable_profile is false (#61131)
     add 618ebd701a0 [opt](rowset) Aggregate non-MOW segment key bounds to reduce rowset meta size (#62604)
     add 589a32cb064 [fix](fe) Reject invalid stream load tokens on commit and rollback (#62111)
     add 65e281bbf38 [Improvement](join) add HashCRC32Return32 and make join_hash_table use 32-bit hash value (#62512)
     add ff563c29411 [improve](streaming-job) Cap auto-resume attempts and expose structured FailureReason (#62345)
     add 27fba6c49ad [Improve](streaming-job) support specifying offset for StreamingInsertJob create and alter (#62490)
     add 1863fbf0e51 [fix](transaction) fix IllegalMonitorStateException in routine load afterAborted when coordinate BE restarts (#61881)
     add eb7da737973 [fix](memory) attach MemTracker to cache background threads to fix orphan crash (#62739)
     add da73f0ba8a3 [fix](be) Fix UB and param order in assert_num_rows_operator (#62800)
     add b5fe79f8298 [fix](iceberg) Decouple JDBC catalog metadata name (#62806)
     add 4f123e09344 [opt](maxcompute)Allocate write block ids from FE and add catalog-level write_max_block_bytes prop. (#62578)
     add 5f84cfce257 [improvement](be) Optimize parquet timestamp convert path (#62559)
     add e87bccbd98d [fix](hll) shrink chars buffer in hll_to_base64 to match offsets (#62797)
     add 2fe909ffd28 [fix](streaming-job) propagate ALTER source/target properties to runtime and persistence (#62553)
     add 882d02581cb [Fix](decimal) Fix unaligned memory access in read_column_from_arrow (#62759)
     add bcdba040e09 [fix](pipeline) guard CountedFinishDependency::sub() against counter underflow (#62815)
     add 6c6932f90aa (cloud) Hold table write lock across first-time dynamic partition setup to prevent CREATE MV race (#62755)
     add 18fceee908f [feature](jsonb) add json_object_flatten scalar function (#62825)
     add 0295f6a0b73 [refactor](cloud) Extract snapshot integration hooks (#62859)
     add 2497a493e4b [fix](fe) Preserve AWS role props in ObjectInfo adapter (#62857)
     add a4f0c487d40 [fix](docker) doris compose supports docker compose v2 (#62851)
     add bc82bbbb831 [fix](be) Fix exchange receiver dependency race (#62777)
     add d61e8eb8d1b [fix](cloud) refresh event warmup backends (#62839)
     add 6dab90e411b [refactor](fe) Remove enable_nereids_load switch (#62703)
     add 9f70b43cb30 [fix](load): fix invalid String.format pattern in NereidsStreamLoadTask (#62225)
     add ec5bc4919cd [improve](profile) Check profile counter should always gt than 0 (#62475)
     add 59668fc86d3 [Fix](security) Avoid potential token leakage risks (#62898)
     add 1e388e69d53 [fix](fe) fix potential NPE in getDeleteBitmapUpdateLock (#62809)
     add 467e7e7a6a2 [Fix](security) Only allow committer and collaborator to trigger code-review (#62904)
     add c518e8f6573 [feature](be) Add adaptive batch size for scan path (#62835)
     add 9dad5bb178c [chore](ci) Restrict job execution to comments from committers (#62912)
     add 53c52f515aa [fix](audit) Mark internal query failures as ERR in audit log (#62908)
     add ffefcae2866 [fix](variant) Skip full footer scan when constructing VariantStatsCaculator (#62819)
     add 0136aa55f59 [fix](fe) address dependency check findings (#62858)
     add 0c9fff3b8ff [fix](serde) fix split_by_delimiter missing backslash escape handling (#61995)
     add aeb982e53ea Fix typo in 'Read this in other language' header (#62570)
     add 430781b1296 [fix](be) Fix ANN query vector extraction to handle all constant expression types (#62637)
     add c31c82fc7f8 [Fix](version) Fix unknown doris version when build in git worktree directory (#62935)
     add 7ba4569729a [fix](memtable) use CPU metrics delta for CPU pressure detection in adaptive flush controller (#62744)
     add afcd99c6971 [fix](Expr) add SerDe for ColumnRefExpr and Expr SerDe unit test (#62900)
     add 42016ce8d54 [fix](mv) Invalidate rewrite cache on constraint changes (#62530)
     add 42c9d92d34a [fix](build) Isolate OpenCode review context files (#62949)
     add 1a5d2e7153e [improvement](build) Fix COMMENT_BODY output injection risk in comment-to-trigger-teamcity workflow (#62934)
     add 284caa22dcc [fix](streaming-job) reject silent-no-op ALTER keys and unsupported load.* properties (#62680)
     add 8ff6044ad24 [refactor](be) Remove pipeline tracing support (#62765)
     add d47a2f91561 [improve](streaming-job) support specifying compute_group for StreamingJob (#62747)
     add d5ed612295f [fix](insert) Report physical file count in LoadStatistic.FileNumber (#62804)
     add 41227049c06 [improvement](build) Fix COMMENT_BODY injection risk and block pipeline script tampering (#62953)
     add 5f4654886df [Improvement](local exchange) Copy-on-read mode for AdaptivePassthrou… (#62760)
     add 0a40a41b671 [Improvement](minor) Reduce memory in predicates (#62794)
     add 48fca63dfcc [fix](nljoin) Fix nested loop join (#62803)
     add b1c1a5ad6df [fix](cloud) avoid NPE and clear stale cache on warmup job cancel/expire (#62805)
     add 5efc7f4bcd5 [fix](fe) Clear warmup jobs on available backends (#62931)
     add 412c89ba2c2 [Fix](warm up) Fix warm up don't retry due to error message change (#62886)
     add 8ca1b908345 [refine](datatype)replace manual memcpy with unaligned_load for unaligned memory reads (#62918)
     add 0ec388ff956 [chore](collaborator) Add linrrarity as a collaborator (#62962)
     add 92f993c68ed [chore](collaborator) fix collaborator github username (#62963)
     add 6d7ba6a3ad8 [fix](runtime-filter) Restore _applied_rf_num update in late arrival path (#62872)
     add 9368a15b378 [feature](fe) Add partition filter sql block rule (#62196)
     add fcd4d98593e [Opt](parse) Add fast path for canonical format datetime parse (#62757)
     add f920c63942f [fix](nereids) Fix DST spring-forward gap handling in timestamptz literal (#62945)
     add c2cdd3d2ca4 [fix](be) Poll packed file async close without blocking (#62938)
     add 407823768fa [fix](build) Prefer thirdparty mirror for JuiceFS downloads (#61968)
     add 26761c6b2f9 [improve](streaming-job) support SSL and align MySQL CDC source with PG (#62700)
     add 235822d9cf8 [fix](streaming-job) bound cdc_client RPCs with per-category timeouts (#62870)
     add 249bb6d3db6 [refactor](ann) Avoid copying ANN search results (#62924)
     add 5c56cfd0bf3 [fix](nereids) Do not push offset-only access path for CHAR columns (#62854)
     add d628e4b1836 [improvement](be) Restructure OLAP scan profile timers into tree hierarchy (#62717)
     add ddce328ca32 [fix](streaming-job) fix filteredRows always 0 on single-table S3 streaming (#62816)
     add fed20f06899 [fix](be) Prevent finalized pipeline task resubmission (#62891)
     add 6d774eb331a [Feature] add binlog meta module (row type) (1/3) (#62058)
     add f461a2858b6 [fix](point query) Keep LogicalOlapScan for short-circuit point query on empty table (#62948)
     add 138da30a7e7 [fix](fe) Return unknown stats for system tables (#62913)
     add 8c891caf772 [fix](fe) Fix ReadListener leak on rejected worker task (#62679)
     add df232fe3aa7 [opt](point query) reduce point-query network overhead by resending query context on cache miss (#62836)
     add 149cb668fb9 [fix](cloud) Avoid deleting nonexistent delete bitmap files (#62967)
     add 030e6d73302 [fix](nereids) Allocate fresh ExprId for constants when pushing project into Union (#62296)
     add 48da948ab7f [fix](functions)Preserve TIMESTAMPTZ in LEAD/LAG by adding TimeStampTzType signature matching (#62779)
     add 4479e72758b [fix] Support AND predicates on CreateTime/FinishTime in SHOW ALTER (#62619)
     add 35c6887064f [fix](tool) Fix meta_tool coredump and dead loop issues (#61509)
     add 8209b79a35e [enhance](nereids) improve masking of user's password for ALTER USER and CREATE USER commands in audit logs (#62141)
     add 65e4da48cc4 [fix](agg,array) support TIMESTAMPTZ in multiple aggregate and array functions (#62756)
     add ff2157bb4d7 [fix](load) fix broker load silently loaded only the first file when parsing multiple files path (#62969)
     add efd7067464e  [refine](exec) add SubQueue abstraction and thread-safety annotations to DataQueue         (#62947)
     add 9ee1ba12b7c Revert "[chore](ci) Restrict job execution to comments from committers" (#63043)
     add 30d9109fbd7 [chore](regression-test) fix some unstable cases (#62922)
     add accd8a04106  [refine](code) remove dead code across core types and utilities (#62994)
     add ceeb9bc09a9 [feat](Iceberg)Rest & S3Table Support Iam-role (#60498)
     add 668805a6ab2 [fix](filecache) reject oversized block size in add_cell (#62878)
     add 98dec70384d [fix](fe) Fix Ranger column-level privilege bypass when CTE combined (#61741)
     add 9cd2008070e [Refactor](Variant) add NestedGroup path metadata support (#62848)
     add 258c9991de8 [improvement](build) Optimize FE incremental build packaging (#62915)
     add 555ea5c61d2 [fix](zone-map) Avoid per-row Field temporaries in TypedZoneMapIndexWriter (#62544)
     add 4955aaf65a4 [refine](column) remove IDataType get_default (#62582)
     add 5de1ed88d4b [feat](join) support outer join reorder in dphyper (#61146)
     add c5883bb4ae1 [fix](function) preserve sign for negative sub-hour TIMESTAMPTZ offsets (#62823)
     add 4d33d4d2352 [fix](be) Move #include directives outside namespace blocks to avoid ODR violations (#62871)
     add 1a602f13188 [test](regression) Add debug logging for flaky agg_strategy case (#63008)
     add c7629ae23cf [fix](iceberg) Allow disabling REST catalog view operations (#62986)
     add d34b16c8fd3 [bug](cloud restore) forbid restoring table with property 'light_schema change' = 'false' in cloud mode (#62914)
     add 98d55d88c3e [opt](point query) use fastUniqueId instead of UUID.randomUUID to reduce contention (#63028)
     add 17bbba45a52 [fix](pipeline) avoid data queue sink dependency lost wakeup (#63055)
     add 3f3c79c01c7 [Fix](pyudf) make Python server pool selection alive-aware and version-isolated (#62620)
     add 8897940c2ab [opt](statistic) use explicit datetimev2 as update_time column's type (#63014)
     add 6e6729cd834 [feature](dynamic table) support stream part 2: stream query & comsuption infrastructure (#62453)
     add b3af03dafc1 [Fix](fragment) avoid query-ctx map clear self-deadlock when stop FragmentMgr (#62954)
     add 333e33d6a6b [fix](parse) No longer throws exceptions when parse datetime failed in `from_olap_string` (#63035)
     add 9ba7e0416d1 [fix](be) Load JNI log4j2 properties config (#63063)
     add 4d643725ef1 [fix](inverted index) resolve variant sub-column indexes for score() (#62992)
     add 75b381a8930 [Enhancement](pyudf) Support parameterless calls for pythonUDF (#62624)
     add 7ca6ffc5f53 [refine](exec) reject redundant same-type assert_cast (#63059)
     add 9793d554afe [fix](cloud) Skip skewed warmup rowset latency samples (#62941)
     add 915add164df [Opt](function) Remove datetime transfomers check in release mode (#63003)
     add a9ca36f68ee [fix](timestamptz) Preserve correct DST fold branch to go cross the transition point (#63034)
     add 497cbf5c27e [Log](pyudf) Add progress logs for python process pool init (#62974)
     add 2dc0d0a8c81 [refine](exec/operator) replace std::mutex/std::lock_guard with annotated wrappers for thread safety analysis (#63070)
     add eaa4ef92b90 [Opt](cloud) Add rate limit for BE to MS rpc (#60344)
     add 85d2e421c0a [improvement](workflow) Switch OpenCode review runner to OpenAI provider (#63097)
     add 27913c931db [fix](variant) Fix variant flat-leaf root read plan (#63086)
     add e360c3d0d07 [cloud](fe) RestoreJob cannot deserialize Tablet when upgrade (#62673)
     add 4178178dc7b [improvement](fe) Add virtual compute group switch metric (#63036)
     add 75176c0b8bd [fix](statistics) Skip statistics cache for system dbs (#63089)
     add 559b0009a98 [refactor](nereids)Remove defer materialize (#62917)
     add 6b051db1b21 [improvement](executor) unify current query runtime statistics and expose task progress (#60567)
     add 8e7977850f0 [chore](expr) remove useless if in `is_acting_on_a_slot` (#63095)
     add 62391b3d761 [fix](parquet) Fix parquet row group column lookup crash and row group reader lifetime (#63102)
     add 1ddd2a91315 [chore](CI) Make AI code review required (#63120)
     add 694c94f65f5  [refine](Field) rename Tuple to Struct in BE core types (#63093)
     add 43a7b4932c2 [improvement](recycler) Avoid single-point read/write during sequentially reading key (#62476)
     add 892eae27bba [Fix](ai_agg) isolate AI_AGG query_ctx per aggregate state (#63080)
     add 0f45376b78c [fix](fe) Disable row-store lazy fetch for shared base columns (#62864)
     add 464d89c5f62 [fix](mtmv) Avoid mutating excluded trigger tables (#62984)
     add 28cc2bf11d5 [Improvement](scan) support push down limit to segment iterator (#62222)
     add 9896994e9e9 [Fix](pyudf) clear Nereids UDF registry on drop database (#62950)
     add 429c0958e12 [fix](user_var)fix integer typing and prefer Variable.realExpression for argument/type resolution (#62524)
     add 789ec330d97 [refactor](inverted-index) replace void* query_value with typed paraminterface (#62960)
     add 771b22d262f [fix](mv) Align extra-join elimination safety check (#62527)
     add ca858fd4a87 [fix](be) Correct Arrow UTF8/String size limit (#63137)
     add 446a3421990 [fix](analyze) Preserve variant subfields in view definitions to fix select view result wrong when view select has variant field (#62907)
     add 7680c6dc8ab [fix](fe) Fix remote Flight SQL result receiver initialization (#63136)
     add 97caf97f62a [fix](variant) materialize NG compaction regular paths (#63104)
     add f563b2eb382 [Improve](variant) Keep first duplicate Variant JSON path (#63082)
     add 1470b6c4146 [fix](insert) Avoid formatting generated insert errors (#62982)
     add 91ff38d98d0 [fix](nereids) Run CheckCast on INSERT VALUES to reject illegal  casts (#62905)
     add 54d7885340a [Fix](pyudf) clear stale UDAF state cache on drop (#63062)
     add 416ad95f80b [fix](streaming-job) start counting task max interval after the first record is received (#63141)
     add 058d97897f6 [fix](fe) fix host not match if start fe in metadata_failure_recovery (#62748)
     new 75857dd29bc [refactor](local shuffle) FE local exchange planning - squashed for rebase
     new 35c69241bb7 [fix](build) Fix compilation issues after rebasing on apache/master
     new b55f12ffab0 [test](local shuffle) Add regression test for enable_local_exchange_before_agg
     new f675ebd4604 [fix](local shuffle) Align AggregationNode with enable_local_exchange_before_agg
     new 8ab2182213f [fix](local shuffle) UnionNode propagates HASH only when downstream requires shuffle for correctness

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (73f5abd220e)
            \
             N -- N -- N   refs/heads/fe_local_shuffle (8ab2182213f)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .asf.yaml                                          |     4 +-
 .claude/skills/be-code-style/SKILL.md              |    67 +
 .claude/skills/clang-tidy-check/SKILL.md           |   138 +
 .claude/skills/code-review/SKILL.md                |    11 +-
 .claude/skills/doris-docker-regression/SKILL.md    |   138 +
 .claude/skills/fe-code-style/SKILL.md              |   102 +
 .github/workflows/comment-to-trigger-teamcity.yml  |    41 +-
 .github/workflows/gitleaks-pr-check.yml            |    86 +
 .github/workflows/license-eyes.yml                 |    63 +-
 .github/workflows/opencode-review-comment.yml      |   122 +
 .github/workflows/opencode-review-runner.yml       |   257 +
 .github/workflows/opencode-review-sync-result.yml  |    97 +
 .github/workflows/opencode-review.yml              |   169 -
 .github/workflows/pr-approve-status.yml            |    43 -
 .gitleaks.toml                                     |    35 +
 .licenserc.yaml                                    |     9 +
 .rat-excludes                                      |     1 +
 AGENTS.md                                          |    30 +-
 README.md                                          |     2 +-
 be/CMakeLists.txt                                  |    34 +-
 be/benchmark/benchmark_bit_pack.hpp                |    12 +-
 be/benchmark/benchmark_column_view.hpp             |   484 +
 be/benchmark/benchmark_fastunion.hpp               |     2 +-
 be/benchmark/benchmark_hll_merge.hpp               |     2 +-
 be/benchmark/benchmark_hybrid_set.hpp              |   190 +
 be/benchmark/benchmark_main.cpp                    |    10 +-
 be/benchmark/benchmark_string.hpp                  |    38 +-
 be/benchmark/benchmark_string_replace.hpp          |   269 +
 be/benchmark/benchmark_zone_map_index.hpp          |   257 +
 be/benchmark/binary_cast_benchmark.hpp             |    14 +-
 be/cmake/rust.cmake                                |    81 +
 be/cmake/thirdparty.cmake                          |     1 +
 be/src/agent/agent_server.cpp                      |     5 +-
 be/src/agent/cgroup_cpu_ctl.cpp                    |     4 -
 be/src/agent/task_worker_pool.cpp                  |   125 +-
 be/src/agent/task_worker_pool.h                    |     3 +
 be/src/agent/workload_group_listener.cpp           |     3 -
 be/src/cloud/cloud_base_compaction.h               |     7 +
 be/src/cloud/cloud_committed_rs_mgr.cpp            |     2 -
 be/src/cloud/cloud_committed_rs_mgr.h              |     2 -
 be/src/cloud/cloud_compaction_action.cpp           |    12 +-
 be/src/cloud/cloud_cumulative_compaction.cpp       |     5 +-
 be/src/cloud/cloud_cumulative_compaction.h         |     9 +-
 .../cloud/cloud_cumulative_compaction_policy.cpp   |     2 -
 be/src/cloud/cloud_cumulative_compaction_policy.h  |     2 -
 be/src/cloud/cloud_delete_task.cpp                 |     5 +-
 be/src/cloud/cloud_delta_writer.cpp                |     6 +-
 .../cloud/cloud_engine_calc_delete_bitmap_task.cpp |     2 -
 be/src/cloud/cloud_full_compaction.cpp             |     2 +-
 be/src/cloud/cloud_full_compaction.h               |     7 +
 be/src/cloud/cloud_internal_service.cpp            |    90 +-
 be/src/cloud/cloud_meta_mgr.cpp                    |   309 +-
 be/src/cloud/cloud_meta_mgr.h                      |    28 +-
 be/src/cloud/cloud_ms_backpressure_handler.cpp     |   521 +
 be/src/cloud/cloud_ms_backpressure_handler.h       |   231 +
 be/src/cloud/cloud_ms_rpc_rate_limit_services.cpp  |    55 +
 be/src/cloud/cloud_ms_rpc_rate_limit_services.h    |    59 +
 be/src/cloud/cloud_ms_rpc_rate_limiters.cpp        |   189 +
 be/src/cloud/cloud_ms_rpc_rate_limiters.h          |   118 +
 be/src/cloud/cloud_rowset_builder.cpp              |     5 +-
 be/src/cloud/cloud_schema_change_job.cpp           |    73 +-
 be/src/cloud/cloud_snapshot_loader.h               |     2 -
 be/src/cloud/cloud_snapshot_mgr.cpp                |    10 +-
 be/src/cloud/cloud_storage_engine.cpp              |   136 +-
 be/src/cloud/cloud_storage_engine.h                |    10 +-
 be/src/cloud/cloud_tablet.cpp                      |    39 +-
 be/src/cloud/cloud_tablet.h                        |     7 +
 be/src/cloud/cloud_tablet_hotspot.cpp              |   342 +-
 be/src/cloud/cloud_tablet_hotspot.h                |    39 +-
 be/src/cloud/cloud_tablets_channel.cpp             |     6 +-
 be/src/cloud/cloud_throttle_state_machine.cpp      |   272 +
 be/src/cloud/cloud_throttle_state_machine.h        |   176 +
 be/src/cloud/cloud_warm_up_manager.cpp             |    20 +-
 be/src/cloud/cloud_warm_up_manager.h               |     3 +-
 be/src/cloud/config.cpp                            |    46 +-
 be/src/cloud/config.h                              |    65 +-
 be/src/cloud/delete_bitmap_file_reader.cpp         |     2 -
 be/src/cloud/delete_bitmap_file_writer.cpp         |     2 -
 be/src/cloud/pb_convert.cpp                        |   108 +-
 be/src/common/AGENTS.md                            |     7 +-
 be/src/common/be_mock_util.cpp                     |     2 -
 be/src/common/compare.h                            |     3 -
 be/src/common/compile_check_begin.h                |    30 -
 be/src/common/compile_check_end.h                  |    23 -
 be/src/common/config.cpp                           |    36 +-
 be/src/common/config.h                             |    39 +-
 be/src/common/daemon.cpp                           |     1 +
 be/src/common/metrics/doris_metrics.cpp            |    12 +
 be/src/common/metrics/doris_metrics.h              |     6 +
 be/src/common/metrics/system_metrics.cpp           |    39 +-
 be/src/common/metrics/system_metrics.h             |    12 +
 be/src/common/multi_version.h                      |     8 +-
 be/src/common/status.h                             |     1 +
 be/src/common/thread_safety_annotations.h          |   171 +
 be/src/core/AGENTS.md                              |     8 +
 be/src/core/assert_cast.h                          |    16 +
 be/src/core/binary_cast.hpp                        |    34 -
 be/src/core/block/block.cpp                        |    35 -
 be/src/core/block/block.h                          |    23 +-
 be/src/core/call_on_type_index.h                   |     2 -
 be/src/core/column/column.h                        |     9 +
 be/src/core/column/column_array.cpp                |     4 -
 be/src/core/column/column_complex.h                |     2 +-
 be/src/core/column/column_const.cpp                |     1 -
 be/src/core/column/column_const.h                  |     2 -
 be/src/core/column/column_decimal.cpp              |     2 +-
 be/src/core/column/column_decimal.h                |     2 -
 be/src/core/column/column_dictionary.h             |     2 -
 be/src/core/column/column_execute_util.h           |    24 +
 be/src/core/column/column_fixed_length_object.h    |     2 +-
 be/src/core/column/column_nullable.cpp             |    22 +-
 be/src/core/column/column_nullable.h               |    18 +-
 be/src/core/column/column_string.cpp               |    16 +-
 be/src/core/column/column_string.h                 |    29 +-
 be/src/core/column/column_struct.cpp               |    13 +-
 be/src/core/column/column_varbinary.cpp            |     9 +-
 be/src/core/column/column_varbinary.h              |     2 -
 be/src/core/column/column_variant.cpp              |   361 +-
 be/src/core/column/column_variant.h                |    18 +-
 be/src/core/column/column_vector.cpp               |     4 +-
 be/src/core/column/column_vector.h                 |     9 +-
 be/src/core/column/predicate_column.h              |     4 +-
 be/src/core/cow.h                                  |     2 -
 be/src/core/custom_allocator.h                     |     2 -
 be/src/core/data_type/convert_field_to_type.cpp    |     4 +-
 be/src/core/data_type/data_type.cpp                |     7 +-
 be/src/core/data_type/data_type.h                  |     9 +-
 be/src/core/data_type/data_type_array.cpp          |     6 -
 be/src/core/data_type/data_type_array.h            |     1 -
 be/src/core/data_type/data_type_bitmap.cpp         |     2 -
 be/src/core/data_type/data_type_bitmap.h           |     4 -
 be/src/core/data_type/data_type_date.cpp           |    17 +-
 be/src/core/data_type/data_type_date.h             |    13 +-
 .../data_type/data_type_date_or_datetime_v2.cpp    |    33 +-
 .../core/data_type/data_type_date_or_datetime_v2.h |    27 +-
 be/src/core/data_type/data_type_date_time.cpp      |    17 +-
 be/src/core/data_type/data_type_date_time.h        |    14 +-
 be/src/core/data_type/data_type_decimal.cpp        |    12 +-
 be/src/core/data_type/data_type_decimal.h          |     4 -
 be/src/core/data_type/data_type_factory.cpp        |    28 +-
 .../data_type/data_type_fixed_length_object.cpp    |     1 -
 .../core/data_type/data_type_fixed_length_object.h |     2 -
 be/src/core/data_type/data_type_hll.cpp            |     1 -
 be/src/core/data_type/data_type_hll.h              |     4 -
 be/src/core/data_type/data_type_ipv4.cpp           |     5 -
 be/src/core/data_type/data_type_ipv6.cpp           |     1 -
 be/src/core/data_type/data_type_jsonb.cpp          |    12 -
 be/src/core/data_type/data_type_jsonb.h            |     4 -
 be/src/core/data_type/data_type_map.cpp            |    10 -
 be/src/core/data_type/data_type_map.h              |     1 -
 be/src/core/data_type/data_type_nothing.h          |     6 -
 be/src/core/data_type/data_type_nullable.cpp       |     5 -
 be/src/core/data_type/data_type_nullable.h         |     2 -
 be/src/core/data_type/data_type_number_base.cpp    |    16 +-
 be/src/core/data_type/data_type_number_base.h      |     6 +-
 be/src/core/data_type/data_type_quantilestate.cpp  |     4 +-
 be/src/core/data_type/data_type_quantilestate.h    |     4 -
 be/src/core/data_type/data_type_string.cpp         |     5 -
 be/src/core/data_type/data_type_string.h           |     2 -
 be/src/core/data_type/data_type_struct.cpp         |    13 +-
 be/src/core/data_type/data_type_struct.h           |     2 -
 be/src/core/data_type/data_type_timestamptz.cpp    |     4 +-
 be/src/core/data_type/data_type_varbinary.cpp      |     5 -
 be/src/core/data_type/data_type_varbinary.h        |     2 -
 be/src/core/data_type/data_type_variant.cpp        |    23 +-
 be/src/core/data_type/data_type_variant.h          |     6 +-
 be/src/core/data_type/define_primitive_type.h      |    42 +-
 be/src/core/data_type/nested_utils.cpp             |     5 -
 be/src/core/data_type/nested_utils.h               |     6 -
 be/src/core/data_type/number_traits.h              |    84 -
 be/src/core/data_type/primitive_type.cpp           |     9 +-
 be/src/core/data_type/primitive_type.h             |    16 +-
 .../complex_type_deserialize_util.h                |     4 +-
 .../core/data_type_serde/data_type_array_serde.cpp |    10 +-
 .../core/data_type_serde/data_type_array_serde.h   |     1 -
 .../data_type_serde/data_type_bitmap_serde.cpp     |     1 -
 .../data_type_date_or_datetime_serde.cpp           |   105 +-
 .../data_type_serde/data_type_datetimev2_serde.cpp |    52 +-
 .../data_type_serde/data_type_datev2_serde.cpp     |    48 +-
 .../data_type_serde/data_type_decimal_serde.cpp    |    35 +-
 .../core/data_type_serde/data_type_decimal_serde.h |     2 -
 .../core/data_type_serde/data_type_hll_serde.cpp   |     1 -
 .../core/data_type_serde/data_type_ipv4_serde.cpp  |     5 +-
 .../core/data_type_serde/data_type_ipv6_serde.cpp  |     5 +-
 .../core/data_type_serde/data_type_jsonb_serde.cpp |     8 +-
 .../core/data_type_serde/data_type_map_serde.cpp   |    10 +-
 be/src/core/data_type_serde/data_type_map_serde.h  |     2 -
 .../data_type_serde/data_type_nullable_serde.cpp   |     1 -
 .../data_type_serde/data_type_nullable_serde.h     |     2 -
 .../data_type_serde/data_type_number_serde.cpp     |    50 +-
 .../core/data_type_serde/data_type_number_serde.h  |     8 +-
 .../data_type_quantilestate_serde.h                |     2 -
 be/src/core/data_type_serde/data_type_serde.cpp    |     1 -
 be/src/core/data_type_serde/data_type_serde.h      |     4 +-
 .../data_type_serde/data_type_string_serde.cpp     |     7 +-
 .../core/data_type_serde/data_type_string_serde.h  |     2 -
 .../data_type_serde/data_type_struct_serde.cpp     |     1 -
 .../core/data_type_serde/data_type_struct_serde.h  |     2 -
 .../core/data_type_serde/data_type_time_serde.cpp  |    35 +-
 be/src/core/data_type_serde/data_type_time_serde.h |     2 -
 .../data_type_timestamptz_serde.cpp                |    14 +-
 .../data_type_serde/data_type_varbinary_serde.h    |     2 -
 .../data_type_serde/data_type_variant_serde.cpp    |     8 +-
 .../core/data_type_serde/data_type_variant_serde.h |     2 -
 .../core/data_type_serde/datelike_serde_common.hpp |    93 +
 be/src/core/decimal12.h                            |     2 -
 be/src/core/field.cpp                              |    19 +-
 be/src/core/field.h                                |    12 +-
 be/src/core/memcmp_small.h                         |    15 +-
 be/src/core/packed_int128.h                        |     2 +
 be/src/core/string_ref.cpp                         |    15 -
 be/src/core/string_ref.h                           |     4 -
 be/src/core/string_view.h                          |     2 -
 be/src/core/types.h                                |     2 -
 be/src/core/value/decimalv2_value.cpp              |     2 -
 be/src/core/value/decimalv2_value.h                |     2 -
 be/src/core/value/hll.cpp                          |     2 -
 be/src/core/value/hll.h                            |     2 -
 be/src/core/value/ip_address_cidr.h                |     4 +-
 be/src/core/value/ipv4_value.h                     |     3 -
 be/src/core/value/ipv6_value.h                     |     3 -
 be/src/core/value/jsonb_value.h                    |     2 -
 be/src/core/value/large_int_value.h                |     2 -
 be/src/core/value/map_value.cpp                    |    29 -
 be/src/core/value/map_value.h                      |     2 -
 be/src/core/value/quantile_state.cpp               |     1 -
 be/src/core/value/struct_value.cpp                 |    27 -
 be/src/core/value/struct_value.h                   |     2 -
 be/src/core/value/time_value.h                     |     4 +-
 be/src/core/value/timestamptz_value.cpp            |    71 +-
 be/src/core/value/timestamptz_value.h              |     9 +-
 be/src/core/value/vdatetime_value.cpp              |    48 -
 be/src/core/value/vdatetime_value.h                |    17 -
 be/src/core/wide_integer_impl.h                    |     2 -
 be/src/exec/common/agg_utils.h                     |   116 +-
 be/src/exec/common/endian.h                        |     2 -
 be/src/exec/common/format_ip.h                     |     2 -
 .../exec/common/hash_table/hash_crc32_return32.h   |   151 +
 be/src/exec/common/hash_table/hash_map_context.h   |    11 +-
 be/src/exec/common/hash_table/hash_table.h         |     3 -
 .../exec/common/hash_table/hash_table_set_build.h  |     2 -
 .../exec/common/hash_table/hash_table_set_probe.h  |     2 -
 be/src/exec/common/hash_table/join_hash_table.h    |     4 +-
 be/src/exec/common/histogram_helpers.hpp           |     3 -
 be/src/exec/common/ipv6_to_binary.h                |    25 +-
 be/src/exec/common/join_utils.h                    |    12 +-
 be/src/exec/common/memory.cpp                      |    90 +
 be/src/exec/common/memory.h                        |   116 +
 be/src/exec/common/partition_sort_utils.cpp        |     4 +-
 be/src/exec/common/partition_sort_utils.h          |     8 +-
 be/src/exec/common/sip_hash.h                      |     5 +-
 be/src/exec/common/string_searcher.h               |     2 -
 be/src/exec/common/stringop_substring.h            |     3 -
 be/src/exec/common/varbinaryop_subbinary.h         |     2 -
 be/src/exec/common/variant_util.cpp                |   242 +-
 be/src/exec/common/variant_util.h                  |     2 +-
 be/src/exec/es/es_scan_reader.cpp                  |   269 -
 be/src/exec/es/es_scroll_parser.cpp                |   893 -
 be/src/exec/es/es_scroll_query.cpp                 |   150 -
 be/src/exec/exchange/exchange_writer.cpp           |     1 -
 be/src/exec/exchange/exchange_writer.h             |     2 -
 .../exec/exchange/local_exchange_sink_operator.cpp |     4 +-
 .../exec/exchange/local_exchange_sink_operator.h   |     2 +-
 be/src/exec/exchange/local_exchanger.cpp           |    87 +-
 be/src/exec/exchange/local_exchanger.h             |    12 +-
 be/src/exec/exchange/vdata_stream_mgr.cpp          |     1 -
 be/src/exec/exchange/vdata_stream_mgr.h            |     3 -
 be/src/exec/exchange/vdata_stream_recvr.cpp        |     1 -
 be/src/exec/exchange/vdata_stream_recvr.h          |     3 -
 be/src/exec/exchange/vdata_stream_sender.cpp       |     1 -
 be/src/exec/exchange/vdata_stream_sender.h         |     4 +-
 be/src/exec/operator/aggregation_sink_operator.cpp |     1 -
 be/src/exec/operator/aggregation_sink_operator.h   |     5 +-
 .../exec/operator/aggregation_source_operator.cpp  |     1 -
 be/src/exec/operator/aggregation_source_operator.h |     2 -
 be/src/exec/operator/analytic_sink_operator.cpp    |     5 +-
 be/src/exec/operator/analytic_sink_operator.h      |     2 -
 be/src/exec/operator/analytic_source_operator.cpp  |    10 +-
 be/src/exec/operator/analytic_source_operator.h    |     3 -
 be/src/exec/operator/assert_num_rows_operator.cpp  |     7 +-
 be/src/exec/operator/assert_num_rows_operator.h    |     2 -
 .../bucketed_aggregation_sink_operator.cpp         |   511 +
 .../operator/bucketed_aggregation_sink_operator.h  |   145 +
 .../bucketed_aggregation_source_operator.cpp       |   732 +
 .../bucketed_aggregation_source_operator.h         |   121 +
 be/src/exec/operator/cache_sink_operator.cpp       |     1 -
 be/src/exec/operator/cache_sink_operator.h         |     2 -
 be/src/exec/operator/cache_source_operator.cpp     |     7 +-
 be/src/exec/operator/cache_source_operator.h       |     2 -
 be/src/exec/operator/data_queue.cpp                |   234 +-
 be/src/exec/operator/data_queue.h                  |   113 +-
 be/src/exec/operator/datagen_operator.cpp          |     1 -
 be/src/exec/operator/datagen_operator.h            |     2 -
 be/src/exec/operator/dict_sink_operator.cpp        |     2 -
 be/src/exec/operator/dict_sink_operator.h          |     2 -
 .../distinct_streaming_aggregation_operator.cpp    |     1 -
 .../distinct_streaming_aggregation_operator.h      |     6 +-
 be/src/exec/operator/empty_set_operator.cpp        |     2 -
 be/src/exec/operator/empty_set_operator.h          |     2 -
 be/src/exec/operator/es_scan_operator.cpp          |   152 -
 be/src/exec/operator/es_scan_operator.h            |    89 -
 be/src/exec/operator/exchange_sink_buffer.cpp      |    58 +-
 be/src/exec/operator/exchange_sink_buffer.h        |     2 -
 be/src/exec/operator/exchange_sink_operator.cpp    |     4 +-
 be/src/exec/operator/exchange_sink_operator.h      |     8 +-
 be/src/exec/operator/exchange_source_operator.cpp  |    25 +-
 be/src/exec/operator/exchange_source_operator.h    |     7 +-
 be/src/exec/operator/file_scan_operator.cpp        |     1 -
 be/src/exec/operator/file_scan_operator.h          |     2 -
 .../operator/group_commit_block_sink_operator.cpp  |     1 -
 .../operator/group_commit_block_sink_operator.h    |     2 -
 .../exec/operator/group_commit_scan_operator.cpp   |     1 -
 be/src/exec/operator/group_commit_scan_operator.h  |     2 -
 be/src/exec/operator/hashjoin_build_sink.cpp       |    55 +-
 be/src/exec/operator/hashjoin_build_sink.h         |     7 +-
 be/src/exec/operator/hashjoin_probe_operator.cpp   |     1 -
 be/src/exec/operator/hashjoin_probe_operator.h     |     2 -
 be/src/exec/operator/hive_table_sink_operator.cpp  |     1 -
 be/src/exec/operator/hive_table_sink_operator.h    |     2 -
 .../exec/operator/iceberg_delete_sink_operator.cpp |     1 -
 .../exec/operator/iceberg_delete_sink_operator.h   |     2 -
 .../exec/operator/iceberg_merge_sink_operator.cpp  |     2 -
 be/src/exec/operator/iceberg_merge_sink_operator.h |     2 -
 .../exec/operator/iceberg_table_sink_operator.cpp  |     1 -
 be/src/exec/operator/iceberg_table_sink_operator.h |     2 -
 be/src/exec/operator/jdbc_scan_operator.cpp        |     1 -
 be/src/exec/operator/jdbc_scan_operator.h          |     2 -
 be/src/exec/operator/jdbc_table_sink_operator.cpp  |     1 -
 be/src/exec/operator/jdbc_table_sink_operator.h    |     2 -
 .../operator/join/process_hash_table_probe_impl.h  |    10 +-
 be/src/exec/operator/join_build_sink_operator.cpp  |     1 -
 be/src/exec/operator/join_build_sink_operator.h    |     2 -
 be/src/exec/operator/join_probe_operator.cpp       |     1 -
 be/src/exec/operator/join_probe_operator.h         |     2 -
 .../operator/local_merge_sort_source_operator.cpp  |    16 +-
 .../operator/local_merge_sort_source_operator.h    |     5 +-
 be/src/exec/operator/materialization_opertor.cpp   |    93 +-
 be/src/exec/operator/materialization_opertor.h     |     5 +-
 .../operator/maxcompute_table_sink_operator.cpp    |     1 -
 .../exec/operator/maxcompute_table_sink_operator.h |     2 -
 .../exec/operator/memory_scratch_sink_operator.cpp |     1 -
 .../exec/operator/memory_scratch_sink_operator.h   |     2 -
 be/src/exec/operator/meta_scan_operator.cpp        |     1 -
 be/src/exec/operator/meta_scan_operator.h          |     2 -
 be/src/exec/operator/mock_scan_operator.h          |    29 +-
 .../exec/operator/multi_cast_data_stream_sink.cpp  |     1 -
 be/src/exec/operator/multi_cast_data_stream_sink.h |     2 -
 .../operator/multi_cast_data_stream_source.cpp     |     1 -
 .../exec/operator/multi_cast_data_stream_source.h  |     2 -
 be/src/exec/operator/multi_cast_data_streamer.cpp  |    20 +-
 be/src/exec/operator/multi_cast_data_streamer.h    |    21 +-
 .../operator/nested_loop_join_build_operator.cpp   |     1 -
 .../operator/nested_loop_join_build_operator.h     |     2 -
 .../operator/nested_loop_join_probe_operator.cpp   |     6 +-
 .../operator/nested_loop_join_probe_operator.h     |     2 -
 be/src/exec/operator/olap_scan_operator.cpp        |   269 +-
 be/src/exec/operator/olap_scan_operator.h          |    13 +-
 be/src/exec/operator/olap_table_sink_operator.h    |     8 +-
 be/src/exec/operator/olap_table_sink_v2_operator.h |     8 +-
 be/src/exec/operator/operator.cpp                  |    34 +-
 be/src/exec/operator/operator.h                    |    29 +-
 .../exec/operator/partition_sort_sink_operator.cpp |    28 +-
 .../exec/operator/partition_sort_sink_operator.h   |     7 +-
 .../operator/partition_sort_source_operator.cpp    |    11 +-
 .../exec/operator/partition_sort_source_operator.h |     2 -
 .../partitioned_aggregation_sink_operator.cpp      |     2 -
 .../partitioned_aggregation_sink_operator.h        |     2 -
 .../partitioned_aggregation_source_operator.cpp    |     8 +-
 .../partitioned_aggregation_source_operator.h      |     2 -
 .../partitioned_hash_join_probe_operator.cpp       |     8 +-
 .../partitioned_hash_join_probe_operator.h         |     2 -
 .../partitioned_hash_join_sink_operator.cpp        |    17 +-
 .../operator/partitioned_hash_join_sink_operator.h |     2 -
 .../exec/operator/rec_cte_anchor_sink_operator.cpp |     1 -
 .../exec/operator/rec_cte_anchor_sink_operator.h   |     2 -
 be/src/exec/operator/rec_cte_scan_operator.h       |     2 -
 be/src/exec/operator/rec_cte_sink_operator.cpp     |     1 -
 be/src/exec/operator/rec_cte_sink_operator.h       |     2 -
 be/src/exec/operator/rec_cte_source_operator.cpp   |     1 -
 be/src/exec/operator/rec_cte_source_operator.h     |   124 +-
 be/src/exec/operator/repeat_operator.cpp           |     2 -
 be/src/exec/operator/repeat_operator.h             |     2 -
 be/src/exec/operator/result_file_sink_operator.cpp |    19 +-
 be/src/exec/operator/result_file_sink_operator.h   |     2 -
 be/src/exec/operator/result_sink_operator.cpp      |    25 +-
 be/src/exec/operator/result_sink_operator.h        |     4 +-
 be/src/exec/operator/scan_operator.cpp             |    88 +-
 be/src/exec/operator/scan_operator.h               |    20 +-
 be/src/exec/operator/schema_scan_operator.cpp      |    10 +-
 be/src/exec/operator/schema_scan_operator.h        |    10 +-
 be/src/exec/operator/select_operator.h             |     2 -
 be/src/exec/operator/set_probe_sink_operator.cpp   |     2 -
 be/src/exec/operator/set_probe_sink_operator.h     |     2 -
 be/src/exec/operator/set_sink_operator.cpp         |    16 +-
 be/src/exec/operator/set_sink_operator.h           |     7 +-
 be/src/exec/operator/set_source_operator.cpp       |     1 -
 be/src/exec/operator/set_source_operator.h         |     2 -
 be/src/exec/operator/sort_sink_operator.cpp        |    22 +-
 be/src/exec/operator/sort_sink_operator.h          |     7 +-
 be/src/exec/operator/sort_source_operator.cpp      |     2 -
 .../operator/spill_iceberg_table_sink_operator.cpp |     2 -
 .../operator/spill_iceberg_table_sink_operator.h   |     2 -
 be/src/exec/operator/spill_sort_sink_operator.cpp  |     2 -
 be/src/exec/operator/spill_sort_sink_operator.h    |     2 -
 .../exec/operator/spill_sort_source_operator.cpp   |     2 -
 be/src/exec/operator/spill_sort_source_operator.h  |     2 -
 be/src/exec/operator/spill_utils.h                 |     3 -
 .../operator/streaming_aggregation_operator.cpp    |     2 -
 .../exec/operator/streaming_aggregation_operator.h |     5 +-
 be/src/exec/operator/table_function_operator.cpp   |   343 +-
 be/src/exec/operator/table_function_operator.h     |    14 +-
 be/src/exec/operator/tvf_table_sink_operator.cpp   |     1 -
 be/src/exec/operator/tvf_table_sink_operator.h     |     2 -
 be/src/exec/operator/union_sink_operator.cpp       |     2 -
 be/src/exec/operator/union_sink_operator.h         |     2 -
 be/src/exec/operator/union_source_operator.cpp     |     2 -
 be/src/exec/operator/union_source_operator.h       |     2 -
 be/src/exec/partitioner/partitioner.cpp            |     1 -
 be/src/exec/partitioner/partitioner.h              |     2 -
 be/src/exec/pipeline/dependency.cpp                |    10 +-
 be/src/exec/pipeline/dependency.h                  |   196 +-
 be/src/exec/pipeline/pipeline.cpp                  |     6 +-
 be/src/exec/pipeline/pipeline.h                    |     2 -
 be/src/exec/pipeline/pipeline_fragment_context.cpp |   526 +-
 be/src/exec/pipeline/pipeline_fragment_context.h   |    73 +-
 be/src/exec/pipeline/pipeline_task.cpp             |   165 +-
 be/src/exec/pipeline/pipeline_task.h               |    38 +-
 be/src/exec/pipeline/pipeline_tracing.cpp          |   181 -
 be/src/exec/pipeline/pipeline_tracing.h            |   109 -
 be/src/exec/pipeline/rec_cte_shared_state.h        |     2 -
 be/src/exec/pipeline/task_queue.cpp                |     1 -
 be/src/exec/pipeline/task_queue.h                  |     2 -
 be/src/exec/pipeline/task_scheduler.cpp            |    23 +-
 be/src/exec/rowid_fetcher.cpp                      |     9 +-
 be/src/exec/runtime_filter/runtime_filter.cpp      |    26 +-
 be/src/exec/runtime_filter/runtime_filter.h        |    16 +-
 .../runtime_filter/runtime_filter_consumer.cpp     |    26 +-
 .../exec/runtime_filter/runtime_filter_consumer.h  |     2 -
 .../runtime_filter_consumer_helper.cpp             |     1 -
 .../runtime_filter_consumer_helper.h               |     2 -
 .../runtime_filter/runtime_filter_definitions.h    |     2 -
 be/src/exec/runtime_filter/runtime_filter_merger.h |     2 -
 be/src/exec/runtime_filter/runtime_filter_mgr.cpp  |    90 +-
 be/src/exec/runtime_filter/runtime_filter_mgr.h    |    29 +-
 .../runtime_filter/runtime_filter_producer.cpp     |    72 +-
 .../exec/runtime_filter/runtime_filter_producer.h  |    68 +-
 .../runtime_filter_producer_helper.cpp             |     1 -
 .../runtime_filter_producer_helper.h               |     2 -
 .../runtime_filter_producer_helper_cross.h         |     2 -
 .../runtime_filter_producer_helper_set.h           |     2 -
 .../exec/runtime_filter/runtime_filter_wrapper.cpp |    17 +-
 .../exec/runtime_filter/runtime_filter_wrapper.h   |     2 -
 be/src/exec/runtime_filter/utils.cpp               |     1 -
 be/src/exec/runtime_filter/utils.h                 |     2 -
 be/src/exec/scan/es_scanner.cpp                    |   205 -
 be/src/exec/scan/es_scanner.h                      |    80 -
 be/src/exec/scan/file_scanner.cpp                  |  1092 +-
 be/src/exec/scan/file_scanner.h                    |    71 +-
 be/src/exec/scan/meta_scanner.cpp                  |    13 +-
 be/src/exec/scan/meta_scanner.h                    |     2 -
 be/src/exec/scan/olap_scanner.cpp                  |   167 +-
 be/src/exec/scan/olap_scanner.h                    |     2 +-
 be/src/exec/scan/scanner.cpp                       |    33 +-
 be/src/exec/scan/scanner.h                         |    57 +-
 be/src/exec/scan/scanner_context.cpp               |   320 +-
 be/src/exec/scan/scanner_context.h                 |   142 +-
 be/src/exec/scan/scanner_scheduler.cpp             |   199 +-
 be/src/exec/scan/split_source_connector.h          |     2 -
 .../time_sharing/time_sharing_task_executor.cpp    |     1 -
 .../time_sharing/time_sharing_task_handle.cpp      |     1 -
 be/src/exec/scan/vector_search_user_params.cpp     |     1 -
 be/src/exec/scan/vector_search_user_params.h       |     4 +-
 be/src/exec/sink/autoinc_buffer.cpp                |     1 -
 be/src/exec/sink/autoinc_buffer.h                  |     2 -
 be/src/exec/sink/delta_writer_v2_pool.cpp          |     1 -
 be/src/exec/sink/delta_writer_v2_pool.h            |     3 -
 be/src/exec/sink/load_stream_map_pool.cpp          |     1 -
 be/src/exec/sink/load_stream_map_pool.h            |     3 -
 be/src/exec/sink/load_stream_stub.cpp              |     1 -
 be/src/exec/sink/load_stream_stub.h                |     3 -
 .../sink/scale_writer_partitioning_exchanger.hpp   |     2 -
 be/src/exec/sink/tablet_sink_hash_partitioner.cpp  |     1 -
 be/src/exec/sink/tablet_sink_hash_partitioner.h    |     2 -
 be/src/exec/sink/viceberg_delete_sink.cpp          |   271 +-
 be/src/exec/sink/viceberg_delete_sink.h            |    29 +-
 be/src/exec/sink/viceberg_merge_sink.cpp           |     7 +
 be/src/exec/sink/vrow_distribution.cpp             |    11 +-
 be/src/exec/sink/vrow_distribution.h               |     3 -
 be/src/exec/sink/vtablet_block_convertor.cpp       |     1 -
 be/src/exec/sink/vtablet_block_convertor.h         |     2 -
 be/src/exec/sink/vtablet_finder.cpp                |     1 -
 be/src/exec/sink/vtablet_finder.h                  |     2 -
 be/src/exec/sink/writer/async_result_writer.cpp    |     2 -
 be/src/exec/sink/writer/iceberg/partition_data.h   |     2 -
 .../sink/writer/iceberg/partition_transformers.h   |    14 +-
 .../writer/iceberg/viceberg_delete_file_writer.cpp |     1 +
 .../writer/iceberg/viceberg_partition_writer.cpp   |     1 +
 .../sink/writer/iceberg/viceberg_sort_writer.cpp   |    12 +-
 .../sink/writer/iceberg/viceberg_sort_writer.h     |     2 +-
 .../sink/writer/iceberg/viceberg_table_writer.cpp  |    36 +-
 .../sink/writer/iceberg/viceberg_table_writer.h    |     8 +
 .../sink/writer/maxcompute/vmc_table_writer.cpp    |    55 +-
 .../exec/sink/writer/maxcompute/vmc_table_writer.h |    13 -
 .../sink/writer/varrow_flight_result_writer.cpp    |     1 -
 .../exec/sink/writer/varrow_flight_result_writer.h |     3 -
 be/src/exec/sink/writer/vhive_table_writer.cpp     |     1 -
 be/src/exec/sink/writer/vmysql_result_writer.cpp   |     1 -
 be/src/exec/sink/writer/vmysql_result_writer.h     |     3 -
 be/src/exec/sink/writer/vtablet_writer.cpp         |    13 +-
 be/src/exec/sink/writer/vtablet_writer_v2.cpp      |     1 -
 be/src/exec/sort/heap_sorter.cpp                   |    18 +-
 be/src/exec/sort/heap_sorter.h                     |    11 +-
 be/src/exec/sort/partition_sorter.cpp              |    11 +-
 be/src/exec/sort/partition_sorter.h                |     5 +-
 be/src/exec/sort/sort_block.cpp                    |     1 -
 be/src/exec/sort/sort_block.h                      |     2 -
 be/src/exec/sort/sort_cursor.h                     |     2 -
 be/src/exec/sort/sorter.cpp                        |    28 +-
 be/src/exec/sort/sorter.h                          |    25 +-
 be/src/exec/sort/topn_sorter.cpp                   |     9 +-
 be/src/exec/sort/topn_sorter.h                     |     7 +-
 be/src/exec/sort/vsort_exec_exprs.cpp              |    87 -
 be/src/exec/sort/vsort_exec_exprs.h                |    86 -
 be/src/exec/sort/vsorted_run_merger.cpp            |     1 -
 be/src/exec/sort/vsorted_run_merger.h              |     3 -
 be/src/exec/spill/spill_file.cpp                   |     1 -
 be/src/exec/spill/spill_file.h                     |     2 -
 be/src/exec/spill/spill_file_manager.cpp           |     1 -
 be/src/exec/spill/spill_file_manager.h             |     2 -
 be/src/exec/spill/spill_file_reader.cpp            |     1 -
 be/src/exec/spill/spill_file_reader.h              |     2 -
 be/src/exec/spill/spill_file_writer.cpp            |     1 -
 be/src/exec/spill/spill_file_writer.h              |     3 -
 be/src/exec/spill/spill_repartitioner.cpp          |     2 -
 be/src/exec/table_connector.cpp                    |     2 -
 be/src/exprs/aggregate/aggregate_function.h        |    36 +-
 .../exprs/aggregate/aggregate_function_ai_agg.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_ai_agg.h |    87 +-
 .../aggregate_function_approx_count_distinct.cpp   |     1 -
 .../aggregate_function_approx_count_distinct.h     |     5 +-
 .../aggregate/aggregate_function_array_agg.cpp     |     1 -
 .../exprs/aggregate/aggregate_function_array_agg.h |     6 +-
 be/src/exprs/aggregate/aggregate_function_avg.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_avg.h    |     9 +-
 .../aggregate/aggregate_function_avg_weighted.cpp  |     1 -
 .../aggregate/aggregate_function_avg_weighted.h    |     4 -
 be/src/exprs/aggregate/aggregate_function_binary.h |     5 +-
 be/src/exprs/aggregate/aggregate_function_bit.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_bit.h    |     3 -
 .../exprs/aggregate/aggregate_function_bitmap.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_bitmap.h |     2 -
 .../aggregate/aggregate_function_bitmap_agg.cpp    |     1 -
 .../aggregate/aggregate_function_bitmap_agg.h      |     2 -
 .../aggregate/aggregate_function_bool_union.cpp    |     2 -
 .../aggregate/aggregate_function_bool_union.h      |     3 -
 .../exprs/aggregate/aggregate_function_collect.cpp |     1 -
 .../exprs/aggregate/aggregate_function_collect.h   |    18 +-
 .../aggregate/aggregate_function_collect_impl.h    |     2 -
 .../aggregate/aggregate_function_collect_limit.cpp |     1 -
 .../aggregate_function_collect_no_limit.cpp        |     1 -
 .../aggregate/aggregate_function_combinator.h      |     3 -
 be/src/exprs/aggregate/aggregate_function_corr.h   |     6 +-
 .../exprs/aggregate/aggregate_function_count.cpp   |     1 -
 be/src/exprs/aggregate/aggregate_function_count.h  |     3 -
 .../aggregate/aggregate_function_count_by_enum.cpp |     1 -
 .../aggregate/aggregate_function_count_by_enum.h   |     2 -
 .../exprs/aggregate/aggregate_function_covar.cpp   |     1 -
 be/src/exprs/aggregate/aggregate_function_covar.h  |     4 +-
 .../aggregate/aggregate_function_distinct.cpp      |     1 -
 .../exprs/aggregate/aggregate_function_distinct.h  |     5 +-
 .../exprs/aggregate/aggregate_function_foreach.cpp |     1 -
 .../exprs/aggregate/aggregate_function_foreach.h   |     6 +-
 .../aggregate/aggregate_function_foreachv2.cpp     |     3 +-
 .../aggregate_function_group_array_intersect.cpp   |     1 -
 .../aggregate_function_group_array_set_op.cpp      |     1 -
 .../aggregate_function_group_array_set_op.h        |     5 +-
 .../aggregate_function_group_array_set_op_impl.h   |    90 +-
 .../aggregate_function_group_array_union.cpp       |     1 -
 .../aggregate/aggregate_function_group_concat.cpp  |     1 -
 .../aggregate/aggregate_function_group_concat.h    |     3 -
 .../aggregate/aggregate_function_histogram.cpp     |     3 +-
 .../exprs/aggregate/aggregate_function_histogram.h |     7 +-
 .../aggregate/aggregate_function_hll_union_agg.cpp |     1 -
 .../aggregate/aggregate_function_hll_union_agg.h   |     5 +-
 .../exprs/aggregate/aggregate_function_java_udaf.h |     4 -
 .../aggregate/aggregate_function_kurtosis.cpp      |     1 -
 .../aggregate_function_linear_histogram.cpp        |     1 -
 .../aggregate_function_linear_histogram.h          |     3 -
 be/src/exprs/aggregate/aggregate_function_map.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_map.h    |     3 -
 .../exprs/aggregate/aggregate_function_map_v2.cpp  |     2 +-
 be/src/exprs/aggregate/aggregate_function_map_v2.h |     3 -
 .../exprs/aggregate/aggregate_function_min_max.cpp |     1 -
 .../exprs/aggregate/aggregate_function_min_max.h   |    16 +-
 .../aggregate/aggregate_function_min_max_by.cpp    |    53 +-
 .../aggregate/aggregate_function_min_max_by.h      |    92 +-
 .../aggregate/aggregate_function_min_max_impl.h    |     3 -
 be/src/exprs/aggregate/aggregate_function_null.h   |     3 -
 .../exprs/aggregate/aggregate_function_null_v2.h   |     3 -
 .../aggregate_function_orth_bitmap_expr_cal.cpp    |    37 +
 ...gregate_function_orth_bitmap_expr_cal_count.cpp |    37 +
 .../aggregate_function_orth_bitmap_intersect.cpp   |    29 +
 ...regate_function_orth_bitmap_intersect_count.cpp |    29 +
 .../aggregate_function_orth_bitmap_union_count.cpp |    36 +
 .../aggregate_function_orth_intersect_count.cpp    |    29 +
 .../aggregate_function_orthogonal_bitmap.cpp       |    79 +-
 .../aggregate_function_orthogonal_bitmap.h         |    13 +-
 .../aggregate_function_orthogonal_bitmap_impl.h    |    62 +
 .../aggregate/aggregate_function_percentile.cpp    |    10 +-
 .../aggregate/aggregate_function_percentile.h      |   455 +-
 .../aggregate_function_percentile_reservoir.cpp    |     2 -
 .../exprs/aggregate/aggregate_function_product.h   |    17 +-
 .../aggregate/aggregate_function_python_udaf.cpp   |     4 +-
 .../aggregate/aggregate_function_python_udaf.h     |     3 -
 .../aggregate_function_quantile_state.cpp          |     1 -
 .../aggregate/aggregate_function_quantile_state.h  |     3 -
 .../exprs/aggregate/aggregate_function_reader.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_reader.h |     3 -
 .../aggregate_function_reader_first_last.h         |   348 +-
 .../aggregate_function_reader_replace.cpp          |   263 +-
 be/src/exprs/aggregate/aggregate_function_regr.cpp |    93 +
 be/src/exprs/aggregate/aggregate_function_regr.h   |   533 +
 .../aggregate/aggregate_function_regr_union.cpp    |    67 -
 .../aggregate/aggregate_function_regr_union.h      |   392 -
 .../aggregate/aggregate_function_retention.cpp     |     1 -
 .../exprs/aggregate/aggregate_function_retention.h |     4 +-
 be/src/exprs/aggregate/aggregate_function_rpc.h    |     1 -
 be/src/exprs/aggregate/aggregate_function_sem.cpp  |     2 -
 be/src/exprs/aggregate/aggregate_function_sem.h    |     2 -
 .../aggregate_function_sequence_match.cpp          |     1 -
 .../aggregate/aggregate_function_sequence_match.h  |    42 +-
 .../aggregate_function_simple_factory.cpp          |     7 +-
 .../aggregate/aggregate_function_simple_factory.h  |    12 +-
 be/src/exprs/aggregate/aggregate_function_skew.cpp |     1 -
 be/src/exprs/aggregate/aggregate_function_sort.cpp |     1 -
 be/src/exprs/aggregate/aggregate_function_sort.h   |     5 +-
 .../aggregate/aggregate_function_state_merge.h     |     3 -
 .../aggregate/aggregate_function_state_union.h     |     6 +-
 .../exprs/aggregate/aggregate_function_statistic.h |     4 +-
 .../exprs/aggregate/aggregate_function_stddev.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_stddev.h |     5 +-
 be/src/exprs/aggregate/aggregate_function_sum.cpp  |     1 -
 be/src/exprs/aggregate/aggregate_function_sum.h    |     3 -
 be/src/exprs/aggregate/aggregate_function_topn.cpp |     1 -
 be/src/exprs/aggregate/aggregate_function_topn.h   |    35 +-
 .../aggregate/aggregate_function_topn_array.cpp    |     1 -
 .../aggregate/aggregate_function_topn_weighted.cpp |     1 -
 be/src/exprs/aggregate/aggregate_function_uniq.cpp |     1 -
 be/src/exprs/aggregate/aggregate_function_uniq.h   |    28 +-
 .../aggregate_function_uniq_distribute_key.cpp     |     1 -
 .../aggregate_function_uniq_distribute_key.h       |    25 +-
 .../exprs/aggregate/aggregate_function_window.cpp  |    39 +-
 be/src/exprs/aggregate/aggregate_function_window.h |    19 +-
 .../aggregate/aggregate_function_window_first.cpp  |     9 +-
 .../aggregate/aggregate_function_window_funnel.cpp |     4 +-
 .../aggregate/aggregate_function_window_funnel.h   |     7 +-
 .../aggregate_function_window_funnel_v2.cpp        |    54 +
 .../aggregate_function_window_funnel_v2.h          |   676 +
 .../aggregate/aggregate_function_window_impl.h     |   348 +-
 .../aggregate/aggregate_function_window_lag.cpp    |     6 +-
 .../aggregate/aggregate_function_window_last.cpp   |     9 +-
 .../aggregate/aggregate_function_window_lead.cpp   |     6 +-
 .../aggregate_function_window_nth_value.cpp        |     9 +-
 be/src/exprs/aggregate/factory_helpers.h           |     3 -
 be/src/exprs/aggregate/helpers.h                   |     3 -
 be/src/exprs/aggregate/moments.h                   |     3 -
 be/src/exprs/bitset_container.h                    |   156 +
 be/src/exprs/block_bloom_filter.hpp                |     2 -
 be/src/exprs/block_bloom_filter_impl.cc            |     2 -
 be/src/exprs/bloom_filter_func.h                   |     2 -
 be/src/exprs/bloom_filter_func_adaptor.h           |    13 +-
 be/src/exprs/bloom_filter_func_impl.h              |     2 -
 be/src/exprs/create_predicate_function.h           |    47 +-
 be/src/exprs/function/ai/ai_adapter.h              |   540 +-
 be/src/exprs/function/ai/ai_classify.h             |    15 +-
 be/src/exprs/function/ai/ai_extract.h              |    16 +-
 be/src/exprs/function/ai/ai_filter.h               |    37 +-
 be/src/exprs/function/ai/ai_fix_grammar.h          |    12 +-
 be/src/exprs/function/ai/ai_functions.h            |   420 +-
 be/src/exprs/function/ai/ai_generate.h             |    10 +-
 be/src/exprs/function/ai/ai_mask.h                 |    14 +-
 be/src/exprs/function/ai/ai_sentiment.h            |    19 +-
 be/src/exprs/function/ai/ai_similarity.h           |    41 +-
 be/src/exprs/function/ai/ai_summarize.h            |    13 +-
 be/src/exprs/function/ai/ai_translate.h            |    13 +-
 be/src/exprs/function/ai/embed.h                   |   354 +
 .../function/array/function_array_contains_all.cpp |     6 +-
 .../exprs/function/array/function_array_distance.h |   173 +-
 .../exprs/function/array/function_array_element.h  |   127 +-
 .../function/array/function_array_enumerate.cpp    |     2 +-
 .../array/function_array_enumerate_uniq.cpp        |     3 +-
 .../function/array/function_array_flatten.cpp      |     1 -
 be/src/exprs/function/array/function_array_index.h |    56 +-
 .../function/array/function_array_intersect.cpp    |     1 -
 be/src/exprs/function/array/function_array_join.h  |     2 -
 be/src/exprs/function/array/function_array_map.h   |     2 -
 .../exprs/function/array/function_array_mapped.h   |     2 -
 be/src/exprs/function/array/function_array_nary.h  |     2 -
 .../exprs/function/array/function_array_range.cpp  |     1 -
 .../exprs/function/array/function_array_remove.h   |     4 +-
 .../exprs/function/array/function_array_reverse.h  |     1 +
 .../function/array/function_array_shuffle.cpp      |     1 -
 .../exprs/function/array/function_array_sortby.cpp |     1 -
 .../exprs/function/array/function_array_split.cpp  |     1 -
 .../exprs/function/array/function_array_union.cpp  |     1 -
 .../exprs/function/array/function_array_utils.cpp  |     2 +-
 be/src/exprs/function/array/function_array_utils.h |     4 +-
 .../array/function_array_with_constant.cpp         |     2 -
 .../exprs/function/array/function_arrays_overlap.h |    13 +-
 be/src/exprs/function/cast/cast_base.h             |    20 +-
 be/src/exprs/function/cast/cast_to_array.h         |     2 -
 .../function/cast/cast_to_basic_number_common.h    |    65 +-
 be/src/exprs/function/cast/cast_to_boolean.h       |    44 +-
 be/src/exprs/function/cast/cast_to_date.h          |    43 -
 .../cast/cast_to_date_or_datetime_impl.hpp         |   145 +-
 .../function/cast/cast_to_datetimev2_impl.hpp      |   125 +-
 be/src/exprs/function/cast/cast_to_datev2_impl.hpp |    60 +-
 be/src/exprs/function/cast/cast_to_decimal.h       |   457 +-
 be/src/exprs/function/cast/cast_to_float.h         |    52 +-
 be/src/exprs/function/cast/cast_to_int.h           |    54 +-
 be/src/exprs/function/cast/cast_to_ip.h            |    42 -
 be/src/exprs/function/cast/cast_to_jsonb.h         |     5 +-
 be/src/exprs/function/cast/cast_to_map.h           |     4 +-
 be/src/exprs/function/cast/cast_to_string.h        |    26 +-
 be/src/exprs/function/cast/cast_to_struct.h        |     2 -
 be/src/exprs/function/cast/cast_to_time_impl.hpp   |    55 +-
 be/src/exprs/function/cast/cast_to_timestamptz.h   |    58 +-
 .../function/cast/cast_to_timestamptz_impl.hpp     |    83 +
 be/src/exprs/function/cast/cast_to_variant.h       |    33 +-
 be/src/exprs/function/cast/cast_wrapper_decls.h    |    53 +
 be/src/exprs/function/cast/function_cast.cpp       |    35 +-
 be/src/exprs/function/cast/function_cast_bool.cpp  |    55 +
 be/src/exprs/function/cast/function_cast_date.cpp  |    83 +
 .../exprs/function/cast/function_cast_decimal.cpp  |    80 +
 be/src/exprs/function/cast/function_cast_float.cpp |    70 +
 be/src/exprs/function/cast/function_cast_int.cpp   |    76 +
 be/src/exprs/function/cast/function_cast_ip.cpp    |    78 +
 .../function/cast/function_cast_timestamptz.cpp    |    57 +
 .../exprs/function/complex_hash_map_dictionary.cpp |     2 -
 be/src/exprs/function/date_format_type.h           |     2 -
 be/src/exprs/function/date_time_transforms.h       |     2 -
 be/src/exprs/function/function.cpp                 |     2 -
 be/src/exprs/function/function_bit_count.cpp       |     1 -
 be/src/exprs/function/function_bitmap.cpp          |     1 -
 be/src/exprs/function/function_bitmap_min_or_max.h |     3 +-
 be/src/exprs/function/function_collection_in.h     |     7 +-
 be/src/exprs/function/function_compress.cpp        |     2 -
 be/src/exprs/function/function_conv.cpp            |     8 +-
 be/src/exprs/function/function_convert_tz.cpp      |    14 +-
 .../function_date_or_datetime_computation.h        |    10 +-
 .../function_date_or_datetime_to_something.h       |     6 +-
 .../function/function_datetime_floor_ceil.cpp      |    22 +-
 .../function/function_datetime_string_to_string.h  |     3 -
 be/src/exprs/function/function_encryption.cpp      |     1 -
 be/src/exprs/function/function_fake.cpp            |    40 +-
 be/src/exprs/function/function_format.cpp          |     6 +-
 be/src/exprs/function/function_hash.cpp            |    10 +-
 be/src/exprs/function/function_helpers.cpp         |     2 -
 be/src/exprs/function/function_hex.cpp             |     1 -
 be/src/exprs/function/function_hll.cpp             |    24 +-
 be/src/exprs/function/function_ip.h                |    21 +-
 be/src/exprs/function/function_json.cpp            |    38 +-
 be/src/exprs/function/function_jsonb.cpp           |     3 +-
 be/src/exprs/function/function_jsonb_transform.cpp |    55 +
 be/src/exprs/function/function_multi_match.cpp     |     7 +-
 .../exprs/function/function_needs_to_handle_null.h |     2 -
 .../function/function_other_types_to_date.cpp      |    20 +-
 be/src/exprs/function/function_python_udf.cpp      |    10 +-
 be/src/exprs/function/function_regexp.cpp          |     1 -
 be/src/exprs/function/function_reverse.h           |     2 +-
 be/src/exprs/function/function_rpc.cpp             |     1 -
 be/src/exprs/function/function_score.cpp           |     2 -
 be/src/exprs/function/function_search.cpp          |   113 +-
 be/src/exprs/function/function_soundex.cpp         |     2 -
 be/src/exprs/function/function_split_by_regexp.cpp |     2 -
 be/src/exprs/function/function_string.cpp          |    93 +-
 be/src/exprs/function/function_string.h            |  5392 ----
 be/src/exprs/function/function_string_basic.cpp    |   393 +
 be/src/exprs/function/function_string_concat.h     |  1002 +
 be/src/exprs/function/function_string_digest.cpp   |   253 +
 be/src/exprs/function/function_string_format.h     |   776 +
 be/src/exprs/function/function_string_mask.cpp     |   243 +
 be/src/exprs/function/function_string_misc.cpp     |  1665 +
 be/src/exprs/function/function_string_replace.h    |   589 +
 be/src/exprs/function/function_string_search.cpp   |   881 +
 be/src/exprs/function/function_string_url.cpp      |   285 +
 .../function/function_time_value_to_field.cpp      |     2 -
 be/src/exprs/function/function_to_json.cpp         |     1 -
 be/src/exprs/function/function_tokenize.cpp        |     2 -
 be/src/exprs/function/function_varbinary.cpp       |     2 -
 be/src/exprs/function/function_varbinary.h         |     2 -
 be/src/exprs/function/function_variant_element.cpp |    63 +-
 be/src/exprs/function/function_width_bucket.cpp    |     9 +-
 be/src/exprs/function/functions_comparison.h       |    11 +-
 .../function/functions_multi_string_position.cpp   |     2 -
 be/src/exprs/function/in.h                         |    13 +-
 be/src/exprs/function/is_not_null.h                |     2 +-
 be/src/exprs/function/least_greast.cpp             |     2 +-
 be/src/exprs/function/like.cpp                     |     2 -
 be/src/exprs/function/match.cpp                    |     9 +-
 be/src/exprs/function/math.cpp                     |     3 +-
 be/src/exprs/function/minus.cpp                    |     2 -
 be/src/exprs/function/multiply.cpp                 |     2 -
 be/src/exprs/function/plus.cpp                     |     2 -
 be/src/exprs/function/random.cpp                   |     4 +-
 be/src/exprs/function/round.h                      |     8 +-
 be/src/exprs/function/uniform.cpp                  |     4 +-
 be/src/exprs/function/url/find_symbols.h           |     2 +-
 be/src/exprs/function/url/functions_url.h          |     2 -
 be/src/exprs/function_context.cpp                  |     2 -
 be/src/exprs/hybrid_set.h                          |    83 +-
 be/src/exprs/lambda_function/lambda_function.h     |     2 +-
 .../lambda_function/varray_filter_function.cpp     |     8 +-
 .../exprs/lambda_function/varray_map_function.cpp  |     6 +-
 .../exprs/lambda_function/varray_sort_function.cpp |    11 +-
 be/src/exprs/score_runtime.h                       |     2 -
 be/src/exprs/short_circuit_evaluation_expr.cpp     |    32 +-
 be/src/exprs/short_circuit_evaluation_expr.h       |    16 +-
 .../exprs/table_function/python_udtf_function.cpp  |    16 +-
 be/src/exprs/table_function/python_udtf_function.h |     2 -
 be/src/exprs/table_function/table_function.h       |    17 +-
 .../table_function/table_function_factory.cpp      |     5 +-
 .../exprs/table_function/table_function_factory.h  |     2 -
 be/src/exprs/table_function/udf_table_function.cpp |     2 -
 be/src/exprs/table_function/udf_table_function.h   |     2 -
 be/src/exprs/table_function/vexplode.cpp           |    22 +-
 be/src/exprs/table_function/vexplode.h             |     6 +-
 be/src/exprs/table_function/vexplode_bitmap.cpp    |     2 -
 be/src/exprs/table_function/vexplode_bitmap.h      |     2 -
 .../exprs/table_function/vexplode_json_object.cpp  |     2 -
 be/src/exprs/table_function/vexplode_json_object.h |     2 -
 be/src/exprs/table_function/vexplode_map.cpp       |    13 +-
 be/src/exprs/table_function/vexplode_map.h         |     2 -
 be/src/exprs/table_function/vexplode_numbers.cpp   |     8 +-
 be/src/exprs/table_function/vexplode_numbers.h     |     2 -
 be/src/exprs/table_function/vexplode_v2.cpp        |    26 +-
 be/src/exprs/table_function/vexplode_v2.h          |     6 +-
 be/src/exprs/table_function/vjson_each.cpp         |   205 +
 be/src/exprs/table_function/vjson_each.h           |    72 +
 be/src/exprs/vbitmap_predicate.cpp                 |    10 +-
 be/src/exprs/vbitmap_predicate.h                   |     6 +-
 be/src/exprs/vbloom_predicate.cpp                  |    10 +-
 be/src/exprs/vbloom_predicate.h                    |     6 +-
 be/src/exprs/vcase_expr.cpp                        |     7 +-
 be/src/exprs/vcase_expr.h                          |     4 +-
 be/src/exprs/vcast_expr.cpp                        |    12 +-
 be/src/exprs/vcast_expr.h                          |     8 +-
 be/src/exprs/vcolumn_ref.h                         |     4 +-
 be/src/exprs/vcompound_pred.h                      |    15 +-
 be/src/exprs/vcondition_expr.cpp                   |    20 +-
 be/src/exprs/vcondition_expr.h                     |    12 +-
 be/src/exprs/vdirect_in_predicate.h                |     8 +-
 be/src/exprs/vectorized_agg_fn.cpp                 |     8 +-
 be/src/exprs/vectorized_agg_fn.h                   |     2 -
 be/src/exprs/vectorized_fn_call.cpp                |    14 +-
 be/src/exprs/vectorized_fn_call.h                  |    10 +-
 be/src/exprs/vexpr.cpp                             |    51 +-
 be/src/exprs/vexpr.h                               |    15 +-
 be/src/exprs/vexpr_context.cpp                     |     2 -
 be/src/exprs/vin_predicate.cpp                     |     7 +-
 be/src/exprs/vin_predicate.h                       |     4 +-
 be/src/exprs/vinfo_func.cpp                        |     7 +-
 be/src/exprs/vinfo_func.h                          |     4 +-
 be/src/exprs/virtual_slot_ref.cpp                  |     7 +-
 be/src/exprs/virtual_slot_ref.h                    |     6 +-
 be/src/exprs/vlambda_function_call_expr.h          |     4 +-
 be/src/exprs/vlambda_function_expr.h               |     8 +-
 be/src/exprs/vliteral.cpp                          |     7 +-
 be/src/exprs/vliteral.h                            |     4 +-
 be/src/exprs/vmatch_predicate.cpp                  |     8 +-
 be/src/exprs/vmatch_predicate.h                    |     4 +-
 be/src/exprs/vruntimefilter_wrapper.cpp            |    16 +-
 be/src/exprs/vruntimefilter_wrapper.h              |    11 +-
 be/src/exprs/vsearch.cpp                           |     5 +-
 be/src/exprs/vsearch.h                             |     4 +-
 be/src/exprs/vslot_ref.cpp                         |     5 +-
 be/src/exprs/vslot_ref.h                           |     4 +-
 be/src/exprs/vstruct_literal.cpp                   |     2 +-
 be/src/exprs/vtopn_pred.h                          |     6 +-
 be/src/format/CMakeLists.txt                       |     7 +
 be/src/format/arrow/arrow_block_convertor.cpp      |    11 +-
 be/src/format/arrow/arrow_block_convertor.h        |     4 +
 be/src/format/arrow/arrow_pip_input_stream.cpp     |     2 -
 be/src/format/arrow/arrow_pip_input_stream.h       |     2 -
 be/src/format/arrow/arrow_row_batch.cpp            |     5 +-
 be/src/format/arrow/arrow_row_batch.h              |     7 +-
 be/src/format/arrow/arrow_stream_reader.cpp        |     8 +-
 be/src/format/arrow/arrow_stream_reader.h          |    11 +-
 be/src/format/column_descriptor.h                  |    56 +
 be/src/format/column_type_convert.cpp              |     2 -
 be/src/format/column_type_convert.h                |   135 +-
 be/src/format/count_reader.h                       |   106 +
 be/src/format/csv/csv_reader.cpp                   |    99 +-
 be/src/format/csv/csv_reader.h                     |    28 +-
 .../file_reader/new_plain_binary_line_reader.cpp   |     2 -
 .../file_reader/new_plain_binary_line_reader.h     |     2 -
 .../file_reader/new_plain_text_line_reader.cpp     |     2 -
 .../file_reader/new_plain_text_line_reader.h       |     2 -
 be/src/format/format_common.h                      |     2 -
 be/src/format/generic_reader.cpp                   |    23 +
 be/src/format/generic_reader.h                     |   221 +-
 be/src/format/jni/jni_data_bridge.cpp              |    21 +-
 be/src/format/jni/jni_data_bridge.h                |     2 -
 be/src/format/jni/jni_reader.cpp                   |    35 +-
 be/src/format/jni/jni_reader.h                     |    12 +-
 be/src/format/json/new_json_reader.cpp             |    79 +-
 be/src/format/json/new_json_reader.h               |    38 +-
 be/src/format/lance/lance_ffi.h                    |    84 +
 be/src/format/lance/lance_rust_reader.cpp          |   403 +
 be/src/format/lance/lance_rust_reader.h            |   116 +
 be/src/format/native/native_reader.cpp             |    10 +-
 be/src/format/native/native_reader.h               |    13 +-
 be/src/format/orc/orc_memory_pool.h                |     2 -
 be/src/format/orc/vorc_reader.cpp                  |   634 +-
 be/src/format/orc/vorc_reader.h                    |   197 +-
 be/src/format/parquet/arrow_memory_pool.cpp        |     2 -
 be/src/format/parquet/arrow_memory_pool.h          |     2 -
 be/src/format/parquet/bool_plain_decoder.cpp       |     2 -
 be/src/format/parquet/bool_plain_decoder.h         |     2 -
 be/src/format/parquet/bool_rle_decoder.cpp         |     2 -
 be/src/format/parquet/bool_rle_decoder.h           |     2 -
 be/src/format/parquet/byte_array_dict_decoder.cpp  |     2 -
 be/src/format/parquet/byte_array_dict_decoder.h    |     2 -
 be/src/format/parquet/byte_array_plain_decoder.cpp |     2 -
 be/src/format/parquet/byte_array_plain_decoder.h   |     2 -
 .../format/parquet/byte_stream_split_decoder.cpp   |     2 -
 be/src/format/parquet/byte_stream_split_decoder.h  |     2 -
 be/src/format/parquet/decoder.cpp                  |     2 -
 be/src/format/parquet/decoder.h                    |     2 -
 be/src/format/parquet/delta_bit_pack_decoder.cpp   |     2 -
 be/src/format/parquet/delta_bit_pack_decoder.h     |     3 -
 be/src/format/parquet/fix_length_dict_decoder.hpp  |     2 -
 be/src/format/parquet/fix_length_plain_decoder.cpp |     4 -
 be/src/format/parquet/fix_length_plain_decoder.h   |     3 -
 be/src/format/parquet/level_decoder.cpp            |     2 -
 be/src/format/parquet/level_decoder.h              |     2 -
 be/src/format/parquet/parquet_column_convert.cpp   |     2 -
 be/src/format/parquet/parquet_column_convert.h     |   106 +-
 be/src/format/parquet/parquet_common.cpp           |     2 -
 be/src/format/parquet/parquet_common.h             |     2 -
 be/src/format/parquet/parquet_predicate.h          |     2 -
 be/src/format/parquet/parquet_thrift_util.h        |     2 -
 be/src/format/parquet/schema_desc.cpp              |     6 +-
 be/src/format/parquet/schema_desc.h                |     2 -
 .../parquet/vparquet_column_chunk_reader.cpp       |     2 -
 .../format/parquet/vparquet_column_chunk_reader.h  |     2 -
 be/src/format/parquet/vparquet_column_reader.cpp   |    11 +-
 be/src/format/parquet/vparquet_column_reader.h     |    19 +-
 be/src/format/parquet/vparquet_file_metadata.cpp   |     2 -
 be/src/format/parquet/vparquet_file_metadata.h     |     2 -
 be/src/format/parquet/vparquet_group_reader.cpp    |   372 +-
 be/src/format/parquet/vparquet_group_reader.h      |    63 +-
 be/src/format/parquet/vparquet_page_index.cpp      |     2 -
 be/src/format/parquet/vparquet_page_index.h        |     2 -
 be/src/format/parquet/vparquet_page_reader.cpp     |     2 -
 be/src/format/parquet/vparquet_page_reader.h       |     2 -
 be/src/format/parquet/vparquet_reader.cpp          |   333 +-
 be/src/format/parquet/vparquet_reader.h            |   170 +-
 be/src/format/table/equality_delete.cpp            |     8 +-
 be/src/format/table/equality_delete.h              |     2 -
 be/src/format/table/es/es_http_reader.cpp          |   259 +
 be/src/format/table/es/es_http_reader.h            |   101 +
 be/src/format/table/es/es_scan_reader.cpp          |   269 +
 be/src/{exec => format/table}/es/es_scan_reader.h  |     0
 be/src/format/table/es/es_scroll_parser.cpp        |   916 +
 .../{exec => format/table}/es/es_scroll_parser.h   |     0
 be/src/format/table/es/es_scroll_query.cpp         |   150 +
 be/src/{exec => format/table}/es/es_scroll_query.h |     0
 .../table/hive/hive_orc_nested_column_utils.cpp    |     4 +-
 .../table/hive/hive_orc_nested_column_utils.h      |     4 +-
 .../hive/hive_parquet_nested_column_utils.cpp      |     3 +-
 .../table/hive/hive_parquet_nested_column_utils.h  |     4 +-
 be/src/format/table/hive_reader.cpp                |   186 +-
 be/src/format/table/hive_reader.h                  |    86 +-
 be/src/format/table/hudi_jni_reader.cpp            |     2 -
 be/src/format/table/hudi_jni_reader.h              |     5 +-
 be/src/format/table/hudi_reader.cpp                |    78 +-
 be/src/format/table/hudi_reader.h                  |    82 +-
 be/src/format/table/iceberg/arrow_schema_util.cpp  |     2 -
 be/src/format/table/iceberg/arrow_schema_util.h    |     2 -
 .../iceberg/iceberg_orc_nested_column_utils.cpp    |     4 +-
 .../iceberg/iceberg_orc_nested_column_utils.h      |     4 +-
 .../iceberg_parquet_nested_column_utils.cpp        |     3 +-
 .../iceberg/iceberg_parquet_nested_column_utils.h  |     4 +-
 be/src/format/table/iceberg/partition_spec.cpp     |     2 -
 be/src/format/table/iceberg/partition_spec.h       |     2 -
 .../format/table/iceberg/partition_spec_parser.cpp |     2 -
 .../format/table/iceberg/partition_spec_parser.h   |     2 -
 be/src/format/table/iceberg/schema.cpp             |     2 -
 be/src/format/table/iceberg/schema.h               |     2 -
 be/src/format/table/iceberg/schema_parser.cpp      |     2 -
 be/src/format/table/iceberg/schema_parser.h        |     2 -
 be/src/format/table/iceberg/struct_like.h          |     2 -
 be/src/format/table/iceberg/types.cpp              |     2 -
 be/src/format/table/iceberg/types.h                |     2 -
 .../table/iceberg/unbound_partition_spec.cpp       |     2 -
 .../format/table/iceberg/unbound_partition_spec.h  |     2 -
 .../table/iceberg_delete_file_reader_helper.cpp    |   314 +
 .../table/iceberg_delete_file_reader_helper.h      |    78 +
 be/src/format/table/iceberg_reader.cpp             |  1388 +-
 be/src/format/table/iceberg_reader.h               |   230 +-
 be/src/format/table/iceberg_reader_mixin.h         |   874 +
 .../format/table/iceberg_sys_table_jni_reader.cpp  |    38 +-
 be/src/format/table/iceberg_sys_table_jni_reader.h |    12 +-
 be/src/format/table/jdbc_jni_reader.cpp            |     6 +-
 be/src/format/table/jdbc_jni_reader.h              |     8 +-
 be/src/format/table/max_compute_jni_reader.cpp     |     2 -
 be/src/format/table/max_compute_jni_reader.h       |     5 +-
 be/src/format/table/nested_column_access_helper.h  |     4 +-
 be/src/format/table/paimon_cpp_reader.cpp          |    17 +-
 be/src/format/table/paimon_cpp_reader.h            |    10 +-
 be/src/format/table/paimon_jni_reader.cpp          |    17 +-
 be/src/format/table/paimon_jni_reader.h            |     7 +-
 be/src/format/table/paimon_predicate_converter.cpp |     2 -
 be/src/format/table/paimon_predicate_converter.h   |     2 -
 be/src/format/table/paimon_reader.cpp              |   204 +-
 be/src/format/table/paimon_reader.h                |   147 +-
 be/src/format/table/parquet_metadata_reader.cpp    |     2 +-
 be/src/format/table/parquet_metadata_reader.h      |     5 +-
 be/src/format/table/remote_doris_reader.cpp        |     9 +-
 be/src/format/table/remote_doris_reader.h          |    13 +-
 be/src/format/table/table_format_reader.cpp        |   685 +-
 be/src/format/table/table_format_reader.h          |   551 +-
 be/src/format/table/table_schema_change_helper.cpp |   655 +
 be/src/format/table/table_schema_change_helper.h   |   348 +
 be/src/format/table/transactional_hive_common.cpp  |     2 -
 be/src/format/table/transactional_hive_common.h    |    48 +-
 be/src/format/table/transactional_hive_reader.cpp  |   186 +-
 be/src/format/table/transactional_hive_reader.h    |    91 +-
 be/src/format/table/trino_connector_jni_reader.cpp |     2 -
 be/src/format/table/trino_connector_jni_reader.h   |     5 +-
 be/src/format/text/text_reader.cpp                 |     7 +-
 be/src/format/text/text_reader.h                   |     5 +-
 .../transformer/iceberg_partition_function.cpp     |    22 +-
 .../transformer/iceberg_partition_function.h       |     2 -
 be/src/format/transformer/merge_partitioner.cpp    |     2 -
 be/src/format/transformer/merge_partitioner.h      |     2 -
 be/src/format/transformer/vcsv_transformer.cpp     |     1 -
 be/src/format/transformer/vcsv_transformer.h       |     3 -
 .../format/transformer/vfile_format_transformer.h  |     3 -
 .../format/transformer/vjni_format_transformer.h   |     3 -
 be/src/format/transformer/vnative_transformer.cpp  |     4 -
 be/src/format/transformer/vnative_transformer.h    |     3 -
 be/src/format/transformer/vorc_transformer.cpp     |     1 -
 be/src/format/transformer/vorc_transformer.h       |     3 -
 be/src/format/transformer/vparquet_transformer.cpp |     3 +-
 be/src/format/transformer/vparquet_transformer.h   |     3 -
 be/src/format/transformer/writer_assigner.h        |     2 -
 .../schema_active_queries_scanner.cpp              |     1 -
 .../schema_authentication_integrations_scanner.cpp |     2 -
 .../schema_backend_active_tasks.cpp                |     1 -
 .../schema_backend_kerberos_ticket_cache.cpp       |     1 -
 ...ema_backend_ms_rpc_table_throttlers_scanner.cpp |   113 +
 ...chema_backend_ms_rpc_table_throttlers_scanner.h |    46 +
 .../schema_catalog_meta_cache_stats_scanner.cpp    |     1 -
 .../schema_cluster_snapshot_properties_scanner.cpp |     2 -
 .../schema_cluster_snapshots_scanner.cpp           |     2 -
 .../schema_column_data_sizes_scanner.cpp           |     2 -
 .../information_schema/schema_columns_scanner.cpp  |     1 -
 .../schema_compaction_tasks_scanner.cpp            |   502 +
 .../schema_compaction_tasks_scanner.h              |    50 +
 .../schema_encryption_keys_scanner.cpp             |     2 -
 .../schema_file_cache_info_scanner.cpp             |     1 -
 .../schema_file_cache_statistics.cpp               |     1 -
 .../schema_partitions_scanner.cpp                  |     1 -
 .../schema_processlist_scanner.cpp                 |     7 +-
 .../schema_role_mappings_scanner.cpp               |   143 +
 .../schema_role_mappings_scanner.h                 |    53 +
 .../information_schema/schema_rowsets_scanner.cpp  |    13 +-
 be/src/information_schema/schema_scanner.cpp       |    20 +-
 .../schema_sql_block_rule_status_scanner.cpp       |    32 +-
 .../schema_table_options_scanner.cpp               |     1 -
 .../schema_table_properties_scanner.cpp            |     1 -
 .../schema_table_stream_consumption_scanner.cpp    |   141 +
 .../schema_table_stream_consumption_scanner.h      |    51 +
 .../schema_table_streams_scanner.cpp               |   141 +
 .../schema_table_streams_scanner.h                 |    51 +
 .../information_schema/schema_tablets_scanner.cpp  |     2 -
 .../schema_workload_group_privileges.cpp           |     1 -
 ...chema_workload_group_resource_usage_scanner.cpp |     1 -
 .../schema_workload_groups_scanner.cpp             |     1 -
 .../schema_workload_sched_policy_scanner.cpp       |     1 -
 be/src/io/cache/block_file_cache.cpp               |     6 +-
 be/src/io/cache/block_file_cache.h                 |     1 +
 be/src/io/cache/block_file_cache_downloader.cpp    |     2 +
 be/src/io/cache/block_file_cache_downloader.h      |     1 +
 be/src/io/cache/cached_remote_file_reader.cpp      |    60 +-
 be/src/io/cache/cached_remote_file_reader.h        |     3 +-
 be/src/io/cache/fs_file_cache_storage.cpp          |     5 +
 be/src/io/file_factory.cpp                         |     2 -
 be/src/io/fs/buffered_reader.cpp                   |    35 +-
 be/src/io/fs/buffered_reader.h                     |     8 +-
 .../io/fs/connectivity/s3_connectivity_tester.cpp  |     2 -
 .../connectivity/storage_connectivity_tester.cpp   |     2 -
 be/src/io/fs/file_handle_cache.cpp                 |     4 -
 be/src/io/fs/file_writer.h                         |    10 +
 be/src/io/fs/hdfs_file_reader.cpp                  |     2 -
 be/src/io/fs/hdfs_file_system.cpp                  |     8 +-
 be/src/io/fs/hdfs_file_writer.cpp                  |     2 -
 be/src/io/fs/http_file_reader.cpp                  |   154 +-
 be/src/io/fs/http_file_reader.h                    |     9 +-
 be/src/io/fs/local_file_system.cpp                 |     2 +-
 be/src/io/fs/local_file_writer.cpp                 |     2 -
 be/src/io/fs/packed_file_manager.cpp               |    19 +-
 be/src/io/fs/packed_file_manager.h                 |     4 +-
 be/src/io/fs/packed_file_system.cpp                |    42 +
 be/src/io/fs/s3_file_writer.cpp                    |    93 +-
 be/src/io/fs/s3_file_writer.h                      |     2 +
 be/src/io/tools/file_cache_microbench.cpp          |     1 +
 be/src/load/channel/load_channel.cpp               |    19 +-
 be/src/load/channel/load_stream.cpp                |     2 -
 be/src/load/channel/load_stream_writer.cpp         |     2 -
 be/src/load/channel/tablets_channel.cpp            |    12 +-
 be/src/load/delta_writer/delta_writer.cpp          |    14 +-
 be/src/load/delta_writer/delta_writer.h            |     3 -
 be/src/load/delta_writer/delta_writer_context.h    |    12 +
 be/src/load/delta_writer/delta_writer_v2.cpp       |     2 -
 be/src/load/delta_writer/push_handler.cpp          |    25 +-
 be/src/load/group_commit/group_commit_mgr.cpp      |     2 -
 be/src/load/group_commit/wal/wal_info.cpp          |     2 -
 be/src/load/group_commit/wal/wal_reader.cpp        |    31 +-
 be/src/load/group_commit/wal/wal_reader.h          |    23 +-
 be/src/load/load_path_mgr.cpp                      |     4 -
 be/src/load/memtable/memtable.cpp                  |    12 +-
 be/src/load/memtable/memtable_flush_executor.cpp   |    53 +-
 be/src/load/memtable/memtable_flush_executor.h     |     9 +
 be/src/load/memtable/memtable_memory_limiter.h     |     2 +
 be/src/load/memtable/memtable_writer.cpp           |     3 +
 be/src/load/routine_load/data_consumer.cpp         |    43 +-
 be/src/load/routine_load/data_consumer.h           |     4 +
 be/src/load/routine_load/data_consumer_group.cpp   |     2 -
 be/src/load/routine_load/data_consumer_group.h     |     2 -
 be/src/load/stream_load/stream_load_context.cpp    |     2 -
 be/src/runtime/AGENTS.md                           |     1 +
 be/src/runtime/aws_msk_iam_auth.cpp                |   517 +
 be/src/runtime/aws_msk_iam_auth.h                  |   169 +
 be/src/runtime/cache/result_node.h                 |     4 +-
 be/src/runtime/descriptors.cpp                     |     2 -
 be/src/runtime/descriptors.h                       |     2 -
 be/src/runtime/exec_env.h                          |    36 +-
 be/src/runtime/exec_env_init.cpp                   |   112 +-
 be/src/runtime/fragment_mgr.cpp                    |   496 +-
 be/src/runtime/fragment_mgr.h                      |    37 +-
 be/src/runtime/memory/cache_manager.cpp            |    11 +-
 be/src/runtime/memory/cache_manager.h              |     2 -
 be/src/runtime/memory/cache_policy.cpp             |     2 -
 be/src/runtime/memory/cache_policy.h               |    12 +-
 be/src/runtime/memory/global_memory_arbitrator.cpp |     2 -
 be/src/runtime/memory/global_memory_arbitrator.h   |     2 -
 be/src/runtime/memory/heap_profiler.cpp            |     2 -
 be/src/runtime/memory/heap_profiler.h              |     2 -
 be/src/runtime/memory/jemalloc_control.cpp         |     2 -
 be/src/runtime/memory/jemalloc_control.h           |     2 -
 be/src/runtime/memory/lru_cache_policy.h           |     2 -
 be/src/runtime/memory/lru_cache_value_base.h       |     2 -
 be/src/runtime/memory/mem_counter.h                |     2 -
 be/src/runtime/memory/mem_tracker.h                |     2 -
 be/src/runtime/memory/mem_tracker_limiter.cpp      |     2 -
 be/src/runtime/memory/mem_tracker_limiter.h        |     2 -
 be/src/runtime/memory/memory_profile.cpp           |     7 +-
 be/src/runtime/memory/memory_profile.h             |     2 -
 be/src/runtime/memory/memory_reclamation.cpp       |    16 +-
 be/src/runtime/memory/memory_reclamation.h         |     2 -
 be/src/runtime/memory/thread_mem_tracker_mgr.cpp   |    41 +-
 be/src/runtime/memory/thread_mem_tracker_mgr.h     |     2 -
 be/src/runtime/query_cache/query_cache.h           |    16 +
 be/src/runtime/query_context.cpp                   |    40 +-
 be/src/runtime/query_context.h                     |    20 +-
 be/src/runtime/result_block_buffer.cpp             |     8 +-
 be/src/runtime/result_block_buffer.h               |    18 +-
 be/src/runtime/runtime_profile.cpp                 |     1 -
 be/src/runtime/runtime_profile.h                   |    87 +-
 be/src/runtime/runtime_profile_counter_names.h     |     3 +
 be/src/runtime/runtime_state.cpp                   |    58 +-
 be/src/runtime/runtime_state.h                     |    68 +-
 be/src/runtime/snapshot_loader.cpp                 |     2 -
 be/src/runtime/task_execution_context.cpp          |    14 +-
 be/src/runtime/task_execution_context.h            |    22 +-
 be/src/runtime/thread_context.cpp                  |   101 +
 be/src/runtime/thread_context.h                    |     5 +
 be/src/runtime/workload_group/workload_group.cpp   |    40 +-
 be/src/runtime/workload_group/workload_group.h     |    10 +-
 .../workload_group/workload_group_manager.cpp      |   583 +-
 .../workload_group/workload_group_manager.h        |   129 +-
 .../workload_group/workload_group_metrics.cpp      |     2 -
 be/src/runtime/workload_management/cpu_context.cpp |     2 -
 be/src/runtime/workload_management/cpu_context.h   |     2 -
 be/src/runtime/workload_management/io_context.h    |     6 +-
 .../runtime/workload_management/memory_context.cpp |     2 -
 .../runtime/workload_management/memory_context.h   |     2 -
 .../workload_management/query_task_controller.cpp  |    36 +-
 .../workload_management/query_task_controller.h    |    12 +-
 .../workload_management/resource_context.cpp       |    10 +-
 .../runtime/workload_management/resource_context.h |     2 -
 .../workload_management/task_controller.cpp        |     2 -
 .../runtime/workload_management/task_controller.h  |     2 -
 be/src/rust/doris-native/Cargo.lock                |  5409 ++++
 be/src/rust/doris-native/Cargo.toml                |    44 +
 be/src/rust/doris-native/README.md                 |   181 +
 .../rust/doris-native/crates/doris-ffi/Cargo.toml  |    47 +
 be/src/rust/doris-native/crates/doris-ffi/build.rs |    95 +
 .../doris-native/crates/doris-ffi/glibc_compat.c   |    68 +
 .../doris-native/crates/doris-ffi/src/error.rs     |   189 +
 .../rust/doris-native/crates/doris-ffi/src/ffi.rs  |   864 +
 .../crates/doris-ffi/src/lance_reader.rs           |   444 +
 .../rust/doris-native/crates/doris-ffi/src/lib.rs  |    44 +
 be/src/rust/doris-native/rust-toolchain.toml       |    19 +
 be/src/service/backend_service.cpp                 |     2 -
 be/src/service/http/action/adjust_tracing_dump.cpp |    37 -
 be/src/service/http/action/adjust_tracing_dump.h   |    35 -
 .../http/action/check_rpc_channel_action.cpp       |     2 -
 be/src/service/http/action/checksum_action.cpp     |     2 -
 be/src/service/http/action/compaction_action.cpp   |   123 +-
 be/src/service/http/action/compaction_action.h     |     5 +-
 .../http/action/compaction_profile_action.cpp      |   266 +
 .../http/action/compaction_profile_action.h        |    36 +
 .../http/action/compaction_score_action.cpp        |     2 -
 be/src/service/http/action/config_action.cpp       |     2 -
 .../service/http/action/delete_bitmap_action.cpp   |     2 -
 be/src/service/http/action/delete_bitmap_action.h  |     2 -
 be/src/service/http/action/health_action.h         |     4 +-
 be/src/service/http/action/http_stream.cpp         |    11 +-
 be/src/service/http/action/http_stream.h           |     5 +-
 be/src/service/http/action/pad_rowset_action.cpp   |     2 +-
 .../service/http/action/reload_tablet_action.cpp   |     2 -
 .../http/action/reset_rpc_channel_action.cpp       |     2 -
 be/src/service/http/action/show_hotspot_action.cpp |     4 -
 be/src/service/http/action/snapshot_action.cpp     |     2 -
 be/src/service/http/action/stream_load.cpp         |    24 +-
 be/src/service/http/action/stream_load.h           |     6 +-
 be/src/service/http/action/stream_load_2pc.cpp     |     6 +-
 be/src/service/http/action/stream_load_2pc.h       |     5 +-
 .../http/action/stream_load_forward_handler.cpp    |     2 -
 .../http/action/tablet_migration_action.cpp        |     2 -
 be/src/service/http/http_client.cpp                |     2 -
 be/src/service/http/http_handler_with_auth.cpp     |     4 +
 be/src/service/http_service.cpp                    |    20 +-
 be/src/service/internal_service.cpp                |    35 +-
 be/src/service/point_query_executor.cpp            |    23 +-
 be/src/storage/adaptive_thread_pool_controller.cpp |   336 +
 be/src/storage/adaptive_thread_pool_controller.h   |   163 +
 be/src/storage/binlog.h                            |     3 +
 be/src/storage/binlog_config.cpp                   |    28 +-
 be/src/storage/binlog_config.h                     |    25 +-
 be/src/storage/cache/ann_index_ivf_list_cache.cpp  |    61 +
 be/src/storage/cache/ann_index_ivf_list_cache.h    |    95 +
 be/src/storage/cache/page_cache.cpp                |    15 +
 be/src/storage/cache/page_cache.h                  |     5 +
 be/src/storage/cache/schema_cache.cpp              |    60 -
 be/src/storage/cache/schema_cache.h                |    98 -
 be/src/storage/compaction/base_compaction.cpp      |     1 -
 be/src/storage/compaction/base_compaction.h        |     6 +
 .../storage/compaction/collection_similarity.cpp   |     2 -
 be/src/storage/compaction/collection_similarity.h  |     2 -
 .../storage/compaction/collection_statistics.cpp   |     4 +-
 be/src/storage/compaction/collection_statistics.h  |     2 -
 be/src/storage/compaction/compaction.cpp           |   116 +-
 be/src/storage/compaction/compaction.h             |    22 +
 .../storage/compaction/cumulative_compaction.cpp   |     2 -
 be/src/storage/compaction/cumulative_compaction.h  |     6 +
 .../compaction/cumulative_compaction_policy.cpp    |     2 -
 .../cumulative_compaction_time_series_policy.cpp   |     2 -
 be/src/storage/compaction/full_compaction.h        |     6 +
 be/src/storage/compaction_task_tracker.cpp         |   271 +
 be/src/storage/compaction_task_tracker.h           |   203 +
 be/src/storage/data_dir.cpp                        |    59 +-
 be/src/storage/delete/delete_bitmap_calculator.cpp |     2 -
 be/src/storage/delete/delete_handler.cpp           |     1 +
 be/src/storage/field.h                             |    25 +-
 be/src/storage/index/ann/ann_index.cpp             |     4 +
 be/src/storage/index/ann/ann_index.h               |     4 +-
 be/src/storage/index/ann/ann_index_files.h         |     1 +
 be/src/storage/index/ann/ann_index_iterator.cpp    |     2 -
 be/src/storage/index/ann/ann_index_iterator.h      |     2 -
 be/src/storage/index/ann/ann_index_reader.cpp      |    85 +-
 be/src/storage/index/ann/ann_index_reader.h        |    14 +-
 be/src/storage/index/ann/ann_index_writer.cpp      |     2 -
 be/src/storage/index/ann/ann_index_writer.h        |     2 -
 .../storage/index/ann/ann_range_search_runtime.cpp |     1 -
 .../storage/index/ann/ann_range_search_runtime.h   |     2 -
 be/src/storage/index/ann/ann_search_params.h       |    52 +-
 be/src/storage/index/ann/ann_topn_runtime.cpp      |    36 +-
 be/src/storage/index/ann/ann_topn_runtime.h        |     6 +-
 .../storage/index/ann/cmake-protect/CMakeLists.txt |     6 +-
 be/src/storage/index/ann/faiss_ann_index.cpp       |   483 +-
 be/src/storage/index/ann/faiss_ann_index.h         |    22 +-
 be/src/storage/index/bloom_filter/bloom_filter.h   |     2 -
 .../bloom_filter/bloom_filter_index_reader.cpp     |     2 -
 .../bloom_filter/bloom_filter_index_writer.cpp     |    12 +-
 .../index/bloom_filter/bloom_filter_index_writer.h |     9 +-
 .../index/bloom_filter/ngram_bloom_filter.cpp      |     2 -
 .../index/bloom_filter/ngram_bloom_filter.h        |     2 -
 be/src/storage/index/index_file_reader.cpp         |    10 +-
 be/src/storage/index/index_file_reader.h           |    10 +-
 be/src/storage/index/index_file_writer.cpp         |    19 +-
 be/src/storage/index/index_file_writer.h           |     4 +-
 be/src/storage/index/index_page.cpp                |     2 -
 be/src/storage/index/index_page.h                  |     2 -
 be/src/storage/index/index_query_context.h         |     2 -
 be/src/storage/index/index_reader_helper.h         |     2 -
 be/src/storage/index/index_storage_format.cpp      |     2 -
 be/src/storage/index/index_storage_format_v1.cpp   |     2 -
 be/src/storage/index/index_storage_format_v2.cpp   |     2 -
 be/src/storage/index/index_writer.cpp              |     2 -
 be/src/storage/index/index_writer.h                |     2 -
 be/src/storage/index/indexed_column_writer.cpp     |    15 +-
 be/src/storage/index/indexed_column_writer.h       |     9 +-
 .../storage/index/inverted/analyzer/analyzer.cpp   |     2 -
 .../index/inverted/analyzer/ik/IKTokenizer.cpp     |     2 -
 .../inverted/analyzer/ik/core/AnalyzeContext.cpp   |     2 -
 .../inverted/analyzer/ik/core/CJKSegmenter.cpp     |     2 -
 .../analyzer/ik/core/CN_QuantifierSegmenter.cpp    |     2 -
 .../inverted/analyzer/ik/core/CharacterUtil.h      |     2 -
 .../inverted/analyzer/ik/core/IKSegmenter.cpp      |     2 -
 .../inverted/analyzer/ik/core/LetterSegmenter.cpp  |     2 -
 .../char_filter/char_replace_char_filter.cpp       |     2 -
 .../inverted/inverted_index_compound_reader.cpp    |     2 -
 .../index/inverted/inverted_index_fs_directory.cpp |     4 +-
 .../index/inverted/inverted_index_fs_directory.h   |     3 +-
 .../index/inverted/inverted_index_iterator.cpp     |     2 +-
 .../index/inverted/inverted_index_iterator.h       |     5 +-
 .../index/inverted/inverted_index_reader.cpp       |   139 +-
 .../storage/index/inverted/inverted_index_reader.h |   149 +-
 .../index/inverted/query/conjunction_query.cpp     |     2 -
 .../index/inverted/query/phrase_prefix_query.cpp   |     2 -
 .../inverted/query/phrase_query/phrase_matcher.h   |     2 -
 .../query/phrase_query/sloppy_phrase_matcher.cpp   |     2 -
 .../storage/index/inverted/query/query_helper.cpp  |     2 -
 be/src/storage/index/inverted/query/query_helper.h |     2 -
 .../storage/index/inverted/query/regexp_query.cpp  |     2 -
 be/src/storage/index/inverted/query/term_query.cpp |     2 -
 be/src/storage/index/inverted/query/term_query.h   |     2 -
 .../index/inverted/similarity/bm25_similarity.cpp  |     2 -
 .../index/inverted/similarity/bm25_similarity.h    |     2 -
 .../storage/index/inverted/similarity/similarity.h |     2 -
 .../inverted/token_filter/ascii_folding_filter.cpp |     2 -
 .../token_filter/word_delimiter_filter.cpp         |     2 -
 .../token_filter/word_delimiter_filter_factory.h   |     2 -
 be/src/storage/index/inverted/token_stream.h       |     2 -
 .../inverted/tokenizer/basic/basic_tokenizer.cpp   |     2 -
 .../char/char_group_tokenizer_factory.cpp          |     2 -
 .../tokenizer/char/char_group_tokenizer_factory.h  |     2 -
 .../inverted/tokenizer/char/char_tokenizer.cpp     |     2 -
 .../index/inverted/tokenizer/char/char_tokenizer.h |     2 -
 .../index/inverted/tokenizer/icu/icu_tokenizer.cpp |     2 -
 .../inverted/tokenizer/keyword/keyword_tokenizer.h |     2 -
 .../inverted/tokenizer/ngram/ngram_tokenizer.cpp   |     2 -
 .../inverted/tokenizer/ngram/ngram_tokenizer.h     |     2 -
 .../tokenizer/standard/standard_tokenizer_impl.h   |     2 -
 .../index/inverted/util/docid_set_iterator.h       |     2 -
 be/src/storage/index/inverted/util/fixed_bit_set.h |     2 -
 be/src/storage/index/inverted/util/mock_iterator.h |     2 -
 .../storage/index/inverted/util/priority_queue.h   |     2 -
 be/src/storage/index/inverted/util/string_helper.h |     2 -
 .../index/inverted/util/union_term_iterator.h      |     2 -
 be/src/storage/index/ordinal_page_index.cpp        |     2 -
 be/src/storage/index/primary_key_index.h           |     2 -
 be/src/storage/index/short_key_index.cpp           |     2 -
 be/src/storage/index/zone_map/zone_map_index.cpp   |    63 +-
 be/src/storage/index/zone_map/zone_map_index.h     |    21 +-
 be/src/storage/iterator/block_reader.cpp           |    53 +-
 be/src/storage/iterator/block_reader.h             |    10 +
 be/src/storage/iterator/olap_data_convertor.h      |     4 -
 be/src/storage/iterator/vcollect_iterator.cpp      |   127 +-
 be/src/storage/iterator/vcollect_iterator.h        |    13 +-
 be/src/storage/iterator/vertical_block_reader.cpp  |     2 -
 .../storage/iterator/vertical_merge_iterator.cpp   |     2 -
 be/src/storage/iterator/vertical_merge_iterator.h  |     4 +-
 be/src/storage/iterator/vgeneric_iterators.cpp     |     5 -
 be/src/storage/iterator/vgeneric_iterators.h       |     4 -
 be/src/storage/iterators.h                         |     9 +-
 be/src/storage/itoken_extractor.h                  |     2 -
 be/src/storage/key_coder.h                         |    58 +
 be/src/storage/merger.cpp                          |   154 +-
 be/src/storage/merger.h                            |     6 +-
 be/src/storage/olap_common.h                       |     8 +-
 be/src/storage/olap_scan_common.h                  |     3 -
 be/src/storage/olap_server.cpp                     |    76 +-
 be/src/storage/partial_update_info.cpp             |     7 +-
 be/src/storage/predicate/accept_null_predicate.h   |     5 +-
 be/src/storage/predicate/column_predicate.h        |     3 +-
 be/src/storage/predicate/comparison_predicate.h    |    27 +-
 be/src/storage/predicate/in_list_predicate.h       |    91 +-
 be/src/storage/predicate/null_predicate.h          |     1 -
 be/src/storage/predicate/predicate_creator.cpp     |     5 +
 be/src/storage/predicate/predicate_creator.h       |   254 +-
 .../predicate/predicate_creator_comparison.cpp     |   153 +
 .../predicate/predicate_creator_in_list_in.cpp     |   174 +
 .../predicate/predicate_creator_in_list_not_in.cpp |   174 +
 be/src/storage/predicate/shared_predicate.h        |     4 +-
 be/src/storage/predicate_collector.cpp             |    57 +-
 be/src/storage/predicate_collector.h               |     1 +
 be/src/storage/row_cursor.cpp                      |    86 +-
 be/src/storage/row_cursor.h                        |     2 -
 be/src/storage/rowid_conversion.h                  |     2 -
 be/src/storage/rowset/beta_rowset.cpp              |     6 +-
 be/src/storage/rowset/beta_rowset_reader.cpp       |     6 +-
 be/src/storage/rowset/beta_rowset_writer.cpp       |    35 +-
 be/src/storage/rowset/beta_rowset_writer.h         |     5 +
 be/src/storage/rowset/group_rowset_writer.cpp      |    53 +
 be/src/storage/rowset/group_rowset_writer.h        |   128 +
 be/src/storage/rowset/pending_rowset_helper.cpp    |    43 +-
 be/src/storage/rowset/pending_rowset_helper.h      |     7 +-
 be/src/storage/rowset/rowset.cpp                   |     7 +-
 be/src/storage/rowset/rowset.h                     |     9 +-
 be/src/storage/rowset/rowset_factory.cpp           |    18 +
 be/src/storage/rowset/rowset_factory.h             |     5 +
 be/src/storage/rowset/rowset_fwd.h                 |     4 +
 be/src/storage/rowset/rowset_meta.cpp              |    37 +-
 be/src/storage/rowset/rowset_meta.h                |    29 +-
 be/src/storage/rowset/rowset_meta_manager.cpp      |     2 -
 be/src/storage/rowset/rowset_reader_context.h      |    11 +-
 be/src/storage/rowset/rowset_writer.h              |     2 +-
 be/src/storage/rowset/rowset_writer_context.h      |    32 +
 be/src/storage/rowset/segcompaction.cpp            |     2 -
 be/src/storage/rowset/segment_creator.cpp          |     9 +
 .../storage/rowset/vertical_beta_rowset_writer.h   |    27 +-
 be/src/storage/rowset_builder.cpp                  |   202 +-
 be/src/storage/rowset_builder.h                    |    87 +-
 be/src/storage/schema.h                            |     4 -
 be/src/storage/schema_change/schema_change.cpp     |     4 -
 .../segment/adaptive_block_size_predictor.cpp      |    84 +
 .../segment/adaptive_block_size_predictor.h        |   108 +
 be/src/storage/segment/binary_dict_page.cpp        |    85 +-
 be/src/storage/segment/binary_dict_page.h          |     5 -
 be/src/storage/segment/binary_plain_page.h         |    89 +-
 be/src/storage/segment/binary_plain_page_v2.h      |    51 -
 be/src/storage/segment/binary_prefix_page.cpp      |     6 -
 be/src/storage/segment/binary_prefix_page.h        |    21 +-
 be/src/storage/segment/bitshuffle_page.h           |    25 -
 be/src/storage/segment/column_reader.cpp           |   453 +-
 be/src/storage/segment/column_reader.h             |    72 +-
 be/src/storage/segment/column_reader_cache.cpp     |     4 -
 be/src/storage/segment/column_writer.cpp           |    24 +-
 be/src/storage/segment/frame_of_reference_page.h   |    24 -
 be/src/storage/segment/options.h                   |     1 +
 be/src/storage/segment/page_builder.h              |    14 -
 be/src/storage/segment/page_io.cpp                 |     2 -
 be/src/storage/segment/plain_page.h                |    30 +-
 be/src/storage/segment/rle_page.h                  |    27 -
 be/src/storage/segment/row_ranges.h                |     2 -
 be/src/storage/segment/segment.cpp                 |    37 +-
 be/src/storage/segment/segment.h                   |    16 +-
 be/src/storage/segment/segment_iterator.cpp        |   196 +-
 be/src/storage/segment/segment_iterator.h          |    17 +-
 be/src/storage/segment/segment_loader.cpp          |     9 +
 be/src/storage/segment/segment_loader.h            |     2 -
 be/src/storage/segment/segment_writer.cpp          |    16 +-
 .../variant/binary_column_extract_iterator.h       |     4 -
 .../segment/variant/binary_column_reader.cpp       |    19 +-
 .../storage/segment/variant/binary_column_reader.h |     3 -
 .../segment/variant/hierarchical_data_iterator.cpp |    70 +-
 .../segment/variant/hierarchical_data_iterator.h   |    12 +-
 be/src/storage/segment/variant/nested_group_path.h |    32 +
 .../variant/sparse_column_merge_iterator.cpp       |     4 -
 .../segment/variant/sparse_column_merge_iterator.h |     4 -
 .../segment/variant/variant_column_reader.cpp      |   198 +-
 .../segment/variant/variant_column_reader.h        |     4 -
 .../segment/variant/variant_column_writer_impl.cpp |   111 +-
 .../segment/variant/variant_column_writer_impl.h   |     5 +-
 .../variant_doc_snpashot_compact_iterator.h        |    10 +-
 .../variant/variant_external_meta_reader.cpp       |     4 -
 .../segment/variant/variant_external_meta_reader.h |     4 -
 .../storage/segment/variant/variant_statistics.h   |     3 -
 .../variant_streaming_compaction_writer.cpp        |    27 +-
 .../variant/variant_streaming_compaction_writer.h  |     4 -
 .../segment/variant/variant_writer_helpers.h       |     4 -
 .../storage/segment/variant_stats_calculator.cpp   |    18 +-
 be/src/storage/segment/variant_stats_calculator.h  |     8 +-
 be/src/storage/segment/vertical_segment_writer.cpp |    10 +-
 be/src/storage/segment/virtual_column_iterator.cpp |     4 +-
 be/src/storage/segment/virtual_column_iterator.h   |     4 +-
 be/src/storage/snapshot/snapshot_manager.cpp       |    21 +-
 be/src/storage/snapshot/snapshot_manager.h         |     2 +-
 be/src/storage/storage_engine.cpp                  |    26 +-
 be/src/storage/storage_engine.h                    |    20 +-
 be/src/storage/tablet/base_tablet.cpp              |    27 +-
 be/src/storage/tablet/base_tablet.h                |     4 +
 be/src/storage/tablet/tablet.cpp                   |   110 +-
 be/src/storage/tablet/tablet.h                     |    36 +-
 be/src/storage/tablet/tablet_manager.cpp           |     6 +-
 be/src/storage/tablet/tablet_meta.cpp              |   546 +-
 be/src/storage/tablet/tablet_meta.h                |    59 +-
 be/src/storage/tablet/tablet_meta_manager.cpp      |    12 +-
 be/src/storage/tablet/tablet_reader.cpp            |    12 +-
 be/src/storage/tablet/tablet_reader.h              |    19 +-
 be/src/storage/tablet/tablet_schema.cpp            |     8 +-
 be/src/storage/tablet/tablet_schema.h              |    19 +-
 be/src/storage/tablet_info.cpp                     |    34 +-
 be/src/storage/tablet_info.h                       |     2 -
 be/src/storage/task/engine_batch_load_task.h       |     6 +-
 be/src/storage/task/engine_clone_task.h            |     4 +-
 .../storage/task/engine_publish_version_task.cpp   |    65 +-
 be/src/storage/task/engine_publish_version_task.h  |    37 +-
 .../storage/task/engine_storage_migration_task.cpp |     2 -
 be/src/storage/task/index_builder.cpp              |    17 +-
 be/src/storage/txn/txn_manager.cpp                 |    16 +-
 be/src/storage/txn/txn_manager.h                   |     6 +-
 be/src/storage/types.cpp                           |     2 -
 be/src/storage/types.h                             |   275 +-
 be/src/storage/utils.cpp                           |     2 -
 be/src/storage/version_graph.cpp                   |     2 -
 be/src/tools/meta_tool.cpp                         |   196 +-
 be/src/udf/python/python_server.cpp                |   205 +-
 be/src/udf/python/python_server.h                  |    53 +-
 be/src/udf/python/python_server.py                 |   224 +-
 be/src/udf/python/python_udf_meta.cpp              |     8 +-
 be/src/udf/python/python_udf_meta.h                |    10 +-
 be/src/udf/python/python_udf_runtime.h             |     6 +-
 be/src/util/bit_packing.inline.h                   |     2 -
 be/src/util/bit_stream_utils.h                     |     2 -
 be/src/util/bit_stream_utils.inline.h              |     2 -
 be/src/util/bitmap.h                               |     2 -
 be/src/util/bitmap_intersect.h                     |    26 +-
 be/src/util/block_budget.h                         |    92 +
 be/src/util/block_compression.cpp                  |     2 -
 be/src/util/blocking_priority_queue.hpp            |     2 -
 be/src/util/blocking_queue.hpp                     |     2 -
 be/src/util/brpc_client_cache.cpp                  |     2 -
 be/src/util/brpc_client_cache.h                    |     2 -
 be/src/util/brpc_closure.h                         |   114 +-
 be/src/util/cgroup_util.cpp                        |     1 +
 be/src/util/coding.cpp                             |     2 -
 be/src/util/coding.h                               |     2 -
 be/src/util/countdown_latch.h                      |     2 -
 be/src/util/counts.h                               |   227 -
 be/src/util/cpu_info.cpp                           |     4 +-
 be/src/util/date_func.cpp                          |     2 -
 be/src/util/decompressor.cpp                       |     2 -
 be/src/util/decompressor.h                         |     2 -
 be/src/util/disk_info.cpp                          |     4 -
 be/src/util/disk_info.h                            |     4 -
 be/src/util/frame_of_reference_coding.cpp          |     2 -
 be/src/util/frame_of_reference_coding.h            |     2 -
 be/src/util/hash/city.cc                           |     1 -
 be/src/util/hash/murmur_hash3.cpp                  |     8 +-
 be/src/util/hash_util.hpp                          |     3 -
 be/src/util/io_helper.cpp                          |    55 -
 be/src/util/io_helper.h                            |   252 -
 be/src/util/jni-util.cpp                           |     6 +-
 be/src/util/jni_native_method.cpp                  |   127 +
 be/src/util/jni_native_method.h                    |     4 +
 be/src/util/json/json_parser.cpp                   |    61 +-
 be/src/util/json/json_parser.h                     |     5 +
 be/src/util/json/path_in_data.cpp                  |     4 -
 be/src/util/json/simd_json_parser.h                |     4 -
 be/src/util/jsonb_document_cast.h                  |    16 +-
 be/src/util/jsonb_parser_simd.h                    |     2 -
 be/src/util/lru_cache.cpp                          |     1 -
 be/src/util/lru_cache.h                            |     2 -
 be/src/util/lzo_decompressor.cpp                   |     2 -
 be/src/util/network_util.cpp                       |     2 -
 be/src/util/parse_util.cpp                         |     1 -
 be/src/util/percentile_util.h                      |   300 +
 be/src/util/perf_counters.cpp                      |     1 -
 be/src/util/raw_value.h                            |     2 -
 be/src/util/rle_encoding.h                         |     2 -
 be/src/util/s3_util.cpp                            |     2 +-
 be/src/util/s3_util.h                              |     2 +-
 be/src/util/simd/bits.h                            |     2 -
 be/src/util/simd/reverse_copy_bytes.h              |     2 -
 be/src/util/simd/vstring_function.h                |     1 -
 be/src/util/slice.h                                |     2 -
 be/src/util/stopwatch.hpp                          |    70 +-
 be/src/util/string_search.hpp                      |     2 -
 be/src/util/tdigest.h                              |     2 -
 be/src/util/thrift_client.h                        |     3 +
 be/src/util/time_lut.cpp                           |     2 -
 be/src/util/timezone_utils.cpp                     |   128 +-
 be/src/util/timezone_utils.h                       |     5 +
 be/src/util/uid_util.cpp                           |     2 -
 be/src/util/unaligned.h                            |     1 +
 be/src/util/url_parser.cpp                         |     2 -
 be/src/util/zlib.cpp                               |     2 -
 be/test/CMakeLists.txt                             |     6 +
 be/test/ai/aggregate_function_ai_agg_test.cpp      |   105 +-
 be/test/ai/ai_adapter_test.cpp                     |   423 +-
 be/test/ai/ai_function_test.cpp                    |   874 +-
 be/test/ai/embed_test.cpp                          |   666 +-
 .../cloud/cloud_ms_backpressure_handler_test.cpp   |   552 +
 be/test/cloud/cloud_ms_rpc_rate_limiters_test.cpp  |   310 +
 be/test/cloud/cloud_schema_change_job_test.cpp     |   339 +
 be/test/cloud/cloud_tablet_hotspot_gc_test.cpp     |   198 +
 be/test/cloud/cloud_tablet_test.cpp                |   248 +
 .../cloud/cloud_throttle_state_machine_test.cpp    |   954 +
 be/test/common/block_budget_test.cpp               |   125 +
 be/test/common/check_overflow.cpp                  |     5 +-
 be/test/core/block/block_test.cpp                  |     2 -
 be/test/core/column/column_const_test.cpp          |    10 +-
 be/test/core/column/column_dictionary_test.cpp     |     3 +-
 be/test/core/column/column_hash_func_test.cpp      |     2 +-
 be/test/core/column/column_string_test.cpp         |    89 +-
 be/test/core/column/column_varbinary_test.cpp      |     9 +-
 be/test/core/column/column_variant_test.cpp        |   128 +-
 be/test/core/column/predicate_column_test.cpp      |  1082 +
 be/test/core/data_type/common_data_type_test.h     |     1 -
 be/test/core/data_type/data_type_array_test.cpp    |     6 +-
 .../core/data_type/data_type_datetime_v1_test.cpp  |     2 +-
 .../core/data_type/data_type_datetime_v2_test.cpp  |    19 +-
 be/test/core/data_type/data_type_decimal_test.cpp  |    16 +-
 .../data_type/data_type_insert_default_test.cpp    |   348 +
 be/test/core/data_type/data_type_ip_test.cpp       |     2 +-
 be/test/core/data_type/data_type_jsonb_test.cpp    |     6 -
 be/test/core/data_type/data_type_map_test.cpp      |     2 +-
 be/test/core/data_type/data_type_number_test.cpp   |     9 +-
 be/test/core/data_type/data_type_string_test.cpp   |     2 -
 be/test/core/data_type/data_type_struct_test.cpp   |    10 +-
 .../core/data_type/data_type_timestamptz_test.cpp  |    26 +-
 .../core/data_type/data_type_varbinary_test.cpp    |     7 -
 .../data_type_serde/data_type_serde_arrow_test.cpp |    31 +-
 .../data_type_serde_datelike_batch_test.cpp        |   454 +
 .../data_type_serde_decimal_test.cpp               |   162 +
 .../data_type_serde/data_type_serde_map_test.cpp   |    57 +
 .../data_type_serde_number_test.cpp                |    36 +
 .../data_type_serde/data_type_serde_pb_test.cpp    |     4 +-
 .../core/data_type_serde/data_type_serde_test.cpp  |    45 -
 .../data_type_serde_varbinary_test.cpp             |    26 +-
 .../data_type_serde/data_type_to_string_test.cpp   |     2 +-
 be/test/core/field_test.cpp                        |     2 +-
 be/test/core/jsonb/convert_field_to_type_test.cpp  |     2 +-
 be/test/core/jsonb/serialize_test.cpp              |     2 +-
 .../utils/arrow_column_to_doris_column_test.cpp    |    30 +-
 be/test/core/value/vdatetime_value_test.cpp        |   240 +-
 be/test/exec/column_type_convert_test.cpp          |   124 +-
 .../common/hash_table/hash_crc32_return32_test.cpp |   293 +
 be/test/exec/common/schema_util_rowset_test.cpp    |     2 +-
 be/test/exec/common/schema_util_test.cpp           |   111 +-
 .../exec/operator/analytic_sink_operator_test.cpp  |     2 +-
 ...istinct_streaming_aggregation_operator_test.cpp |     2 +-
 .../operator/exchange_source_operator_test.cpp     |     2 +-
 be/test/exec/operator/hashjoin_build_sink_test.cpp |   262 +
 .../local_merge_sort_source_operator_test.cpp      |     7 +-
 .../operator/materialization_shared_state_test.cpp |   221 +-
 .../nested_loop_join_probe_operator_test.cpp       |   167 +
 .../operator/partition_sort_sink_operator_test.cpp |     9 +-
 ...artitioned_aggregation_source_operator_test.cpp |    38 +
 .../partitioned_hash_join_probe_operator_test.cpp  |    45 +
 .../exec/operator/query_cache_operator_test.cpp    |     2 +-
 be/test/exec/operator/repeat_operator_test.cpp     |     2 +-
 be/test/exec/operator/set_operator_test.cpp        |     4 +-
 be/test/exec/operator/sort_operator_test.cpp       |    12 +-
 .../operator/spill_sort_source_operator_test.cpp   |    12 +-
 .../exec/operator/table_function_operator_test.cpp |  1248 +-
 be/test/exec/operator/union_operator_test.cpp      |     6 +-
 be/test/exec/pipeline/data_queue_test.cpp          |   309 +-
 be/test/exec/pipeline/dummy_task_queue.h           |     9 +-
 be/test/exec/pipeline/local_exchanger_test.cpp     |    92 +-
 .../pipeline/multi_cast_data_streamer_test.cpp     |    17 +-
 be/test/exec/pipeline/pipeline_task_test.cpp       |   282 +-
 be/test/exec/pipeline/pipeline_test.cpp            |   130 +-
 be/test/exec/pipeline/vdata_stream_recvr_test.cpp  |     2 -
 .../runtime_filter/runtime_filter_mgr_test.cpp     |    10 +-
 .../runtime_filter_selectivity_test.cpp            |    46 +
 .../runtime_filter/sync_size_callback_test.cpp     |   379 +
 .../vruntimefilter_wrapper_sampling_test.cpp       |   181 +
 be/test/exec/scan/scanner_context_test.cpp         |   530 +-
 be/test/exec/scan/scanner_late_arrival_rf_test.cpp |   120 +
 be/test/exec/scan/vfile_scanner_exception_test.cpp |    41 +
 .../schema_role_mappings_scanner_test.cpp          |    40 +
 .../exec/sink/arrow_result_block_buffer_test.cpp   |    20 +-
 be/test/exec/sink/result_block_buffer_test.cpp     |    18 +-
 be/test/exec/sink/viceberg_delete_sink_test.cpp    |   111 +
 be/test/exec/sort/full_sort_test.cpp               |    20 +-
 be/test/exec/sort/heap_sorter_test.cpp             |    24 +-
 be/test/exec/sort/merge_sorter_state.cpp           |     2 +-
 be/test/exec/sort/partition_sorter_test.cpp        |    20 +-
 be/test/exec/sort/sort_test.cpp                    |    38 +-
 be/test/exec/sort/topn_sort_test.cpp               |    18 +-
 .../mixed_encoding_position_delete.parquet         |   Bin 0 -> 34601 bytes
 be/test/exprs/aggregate/agg_replace_test.cpp       |    20 +-
 be/test/exprs/aggregate/agg_test.cpp               |    49 +
 .../aggregate/aggregate_function_min_max_test.cpp  |   224 +
 be/test/exprs/aggregate/vec_retention_test.cpp     |    18 +-
 .../exprs/aggregate/vec_sequence_match_test.cpp    |   104 +-
 .../exprs/aggregate/vec_window_funnel_v2_test.cpp  |  1910 ++
 be/test/exprs/bloom_filter_func_test.cpp           |     7 +-
 be/test/exprs/function/cast/cast_test.h            |    10 +-
 .../exprs/function/cast/cast_to_float_double.cpp   |    21 +-
 .../function/cast/cast_to_string_api_test.cpp      |    43 +-
 .../function/cast/function_variant_cast_test.cpp   |    16 +-
 ...ion_comparison_evaluate_inverted_index_test.cpp |     4 +-
 be/test/exprs/function/function_ip_test.cpp        |     4 +-
 .../function/function_json_object_flatten_test.cpp |   134 +
 .../exprs/function/function_money_format_test.cpp  |     2 +-
 be/test/exprs/function/function_string_test.cpp    |    30 +
 .../exprs/function/function_sub_replace_test.cpp   |     2 +-
 be/test/exprs/function/function_test_util.cpp      |    27 +-
 .../function/function_variant_element_test.cpp     |     4 +-
 be/test/exprs/function/table_function_test.cpp     |  1046 +
 be/test/exprs/minmax_predicate_test.cpp            |    16 +-
 be/test/exprs/mock_vexpr.h                         |     4 +-
 be/test/exprs/score_runtime_test.cpp               |    11 +-
 be/test/exprs/try_cast_expr_test.cpp               |    12 +-
 be/test/exprs/vexpr_test.cpp                       |   325 +-
 be/test/exprs/virtual_slot_ref_test.cpp            |    15 +-
 be/test/exprs/vsearch_expr_test.cpp                |    21 +-
 be/test/format/condition_cache_test.cpp            |   106 +-
 be/test/format/count_reader_test.cpp               |   197 +
 be/test/format/csv/csv_reader_test.cpp             |    88 +
 be/test/format/json/json_reader_test.cpp           |    90 +
 be/test/format/lance/lance_rust_reader_test.cpp    |   218 +
 be/test/format/lance/standalone_lance_test.cpp     |   376 +
 .../format/native/native_reader_writer_test.cpp    |     5 +-
 be/test/format/orc/orc_convert_dict_test.cpp       |    10 +-
 .../format/orc/orc_convert_to_orc_literal_test.cpp |    64 +-
 be/test/format/orc/orc_read_lines.cpp              |    31 +-
 be/test/format/orc/orc_reader_fill_data_test.cpp   |    12 +-
 be/test/format/orc/orc_reader_init_column_test.cpp |    16 +-
 be/test/format/orc/orc_reader_test.cpp             |    83 +-
 .../format/parquet/parquet_column_convert_test.cpp |   122 +
 be/test/format/parquet/parquet_expr_test.cpp       |    33 +-
 be/test/format/parquet/parquet_read_lines.cpp      |    28 +-
 be/test/format/parquet/parquet_reader_test.cpp     |   162 +-
 be/test/format/table/es_http_reader_test.cpp       |    72 +
 .../hive/hive_reader_create_column_ids_test.cpp    |    45 +-
 be/test/format/table/hive/hive_reader_test.cpp     |    82 +-
 .../iceberg_delete_file_reader_helper_test.cpp     |   110 +
 .../iceberg_reader_create_column_ids_test.cpp      |    45 +-
 .../format/table/iceberg/iceberg_reader_test.cpp   |   265 +-
 be/test/format/table/table_format_reader_test.cpp  |    51 +
 .../table/table_schema_change_helper_test.cpp      |     9 +-
 be/test/io/cache/block_file_cache_test.cpp         |    89 +
 .../io/cache/block_file_cache_test_lru_dump.cpp    |     1 +
 be/test/io/client/s3_file_system_test.cpp          |    52 +-
 be/test/io/fs/packed_file_concurrency_test.cpp     |     2 +
 be/test/io/fs/packed_file_manager_test.cpp         |    72 +-
 be/test/io/fs/packed_file_system_test.cpp          |    51 +
 be/test/io/fs/s3_file_writer_test.cpp              |    30 +-
 .../delta_writer/delta_writer_cluster_key_test.cpp |     8 +-
 be/test/load/delta_writer/delta_writer_test.cpp    |    49 +-
 .../load/memtable/memtable_flush_executor_test.cpp |    18 +-
 be/test/olap/rowset/group_rowset_builder_test.cpp  |   219 +
 be/test/runtime/aws_msk_iam_auth_test.cpp          |   244 +
 .../fragment_mgr_cross_cluster_cancel_test.cpp     |   186 +
 .../runtime/runtime_state_block_budget_test.cpp    |   167 +
 be/test/runtime/timestamptz_value_test.cpp         |     2 +-
 .../workload_group/workload_group_manager_test.cpp |   654 +-
 be/test/service/http/compaction_action_test.cpp    |   263 +
 be/test/service/http/http_auth_test.cpp            |    99 +-
 .../adaptive_thread_pool_controller_test.cpp       |   352 +
 .../cache/ann_index_ivf_list_cache_test.cpp        |   238 +
 .../compaction/collection_statistics_test.cpp      |   666 +-
 .../compaction/vertical_compaction_test.cpp        |   259 +
 be/test/storage/compaction_task_tracker_test.cpp   |   769 +
 .../storage/index/ann/ann_index_reader_test.cpp    |    36 -
 .../storage/index/ann/ann_range_search_test.cpp    |    85 +-
 .../storage/index/ann/ann_topn_descriptor_test.cpp |     8 +-
 .../index/ann/ann_topn_runtime_negative_test.cpp   |     2 +-
 .../index/ann/extract_query_vector_test.cpp        |   248 +
 .../storage/index/ann/faiss_vector_index_test.cpp  |   124 +
 .../index/ann/virtual_column_iterator_test.cpp     |    48 +-
 .../compaction/util/index_compaction_utils.cpp     |     7 +-
 .../iterator/block_reader_agg_flush_test.cpp       |   239 +
 .../iterator/block_reader_batch_max_rows_test.cpp  |   144 +
 .../vcollect_iterator_collected_enough_test.cpp    |   383 +
 .../iterator/vertical_merge_iterator_test.cpp      |    69 +-
 be/test/storage/key_coder_test.cpp                 |   352 +
 be/test/storage/olap_type_test.cpp                 |    62 +-
 be/test/storage/rowset/rowset_meta_test.cpp        |   152 +
 .../segment/adaptive_block_size_predictor_test.cpp |   357 +
 be/test/storage/segment/binary_dict_page_test.cpp  |    10 -
 be/test/storage/segment/binary_plain_page_test.cpp |     8 -
 .../storage/segment/binary_plain_page_v2_test.cpp  |    64 -
 .../storage/segment/binary_prefix_page_test.cpp    |    16 -
 be/test/storage/segment/bitshuffle_page_test.cpp   |     8 -
 be/test/storage/segment/column_reader_test.cpp     |    40 +-
 .../segment/frame_of_reference_page_test.cpp       |     6 -
 .../segment/hierarchical_data_iterator_test.cpp    |     6 +-
 .../storage/segment/index_reader_helper_test.cpp   |     4 +-
 .../inverted_index_compound_reader_test.cpp        |    57 +
 .../segment/inverted_index_iterator_test.cpp       |     4 +-
 .../segment/inverted_index_query_param_test.cpp    |   591 -
 .../storage/segment/inverted_index_reader_test.cpp |   648 +-
 .../storage/segment/inverted_index_writer_test.cpp |    22 +-
 be/test/storage/segment/mock/mock_segment.h        |     4 +
 .../storage/segment/nested_group_provider_test.cpp |     2 +-
 be/test/storage/segment/plain_page_test.cpp        |     8 -
 be/test/storage/segment/rle_page_test.cpp          |     8 -
 be/test/storage/segment/segment_cache_test.cpp     |     8 +-
 .../segment/segment_column_raw_data_bytes_test.cpp |    66 +
 .../segment_iterator_apply_index_expr_test.cpp     |     4 +-
 .../segment/segment_iterator_limit_opt_test.cpp    |   207 +
 .../segments_key_bounds_truncation_test.cpp        |     7 +
 .../segment/variant_column_writer_reader_test.cpp  |   536 +-
 .../segment/variant_stats_calculator_test.cpp      |    35 +
 be/test/storage/segment/variant_util_test.cpp      |   291 +-
 be/test/storage/segment/zone_map_index_test.cpp    |   105 +
 be/test/storage/storage_engine_test.cpp            |    28 +-
 be/test/storage/storage_types_test.cpp             |    53 +-
 be/test/storage/tablet/tablet_cooldown_test.cpp    |     8 +-
 .../storage/tablet/tablet_meta_manager_test.cpp    |     6 +
 be/test/storage/test_data/tablet_meta_test.hdr     |   Bin 0 -> 280 bytes
 be/test/storage/txn/txn_manager_test.cpp           |    28 +-
 be/test/testutil/mock/mock_descriptors.h           |    32 +-
 be/test/testutil/mock/mock_runtime_state.h         |    17 +-
 be/test/testutil/variant_util.h                    |    10 +-
 be/test/udf/python/python_server_test.cpp          |   272 +-
 be/test/udf/python/python_udf_meta_test.cpp        |    66 +-
 be/test/udf/python/python_udf_runtime_test.cpp     |    29 +-
 be/test/util/counts_test.cpp                       |    82 -
 be/test/util/percentile_util_test.cpp              |   290 +
 be/test/util/profile_spec_test.cpp                 |   111 +-
 be/test/util/test_data/stat_cpu_busy_after         |     1 +
 be/test/util/test_data/stat_cpu_busy_before        |     1 +
 be/test/util/test_data/stat_cpu_iowait_after       |     1 +
 be/test/util/test_data/stat_cpu_recovery_after     |     1 +
 be/test/util/test_data/stat_cpu_regressed_after    |     1 +
 be/test/util/timezone_utils_test.cpp               |   155 +-
 bin/start_fe.sh                                    |    21 +-
 build-support/check-format.sh                      |    11 +-
 build-support/clang-format.sh                      |    11 +-
 build-support/run-clang-tidy.sh                    |   375 +
 build.sh                                           |   158 +-
 cloud/script/start.sh                              |     5 +-
 cloud/src/common/CMakeLists.txt                    |    18 +
 cloud/src/common/config.h                          |     2 +-
 cloud/src/common/configbase.cpp                    |    57 +
 cloud/src/common/configbase.h                      |     5 +
 cloud/src/common/http_helper.cpp                   |  1219 +
 cloud/src/common/http_helper.h                     |   212 +
 cloud/src/gen-cpp/CMakeLists.txt                   |    17 +
 cloud/src/main.cpp                                 |    14 +-
 cloud/src/meta-service/CMakeLists.txt              |    17 +-
 cloud/src/meta-service/http_encode_key.cpp         |     5 +-
 cloud/src/meta-service/injection_point_http.cpp    |    29 +
 cloud/src/meta-service/meta_server.cpp             |     3 +-
 cloud/src/meta-service/meta_service.cpp            |    17 +-
 cloud/src/meta-service/meta_service.h              |    13 +-
 cloud/src/meta-service/meta_service_http.cpp       |   904 +-
 cloud/src/meta-service/meta_service_http.h         |    18 +
 cloud/src/meta-service/meta_service_job.cpp        |     8 +-
 cloud/src/meta-service/meta_service_resource.cpp   |   255 +-
 .../src/meta-service/meta_service_tablet_stats.cpp |     4 +-
 cloud/src/meta-service/meta_service_txn.cpp        |    20 +-
 cloud/src/meta-store/CMakeLists.txt                |    17 +
 cloud/src/meta-store/blob_message.cpp              |     9 +-
 cloud/src/meta-store/txn_kv.cpp                    |     2 +-
 cloud/src/rate-limiter/CMakeLists.txt              |    16 +
 cloud/src/recycler/CMakeLists.txt                  |    16 +
 cloud/src/recycler/azure_obj_client.cpp            |     2 +-
 cloud/src/recycler/checker.cpp                     |    88 +-
 cloud/src/recycler/meta_checker.cpp                |     7 +-
 cloud/src/recycler/recycler.cpp                    |   546 +-
 cloud/src/recycler/recycler.h                      |    31 +-
 cloud/src/recycler/recycler_service.cpp            |   234 +-
 cloud/src/recycler/recycler_service.h              |    14 +-
 cloud/src/recycler/recycler_snapshot.cpp           |     8 +-
 cloud/src/recycler/s3_accessor.cpp                 |     2 +-
 cloud/src/recycler/s3_accessor.h                   |     3 +-
 cloud/src/recycler/s3_obj_client.cpp               |     2 +-
 cloud/src/recycler/snapshot_chain_compactor.cpp    |     5 +-
 cloud/src/recycler/snapshot_data_migrator.cpp      |     5 +-
 cloud/src/recycler/util.cpp                        |     4 +-
 cloud/src/resource-manager/CMakeLists.txt          |    16 +
 cloud/src/resource-manager/resource_manager.cpp    |    19 +-
 cloud/src/snapshot/CMakeLists.txt                  |    19 +-
 cloud/src/snapshot/snapshot_manager.cpp            |    96 +
 cloud/src/snapshot/snapshot_manager.h              |    10 +-
 cloud/src/snapshot/snapshot_manager_factory.cpp    |    26 +
 cloud/src/snapshot/snapshot_manager_factory.h      |    28 +
 cloud/test/CMakeLists.txt                          |    17 +
 cloud/test/bvars_test.cpp                          |     4 +-
 cloud/test/mem_txn_kv_test.cpp                     |     4 +-
 cloud/test/meta_service_http_test.cpp              |   169 +-
 cloud/test/meta_service_job_test.cpp               |     5 +
 cloud/test/meta_service_test.cpp                   |   161 +-
 cloud/test/mock_accessor.h                         |     2 +-
 cloud/test/recycler_test.cpp                       |    80 +-
 cloud/test/s3_accessor_client_test.cpp             |    54 +-
 cloud/test/s3_rate_limiter_test.cpp                |     2 +-
 cloud/test/txn_kv_test.cpp                         |    12 +-
 common/cpp/s3_rate_limiter.cpp                     |   154 -
 common/cpp/s3_rate_limiter.h                       |    97 -
 common/cpp/token_bucket_rate_limiter.cpp           |   157 +
 common/cpp/token_bucket_rate_limiter.h             |    99 +
 conf/be.conf                                       |     2 +-
 conf/fe.conf                                       |     7 +-
 conf/ubsan_ignorelist.txt                          |    23 +
 contrib/faiss                                      |     2 +-
 docker/runtime/be/resource/be_entrypoint.sh        |   131 +-
 docker/runtime/doris-compose/cluster.py            |    15 +-
 docker/runtime/doris-compose/command.py            |    58 +-
 docker/runtime/doris-compose/resource/fdb.conf     |     4 +-
 docker/runtime/doris-compose/resource/init_fdb.sh  |    19 +
 docker/runtime/doris-compose/resource/init_fe.sh   |    29 +-
 docker/runtime/doris-compose/utils.py              |    51 +-
 docker/runtime/fe/resource/fe_entrypoint.sh        |   132 +-
 docker/runtime/fe/resource/fe_prestop.sh           |     2 +-
 docker/thirdparties/custom_settings.env            |     8 +
 .../docker-compose/clickhouse/clickhouse.yaml.tpl  |     5 +-
 .../thirdparties/docker-compose/db2/db2.yaml.tpl   |     3 +-
 docker/thirdparties/docker-compose/hive/README.md  |   408 +
 .../thirdparties/docker-compose/hive/README_ZH.md  |   408 +
 .../docker-compose/hive/hadoop-hive-3x.env.tpl     |     4 +-
 .../docker-compose/hive/hadoop-hive.env.tpl        |     6 +-
 .../docker-compose/hive/hive-2x.yaml.tpl           |    36 +-
 .../docker-compose/hive/hive-2x_settings.env       |     4 +-
 .../docker-compose/hive/hive-3x.yaml.tpl           |    36 +-
 .../hive/scripts/auxlib/lzo-hadoop-1.0.6.tar.gz    |   Bin 0 -> 39584 bytes
 .../docker-compose/hive/scripts/bin/hadoop         |    75 +
 .../docker-compose/hive/scripts/bin/hive           |    54 +
 .../hive/scripts/bootstrap/bootstrap-groups.sh     |   167 +
 .../bootstrap/hive2_only.preinstalled_hql.list     |     4 +
 .../hive/scripts/bootstrap/hive2_only.run_sh.list  |     1 +
 .../scripts/bootstrap/hive3_only.download_dir.list |     2 +
 .../hive/scripts/bootstrap/hive3_only.run_sh.list  |     2 +
 .../create_paimon_tables.hql                       |    26 +-
 .../create_hive_orc_tables.hql                     |     4 +-
 .../create_tpch1_orc.hql                           |    34 +-
 .../create_tpch1_parquet.hql                       |    34 +-
 .../create_preinstalled_scripts/employees.csv      |     5 +
 .../scripts/create_preinstalled_scripts/run02.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run03.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run04.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run05.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run06.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run07.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run08.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run09.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run10.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run11.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run12.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run13.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run14.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run15.hql  |     1 +
 .../scripts/create_preinstalled_scripts/run16.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run17.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run18.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run19.hql  |    20 +-
 .../scripts/create_preinstalled_scripts/run25.hql  |    22 +
 .../scripts/create_preinstalled_scripts/run29.hql  |     1 +
 .../scripts/create_preinstalled_scripts/run30.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run31.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run32.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run33.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run34.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run35.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run36.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run37.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run38.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run39.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run40.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run41.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run42.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run43.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run44.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run45.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run46.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run47.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run48.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run49.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run50.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run51.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run52.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run53.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run54.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run55.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run56.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run57.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run58.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run59.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run60.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run61.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run62.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run63.hql  |    58 +-
 .../scripts/create_preinstalled_scripts/run64.hql  |     9 +-
 .../scripts/create_preinstalled_scripts/run65.hql  |     9 +-
 .../scripts/create_preinstalled_scripts/run66.hql  |     4 +
 .../scripts/create_preinstalled_scripts/run67.hql  |     6 +-
 .../scripts/create_preinstalled_scripts/run69.hql  |     8 +-
 .../scripts/create_preinstalled_scripts/run70.hql  |     5 +-
 .../scripts/create_preinstalled_scripts/run71.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run72.hql  |    14 +-
 .../scripts/create_preinstalled_scripts/run73.hql  |    19 +-
 .../scripts/create_preinstalled_scripts/run74.hql  |    20 +-
 .../scripts/create_preinstalled_scripts/run75.hql  |   129 +-
 .../scripts/create_preinstalled_scripts/run76.hql  |    50 +-
 .../scripts/create_preinstalled_scripts/run77.hql  |     3 +-
 .../scripts/create_preinstalled_scripts/run80.hql  |    21 +-
 .../scripts/create_preinstalled_scripts/run81.hql  |    12 +-
 .../scripts/create_preinstalled_scripts/run82.hql  |     2 +
 .../scripts/create_preinstalled_scripts/run83.hql  |    31 +-
 .../scripts/create_preinstalled_scripts/run84.hql  |     7 +-
 .../scripts/create_preinstalled_scripts/run85.hql  |     4 +-
 .../scripts/create_preinstalled_scripts/run86.hql  |    50 +
 .../scripts/create_view_scripts/create_view.hql    |     8 +
 .../data/default/account_fund/create_table.hql     |     6 +-
 .../scripts/data/default/hive01/create_table.hql   |     6 +-
 .../data/default/sale_table/create_table.hql       |     6 +-
 .../data/default/string_table/create_table.hql     |     6 +-
 .../scripts/data/default/student/create_table.hql  |     6 +-
 .../scripts/data/default/test1/create_table.hql    |     6 +-
 .../scripts/data/default/test2/create_table.hql    |     6 +-
 .../data/default/test_hive_doris/create_table.hql  |     6 +-
 .../data/multi_catalog/datev2_csv/create_table.hql |     7 +-
 .../data/multi_catalog/datev2_orc/create_table.hql |     7 +-
 .../multi_catalog/datev2_parquet/create_table.hql  |     7 +-
 .../hive_config_test/create_table.hql              |    13 +-
 .../hive_text_complex_type/create_table.hql        |     6 +-
 .../hive_text_complex_type2/create_table.hql       |     6 +-
 .../hive_text_complex_type3/create_table.hql       |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../hive_textfile_array_all_types/create_table.hql |     6 +-
 .../hive_textfile_array_delimiter/create_table.hql |     6 +-
 .../hive_textfile_nestedarray/create_table.hql     |     6 +-
 .../hive_upper_case_orc/create_table.hql           |     7 +-
 .../hive_upper_case_parquet/create_table.hql       |     7 +-
 .../multi_catalog/logs1_parquet/create_table.hql   |     6 +-
 .../multi_catalog/one_partition/create_table.hql   |     5 +-
 .../orc_nested_types/create_table.hql              |     7 +-
 .../orc_partitioned_columns/create_table.hql       |     4 +-
 .../orc_partitioned_one_column/create_table.hql    |     4 +-
 .../orc_predicate/orc_predicate_table.hql          |    12 +-
 .../par_fields_in_file_orc/create_table.hql        |     4 +-
 .../par_fields_in_file_parquet/create_table.hql    |     4 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../parquet_alter_column_to_char/create_table.hql  |     6 +-
 .../parquet_alter_column_to_date/create_table.hql  |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../parquet_alter_column_to_float/create_table.hql |     6 +-
 .../parquet_alter_column_to_int/create_table.hql   |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../parquet_bloom_filter/create_table.hql          |     6 +-
 .../parquet_lz4_compression/create_table.hql       |     7 +-
 .../parquet_lzo_compression/create_table.hql       |     7 +-
 .../parquet_nested_types/create_table.hql          |    19 +-
 .../parquet_partitioned_columns/create_table.hql   |     4 +-
 .../create_table.hql                               |     4 +-
 .../parquet_predicate_table/create_table.hql       |     6 +-
 .../partition_location_1/create_table.hql          |     6 +-
 .../partition_location_2/create_table.hql          |     8 +-
 .../partition_manual_remove/create_table.hql       |     4 +-
 .../test_chinese_orc/create_table.hql              |     6 +-
 .../test_chinese_parquet/create_table.hql          |     6 +-
 .../test_chinese_text/create_table.hql             |     6 +-
 .../test_complex_types/create_table.hql            |    24 +-
 .../test_compress_partitioned/create_table.hql     |     4 +-
 .../test_csv_format_error/create_table.hql         |     4 +-
 .../test_date_string_partition/create_table.hql    |     6 +-
 .../test_hive_same_db_table_name/create_table.hql  |     6 +-
 .../create_table.hql                               |     4 +-
 .../test_mixed_par_locations_orc/create_table.hql  |     4 +-
 .../create_table.hql                               |     4 +-
 .../test_multi_langs_orc/create_table.hql          |     6 +-
 .../test_multi_langs_parquet/create_table.hql      |     6 +-
 .../test_multi_langs_text/create_table.hql         |     6 +-
 .../test_special_orc_formats/create_table.hql      |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../create_table.hql                               |     6 +-
 .../multi_catalog/test_wide_table/create_table.hql |     6 +-
 .../text_partitioned_columns/create_table.hql      |     4 +-
 .../text_partitioned_one_column/create_table.hql   |     4 +-
 .../timestamp_with_time_zone/create_table.hql      |     6 +-
 .../multi_catalog/two_partition/create_table.hql   |     5 +-
 .../multi_catalog/type_change_orc/create_table.hql |     6 +-
 .../type_change_origin/create_table.hql            |     6 +-
 .../type_change_parquet/create_table.hql           |     6 +-
 .../bigint_partition/create_table.hql              |     4 +-
 .../partition_type/char_partition/create_table.hql |     4 +-
 .../partition_type/date_partition/create_table.hql |     4 +-
 .../decimal_partition/create_table.hql             |     4 +-
 .../double_partition/create_table.hql              |     4 +-
 .../float_partition/create_table.hql               |     4 +-
 .../partition_type/int_partition/create_table.hql  |     4 +-
 .../smallint_partition/create_table.hql            |     4 +-
 .../string_partition/create_table.hql              |     4 +-
 .../tinyint_partition/create_table.hql             |     4 +-
 .../varchar_partition/create_table.hql             |     4 +-
 .../data/regression/crdmm_data/create_table.hql    |     7 +-
 .../multi_delimit_serde/create_table.hql           |    11 +-
 .../regression/serde_prop/some_serde_table.hql     |    53 +-
 .../data/statistics/empty_table/create_table.hql   |     6 +-
 .../data/statistics/statistics/create_table.hql    |     8 +-
 .../scripts/data/statistics/stats/create_table.hql |     6 +-
 .../scripts/data/test/hive_test/create_table.hql   |     6 +-
 .../data/tpch_1000_parquet/part/create_table.hql   |     7 +-
 .../data/tvf/test_hdfs_tvf_compression/run.sh      |     6 +-
 .../docker-compose/hive/scripts/healthy_check.sh   |     6 +-
 .../docker-compose/hive/scripts/hive-common-lib.sh |    80 +
 .../docker-compose/hive/scripts/hive-metastore.sh  |   149 -
 .../docker-compose/hive/scripts/hive-module-lib.sh |   325 +
 .../hive/scripts/init-hive-baseline.sh             |    36 +
 .../preinstalled_data/text_lzo/part-m-00000.lzo    |   Bin 0 -> 201 bytes
 .../text_lzo/part-m-00000.lzo.index                |   Bin 0 -> 8 bytes
 .../hive/scripts/prepare-hive-data.sh              |   162 +-
 .../hive/scripts/refresh-hive-modules.sh           |    59 +
 .../hive/scripts/reset-hive-state.sh               |    27 +
 .../hive/scripts/snapshot-hive-baseline.sh         |    68 +
 .../hive/scripts/start-hive-metastore.sh           |    29 +
 .../hive/scripts/start-hive-server.sh              |    27 +
 .../thirdparties/docker-compose/hudi/hudi.env.tpl  |     8 +-
 .../docker-compose/iceberg/entrypoint.sh.tpl       |    14 +-
 .../docker-compose/iceberg/iceberg.yaml.tpl        |    20 +-
 .../create_preinstalled_scripts/iceberg/run29.sql  |   391 +
 .../create_preinstalled_scripts/paimon/run02.sql   |   190 +-
 .../create_preinstalled_scripts/paimon/run09.sql   |     1 +
 .../docker-compose/iceberg/spark-defaults.conf     |    40 +-
 .../kerberos/entrypoint-hive-master.sh             |     5 +-
 .../docker-compose/kerberos/hadoop-hive.env.tpl    |     3 +-
 .../{postgresql => mysql}/certs/root.crt           |     0
 .../{postgresql => mysql}/certs/server.crt         |     0
 .../{postgresql => mysql}/certs/server.key         |     0
 .../docker-compose/mysql/mysql-5.7.yaml.tpl        |    19 +-
 docker/thirdparties/docker-health.sh               |    81 +
 docker/thirdparties/jindofs-helpers.sh             |   118 +
 docker/thirdparties/juicefs-helpers.sh             |   109 +-
 docker/thirdparties/run-thirdparties-docker.sh     |  1268 +-
 .../test/juicefs-helpers-mirror-test.sh            |    68 +
 ...irdparties-docker-hive-bootstrap-groups-test.sh |    64 +
 .../dbt-doris/dbt/adapters/doris/__version__.py    |     2 +-
 .../dbt-doris/dbt/adapters/doris/connections.py    |   104 +-
 extension/dbt-doris/dbt/adapters/doris/impl.py     |    86 +-
 extension/dbt-doris/dbt/adapters/doris/relation.py |     8 +-
 .../dbt/include/doris/macros/adapters/columns.sql  |    53 +-
 .../dbt/include/doris/macros/adapters/metadata.sql |     8 +-
 .../dbt/include/doris/macros/adapters/relation.sql |     8 +
 .../doris/macros/materializations/table/table.sql  |    13 +-
 .../materializations/view/create_view_as.sql       |     9 +-
 .../doris/macros/materializations/view/view.sql    |    49 +-
 .../dbt/include/doris/sample_profiles.yml          |    13 +-
 extension/dbt-doris/dev-requirements.txt           |    17 +
 extension/dbt-doris/setup.py                       |     7 +-
 extension/dbt-doris/test/conftest.py               |    10 +-
 .../dbt-doris/test/functional}/__init__.py         |     0
 .../dbt-doris/test/functional/adapter}/__init__.py |     0
 .../test/functional/adapter/test_basic.py          |    60 +-
 .../functional/adapter/test_doris_connection.py    |    90 +
 .../adapter/test_doris_cross_database.py           |   232 +
 .../functional/adapter/test_doris_incremental.py   |   177 +
 .../test/functional/adapter/test_doris_seed.py     |   142 +
 .../test/functional/adapter/test_doris_snapshot.py |    89 +
 .../test/functional/adapter/test_doris_table.py    |   186 +
 .../test/functional/adapter/test_doris_view.py     |   113 +
 fe/.mvn/maven-build-cache-config.xml               |    76 +
 .../apache/doris/hudi/HadoopHudiJniScanner.java    |     2 +-
 .../doris/iceberg/IcebergSysTableJniScanner.java   |    60 +-
 .../common/classloader/JniScannerClassLoader.java  |     9 +
 .../doris/common/classloader/ScannerLoader.java    |     2 +-
 .../apache/doris/common/jdbc/JdbcDriverUtils.java  |   114 +
 .../org/apache/doris/common/jni/JniScanner.java    |     4 +
 .../doris/common/jni/utils/JNINativeMethod.java    |     5 +
 .../java-common/src/main/resources/log4j2.xml      |    63 -
 .../apache/doris/common/jni/JniScannerTest.java    |    42 +
 .../org/apache/doris/jdbc/MySQLTypeHandler.java    |    23 +-
 .../max-compute-connector/pom.xml                  |     1 -
 .../doris/maxcompute/MaxComputeJniWriter.java      |   476 +-
 fe/be-java-extensions/paimon-scanner/pom.xml       |     4 -
 .../apache/doris/paimon/PaimonJdbcDriverUtils.java |    59 +
 .../org/apache/doris/paimon/PaimonJniScanner.java  |     8 +-
 .../paimon-scanner/src/main/resources/package.xml  |     6 +
 .../doris/paimon/PaimonJdbcDriverUtilsTest.java    |   139 +
 fe/be-java-extensions/preload-extensions/pom.xml   |     6 +-
 .../doris/authentication/AuthenticationResult.java |    46 +-
 .../doris/authentication/BasicPrincipal.java       |    32 +
 .../org/apache/doris/authentication/Principal.java |    10 +
 .../authentication/AuthenticationResultTest.java   |    19 +
 .../doris/authentication/BasicPrincipalTest.java   |    11 +-
 .../fe-authentication-handler/pom.xml              |    15 +-
 .../handler/AuthenticationOutcome.java             |    10 +
 .../handler/AuthenticationService.java             |    84 +-
 .../handler/AuthenticationOutcomeTest.java         |    41 +
 .../handler/AuthenticationPluginManagerTest.java   |     5 +
 .../handler/AuthenticationServiceTest.java         |   274 +-
 .../fe-authentication-role-mapping/pom.xml         |    62 +
 .../DefinitionBackedRoleMappingEvaluator.java      |   113 +
 .../IntegrationPropertyRoleMappingEvaluator.java   |   200 +
 .../rolemapping/NoOpRoleMappingEvaluator.java      |    40 +
 .../rolemapping/RoleMappingDefinition.java         |   118 +
 .../rolemapping/RoleMappingDefinitionProvider.java |    25 +
 .../rolemapping/RoleMappingEvaluator.java          |    32 +
 .../rolemapping/UnifiedRoleMappingCelEngine.java   |   495 +
 .../oidc/playground/RoleMappingCelPlayground.java  |   152 +
 .../playground/RoleMappingCelPlaygroundTest.java   |    36 +
 ...ntegrationPropertyRoleMappingEvaluatorTest.java |    85 +
 .../UnifiedRoleMappingCelEngineTest.java           |   180 +
 fe/fe-authentication/pom.xml                       |     1 +
 fe/fe-catalog/pom.xml                              |    66 +-
 .../org/apache/doris/analysis/SearchLexer.g4       |     0
 .../org/apache/doris/analysis/SearchParser.g4      |     0
 .../apache/doris/analysis/AnalyzerSelector.java    |     0
 .../org/apache/doris/analysis/ArithmeticExpr.java  |   133 +
 .../org/apache/doris/analysis/ArrayLiteral.java    |     0
 .../apache/doris/analysis/BetweenPredicate.java    |     0
 .../org/apache/doris/analysis/BinaryPredicate.java |     0
 .../org/apache/doris/analysis/BoolLiteral.java     |     0
 .../java/org/apache/doris/analysis/CaseExpr.java   |     0
 .../org/apache/doris/analysis/CaseWhenClause.java  |     0
 .../java/org/apache/doris/analysis/CastExpr.java   |     0
 .../apache/doris/analysis/ColumnAccessPath.java    |    99 +
 .../doris/analysis/ColumnAccessPathType.java       |    27 +
 .../org/apache/doris/analysis/ColumnRefExpr.java   |    73 +
 .../apache/doris/analysis/CompoundPredicate.java   |   119 +
 .../org/apache/doris/analysis/DateLiteral.java     |  1394 +
 .../org/apache/doris/analysis/DecimalLiteral.java  |   229 +
 .../org/apache/doris/analysis/EncryptKeyName.java  |   109 +
 .../org/apache/doris/analysis/EncryptKeyRef.java   |     0
 .../main/java/org/apache/doris/analysis/Expr.java  |   405 +
 .../apache/doris/analysis/ExprSubstitutionMap.java |     0
 .../org/apache/doris/analysis/ExprVisitor.java     |     0
 .../org/apache/doris/analysis/FloatLiteral.java    |     0
 .../apache/doris/analysis/FunctionCallExpr.java    |   344 +
 .../org/apache/doris/analysis/FunctionParams.java  |    95 +
 .../org/apache/doris/analysis/IPv4Literal.java     |     0
 .../org/apache/doris/analysis/IPv6Literal.java     |     0
 .../org/apache/doris/analysis/InPredicate.java     |   144 +
 .../apache/doris/analysis/InformationFunction.java |     0
 .../java/org/apache/doris/analysis/IntLiteral.java |     0
 .../doris/analysis/InvertedIndexProperties.java    |     0
 .../org/apache/doris/analysis/IsNullPredicate.java |     0
 .../org/apache/doris/analysis/JsonLiteral.java     |     0
 .../doris/analysis/LambdaFunctionCallExpr.java     |     0
 .../apache/doris/analysis/LambdaFunctionExpr.java  |     0
 .../org/apache/doris/analysis/LargeIntLiteral.java |     0
 .../org/apache/doris/analysis/LikePredicate.java   |     0
 .../org/apache/doris/analysis/LiteralExpr.java     |   106 +
 .../java/org/apache/doris/analysis/MapLiteral.java |     0
 .../org/apache/doris/analysis/MatchPredicate.java  |     0
 .../java/org/apache/doris/analysis/MaxLiteral.java |     0
 .../org/apache/doris/analysis/NullLiteral.java     |     0
 .../apache/doris/analysis/NumericLiteralExpr.java  |     0
 .../org/apache/doris/analysis/OrderByElement.java  |   127 +
 .../org/apache/doris/analysis/PlaceHolderExpr.java |   107 +
 .../java/org/apache/doris/analysis/Predicate.java  |     0
 .../org/apache/doris/analysis/SearchDslParser.java |     0
 .../org/apache/doris/analysis/SearchPredicate.java |     0
 .../java/org/apache/doris/analysis/SetType.java    |     0
 .../org/apache/doris/analysis/SlotDescriptor.java  |   248 +
 .../java/org/apache/doris/analysis/SlotId.java     |     0
 .../java/org/apache/doris/analysis/SlotRef.java    |   260 +
 .../org/apache/doris/analysis/StringLiteral.java   |     0
 .../org/apache/doris/analysis/StructLiteral.java   |     0
 .../org/apache/doris/analysis/TimeV2Literal.java   |   140 +
 .../doris/analysis/TimestampArithmeticExpr.java    |     0
 .../org/apache/doris/analysis/TryCastExpr.java     |     0
 .../java/org/apache/doris/analysis/TupleId.java    |     0
 .../apache/doris/analysis/VarBinaryLiteral.java    |     0
 .../org/apache/doris/analysis/VariableExpr.java    |   161 +
 .../org/apache/doris/analysis/VirtualSlotRef.java  |    35 +
 .../apache/doris/catalog/AggregateFunction.java    |   329 +
 .../org/apache/doris/catalog/AggregateType.java    |   176 +
 .../org/apache/doris/catalog/AliasFunction.java    |   101 +
 .../main/java/org/apache/doris/catalog/Column.java |  1104 +
 .../java/org/apache/doris/catalog/ColumnType.java  |   335 +
 .../java/org/apache/doris/catalog/Function.java    |   418 +
 .../org/apache/doris/catalog/FunctionName.java     |     0
 .../apache/doris/catalog/GeneratedColumnInfo.java  |    56 +
 .../main/java/org/apache/doris/catalog/Index.java  |   314 +
 .../org/apache/doris/catalog/NameSpaceContext.java |    48 +
 .../org/apache/doris/catalog/ScalarFunction.java   |   209 +
 .../apache/doris/catalog/info/TableNameInfo.java   |   238 +
 .../doris/persist/gson/GsonUtilsCatalog.java       |   190 +
 fe/fe-common/pom.xml                               |    87 +-
 .../main/java/org/apache/doris/common/Config.java  |   156 +-
 .../java/org/apache/doris/common/ErrorCode.java    |     2 +
 .../src/main/java/org/apache/doris/common/Id.java  |     0
 .../java/org/apache/doris/common/IdGenerator.java  |     0
 .../java/org/apache/doris/common/LdapConfig.java   |    31 +-
 .../java/org/apache/doris/common/TreeNode.java     |     0
 .../doris/common/maxcompute/MCProperties.java      |     7 +-
 .../apache/doris/job/cdc/DataSourceConfigKeys.java |    23 +
 .../job/cdc/request/CompareOffsetRequest.java      |     2 +-
 .../doris/job/cdc/request/FetchRecordRequest.java  |     1 +
 .../job/cdc/request/FetchTableSplitsRequest.java   |     2 +-
 .../doris/job/cdc/request/JobBaseConfig.java       |     2 +-
 .../apache/doris/persist/gson/GsonUtilsBase.java   |   414 +
 .../persist/gson/RuntimeTypeAdapterFactory.java    |     0
 .../java/org/apache/doris/qe/GlobalVariable.java   |   316 +
 .../main/java/org/apache/doris/qe/VarAttrDef.java  |    87 +
 fe/fe-connector/fe-connector-api/pom.xml           |    75 +
 .../org/apache/doris/connector/api/Connector.java  |   121 +
 .../doris/connector/api/ConnectorCapability.java   |    60 +
 .../doris/connector/api/ConnectorColumn.java       |    99 +
 .../connector/api/ConnectorDatabaseMetadata.java   |    70 +
 .../connector/api/ConnectorHttpSecurityHook.java   |    65 +
 .../connector/api/ConnectorIdentifierOps.java      |    68 +
 .../doris/connector/api/ConnectorMetadata.java     |    50 +
 .../connector/api/ConnectorPartitionInfo.java      |    82 +
 .../connector/api/ConnectorPropertyMetadata.java   |   120 +
 .../doris/connector/api/ConnectorPushdownOps.java  |    75 +
 .../doris/connector/api/ConnectorSchemaOps.java    |    60 +
 .../doris/connector/api/ConnectorSession.java      |    63 +
 .../connector/api/ConnectorStatisticsOps.java      |    35 +
 .../doris/connector/api/ConnectorTableOps.java     |   129 +
 .../doris/connector/api/ConnectorTableSchema.java  |    92 +
 .../connector/api/ConnectorTableStatistics.java    |    72 +
 .../doris/connector/api/ConnectorTestResult.java   |   116 +
 .../apache/doris/connector/api/ConnectorType.java  |   151 +
 .../connector/api/ConnectorValidationContext.java  |    75 +
 .../doris/connector/api/ConnectorWriteOps.java     |   200 +
 .../connector/api/DorisConnectorException.java     |    32 +
 .../api/handle/ConnectorColumnHandle.java          |    33 +
 .../api/handle/ConnectorDeleteHandle.java          |    29 +
 .../api/handle/ConnectorInsertHandle.java          |    24 +
 .../connector/api/handle/ConnectorMergeHandle.java |    29 +
 .../api/handle/ConnectorPartitionHandle.java       |    26 +
 .../connector/api/handle/ConnectorTableHandle.java |    26 +
 .../api/handle/ConnectorTransactionHandle.java     |    24 +
 .../connector/api/handle/NamedColumnHandle.java    |    61 +
 .../api/handle/PassthroughQueryTableHandle.java    |    46 +
 .../doris/connector/api/pushdown/ConnectorAnd.java |    70 +
 .../connector/api/pushdown/ConnectorBetween.java   |    81 +
 .../api/pushdown/ConnectorColumnAssignment.java    |    71 +
 .../connector/api/pushdown/ConnectorColumnRef.java |    75 +
 .../api/pushdown/ConnectorComparison.java          |   104 +
 .../connector/api/pushdown/ConnectorDomain.java    |   116 +
 .../api/pushdown/ConnectorExpression.java          |    35 +
 .../api/pushdown/ConnectorFilterConstraint.java    |    70 +
 .../api/pushdown/ConnectorFunctionCall.java        |    89 +
 .../doris/connector/api/pushdown/ConnectorIn.java  |    87 +
 .../connector/api/pushdown/ConnectorIsNull.java    |    74 +
 .../connector/api/pushdown/ConnectorLike.java      |    87 +
 .../connector/api/pushdown/ConnectorLiteral.java   |   120 +
 .../doris/connector/api/pushdown/ConnectorNot.java |    66 +
 .../doris/connector/api/pushdown/ConnectorOr.java  |    70 +
 .../connector/api/pushdown/ConnectorRange.java     |   144 +
 .../api/pushdown/FilterApplicationResult.java      |    80 +
 .../api/pushdown/LimitApplicationResult.java       |    70 +
 .../api/pushdown/ProjectionApplicationResult.java  |    85 +
 .../connector/api/scan/ConnectorDeleteFile.java    |    79 +
 .../api/scan/ConnectorScanPlanProvider.java        |   196 +
 .../connector/api/scan/ConnectorScanRange.java     |   141 +
 .../connector/api/scan/ConnectorScanRangeType.java |    47 +
 .../api/scan/ScanNodePropertiesResult.java         |    86 +
 .../connector/api/write/ConnectorWriteConfig.java  |   160 +
 .../connector/api/write/ConnectorWriteType.java    |    47 +
 fe/fe-connector/fe-connector-es/pom.xml            |   103 +
 .../src/main/assembly/plugin-zip.xml               |    60 +
 .../org/apache/doris/connector/es/EsConnector.java |   108 +
 .../doris/connector/es/EsConnectorMetadata.java    |   169 +
 .../doris/connector/es/EsConnectorProperties.java  |   101 +
 .../doris/connector/es/EsConnectorProvider.java    |    51 +
 .../doris/connector/es/EsConnectorRestClient.java  |   345 +
 .../apache/doris/connector/es/EsFieldContext.java  |    73 +
 .../apache/doris/connector/es/EsHostAddress.java   |   104 +
 .../apache/doris/connector/es/EsMajorVersion.java  |   117 +
 .../apache/doris/connector/es/EsMappingUtils.java  |   253 +
 .../doris/connector/es/EsMetadataFetcher.java      |    90 +
 .../apache/doris/connector/es/EsMetadataState.java |    91 +
 .../org/apache/doris/connector/es/EsNodeInfo.java  |   199 +
 .../doris/connector/es/EsQueryDslBuilder.java      |   825 +
 .../doris/connector/es/EsQueryDslResult.java       |    50 +
 .../doris/connector/es/EsScanPlanProvider.java     |   442 +
 .../org/apache/doris/connector/es/EsScanRange.java |   161 +
 .../doris/connector/es/EsShardPartitions.java      |   138 +
 .../apache/doris/connector/es/EsShardRouting.java  |    84 +
 .../apache/doris/connector/es/EsTableHandle.java   |    43 +
 .../apache/doris/connector/es/EsTypeMapping.java   |   263 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 .../connector/es/EsConnectorRestClientTest.java    |   188 +
 .../doris/connector/es/EsMajorVersionTest.java     |   129 +
 .../doris/connector/es/EsMappingUtilsTest.java     |   181 +
 .../connector/es/EsNodeInfoAndScanRangeTest.java   |   215 +
 .../doris/connector/es/EsQueryDslBuilderTest.java  |   244 +
 .../doris/connector/es/EsScanPlanProviderTest.java |   180 +
 .../doris/connector/es/EsTypeMappingTest.java      |   214 +
 fe/fe-connector/fe-connector-hive/pom.xml          |   107 +
 .../src/main/assembly/plugin-zip.xml               |    60 +
 .../doris/connector/hive/HiveColumnHandle.java     |    75 +
 .../apache/doris/connector/hive/HiveConnector.java |   107 +
 .../connector/hive/HiveConnectorMetadata.java      |   427 +
 .../connector/hive/HiveConnectorProperties.java    |    69 +
 .../connector/hive/HiveConnectorProvider.java      |    43 +
 .../doris/connector/hive/HiveFileFormat.java       |   112 +
 .../doris/connector/hive/HiveScanPlanProvider.java |   362 +
 .../apache/doris/connector/hive/HiveScanRange.java |   278 +
 .../connector/hive/HiveTableFormatDetector.java    |   108 +
 .../doris/connector/hive/HiveTableHandle.java      |   196 +
 .../apache/doris/connector/hive/HiveTableType.java |    41 +
 .../doris/connector/hive/HiveTextProperties.java   |   192 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/fe-connector-hms/pom.xml           |   102 +
 .../org/apache/doris/connector/hms/HmsClient.java  |   138 +
 .../doris/connector/hms/HmsClientConfig.java       |    87 +
 .../doris/connector/hms/HmsClientException.java    |    36 +
 .../apache/doris/connector/hms/HmsConfHelper.java  |    70 +
 .../doris/connector/hms/HmsDatabaseInfo.java       |    64 +
 .../doris/connector/hms/HmsPartitionInfo.java      |   100 +
 .../apache/doris/connector/hms/HmsTableInfo.java   |   205 +
 .../apache/doris/connector/hms/HmsTypeMapping.java |   255 +
 .../doris/connector/hms/ThriftHmsClient.java       |   506 +
 fe/fe-connector/fe-connector-hudi/pom.xml          |   121 +
 .../src/main/assembly/plugin-zip.xml               |    55 +
 .../doris/connector/hudi/HudiColumnHandle.java     |    80 +
 .../apache/doris/connector/hudi/HudiConnector.java |   110 +
 .../connector/hudi/HudiConnectorMetadata.java      |   306 +
 .../connector/hudi/HudiConnectorProperties.java    |    56 +
 .../connector/hudi/HudiConnectorProvider.java      |    44 +
 .../doris/connector/hudi/HudiScanPlanProvider.java |   372 +
 .../apache/doris/connector/hudi/HudiScanRange.java |   322 +
 .../doris/connector/hudi/HudiTableHandle.java      |   176 +
 .../doris/connector/hudi/HudiTypeMapping.java      |   159 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/fe-connector-iceberg/pom.xml       |   106 +
 .../src/main/assembly/plugin-zip.xml               |    55 +
 .../doris/connector/iceberg/IcebergConnector.java  |   150 +
 .../iceberg/IcebergConnectorMetadata.java          |   167 +
 .../iceberg/IcebergConnectorProperties.java        |    59 +
 .../iceberg/IcebergConnectorProvider.java          |    45 +
 .../connector/iceberg/IcebergTableHandle.java      |    50 +
 .../connector/iceberg/IcebergTypeMapping.java      |   125 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/fe-connector-jdbc/pom.xml          |    98 +
 .../src/main/assembly/plugin-zip.xml               |    60 +
 .../doris/connector/jdbc/JdbcColumnHandle.java     |    69 +
 .../connector/jdbc/JdbcConnectorMetadata.java      |   379 +
 .../connector/jdbc/JdbcConnectorProperties.java    |    91 +
 .../connector/jdbc/JdbcConnectorProvider.java      |   181 +
 .../apache/doris/connector/jdbc/JdbcDbType.java    |    83 +
 .../doris/connector/jdbc/JdbcDorisConnector.java   |   348 +
 .../connector/jdbc/JdbcFunctionPushdownConfig.java |   311 +
 .../doris/connector/jdbc/JdbcIdentifierMapper.java |   446 +
 .../doris/connector/jdbc/JdbcIdentifierQuoter.java |   131 +
 .../doris/connector/jdbc/JdbcQueryBuilder.java     |   671 +
 .../doris/connector/jdbc/JdbcScanPlanProvider.java |   188 +
 .../apache/doris/connector/jdbc/JdbcScanRange.java |   147 +
 .../doris/connector/jdbc/JdbcTableHandle.java      |    49 +
 .../doris/connector/jdbc/JdbcUrlNormalizer.java    |   155 +
 .../jdbc/client/JdbcClickHouseConnectorClient.java |   290 +
 .../connector/jdbc/client/JdbcConnectorClient.java |   683 +
 .../jdbc/client/JdbcDB2ConnectorClient.java        |   149 +
 .../doris/connector/jdbc/client/JdbcFieldInfo.java |   180 +
 .../jdbc/client/JdbcGbaseConnectorClient.java      |   188 +
 .../jdbc/client/JdbcMySQLConnectorClient.java      |   522 +
 .../jdbc/client/JdbcOceanBaseConnectorClient.java  |   161 +
 .../jdbc/client/JdbcOracleConnectorClient.java     |   220 +
 .../jdbc/client/JdbcPostgreSQLConnectorClient.java |   286 +
 .../jdbc/client/JdbcSQLServerConnectorClient.java  |   132 +
 .../jdbc/client/JdbcSapHanaConnectorClient.java    |   114 +
 .../jdbc/client/JdbcTrinoConnectorClient.java      |   116 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 .../connector/jdbc/JdbcConnectorMetadataTest.java  |   115 +
 .../jdbc/JdbcConnectorProviderValidateTest.java    |   249 +
 .../doris/connector/jdbc/JdbcDbTypeTest.java       |   130 +
 .../connector/jdbc/JdbcDorisConnectorTest.java     |   151 +
 .../jdbc/JdbcFunctionPushdownConfigTest.java       |   240 +
 .../connector/jdbc/JdbcIdentifierMapperTest.java   |   169 +
 .../connector/jdbc/JdbcIdentifierQuoterTest.java   |   187 +
 .../doris/connector/jdbc/JdbcQueryBuilderTest.java |   550 +
 .../jdbc/JdbcScanRangeAndPropertiesTest.java       |   176 +
 .../connector/jdbc/JdbcUrlNormalizerTest.java      |   158 +
 .../client/JdbcConnectorClientClassLoaderTest.java |    94 +
 .../jdbc/client/JdbcDB2ConnectorClientTest.java    |   108 +
 .../client/JdbcSQLServerConnectorClientTest.java   |   130 +
 fe/fe-connector/fe-connector-maxcompute/pom.xml    |   108 +
 .../src/main/assembly/plugin-zip.xml               |    60 +
 .../maxcompute/MCConnectorClientFactory.java       |   125 +
 .../connector/maxcompute/MCConnectorEndpoint.java  |   126 +
 .../maxcompute/MCConnectorProperties.java          |   101 +
 .../doris/connector/maxcompute/MCTypeMapping.java  |   126 +
 .../maxcompute/MaxComputeColumnHandle.java         |    70 +
 .../maxcompute/MaxComputeConnectorMetadata.java    |   155 +
 .../maxcompute/MaxComputeConnectorProvider.java    |    41 +
 .../maxcompute/MaxComputeDorisConnector.java       |   169 +
 .../maxcompute/MaxComputePredicateConverter.java   |   264 +
 .../maxcompute/MaxComputeScanPlanProvider.java     |   383 +
 .../connector/maxcompute/MaxComputeScanRange.java  |   186 +
 .../maxcompute/MaxComputeTableHandle.java          |    62 +
 .../connector/maxcompute/McStructureHelper.java    |   337 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/fe-connector-paimon/pom.xml        |   107 +
 .../src/main/assembly/plugin-zip.xml               |    55 +
 .../doris/connector/paimon/PaimonColumnHandle.java |    69 +
 .../doris/connector/paimon/PaimonConnector.java    |    96 +
 .../connector/paimon/PaimonConnectorMetadata.java  |   211 +
 .../paimon/PaimonConnectorProperties.java          |    42 +
 .../connector/paimon/PaimonConnectorProvider.java  |    43 +
 .../connector/paimon/PaimonPredicateConverter.java |   292 +
 .../connector/paimon/PaimonScanPlanProvider.java   |   396 +
 .../doris/connector/paimon/PaimonScanRange.java    |   318 +
 .../doris/connector/paimon/PaimonTableHandle.java  |    98 +
 .../doris/connector/paimon/PaimonTypeMapping.java  |   203 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/fe-connector-spi/pom.xml           |    76 +
 .../doris/connector/spi/ConnectorContext.java      |    95 +
 .../doris/connector/spi/ConnectorProvider.java     |    98 +
 .../apache/doris/connector/spi/package-info.java   |    29 +
 fe/fe-connector/fe-connector-trino/pom.xml         |   131 +
 .../src/main/assembly/plugin-zip.xml               |    58 +
 .../doris/connector/trino/TrinoBootstrap.java      |   339 +
 .../doris/connector/trino/TrinoColumnHandle.java   |    63 +
 .../trino/TrinoConnectorDorisMetadata.java         |   203 +
 .../connector/trino/TrinoConnectorProvider.java    |    41 +
 .../doris/connector/trino/TrinoDorisConnector.java |   173 +
 .../doris/connector/trino/TrinoJsonSerializer.java |    85 +
 .../doris/connector/trino/TrinoPluginManager.java  |   149 +
 .../connector/trino/TrinoPredicateConverter.java   |   291 +
 .../connector/trino/TrinoScanPlanProvider.java     |   295 +
 .../doris/connector/trino/TrinoScanRange.java      |   189 +
 .../connector/trino/TrinoServicesProvider.java     |   146 +
 .../doris/connector/trino/TrinoTableHandle.java    |    71 +
 .../doris/connector/trino/TrinoTypeMapping.java    |   117 +
 ...rg.apache.doris.connector.spi.ConnectorProvider |    18 +
 fe/fe-connector/pom.xml                            |    54 +
 fe/fe-core/pom.xml                                 |   287 +-
 .../antlr4/org/apache/doris/nereids/DorisLexer.g4  |     4 +
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |    29 +-
 fe/fe-core/src/main/assembly/fe-lib.xml            |    36 +
 .../src/main/java/org/apache/doris/DorisFE.java    |     7 +
 .../main/java/org/apache/doris/alter/Alter.java    |    16 +-
 .../java/org/apache/doris/alter/AlterJobV2.java    |     3 +-
 .../org/apache/doris/alter/AlterOperations.java    |     9 +
 .../doris/alter/MaterializedViewHandler.java       |     8 +-
 .../java/org/apache/doris/alter/RollupJobV2.java   |     2 +-
 .../apache/doris/alter/SchemaChangeHandler.java    |   358 +-
 .../org/apache/doris/alter/SchemaChangeJobV2.java  |     9 +-
 .../org/apache/doris/analysis/AggregateInfo.java   |     4 +-
 .../org/apache/doris/analysis/AnalyticWindow.java  |     6 +-
 .../doris/analysis/AnnIndexPropertiesChecker.java  |     9 +-
 .../org/apache/doris/analysis/ArithmeticExpr.java  |   135 -
 .../doris/analysis/AssertNumRowsElement.java       |     6 +-
 .../org/apache/doris/analysis/ColWithComment.java  |    55 -
 .../java/org/apache/doris/analysis/ColumnDef.java  |    50 +-
 .../org/apache/doris/analysis/ColumnRefExpr.java   |    81 -
 .../apache/doris/analysis/CompoundPredicate.java   |   119 -
 .../org/apache/doris/analysis/DataDescription.java |    49 +-
 .../org/apache/doris/analysis/DataSortInfo.java    |     7 +-
 .../org/apache/doris/analysis/DateLiteral.java     |  1602 -
 .../apache/doris/analysis/DateLiteralUtils.java    |   282 +
 .../org/apache/doris/analysis/DecimalLiteral.java  |   277 -
 .../apache/doris/analysis/DecimalLiteralUtils.java |    84 +
 .../org/apache/doris/analysis/DescriptorTable.java |    36 +-
 .../analysis/DescriptorToThriftConverter.java      |   142 +
 .../org/apache/doris/analysis/EncryptKeyName.java  |   114 -
 .../main/java/org/apache/doris/analysis/Expr.java  |   434 -
 .../doris/analysis/ExprToColumnLabelVisitor.java   |    51 -
 .../doris/analysis/ExprToExprNameVisitor.java      |    65 +
 .../doris/analysis/ExprToExternalSqlVisitor.java   |    14 +-
 .../doris/analysis/ExprToStringValueVisitor.java   |     2 +-
 .../apache/doris/analysis/ExprToThriftVisitor.java |    58 +-
 .../apache/doris/analysis/FunctionCallExpr.java    |   355 -
 .../org/apache/doris/analysis/FunctionParams.java  |   113 -
 .../apache/doris/analysis/ImportColumnsStmt.java   |    32 -
 .../apache/doris/analysis/ImportDeleteOnStmt.java  |    30 -
 .../apache/doris/analysis/ImportSequenceStmt.java  |    30 -
 .../org/apache/doris/analysis/ImportWhereStmt.java |    37 -
 .../org/apache/doris/analysis/InPredicate.java     |   144 -
 .../org/apache/doris/analysis/LiteralExpr.java     |   201 -
 .../apache/doris/analysis/LiteralExprUtils.java    |   117 +
 .../org/apache/doris/analysis/MVColumnItem.java    |    71 +-
 .../org/apache/doris/analysis/OrderByElement.java  |   131 -
 .../java/org/apache/doris/analysis/ParseNode.java  |    13 -
 .../apache/doris/analysis/PartitionExprUtil.java   |     2 +-
 .../org/apache/doris/analysis/PartitionValue.java  |     4 +-
 .../org/apache/doris/analysis/PlaceHolderExpr.java |   122 -
 .../org/apache/doris/analysis/SchemaTableType.java |    10 +-
 .../java/org/apache/doris/analysis/Separator.java  |    51 +-
 .../org/apache/doris/analysis/SlotDescriptor.java  |   298 -
 .../java/org/apache/doris/analysis/SlotRef.java    |   299 -
 .../org/apache/doris/analysis/StatementBase.java   |    25 +-
 .../org/apache/doris/analysis/StorageBackend.java  |    42 +-
 .../org/apache/doris/analysis/TableSample.java     |    16 +-
 .../org/apache/doris/analysis/TimeV2Literal.java   |   142 -
 .../org/apache/doris/analysis/TupleDescriptor.java |    52 +-
 .../org/apache/doris/analysis/VariableExpr.java    |   166 -
 .../org/apache/doris/analysis/VirtualSlotRef.java  |    46 -
 .../AuthenticationIntegrationMgr.java              |    31 +-
 .../AuthenticationIntegrationRuntime.java          |    64 +-
 .../doris/authentication/RoleMappingMeta.java      |   142 +
 .../doris/authentication/RoleMappingMgr.java       |   279 +
 .../java/org/apache/doris/backup/AbstractJob.java  |     5 +-
 .../org/apache/doris/backup/BackupHandler.java     |    30 +-
 .../java/org/apache/doris/backup/BackupJob.java    |     9 +-
 .../java/org/apache/doris/backup/Repository.java   |   639 +-
 .../org/apache/doris/backup/RepositoryMgr.java     |     8 +-
 .../java/org/apache/doris/backup/RestoreJob.java   |    43 +-
 .../org/apache/doris/binlog/BinlogConfigCache.java |     6 +-
 .../org/apache/doris/binlog/BinlogManager.java     |     2 +-
 .../java/org/apache/doris/binlog/BinlogUtils.java  |     6 +
 .../java/org/apache/doris/binlog/DBBinlog.java     |     2 +-
 .../java/org/apache/doris/binlog/TableBinlog.java  |     2 +-
 .../org/apache/doris/blockrule/SqlBlockRule.java   |    25 +-
 .../apache/doris/blockrule/SqlBlockRuleMgr.java    |    59 +-
 .../apache/doris/catalog/AggregateFunction.java    |   330 -
 .../org/apache/doris/catalog/AggregateType.java    |   203 -
 .../org/apache/doris/catalog/AliasFunction.java    |    98 -
 .../org/apache/doris/catalog/AzureResource.java    |   127 +-
 .../org/apache/doris/catalog/BinlogConfig.java     |   164 +-
 .../doris/catalog/BuiltinAggregateFunctions.java   |    12 +-
 .../doris/catalog/BuiltinScalarFunctions.java      |    10 +-
 .../catalog/BuiltinTableGeneratingFunctions.java   |    10 +
 .../doris/catalog/BuiltinTableValuedFunctions.java |     6 +-
 .../apache/doris/catalog/CatalogRecycleBin.java    |    12 +-
 .../apache/doris/catalog/CloudTabletStatMgr.java   |    52 +-
 .../main/java/org/apache/doris/catalog/Column.java |  1370 -
 .../org/apache/doris/catalog/ColumnToProtobuf.java |   201 +
 .../org/apache/doris/catalog/ColumnToThrift.java   |   198 +
 .../java/org/apache/doris/catalog/ColumnType.java  |   335 -
 .../java/org/apache/doris/catalog/Database.java    |   101 +-
 .../java/org/apache/doris/catalog/DatabaseIf.java  |    27 -
 .../main/java/org/apache/doris/catalog/Env.java    |   295 +-
 .../java/org/apache/doris/catalog/Function.java    |   408 -
 .../org/apache/doris/catalog/FunctionRegistry.java |     9 +
 .../doris/catalog/FunctionToSqlConverter.java      |     7 +-
 .../doris/catalog/FunctionToThriftConverter.java   |    44 +-
 .../org/apache/doris/catalog/FunctionUtil.java     |    13 +-
 .../apache/doris/catalog/GeneratedColumnInfo.java  |    80 -
 .../org/apache/doris/catalog/HdfsStorageVault.java |    35 +-
 .../main/java/org/apache/doris/catalog/Index.java  |   375 -
 .../apache/doris/catalog/IndexToPbConvertor.java   |    70 +
 .../doris/catalog/IndexToThriftConvertor.java      |    38 +
 .../org/apache/doris/catalog/InternalSchema.java   |     6 +-
 .../doris/catalog/InternalSchemaInitializer.java   |     4 +-
 .../doris/catalog/LocalTabletInvertedIndex.java    |    24 +-
 .../main/java/org/apache/doris/catalog/MTMV.java   |   124 +-
 .../apache/doris/catalog/MaterializedIndex.java    |     8 +
 .../doris/catalog/MaterializedIndexMeta.java       |    22 +
 .../java/org/apache/doris/catalog/OlapTable.java   |   282 +-
 .../org/apache/doris/catalog/OlapTableWrapper.java |   140 +
 .../java/org/apache/doris/catalog/Partition.java   |     8 +
 .../org/apache/doris/catalog/PartitionKey.java     |     7 +-
 .../org/apache/doris/catalog/RefreshManager.java   |     2 +-
 .../java/org/apache/doris/catalog/Replica.java     |    41 +-
 .../java/org/apache/doris/catalog/Resource.java    |     8 +
 .../doris/catalog/RowBinlogTableWrapper.java       |    40 +
 .../java/org/apache/doris/catalog/S3Resource.java  |   130 +-
 .../org/apache/doris/catalog/ScalarFunction.java   |   213 -
 .../java/org/apache/doris/catalog/SchemaTable.java |    89 +
 .../java/org/apache/doris/catalog/TableIf.java     |    24 +-
 .../org/apache/doris/catalog/TableIndexes.java     |     9 +-
 .../org/apache/doris/catalog/TableProperty.java    |    28 +-
 .../main/java/org/apache/doris/catalog/Tablet.java |    10 +
 .../apache/doris/catalog/TabletInvertedIndex.java  |     4 +-
 .../org/apache/doris/catalog/TabletStatMgr.java    |    41 +-
 .../org/apache/doris/catalog/TokenManager.java     |     4 +-
 .../main/java/org/apache/doris/catalog/View.java   |     4 +
 .../catalog/constraint/ConstraintManager.java      |     2 +-
 .../catalog/constraint/ForeignKeyConstraint.java   |     7 +-
 .../catalog/constraint/PrimaryKeyConstraint.java   |     2 +-
 .../catalog/stream/AbstractTableStreamUpdate.java  |    23 +
 .../doris/catalog/stream/BaseTableStream.java      |   190 +
 .../doris/catalog/stream/OlapTableStream.java      |   212 +
 .../catalog/stream/OlapTableStreamUpdate.java      |    88 +
 .../catalog/stream/OlapTableStreamWrapper.java     |   166 +
 .../doris/catalog/stream/StreamTableInfo.java      |   153 +
 .../catalog/stream/TableStreamBuildFactory.java    |    74 +
 .../doris/catalog/stream/TableStreamManager.java   |   217 +
 .../catalog/stream/TableStreamUpdateInfo.java      |    57 +
 .../doris/clone/DynamicPartitionScheduler.java     |    12 +-
 .../apache/doris/clone/LoadStatisticForTag.java    |    13 +-
 .../apache/doris/clone/PartitionRebalancer.java    |     2 +-
 .../org/apache/doris/cloud/CloudWarmUpJob.java     |    74 +-
 .../cloud/alter/CloudSchemaChangeHandler.java      |     3 +
 .../apache/doris/cloud/backup/CloudRestoreJob.java |     4 +-
 .../org/apache/doris/cloud/catalog/CloudEnv.java   |    92 +
 .../apache/doris/cloud/catalog/CloudReplica.java   |    79 -
 .../cloud/datasource/CloudInternalCatalog.java     |    13 +-
 .../apache/doris/cloud/load/CleanCopyJobTask.java  |    27 +-
 .../java/org/apache/doris/cloud/load/CopyJob.java  |     2 +-
 .../doris/cloud/load/CopyLoadPendingTask.java      |    68 +-
 .../org/apache/doris/cloud/stage/StageUtil.java    |    74 +-
 .../apache/doris/cloud/storage/AzureRemote.java    |   336 -
 .../org/apache/doris/cloud/storage/BosRemote.java  |    60 -
 .../org/apache/doris/cloud/storage/CosRemote.java  |   179 -
 .../apache/doris/cloud/storage/DefaultRemote.java  |   364 -
 .../doris/cloud/storage/ListObjectsResult.java     |    45 -
 .../org/apache/doris/cloud/storage/MockRemote.java |   110 -
 .../org/apache/doris/cloud/storage/ObjectFile.java |    44 -
 .../org/apache/doris/cloud/storage/ObjectInfo.java |   145 +
 .../doris/cloud/storage/ObjectInfoAdapter.java     |   203 +
 .../org/apache/doris/cloud/storage/ObsRemote.java  |   104 -
 .../org/apache/doris/cloud/storage/OssRemote.java  |   191 -
 .../org/apache/doris/cloud/storage/RemoteBase.java |   272 -
 .../org/apache/doris/cloud/storage/S3Remote.java   |   105 -
 .../org/apache/doris/cloud/storage/TosRemote.java  |    42 -
 .../doris/cloud/system/CloudSystemInfoService.java |     3 +
 .../transaction/CloudGlobalTransactionMgr.java     |    90 +-
 .../apache/doris/cloud/transaction/TxnUtil.java    |     3 +-
 .../org/apache/doris/cluster/ClusterGuard.java     |    65 +
 .../doris/cluster/ClusterGuardException.java       |    32 +
 .../apache/doris/cluster/ClusterGuardFactory.java  |    88 +
 .../org/apache/doris/cluster/NoOpClusterGuard.java |    52 +
 .../java/org/apache/doris/common/GenericPool.java  |    74 +-
 .../doris/common/plugin/CloudPluginDownloader.java |    44 +-
 .../apache/doris/common/proc/BackendsProcDir.java  |     6 +-
 .../doris/common/proc/BuildIndexProcDir.java       |    31 +-
 .../common/proc/CurrentQueryFragmentProcNode.java  |    89 -
 .../common/proc/CurrentQueryInfoProvider.java      |   200 -
 .../doris/common/proc/CurrentQuerySqlProcDir.java  |    70 -
 .../proc/CurrentQueryStatementsProcNode.java       |    71 -
 .../common/proc/CurrentQueryStatisticsProcDir.java |    80 +-
 .../doris/common/proc/PartitionsProcDir.java       |     3 +-
 .../org/apache/doris/common/proc/ProcService.java  |     2 +-
 .../apache/doris/common/proc/ReplicasProcNode.java |     5 +-
 .../apache/doris/common/proc/RollupProcDir.java    |    31 +-
 .../doris/common/proc/SchemaChangeProcDir.java     |    31 +-
 .../apache/doris/common/proc/TabletsProcDir.java   |     9 +-
 .../org/apache/doris/common/profile/Profile.java   |     8 +-
 .../doris/common/profile/RuntimeProfile.java       |     5 -
 .../doris/common/profile/SummaryProfile.java       |     8 +-
 .../org/apache/doris/common/util/BrokerReader.java |    19 +-
 .../org/apache/doris/common/util/BrokerUtil.java   |   274 -
 .../apache/doris/common/util/BufferSizeUtil.java   |     4 +
 .../apache/doris/common/util/ClassLoaderUtils.java |    80 +-
 .../doris/common/util/DynamicPartitionUtil.java    |     4 -
 .../doris/common/util/FileFormatConstants.java     |     1 +
 .../org/apache/doris/common/util/LocationPath.java |     2 +-
 .../apache/doris/common/util/PropertyAnalyzer.java |    96 +-
 .../org/apache/doris/common/util/SqlBlockUtil.java |    87 +-
 .../apache/doris/common/util/UniqueIdUtils.java    |    75 +
 .../java/org/apache/doris/common/util/Util.java    |    26 +
 .../apache/doris/connector/ConnectorFactory.java   |   109 +
 .../doris/connector/ConnectorPluginManager.java    |   188 +
 .../doris/connector/ConnectorSessionBuilder.java   |   122 +
 .../doris/connector/ConnectorSessionImpl.java      |   132 +
 .../doris/connector/DefaultConnectorContext.java   |   119 +
 .../DefaultConnectorValidationContext.java         |   145 +
 .../apache/doris/datasource/CatalogFactory.java    |   124 +-
 .../org/apache/doris/datasource/CatalogIf.java     |     5 +-
 .../org/apache/doris/datasource/CatalogMgr.java    |    18 +
 .../doris/datasource/ConnectorColumnConverter.java |   220 +
 .../ExprToConnectorExpressionConverter.java        |   366 +
 .../apache/doris/datasource/ExternalCatalog.java   |    54 +-
 .../apache/doris/datasource/ExternalDatabase.java  |     5 -
 .../doris/datasource/ExternalFunctionRules.java    |    44 +-
 .../org/apache/doris/datasource/FileGroupInfo.java |     5 +-
 .../doris/datasource/FilePartitionUtils.java       |   126 +
 .../apache/doris/datasource/FileQueryScanNode.java |    64 +-
 .../org/apache/doris/datasource/FileScanNode.java  |    31 +-
 .../org/apache/doris/datasource/FileSplitter.java  |     4 +
 .../apache/doris/datasource/InitCatalogLog.java    |     1 +
 .../apache/doris/datasource/InitDatabaseLog.java   |     1 +
 .../apache/doris/datasource/InternalCatalog.java   |   265 +-
 .../datasource/PluginDrivenExternalCatalog.java    |   311 +
 .../datasource/PluginDrivenExternalDatabase.java   |    43 +
 .../datasource/PluginDrivenExternalTable.java      |   248 +
 .../doris/datasource/PluginDrivenScanNode.java     |   615 +
 .../apache/doris/datasource/PluginDrivenSplit.java |    77 +
 .../doris/datasource/es/DorisEsException.java      |    26 -
 .../doris/datasource/es/EsExternalCatalog.java     |   159 -
 .../doris/datasource/es/EsExternalDatabase.java    |    48 -
 .../doris/datasource/es/EsExternalTable.java       |   192 -
 .../apache/doris/datasource/es/EsMajorVersion.java |   120 -
 .../doris/datasource/es/EsMetaStateTracker.java    |    64 -
 .../org/apache/doris/datasource/es/EsNodeInfo.java |   240 -
 .../apache/doris/datasource/es/EsProperties.java   |   128 -
 .../apache/doris/datasource/es/EsRestClient.java   |   374 -
 .../doris/datasource/es/EsSchemaCacheValue.java    |    37 -
 .../doris/datasource/es/EsShardPartitions.java     |   155 -
 .../apache/doris/datasource/es/EsShardRouting.java |    66 -
 .../doris/datasource/es/EsTablePartitions.java     |   108 -
 .../org/apache/doris/datasource/es/EsUrls.java     |    37 -
 .../org/apache/doris/datasource/es/EsUtil.java     |   385 -
 .../apache/doris/datasource/es/MappingPhase.java   |   178 -
 .../apache/doris/datasource/es/PartitionPhase.java |    56 -
 .../apache/doris/datasource/es/QueryBuilders.java  |   879 -
 .../apache/doris/datasource/es/SearchContext.java  |   157 -
 .../apache/doris/datasource/es/SearchPhase.java    |    42 -
 .../doris/datasource/es/source/EsScanNode.java     |   364 -
 .../org/apache/doris/datasource/hive/AcidUtil.java |    98 +-
 .../doris/datasource/hive/HMSCachedClient.java     |     2 +-
 .../doris/datasource/hive/HMSExternalCatalog.java  |    27 +-
 .../doris/datasource/hive/HMSExternalTable.java    |    12 +
 .../doris/datasource/hive/HMSTransaction.java      |   277 +-
 .../datasource/hive/HiveExternalMetaCache.java     |    80 +-
 .../datasource/hive/HiveMetaStoreClientHelper.java |     3 +-
 .../doris/datasource/hive/HiveTransaction.java     |     2 +-
 .../org/apache/doris/datasource/hive/HiveUtil.java |    43 +-
 .../datasource/hive/ThriftHMSCachedClient.java     |   309 +-
 .../doris/datasource/hive/source/HiveScanNode.java |    17 +-
 .../datasource/hudi/HudiExternalMetaCache.java     |     8 +-
 .../iceberg/IcebergDLFExternalCatalog.java         |     4 +-
 .../datasource/iceberg/IcebergExternalCatalog.java |     3 +-
 .../iceberg/IcebergExternalMetaCache.java          |     2 +-
 .../datasource/iceberg/IcebergExternalTable.java   |    18 +-
 .../datasource/iceberg/IcebergMetadataOps.java     |    26 +-
 .../iceberg/IcebergSysExternalTable.java           |   177 +
 .../datasource/iceberg/IcebergTransaction.java     |    89 +-
 .../doris/datasource/iceberg/IcebergUtils.java     |    99 +-
 .../datasource/iceberg/fileio/DelegateFileIO.java  |    62 +-
 .../iceberg/fileio/DelegateInputFile.java          |     4 +-
 .../iceberg/fileio/DelegateOutputFile.java         |    32 +-
 .../fileio/DelegateSeekableInputStream.java        |     4 +-
 .../helper/IcebergRewritableDeletePlan.java        |    54 +
 .../helper/IcebergRewritableDeletePlanner.java     |    87 +
 .../iceberg/helper/IcebergWriterHelper.java        |    18 +-
 .../iceberg/rewrite/RewriteGroupTask.java          |     3 +-
 .../s3tables/CustomAwsCredentialsProvider.java     |    43 -
 .../iceberg/source/IcebergApiSource.java           |    35 +-
 .../datasource/iceberg/source/IcebergScanNode.java |   124 +-
 .../datasource/iceberg/source/IcebergSplit.java    |    19 +-
 .../doris/datasource/jdbc/JdbcExternalCatalog.java |   458 -
 .../datasource/jdbc/JdbcExternalDatabase.java      |    44 -
 .../doris/datasource/jdbc/JdbcExternalTable.java   |   441 -
 .../apache/doris/datasource/jdbc/JdbcNameUtil.java |   175 -
 .../datasource/jdbc/JdbcSchemaCacheValue.java      |    37 -
 .../doris/datasource/jdbc/sink/JdbcTableSink.java  |    91 -
 .../jdbc/source/JdbcFunctionPushDownRule.java      |   203 -
 .../doris/datasource/jdbc/source/JdbcScanNode.java |   614 -
 .../doris/datasource/jdbc/source/JdbcSplit.java    |    90 -
 .../datasource/jdbc/util/JdbcFieldSchema.java      |     5 +-
 .../datasource/mapping/IdentifierMapping.java      |    27 -
 .../datasource/mapping/JdbcIdentifierMapping.java  |   345 -
 .../doris/datasource/maxcompute/MCTransaction.java |    69 +-
 .../maxcompute/MaxComputeExternalCatalog.java      |    11 +-
 .../maxcompute/source/MaxComputeScanNode.java      |    10 +-
 .../operations/ExternalMetadataOperations.java     |    52 -
 .../datasource/operations/ExternalMetadataOps.java |     8 +-
 .../datasource/paimon/PaimonExternalCatalog.java   |     3 +-
 .../datasource/paimon/PaimonSysExternalTable.java  |    73 +-
 .../paimon/source/PaimonPredicateConverter.java    |     3 +-
 .../datasource/paimon/source/PaimonScanNode.java   |    31 +-
 .../datasource/property/ConnectionProperties.java  |    24 +
 .../common/AwsCredentialsProviderFactory.java      |    28 +
 .../common/IcebergAwsAssumeRoleProperties.java     |    52 +
 .../IcebergAwsClientCredentialsProperties.java     |   144 +
 .../property/constants/AIProperties.java           |     2 +-
 .../property/fileformat/FileFormatProperties.java  |     3 +
 .../fileformat/LanceFileFormatProperties.java      |    51 +
 .../metastore/AbstractIcebergProperties.java       |     5 +
 .../metastore/IcebergJdbcMetaStoreProperties.java  |    10 +-
 .../property/metastore/IcebergRestProperties.java  |    81 +-
 .../IcebergS3TablesMetaStoreProperties.java        |    33 +-
 .../property/metastore/MetastoreProperties.java    |    15 +
 .../metastore/PaimonJdbcMetaStoreProperties.java   |    18 +
 .../storage/AbstractS3CompatibleProperties.java    |     9 +
 .../property/storage/AzureProperties.java          |     8 +
 .../datasource/property/storage/COSProperties.java |     9 +
 .../datasource/property/storage/OBSProperties.java |     9 +
 .../datasource/property/storage/OSSProperties.java |     3 +
 .../datasource/property/storage/S3Properties.java  |    29 +-
 .../doris/datasource/systable/IcebergSysTable.java |    53 +-
 .../apache/doris/datasource/systable/SysTable.java |     2 +-
 .../doris/datasource/systable/TvfSysTable.java     |     4 +-
 .../source/TrinoConnectorPredicateConverter.java   |     2 +-
 .../doris/datasource/tvf/source/TVFScanNode.java   |    11 +
 .../java/org/apache/doris/fs/DirectoryLister.java  |     7 +-
 .../main/java/org/apache/doris/fs/FileSystem.java  |   147 -
 .../java/org/apache/doris/fs/FileSystemCache.java  |    33 +-
 .../org/apache/doris/fs/FileSystemDescriptor.java  |   105 +
 .../apache/doris/fs/FileSystemDirectoryLister.java |    23 +-
 .../org/apache/doris/fs/FileSystemFactory.java     |   193 +-
 .../org/apache/doris/fs/FileSystemIOException.java |    65 -
 .../apache/doris/fs/FileSystemPluginManager.java   |   146 +
 .../org/apache/doris/fs/FileSystemProvider.java    |    24 -
 .../apache/doris/fs/FileSystemProviderImpl.java    |    42 -
 .../java/org/apache/doris/fs/FileSystemType.java   |    50 -
 .../java/org/apache/doris/fs/FileSystemUtil.java   |    70 -
 .../org/apache/doris/fs/FsStorageTypeAdapter.java  |    59 +
 .../java/org/apache/doris/fs/GlobListResult.java   |    57 -
 .../org/apache/doris/fs/LocalDfsFileSystem.java    |   199 -
 .../org/apache/doris/fs/PersistentFileSystem.java  |    57 -
 .../apache/doris/fs/RemoteFileRemoteIterator.java  |    47 -
 .../main/java/org/apache/doris/fs/RemoteFiles.java |    35 -
 .../java/org/apache/doris/fs/RemoteIterator.java   |    27 -
 .../java/org/apache/doris/fs/SchemaTypeMapper.java |     6 +
 .../org/apache/doris/fs/SimpleRemoteIterator.java  |    45 -
 .../apache/doris/fs/SpiSwitchingFileSystem.java    |   206 +
 .../doris/fs/StoragePropertiesConverter.java       |    92 +
 .../org/apache/doris/fs/StorageTypeMapper.java     |    68 -
 .../fs/TransactionScopeCachingDirectoryLister.java |    35 +-
 .../java/org/apache/doris/fs/io/DorisInput.java    |    54 -
 .../org/apache/doris/fs/io/DorisInputFile.java     |    75 -
 .../org/apache/doris/fs/io/DorisInputStream.java   |    51 -
 .../org/apache/doris/fs/io/DorisOutputFile.java    |    59 -
 .../java/org/apache/doris/fs/io/ParsedPath.java    |    41 -
 .../org/apache/doris/fs/io/hdfs/HdfsInput.java     |   107 -
 .../org/apache/doris/fs/io/hdfs/HdfsInputFile.java |   155 -
 .../apache/doris/fs/io/hdfs/HdfsInputStream.java   |   180 -
 .../apache/doris/fs/io/hdfs/HdfsOutputFile.java    |    95 -
 .../apache/doris/fs/io/hdfs/HdfsOutputStream.java  |   135 -
 .../org/apache/doris/fs/obj/AzureObjStorage.java   |   625 -
 .../java/org/apache/doris/fs/obj/ObjStorage.java   |    70 -
 .../java/org/apache/doris/fs/obj/RemoteObject.java |    54 -
 .../org/apache/doris/fs/obj/RemoteObjects.java     |    52 -
 .../java/org/apache/doris/fs/obj/S3ObjStorage.java |   862 -
 .../doris/fs/operations/BrokerFileOperations.java  |   163 -
 .../apache/doris/fs/operations/BrokerOpParams.java |    57 -
 .../apache/doris/fs/operations/FileOperations.java |    34 -
 .../doris/fs/operations/HDFSFileOperations.java    |   135 -
 .../apache/doris/fs/operations/HDFSOpParams.java   |    72 -
 .../org/apache/doris/fs/operations/OpParams.java   |    54 -
 .../apache/doris/fs/remote/AzureFileSystem.java    |    89 -
 .../apache/doris/fs/remote/BrokerFileSystem.java   |   712 -
 .../org/apache/doris/fs/remote/ObjFileSystem.java  |   187 -
 .../org/apache/doris/fs/remote/RemoteFile.java     |   117 -
 .../apache/doris/fs/remote/RemoteFileSystem.java   |    72 -
 .../org/apache/doris/fs/remote/S3FileSystem.java   |   143 -
 .../doris/fs/remote/SwitchingFileSystem.java       |   131 -
 .../apache/doris/fs/remote/dfs/DFSFileSystem.java  |   597 -
 .../remote/dfs/DFSFileSystemPhantomReference.java  |    44 -
 .../apache/doris/fs/remote/dfs/JFSFileSystem.java  |    27 -
 .../apache/doris/fs/remote/dfs/OFSFileSystem.java  |    27 -
 .../doris/fs/remote/dfs/OSSHdfsFileSystem.java     |    27 -
 .../fs/remote/dfs/RemoteFSPhantomManager.java      |   127 -
 .../doris/httpv2/controller/BaseController.java    |     1 +
 .../apache/doris/httpv2/rest/BackendsAction.java   |     4 -
 .../doris/httpv2/rest/BootstrapFinishAction.java   |     4 +-
 .../doris/httpv2/rest/CheckDecommissionAction.java |     6 +-
 .../doris/httpv2/rest/CheckWalSizeAction.java      |     6 +-
 .../apache/doris/httpv2/rest/ConnectionAction.java |     6 +-
 .../apache/doris/httpv2/rest/CopyIntoAction.java   |    15 +-
 .../apache/doris/httpv2/rest/DebugPointAction.java |    15 +-
 .../doris/httpv2/rest/ExtraBasepathAction.java     |     4 +-
 .../doris/httpv2/rest/FeVersionInfoAction.java     |     7 +-
 .../apache/doris/httpv2/rest/GetLogFileAction.java |     7 +-
 .../doris/httpv2/rest/GetSmallFileAction.java      |     7 +-
 .../org/apache/doris/httpv2/rest/HealthAction.java |     6 +-
 .../org/apache/doris/httpv2/rest/LoadAction.java   |    11 +-
 .../apache/doris/httpv2/rest/MetaInfoAction.java   |    16 +-
 .../doris/httpv2/rest/MetaReplayerCheckAction.java |     7 +-
 .../apache/doris/httpv2/rest/MetricsAction.java    |     5 +-
 .../apache/doris/httpv2/rest/MinidumpAction.java   |     7 +-
 .../apache/doris/httpv2/rest/ProfileAction.java    |    11 +-
 .../apache/doris/httpv2/rest/QueryStatsAction.java |    26 +-
 .../doris/httpv2/rest/RestBaseController.java      |    18 +
 .../apache/doris/httpv2/rest/RowCountAction.java   |     7 +-
 .../apache/doris/httpv2/rest/SetConfigAction.java  |     6 +-
 .../doris/httpv2/rest/StorageTypeCheckAction.java  |     7 +-
 .../org/apache/doris/httpv2/rest/TSOAction.java    |    97 +
 .../doris/httpv2/rest/TableQueryPlanAction.java    |     3 +-
 .../doris/httpv2/rest/manager/ClusterAction.java   |    11 +-
 .../doris/httpv2/rest/manager/HttpUtils.java       |     8 +-
 .../doris/httpv2/rest/manager/NodeAction.java      |    13 +-
 .../httpv2/rest/manager/QueryProfileAction.java    |    19 +-
 .../doris/httpv2/restv2/ClusterGuardAction.java    |   161 +
 .../doris/httpv2/restv2/ESCatalogAction.java       |    24 +-
 .../apache/doris/httpv2/restv2/ImportAction.java   |    30 +-
 .../org/apache/doris/info/BaseTableRefInfo.java    |    48 -
 .../java/org/apache/doris/info/TableNameInfo.java  |   307 -
 .../org/apache/doris/info/TableNameInfoUtils.java  |   105 +
 .../java/org/apache/doris/info/TableRefInfo.java   |    37 +-
 .../doris/info/TableValuedFunctionRefInfo.java     |     1 +
 .../org/apache/doris/job/base/AbstractJob.java     |     4 +
 .../doris/job/extensions/insert/InsertJob.java     |     5 +
 .../insert/streaming/AbstractStreamingTask.java    |    11 +
 .../streaming/DataSourceConfigValidator.java       |   119 +-
 .../streaming/PostgresResourceValidator.java       |   169 +
 .../insert/streaming/StreamingInsertJob.java       |   287 +-
 .../insert/streaming/StreamingInsertTask.java      |    22 +-
 .../insert/streaming/StreamingJobProperties.java   |    36 +-
 .../streaming/StreamingJobSchedulerTask.java       |    45 +-
 .../insert/streaming/StreamingJobStatistic.java    |     3 +
 .../insert/streaming/StreamingMultiTblTask.java    |    52 +-
 .../StreamingTaskTxnCommitAttachment.java          |     9 +-
 .../apache/doris/job/extensions/mtmv/MTMVTask.java |     2 +-
 .../doris/job/offset/SourceOffsetProvider.java     |    73 +-
 .../job/offset/SourceOffsetProviderFactory.java    |     2 +
 .../apache/doris/job/offset/jdbc/JdbcOffset.java   |    18 +-
 .../job/offset/jdbc/JdbcSourceOffsetProvider.java  |   207 +-
 .../offset/jdbc/JdbcTvfSourceOffsetProvider.java   |   439 +
 .../job/offset/s3/S3SourceOffsetProvider.java      |    96 +-
 .../apache/doris/job/util/StreamingJobUtils.java   |   103 +-
 .../org/apache/doris/journal/JournalEntity.java    |    18 +
 .../apache/doris/journal/local/LocalJournal.java   |     8 +
 .../org/apache/doris/load/BrokerFileGroup.java     |    33 +-
 .../main/java/org/apache/doris/load/DeleteJob.java |    32 +-
 .../main/java/org/apache/doris/load/ExportJob.java |     5 +-
 .../main/java/org/apache/doris/load/ExportMgr.java |    14 +-
 .../org/apache/doris/load/GroupCommitManager.java  |    22 +-
 .../org/apache/doris/load/RoutineLoadDesc.java     |    25 +-
 .../doris/load/loadv2/BrokerLoadPendingTask.java   |    28 +-
 .../apache/doris/load/loadv2/InsertLoadJob.java    |    19 +
 .../java/org/apache/doris/load/loadv2/LoadJob.java |     6 +-
 .../apache/doris/load/loadv2/LoadStatistic.java    |    12 +
 .../doris/load/routineload/RoutineLoadJob.java     |    15 +-
 .../load/routineload/RoutineLoadTaskScheduler.java |     7 +
 .../load/routineload/kafka/KafkaConfiguration.java |    15 +
 .../kafka/KafkaDataSourceProperties.java           |    80 +-
 .../java/org/apache/doris/master/Checkpoint.java   |     2 -
 .../org/apache/doris/master/ReportHandler.java     |     7 +-
 .../java/org/apache/doris/metric/CloudMetrics.java |     5 +
 .../java/org/apache/doris/metric/MetricRepo.java   |   199 +-
 .../java/org/apache/doris/mtmv/BaseTableInfo.java  |    11 +
 .../java/org/apache/doris/mtmv/MTMVJobManager.java |     2 +-
 .../org/apache/doris/mtmv/MTMVPartitionUtil.java   |    14 +-
 .../MTMVRelatedPartitionDescTransferGenerator.java |     2 +-
 .../org/apache/doris/mtmv/MTMVRelationManager.java |     2 +-
 .../java/org/apache/doris/mtmv/MTMVService.java    |    14 +-
 .../main/java/org/apache/doris/mtmv/MTMVUtil.java  |    72 +-
 .../org/apache/doris/mysql/AcceptListener.java     |     1 +
 .../org/apache/doris/mysql/MysqlAuthPacket.java    |     2 +-
 .../org/apache/doris/mysql/MysqlCapability.java    |    12 +-
 .../apache/doris/mysql/MysqlHandshakePacket.java   |     4 -
 .../java/org/apache/doris/mysql/MysqlProto.java    |    29 +-
 .../java/org/apache/doris/mysql/ReadListener.java  |    37 +-
 .../mysql/authenticate/AuthenticateResponse.java   |    66 +-
 .../authenticate/AuthenticationFailureSummary.java |   101 +
 .../mysql/authenticate/AuthenticatorManager.java   |   186 +-
 .../MysqlAuthPacketCredentialExtractor.java        |    90 +
 .../AuthenticationIntegrationAuthenticator.java    |    68 +-
 .../mysql/authenticate/ldap/LdapAuthenticator.java |    38 +-
 .../doris/mysql/authenticate/ldap/LdapClient.java  |    69 +-
 .../doris/mysql/authenticate/ldap/LdapManager.java |    52 +-
 .../password/AuthPacketAwarePasswordResolver.java  |    62 +
 .../password/NativePasswordResolver.java           |     5 +-
 .../plugin/AuthenticationPluginAuthenticator.java  |    72 +-
 .../mysql/privilege/AccessControllerManager.java   |     2 +-
 .../org/apache/doris/mysql/privilege/Auth.java     |    14 +-
 .../apache/doris/mysql/privilege/RoleManager.java  |     2 +-
 .../doris/mysql/privilege/TablePrivEntry.java      |     4 +-
 .../doris/mysql/privilege/UserPropertyMgr.java     |    19 +
 .../org/apache/doris/nereids/CascadesContext.java  |     7 -
 .../org/apache/doris/nereids/NereidsPlanner.java   |     5 +-
 .../java/org/apache/doris/nereids/PlanContext.java |     4 +
 .../org/apache/doris/nereids/StatementContext.java |    59 +-
 .../doris/nereids/analyzer/UnboundAlias.java       |     2 +-
 .../analyzer/UnboundConnectorTableSink.java        |    85 +
 .../nereids/analyzer/UnboundIcebergTableSink.java  |    40 +-
 .../nereids/analyzer/UnboundJdbcTableSink.java     |    84 -
 .../doris/nereids/analyzer/UnboundResultSink.java  |     5 +-
 .../nereids/analyzer/UnboundTableSinkCreator.java  |    20 +-
 .../org/apache/doris/nereids/cost/CostModel.java   |   110 +-
 .../glue/translator/ExpressionTranslator.java      |    45 +-
 .../glue/translator/PhysicalPlanTranslator.java    |   544 +-
 .../glue/translator/PlanTranslatorContext.java     |    41 +-
 .../glue/translator/RunTimeFilterTranslatorV2.java |   123 -
 .../glue/translator/RuntimeFilterTranslator.java   |   188 +-
 .../jobs/cascades/OptimizeGroupExpressionJob.java  |    13 +-
 .../doris/nereids/jobs/executor/Optimizer.java     |   164 +-
 .../doris/nereids/jobs/executor/Rewriter.java      |    18 +-
 .../doris/nereids/jobs/joinorder/JoinOrderJob.java |    17 +-
 .../jobs/joinorder/hypergraph/HyperGraph.java      |    10 +-
 .../jobs/joinorder/hypergraph/edge/FilterEdge.java |    11 +-
 .../joinorder/hypergraphv2/CircleDetector.java     |   176 +
 .../joinorder/hypergraphv2/ConflictRulesMaker.java |   387 +
 .../joinorder/hypergraphv2/GraphSimplifier.java    |   688 +
 .../jobs/joinorder/hypergraphv2/HyperElement.java  |    27 +
 .../jobs/joinorder/hypergraphv2/HyperGraph.java    |   548 +
 .../joinorder/hypergraphv2/SubgraphEnumerator.java |   546 +
 .../joinorder/hypergraphv2/bitmap/LongBitmap.java  |   192 +
 .../hypergraphv2/bitmap/LongBitmapIterator.java    |    58 +
 .../bitmap/LongBitmapReverseIterator.java          |    59 +
 .../bitmap/LongBitmapSubsetIterator.java           |    69 +
 .../jobs/joinorder/hypergraphv2/edge/Edge.java     |   261 +
 .../joinorder/hypergraphv2/node/AbstractNode.java  |    64 +
 .../joinorder/hypergraphv2/node/DPhyperNode.java   |    44 +
 .../hypergraphv2/receiver/AbstractReceiver.java    |    67 +
 .../joinorder/hypergraphv2/receiver/Counter.java   |   105 +
 .../hypergraphv2/receiver/PlanReceiver.java        |   323 +
 .../nereids/lineage/LineageEventProcessor.java     |     6 +-
 .../nereids/lineage/LineageInfoExtractor.java      |    16 -
 .../doris/nereids/load/NereidsDataDescription.java |    10 +-
 .../doris/nereids/load/NereidsFileGroupInfo.java   |     6 +-
 .../nereids/load/NereidsLoadPlanInfoCollector.java |    26 +-
 .../nereids/load/NereidsStreamLoadPlanner.java     |     4 +-
 .../doris/nereids/load/NereidsStreamLoadTask.java  |     4 +-
 .../java/org/apache/doris/nereids/memo/Group.java  |   129 +-
 .../apache/doris/nereids/memo/GroupExpression.java |    35 +-
 .../java/org/apache/doris/nereids/memo/Memo.java   |   100 +-
 .../doris/nereids/minidump/MinidumpUtils.java      |     4 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |   140 +-
 .../parser/LogicalPlanBuilderForEncryption.java    |    10 +
 .../nereids/processor/post/PlanPostProcessors.java |     3 +-
 .../post/ProjectAggregateExpressionsForCse.java    |    31 +-
 .../nereids/processor/post/PushTopnToAgg.java      |    14 +-
 .../RecomputePhysicalPropertiesPostProcessor.java  |    71 +
 .../processor/post/RuntimeFilterContext.java       |   195 +-
 .../processor/post/RuntimeFilterGenerator.java     |   320 +-
 .../processor/post/RuntimeFilterPruner.java        |    46 +-
 .../post/RuntimeFilterPrunerForExternalTable.java  |    16 +-
 .../post/RuntimeFilterPushDownVisitor.java         |   429 +-
 .../nereids/processor/post/ShuffleKeyPruner.java   |   557 +
 .../doris/nereids/processor/post/TopNScanOpt.java  |    24 +-
 .../processor/post/TopnFilterPushDownVisitor.java  |     6 -
 .../post/materialize/LazySlotPruning.java          |     7 +
 .../post/runtimefilterv2/PushDownContext.java      |    97 -
 .../post/runtimefilterv2/PushDownVisitor.java      |   188 -
 .../runtimefilterv2/RuntimeFilterContextV2.java    |    86 -
 .../post/runtimefilterv2/RuntimeFilterV2.java      |   148 -
 .../runtimefilterv2/RuntimeFilterV2Generator.java  |   107 -
 .../pre/TurnOffPageCacheForInsertIntoSelect.java   |     8 -
 .../properties/ChildOutputPropertyDeriver.java     |    42 +-
 .../properties/ChildrenPropertiesRegulator.java    |    35 +-
 .../nereids/properties/DistributionSpecHash.java   |    32 +
 .../nereids/properties/LogicalProperties.java      |    19 +
 .../nereids/properties/RequestPropertyDeriver.java |   108 +-
 .../nereids/properties/ShuffleKeyPruneUtils.java   |   279 +
 .../org/apache/doris/nereids/rules/RuleSet.java    |    82 +-
 .../org/apache/doris/nereids/rules/RuleType.java   |    10 +-
 .../nereids/rules/analysis/BindExpression.java     |     6 +-
 .../doris/nereids/rules/analysis/BindRelation.java |    47 +-
 .../doris/nereids/rules/analysis/BindSink.java     |    95 +-
 .../nereids/rules/analysis/CheckAfterRewrite.java  |     4 +-
 .../nereids/rules/analysis/CollectRelation.java    |    12 +
 .../rules/analysis/EliminateLogicalSelectHint.java |     3 +-
 .../nereids/rules/analysis/ExpressionAnalyzer.java |    78 +-
 .../nereids/rules/analysis/UserAuthentication.java |     4 +
 .../mv/AbstractMaterializedViewRule.java           |    51 +-
 .../rules/exploration/mv/HyperGraphComparator.java |    51 +-
 .../rules/expression/ExpressionOptimization.java   |     4 +-
 .../rules/expression/ExpressionRewrite.java        |    15 +-
 .../rules/expression/ExpressionRuleType.java       |     1 +
 .../expression/rules/FoldConstantRuleOnBE.java     |     1 +
 .../rules/InPredicateExtractNonConstant.java       |     2 +-
 .../rules/PartitionPredicateToRange.java           |     2 +-
 .../rules/expression/rules/PartitionPruner.java    |    51 +-
 .../rules/SimplifyConditionalFunction.java         |    42 +-
 .../expression/rules/StringEmptyToLengthRule.java  |   114 +
 .../rules/implementation/AggregateStrategies.java  |    14 +-
 ...ectorTableSinkToPhysicalConnectorTableSink.java |    48 +
 ...OlapScanToPhysicalDeferMaterializeOlapScan.java |    45 -
 ...ltSinkToPhysicalDeferMaterializeResultSink.java |    48 -
 ...erializeTopNToPhysicalDeferMaterializeTopN.java |    58 -
 .../LogicalEsScanToPhysicalEsScan.java             |    44 -
 .../LogicalJdbcScanToPhysicalJdbcScan.java         |    43 -
 ...ogicalJdbcTableSinkToPhysicalJdbcTableSink.java |    48 -
 .../LogicalOlapScanToPhysicalOlapScan.java         |     1 +
 .../rules/implementation/SplitAggBaseRule.java     |     9 +-
 .../rules/implementation/SplitAggMultiPhase.java   |    29 +-
 .../SplitAggMultiPhaseWithoutGbyKey.java           |    20 +-
 .../implementation/SplitAggWithoutDistinct.java    |   349 +-
 .../rewrite/AccessPathExpressionCollector.java     |   108 +-
 .../nereids/rules/rewrite/AccessPathInfo.java      |    21 +-
 .../rules/rewrite/AccessPathPlanCollector.java     |    14 +-
 .../doris/nereids/rules/rewrite/CTEInline.java     |    13 +-
 .../doris/nereids/rules/rewrite/CTEInliner.java    |   166 +
 .../nereids/rules/rewrite/CheckPrivileges.java     |    33 +-
 .../rules/rewrite/CollectFilterAboveConsumer.java  |     3 +
 .../doris/nereids/rules/rewrite/ColumnPruning.java |    13 +-
 .../nereids/rules/rewrite/ConstantPropagation.java |     2 +-
 .../rewrite/DecomposeRepeatWithPreAggregation.java |     6 +-
 .../rules/rewrite/DeferMaterializeTopNResult.java  |   337 -
 .../nereids/rules/rewrite/ForeignKeyContext.java   |     7 +-
 .../nereids/rules/rewrite/NestedColumnPruning.java |   446 +-
 .../rewrite/NormalizeOlapTableStreamScan.java      |   122 +
 .../nereids/rules/rewrite/PruneEmptyPartition.java |     6 +
 .../rules/rewrite/PruneFileScanPartition.java      |    10 +-
 .../rules/rewrite/PruneOlapScanPartition.java      |    78 +-
 .../rules/rewrite/PullUpJoinFromUnionAll.java      |     2 +-
 .../nereids/rules/rewrite/PullUpPredicates.java    |    15 +-
 .../rewrite/PushDownFilterThroughGenerate.java     |     3 +-
 .../nereids/rules/rewrite/PushDownProject.java     |     3 -
 .../rules/rewrite/PushProjectIntoUnion.java        |    16 +-
 .../rules/rewrite/PushProjectThroughUnion.java     |    17 +-
 .../nereids/rules/rewrite/RewriteCteChildren.java  |     2 +-
 .../doris/nereids/rules/rewrite/SaltJoin.java      |     6 +-
 .../nereids/rules/rewrite/SetPreAggStatus.java     |     5 +
 .../doris/nereids/rules/rewrite/SkewJoin.java      |    29 +-
 .../nereids/rules/rewrite/SlotTypeReplacer.java    |    89 +-
 .../doris/nereids/rules/rewrite/StatsDerive.java   |    24 -
 .../rewrite/eageraggregation/EagerAggRewriter.java |    70 +-
 .../nereids/stats/ColumnStatsAdjustVisitor.java    |     5 +-
 .../doris/nereids/stats/FilterEstimation.java      |     3 +-
 .../doris/nereids/stats/StatsCalculator.java       |   119 +-
 .../trees/copier/LogicalPlanDeepCopier.java        |    29 -
 .../doris/nereids/trees/expressions/AGENTS.md      |     5 +
 .../doris/nereids/trees/expressions/Alias.java     |     2 +-
 .../doris/nereids/trees/expressions/CaseWhen.java  |   114 +-
 .../doris/nereids/trees/expressions/Default.java   |     2 +-
 .../nereids/trees/expressions/InPredicate.java     |    19 +-
 .../doris/nereids/trees/expressions/Like.java      |     5 +-
 .../nereids/trees/expressions/SlotReference.java   |    32 +-
 .../expressions/functions/ExpressionTrait.java     |    35 +-
 .../trees/expressions/functions/agg/AIAgg.java     |     1 +
 .../trees/expressions/functions/agg/BoolAnd.java   |     2 +-
 .../trees/expressions/functions/agg/BoolOr.java    |     2 +-
 .../trees/expressions/functions/agg/BoolXor.java   |     2 +-
 .../trees/expressions/functions/agg/Count.java     |     2 +-
 .../trees/expressions/functions/agg/Histogram.java |     2 +-
 .../expressions/functions/agg/LinearHistogram.java |     2 +-
 .../trees/expressions/functions/agg/Median.java    |     2 +-
 .../functions/agg/MultiDistinctSum.java            |     2 +-
 .../functions/agg/MultiDistinctSum0.java           |     2 +-
 .../functions/agg/PercentileReservoir.java         |     7 +-
 .../trees/expressions/functions/agg/RegrAvgx.java  |    67 +
 .../trees/expressions/functions/agg/RegrAvgy.java  |    67 +
 .../trees/expressions/functions/agg/RegrCount.java |    73 +
 .../expressions/functions/agg/RegrIntercept.java   |    15 -
 .../trees/expressions/functions/agg/RegrR2.java    |    67 +
 .../trees/expressions/functions/agg/RegrSlope.java |    15 -
 .../trees/expressions/functions/agg/RegrSxx.java   |    18 -
 .../trees/expressions/functions/agg/RegrSxy.java   |    18 -
 .../trees/expressions/functions/agg/RegrSyy.java   |    18 -
 .../trees/expressions/functions/agg/Sum0.java      |     2 +-
 .../expressions/functions/agg/WindowFunnel.java    |     2 +-
 .../expressions/functions/agg/WindowFunnelV2.java  |   140 +
 .../trees/expressions/functions/ai/AIFunction.java |     1 +
 .../trees/expressions/functions/ai/Embed.java      |    48 +-
 .../functions/generator/ExplodeMap.java            |     5 +-
 .../functions/generator/ExplodeMapOuter.java       |     5 +-
 .../expressions/functions/generator/JsonEach.java  |    79 +
 .../functions/generator/JsonEachOuter.java         |    72 +
 .../functions/generator/JsonEachText.java          |    80 +
 .../functions/generator/JsonEachTextOuter.java     |    73 +
 .../trees/expressions/functions/scalar/Array.java  |     2 +-
 .../expressions/functions/scalar/ArrayApply.java   |     7 +-
 .../expressions/functions/scalar/ArrayAvg.java     |     7 +-
 .../expressions/functions/scalar/ArrayCompact.java |     2 +-
 .../expressions/functions/scalar/ArrayCumSum.java  |     7 +-
 .../functions/scalar/ArrayDifference.java          |     7 +-
 .../functions/scalar/ArrayDistinct.java            |     2 +-
 .../functions/scalar/ArrayEnumerateUniq.java       |     2 +-
 .../functions/scalar/ArrayIntersect.java           |     2 +-
 .../expressions/functions/scalar/ArrayMax.java     |     2 +-
 .../expressions/functions/scalar/ArrayMin.java     |     2 +-
 .../functions/scalar/ArrayPosition.java            |     2 +-
 .../expressions/functions/scalar/ArrayProduct.java |     2 +-
 .../expressions/functions/scalar/ArrayRemove.java  |     2 +-
 .../functions/scalar/ArrayReverseSort.java         |     4 +-
 .../expressions/functions/scalar/ArraySort.java    |     4 +-
 .../expressions/functions/scalar/ArraySortBy.java  |     4 +-
 .../expressions/functions/scalar/ArraySum.java     |     2 +-
 .../expressions/functions/scalar/ArrayUnion.java   |     2 +-
 .../functions/scalar/ArraysOverlap.java            |     2 +-
 .../trees/expressions/functions/scalar/Char.java   |     9 +-
 .../expressions/functions/scalar/CountEqual.java   |     2 +-
 .../expressions/functions/scalar/CreateMap.java    |    38 +-
 .../expressions/functions/scalar/IsValidUtf8.java  |    76 +
 .../functions/scalar/JsonObjectFlatten.java        |    70 +
 .../functions/scalar/MurmurHash3U64V2.java         |    75 +
 .../trees/expressions/functions/scalar/Random.java |     6 +-
 .../functions/scalar/RegexpReplace.java            |     7 +-
 .../functions/scalar/RegexpReplaceOne.java         |     7 +-
 .../functions/scalar/SplitByRegexp.java            |     8 +-
 .../functions/scalar/StructElement.java            |    20 +-
 .../expressions/functions/scalar/Tokenize.java     |     6 +-
 .../expressions/functions/scalar/Uniform.java      |     6 +-
 .../expressions/functions/scalar/WidthBucket.java  |     2 +-
 .../expressions/functions/table/CdcStream.java     |    59 +
 .../expressions/functions/table/IcebergMeta.java   |    67 -
 .../trees/expressions/functions/udf/JavaUdaf.java  |     5 +-
 .../trees/expressions/functions/udf/JavaUdf.java   |     5 +-
 .../trees/expressions/functions/udf/JavaUdtf.java  |     5 +-
 .../expressions/functions/udf/PythonUdaf.java      |     5 +-
 .../trees/expressions/functions/udf/PythonUdf.java |     5 +-
 .../expressions/functions/udf/PythonUdtf.java      |     5 +-
 .../functions/window/RequireTrivialTypes.java      |     2 +
 .../trees/expressions/literal/DateLiteral.java     |     2 +-
 .../trees/expressions/literal/DateTimeLiteral.java |    66 +-
 .../expressions/literal/StringLikeLiteral.java     |    12 +-
 .../visitor/AggregateFunctionVisitor.java          |    25 +
 .../expressions/visitor/ScalarFunctionVisitor.java |    15 +
 .../visitor/TableGeneratingFunctionVisitor.java    |    20 +
 .../visitor/TableValuedFunctionVisitor.java        |    10 +-
 .../apache/doris/nereids/trees/plans/PlanType.java |    10 +
 .../trees/plans/commands/AddConstraintCommand.java |    59 +-
 .../commands/AdminCancelRepairTableCommand.java    |     2 +-
 .../plans/commands/AdminCompactTableCommand.java   |    41 +-
 .../plans/commands/AdminRepairTableCommand.java    |     2 +-
 .../commands/AdminSetPartitionVersionCommand.java  |     4 +-
 .../plans/commands/AdminSetTableStatusCommand.java |     4 +-
 .../plans/commands/AlterColumnStatsCommand.java    |     4 +-
 .../trees/plans/commands/AlterJobCommand.java      |    92 +-
 .../plans/commands/AlterSqlBlockRuleCommand.java   |    15 +-
 .../trees/plans/commands/AlterTableCommand.java    |     4 +-
 .../plans/commands/AlterTableStatsCommand.java     |     4 +-
 .../trees/plans/commands/AlterUserCommand.java     |     7 +-
 .../trees/plans/commands/AnalyzeTableCommand.java  |     4 +-
 .../plans/commands/CancelAlterTableCommand.java    |     4 +-
 .../plans/commands/CancelBuildIndexCommand.java    |     4 +-
 .../plans/commands/CleanQueryStatsCommand.java     |     4 +-
 .../plans/commands/CreateEncryptkeyCommand.java    |     5 +-
 .../plans/commands/CreateFunctionCommand.java      |    49 +-
 .../trees/plans/commands/CreateJobCommand.java     |     3 +-
 .../commands/CreateMaterializedViewCommand.java    |     8 +-
 .../trees/plans/commands/CreatePolicyCommand.java  |     4 +-
 .../plans/commands/CreateRoleMappingCommand.java   |   122 +
 .../plans/commands/CreateSqlBlockRuleCommand.java  |    13 +-
 .../trees/plans/commands/CreateStageCommand.java   |    23 +-
 .../trees/plans/commands/CreateStreamCommand.java  |    56 +
 .../trees/plans/commands/CreateTableCommand.java   |     1 +
 .../trees/plans/commands/DeleteFromCommand.java    |     3 +-
 .../trees/plans/commands/DescribeCommand.java      |     4 +-
 .../plans/commands/DropCachedStatsCommand.java     |     4 +-
 .../plans/commands/DropConstraintCommand.java      |    23 +-
 .../plans/commands/DropEncryptkeyCommand.java      |     4 +-
 .../commands/DropMaterializedViewCommand.java      |     4 +-
 .../plans/commands/DropRoleMappingCommand.java     |    64 +
 .../trees/plans/commands/DropRowPolicyCommand.java |     4 +-
 .../trees/plans/commands/DropStatsCommand.java     |     4 +-
 .../trees/plans/commands/DropStreamCommand.java    |    90 +
 .../trees/plans/commands/DropTableCommand.java     |     6 +-
 .../trees/plans/commands/DropViewCommand.java      |     4 +-
 .../trees/plans/commands/ExecuteActionCommand.java |     4 +-
 .../trees/plans/commands/ExplainCommand.java       |     2 +-
 .../trees/plans/commands/ExportCommand.java        |     2 +-
 .../trees/plans/commands/IcebergDeleteCommand.java |   102 +-
 .../trees/plans/commands/IcebergMergeCommand.java  |   103 +-
 .../trees/plans/commands/IcebergUpdateCommand.java |    77 +-
 .../trees/plans/commands/LockTablesCommand.java    |     4 +-
 .../plans/commands/RecoverPartitionCommand.java    |     4 +-
 .../trees/plans/commands/RecoverTableCommand.java  |     4 +-
 .../trees/plans/commands/RestoreCommand.java       |    12 +-
 .../plans/commands/ShowAlterTableCommand.java      |    10 +-
 .../trees/plans/commands/ShowAnalyzeCommand.java   |     4 +-
 .../plans/commands/ShowBuildIndexCommand.java      |    13 +-
 .../commands/ShowColumnHistogramStatsCommand.java  |     4 +-
 .../plans/commands/ShowColumnStatsCommand.java     |     4 +-
 .../trees/plans/commands/ShowColumnsCommand.java   |     4 +-
 .../plans/commands/ShowConstraintsCommand.java     |     8 +-
 .../ShowCreateMaterializedViewCommand.java         |     4 +-
 .../plans/commands/ShowCreateStreamCommand.java    |   124 +
 .../plans/commands/ShowCreateTableCommand.java     |    59 +-
 .../plans/commands/ShowCreateViewCommand.java      |     4 +-
 .../trees/plans/commands/ShowDataCommand.java      |   102 +-
 .../trees/plans/commands/ShowDataSkewCommand.java  |     4 +-
 .../trees/plans/commands/ShowDatabasesCommand.java |     2 +-
 .../trees/plans/commands/ShowIndexCommand.java     |     2 +-
 .../plans/commands/ShowIndexStatsCommand.java      |     4 +-
 .../plans/commands/ShowPartitionsCommand.java      |     6 +-
 .../plans/commands/ShowQueryStatsCommand.java      |     4 +-
 .../commands/ShowQueuedAnalyzeJobsCommand.java     |     4 +-
 .../commands/ShowReplicaDistributionCommand.java   |     2 +-
 .../plans/commands/ShowReplicaStatusCommand.java   |     2 +-
 .../plans/commands/ShowSqlBlockRuleCommand.java    |     2 +
 .../trees/plans/commands/ShowTableCommand.java     |    84 +-
 .../plans/commands/ShowTableStatsCommand.java      |     4 +-
 .../plans/commands/ShowTableStatusCommand.java     |     2 +-
 .../commands/ShowTabletsFromTableCommand.java      |     4 +-
 .../trees/plans/commands/ShowViewCommand.java      |     6 +-
 .../trees/plans/commands/SqlBlockRuleCommand.java  |    13 +-
 .../trees/plans/commands/TruncateTableCommand.java |     4 +-
 .../trees/plans/commands/UnsetVariableCommand.java |     3 +-
 .../trees/plans/commands/WarmUpClusterCommand.java |     4 +-
 .../plans/commands/call/CallExecuteStmtFunc.java   |    18 +-
 .../plans/commands/execute/BaseExecuteAction.java  |     2 +-
 .../plans/commands/execute/ExecuteAction.java      |     2 +-
 .../trees/plans/commands/info/AddColumnOp.java     |     7 +-
 .../trees/plans/commands/info/AddColumnsOp.java    |     6 +
 .../plans/commands/info/AddPartitionLikeOp.java    |     6 +
 .../trees/plans/commands/info/AddPartitionOp.java  |     6 +
 .../trees/plans/commands/info/AddRollupOp.java     |     6 +
 .../trees/plans/commands/info/AlterMTMVInfo.java   |     4 +-
 .../plans/commands/info/AlterMTMVPropertyInfo.java |     2 +-
 .../plans/commands/info/AlterMTMVRefreshInfo.java  |     2 +-
 .../plans/commands/info/AlterMTMVRenameInfo.java   |     2 +-
 .../plans/commands/info/AlterMTMVReplaceInfo.java  |     2 +-
 .../nereids/trees/plans/commands/info/AlterOp.java |     7 +
 .../trees/plans/commands/info/AlterTableOp.java    |     2 +-
 .../trees/plans/commands/info/AlterViewInfo.java   |     4 +-
 .../trees/plans/commands/info/BaseViewInfo.java    |     2 +-
 .../trees/plans/commands/info/BuildIndexOp.java    |     4 +-
 .../plans/commands/info/CancelMTMVTaskInfo.java    |     4 +-
 .../trees/plans/commands/info/CopyFromDesc.java    |     2 +-
 .../trees/plans/commands/info/CopyIntoInfo.java    |    19 +-
 .../trees/plans/commands/info/CreateIndexOp.java   |     4 +-
 .../trees/plans/commands/info/CreateMTMVInfo.java  |     4 +-
 .../plans/commands/info/CreateRoutineLoadInfo.java |    42 +-
 .../plans/commands/info/CreateStreamInfo.java      |   110 +
 .../trees/plans/commands/info/CreateTableInfo.java |    16 +-
 .../plans/commands/info/CreateTableLikeInfo.java   |     6 +-
 .../trees/plans/commands/info/CreateViewInfo.java  |     4 +-
 .../trees/plans/commands/info/DropColumnOp.java    |     7 +
 .../trees/plans/commands/info/DropIndexOp.java     |    46 +-
 .../trees/plans/commands/info/DropMTMVInfo.java    |     4 +-
 .../trees/plans/commands/info/DropPartitionOp.java |     6 +
 .../trees/plans/commands/info/DropRollupOp.java    |     6 +
 .../plans/commands/info/GeneratedColumnDesc.java   |     7 +-
 .../trees/plans/commands/info/IndexDefinition.java |    14 +-
 .../trees/plans/commands/info/LabelNameInfo.java   |     4 +-
 .../trees/plans/commands/info/LockTableInfo.java   |     2 +-
 .../plans/commands/info/ModifyColumnCommentOp.java |     6 +
 .../plans/commands/info/ModifyDistributionOp.java  |     6 +
 .../plans/commands/info/ModifyPartitionOp.java     |     6 +
 .../plans/commands/info/ModifyTableCommentOp.java  |     6 +
 .../commands/info/ModifyTablePropertiesOp.java     |    45 +-
 .../trees/plans/commands/info/PauseMTMVInfo.java   |     4 +-
 .../trees/plans/commands/info/RefreshMTMVInfo.java |     4 +-
 .../plans/commands/info/RenamePartitionOp.java     |     6 +
 .../trees/plans/commands/info/RenameRollupOp.java  |     6 +
 .../trees/plans/commands/info/RenameTableOp.java   |     6 +
 .../plans/commands/info/ReplacePartitionOp.java    |     6 +
 .../trees/plans/commands/info/ReplaceTableOp.java  |     5 +
 .../trees/plans/commands/info/ResumeMTMVInfo.java  |     4 +-
 .../plans/commands/info/ShowCreateMTMVInfo.java    |     4 +-
 .../commands/info/SimpleColumnDefinition.java      |     6 -
 .../trees/plans/commands/info/WarmUpItem.java      |     2 +-
 .../commands/insert/AbstractInsertExecutor.java    |    30 +-
 .../commands/insert/IcebergDeleteExecutor.java     |    20 +
 .../insert/IcebergInsertCommandContext.java        |     9 +
 .../commands/insert/IcebergMergeExecutor.java      |    20 +
 .../commands/insert/InsertIntoTVFCommand.java      |    15 +-
 .../commands/insert/InsertIntoTableCommand.java    |   105 +-
 .../trees/plans/commands/insert/InsertUtils.java   |    15 +-
 .../commands/insert/JdbcInsertCommandContext.java  |    24 -
 .../plans/commands/insert/JdbcInsertExecutor.java  |   114 -
 .../plans/commands/insert/MCInsertExecutor.java    |     4 +-
 .../plans/commands/insert/OlapInsertExecutor.java  |    60 +-
 .../insert/PluginDrivenInsertCommandContext.java   |    26 +
 .../insert/PluginDrivenInsertExecutor.java         |   172 +
 .../commands/insert/RemoteOlapInsertExecutor.java  |     3 +-
 .../plans/commands/insert/RewriteTableCommand.java |     1 +
 .../plans/commands/load/MysqlDataDescription.java  |     2 +-
 .../commands/refresh/RefreshTableCommand.java      |     4 +-
 .../worker/job/UnassignedJobBuilder.java           |    16 +-
 .../worker/job/UnassignedLocalTVFSinkJob.java      |    68 +
 .../plans/logical/LogicalCatalogRelation.java      |     5 +-
 .../plans/logical/LogicalConnectorTableSink.java   |   157 +
 .../logical/LogicalDeferMaterializeOlapScan.java   |   187 -
 .../logical/LogicalDeferMaterializeResultSink.java |   152 -
 .../plans/logical/LogicalDeferMaterializeTopN.java |   195 -
 .../nereids/trees/plans/logical/LogicalEsScan.java |   110 -
 .../trees/plans/logical/LogicalFileScan.java       |    56 +-
 .../trees/plans/logical/LogicalJdbcScan.java       |   109 -
 .../trees/plans/logical/LogicalJdbcTableSink.java  |   158 -
 .../nereids/trees/plans/logical/LogicalJoin.java   |    12 +
 .../trees/plans/logical/LogicalOlapScan.java       |   121 +-
 .../plans/logical/LogicalOlapTableStreamScan.java  |   278 +
 .../trees/plans/physical/AbstractPhysicalJoin.java |    16 +-
 .../trees/plans/physical/AbstractPhysicalPlan.java |    11 +-
 .../physical/PhysicalBucketedHashAggregate.java    |   293 +
 .../plans/physical/PhysicalCatalogRelation.java    |    12 +-
 .../plans/physical/PhysicalConnectorTableSink.java |   122 +
 .../physical/PhysicalDeferMaterializeOlapScan.java |   164 -
 .../PhysicalDeferMaterializeResultSink.java        |   159 -
 .../physical/PhysicalDeferMaterializeTopN.java     |   219 -
 .../trees/plans/physical/PhysicalDistribute.java   |    38 +
 .../trees/plans/physical/PhysicalEsScan.java       |   111 -
 .../trees/plans/physical/PhysicalExcept.java       |     8 +-
 .../trees/plans/physical/PhysicalFileScan.java     |    18 +-
 .../plans/physical/PhysicalHashAggregate.java      |    37 +-
 .../trees/plans/physical/PhysicalHashJoin.java     |     3 -
 .../trees/plans/physical/PhysicalHudiScan.java     |     2 +-
 .../trees/plans/physical/PhysicalIntersect.java    |     8 +-
 .../trees/plans/physical/PhysicalJdbcScan.java     |   113 -
 .../plans/physical/PhysicalJdbcTableSink.java      |   110 -
 .../plans/physical/PhysicalLazyMaterialize.java    |     4 +
 .../plans/physical/PhysicalNestedLoopJoin.java     |     3 -
 .../trees/plans/physical/PhysicalOlapScan.java     |    68 +-
 .../trees/plans/physical/PhysicalSetOperation.java |     9 +-
 .../trees/plans/physical/RuntimeFilter.java        |   111 +-
 .../trees/plans/visitor/CommandVisitor.java        |    25 +
 .../nereids/trees/plans/visitor/PlanVisitor.java   |    16 +-
 .../trees/plans/visitor/RelationVisitor.java       |    37 +-
 .../nereids/trees/plans/visitor/SinkVisitor.java   |    30 +-
 .../apache/doris/nereids/types/AggStateType.java   |     1 +
 .../apache/doris/nereids/types/DateTimeV2Type.java |     2 +-
 .../apache/doris/nereids/types/VariantField.java   |    20 +-
 .../apache/doris/nereids/types/VariantType.java    |     9 +
 .../apache/doris/nereids/util/AggregateUtils.java  |    46 +-
 .../apache/doris/nereids/util/ExpressionUtils.java |    11 +
 .../doris/nereids/util/RowStoreFetchChecker.java   |    55 +
 .../doris/nereids/util/TypeCoercionUtils.java      |    84 +-
 .../java/org/apache/doris/nereids/util/Utils.java  |     4 +-
 .../apache/doris/persist/AlterConstraintLog.java   |     2 +-
 .../java/org/apache/doris/persist/AlterMTMV.java   |     2 +-
 .../doris/persist/DropRoleMappingOperationLog.java |    58 +
 .../java/org/apache/doris/persist/EditLog.java     |    82 +-
 .../apache/doris/persist/GlobalVarPersistInfo.java |     8 +-
 .../org/apache/doris/persist/OperationType.java    |     4 +
 .../org/apache/doris/persist/gson/GsonUtils.java   |   529 +-
 .../doris/persist/meta/MetaPersistMethod.java      |    36 +-
 .../doris/persist/meta/PersistMetaModules.java     |     4 +-
 .../org/apache/doris/planner/AggregationNode.java  |    98 +-
 .../org/apache/doris/planner/AnalyticEvalNode.java |    25 +-
 .../planner/BackendPartitionedSchemaScanNode.java  |     6 +-
 .../doris/planner/BaseExternalTableDataSink.java   |    12 +
 .../doris/planner/BucketedAggregationNode.java     |   106 +
 .../java/org/apache/doris/planner/CTEScanNode.java |     5 +-
 .../java/org/apache/doris/planner/ExceptNode.java  |     6 +
 .../org/apache/doris/planner/HashJoinNode.java     |     9 +
 .../apache/doris/planner/IcebergDeleteSink.java    |    18 +-
 .../org/apache/doris/planner/IcebergMergeSink.java |    24 +-
 .../org/apache/doris/planner/IcebergTableSink.java |    22 +-
 .../org/apache/doris/planner/IntersectNode.java    |     6 +
 .../org/apache/doris/planner/JoinNodeBase.java     |     3 -
 .../apache/doris/planner/MaterializationNode.java  |     3 +-
 .../apache/doris/planner/MaxComputeTableSink.java  |     6 +-
 .../org/apache/doris/planner/OlapScanNode.java     |    79 +-
 .../org/apache/doris/planner/OlapTableSink.java    |    13 +-
 .../java/org/apache/doris/planner/PlanNode.java    |    63 +-
 .../doris/planner/PluginDrivenTableSink.java       |   313 +
 .../java/org/apache/doris/planner/RangeMap.java    |    11 +-
 .../doris/planner/RangePartitionPrunerV2.java      |     6 +-
 .../org/apache/doris/planner/RuntimeFilter.java    |    40 +-
 .../doris/planner/RuntimeFilterGenerator.java      |    76 -
 .../java/org/apache/doris/planner/ScanNode.java    |    34 +-
 .../org/apache/doris/planner/SetOperationNode.java |    13 +-
 .../org/apache/doris/planner/TVFTableSink.java     |     3 +-
 .../java/org/apache/doris/qe/AuditLogHelper.java   |   156 +-
 .../java/org/apache/doris/qe/ConnectContext.java   |    95 +-
 .../java/org/apache/doris/qe/ConnectProcessor.java |    52 +-
 .../main/java/org/apache/doris/qe/Coordinator.java |    59 +-
 .../org/apache/doris/qe/CoordinatorContext.java    |     6 +-
 .../java/org/apache/doris/qe/FEOpExecutor.java     |     7 +-
 .../java/org/apache/doris/qe/GlobalVariable.java   |   281 -
 .../org/apache/doris/qe/MasterTxnExecutor.java     |     4 +-
 .../org/apache/doris/qe/MysqlConnectProcessor.java |     4 +
 .../org/apache/doris/qe/NereidsCoordinator.java    |     1 +
 .../org/apache/doris/qe/PointQueryExecutor.java    |   197 +-
 .../java/org/apache/doris/qe/QeProcessorImpl.java  |     5 +
 .../org/apache/doris/qe/QueryStatisticsItem.java   |    18 +
 .../apache/doris/qe/ResultReceiverConsumer.java    |     7 +-
 .../java/org/apache/doris/qe/SessionVariable.java  |  1103 +-
 .../apache/doris/qe/ShortCircuitQueryContext.java  |     3 +-
 .../java/org/apache/doris/qe/StmtExecutor.java     |    69 +-
 .../main/java/org/apache/doris/qe/VariableMgr.java |   120 +-
 .../apache/doris/qe/runtime/QueryProcessor.java    |     4 +
 .../doris/qe/runtime/ThriftPlansBuilder.java       |    30 +-
 .../WorkloadRuntimeStatusMgr.java                  |   112 +-
 .../org/apache/doris/rpc/BackendServiceClient.java |    23 +-
 .../org/apache/doris/rpc/BackendServiceProxy.java  |    11 +
 .../apache/doris/service/FrontendServiceImpl.java  |    81 +-
 .../arrowflight/FlightSqlConnectProcessor.java     |     1 +
 .../org/apache/doris/statistics/AnalysisJob.java   |    15 +-
 .../apache/doris/statistics/AnalysisManager.java   |    34 +-
 .../doris/statistics/AnalyzeSkipException.java     |    39 +
 .../apache/doris/statistics/BaseAnalysisTask.java  |   125 +-
 .../org/apache/doris/statistics/ColStatsData.java  |     5 +-
 .../apache/doris/statistics/ColumnStatistic.java   |    41 +-
 .../doris/statistics/ColumnStatisticBuilder.java   |     8 +-
 .../doris/statistics/ExternalAnalysisTask.java     |     1 +
 .../apache/doris/statistics/OlapAnalysisTask.java  |     5 +
 .../doris/statistics/StatisticConstants.java       |    14 +
 .../doris/statistics/StatisticsAutoCollector.java  |     2 +-
 .../apache/doris/statistics/StatisticsCache.java   |    22 +-
 .../doris/statistics/StatisticsJobAppender.java    |    11 +-
 .../doris/statistics/StatisticsRepository.java     |     7 +-
 .../doris/statistics/util/StatisticsUtil.java      |   306 +-
 .../org/apache/doris/system/SystemInfoService.java |    20 +
 .../CdcStreamTableValuedFunction.java              |   169 +
 .../ExternalFileTableValuedFunction.java           |    37 +-
 .../tablefunction/HudiTableValuedFunction.java     |     2 +-
 .../tablefunction/IcebergTableValuedFunction.java  |   168 -
 .../tablefunction/JdbcQueryTableValueFunction.java |    25 +-
 .../doris/tablefunction/MetadataGenerator.java     |   123 +
 .../ParquetMetadataTableValuedFunction.java        |    14 +-
 .../tablefunction/QueryTableValueFunction.java     |     8 +-
 .../doris/tablefunction/TableValuedFunctionIf.java |     2 -
 .../apache/doris/task/AlterInvertedIndexTask.java  |     9 +-
 .../org/apache/doris/task/AlterReplicaTask.java    |     6 +-
 .../org/apache/doris/task/CreateReplicaTask.java   |    39 +-
 .../main/java/org/apache/doris/task/PushTask.java  |     6 +
 .../doris/transaction/DatabaseTransactionMgr.java  |   133 +-
 .../doris/transaction/GlobalTransactionMgr.java    |    38 +-
 .../doris/transaction/HiveTransactionManager.java  |    10 +-
 .../PluginDrivenTransactionManager.java            |   102 +
 .../apache/doris/transaction/TableCommitInfo.java  |    17 +-
 .../transaction/TransactionManagerFactory.java     |     6 +-
 .../apache/doris/transaction/TransactionState.java |    18 +
 .../main/java/org/apache/doris/tso/TSOService.java |   526 +
 .../java/org/apache/doris/tso/TSOTimestamp.java    |   247 +
 .../apache/doris/alter/AlterJobV2RetryTest.java    |   101 +
 .../org/apache/doris/alter/CloudIndexTest.java     |   442 +-
 .../org/apache/doris/alter/IndexChangeJobTest.java |   247 +-
 .../doris/alter/MaterializedViewHandlerTest.java   |   208 +-
 .../doris/alter/ReplayModifyViewDefTest.java       |   196 +
 .../org/apache/doris/alter/RollupJobV2Test.java    |    81 +-
 .../doris/alter/SchemaChangeHandlerTest.java       |   263 +-
 .../apache/doris/alter/SchemaChangeJobV2Test.java  |   128 +-
 .../org/apache/doris/analysis/AccessTestUtil.java  |   379 +-
 .../org/apache/doris/analysis/DateLiteralTest.java |    99 -
 .../doris/analysis/DateLiteralUtilsTest.java       |   427 +
 .../doris/analysis/DecimalLiteralUtilsTest.java    |   277 +
 .../analysis/DescriptorToThriftConverterTest.java  |   358 +
 .../doris/analysis/ExprGsonSerializationTest.java  |   389 +
 .../org/apache/doris/analysis/ExprToSqlTest.java   |    51 +-
 .../analysis/ExprToStringValueVisitorTest.java     |    10 +-
 .../doris/analysis/PartitionExprUtilTest.java      |    92 +-
 .../AuthenticationIntegrationMgrTest.java          |    52 +-
 .../AuthenticationIntegrationRuntimeTest.java      |   158 +-
 .../doris/authentication/RoleMappingMgrTest.java   |   238 +
 .../org/apache/doris/backup/BackupHandlerTest.java |   347 +-
 .../org/apache/doris/backup/BackupJobTest.java     |   199 +-
 .../org/apache/doris/backup/BrokerStorageTest.java |   192 -
 .../org/apache/doris/backup/CatalogMocker.java     |    88 +-
 .../org/apache/doris/backup/RepositoryTest.java    |   484 +-
 .../org/apache/doris/backup/RestoreJobTest.java    |   168 +-
 .../org/apache/doris/binlog/BinlogManagerTest.java |   371 +-
 .../org/apache/doris/binlog/BinlogTestUtils.java   |    14 +-
 .../java/org/apache/doris/binlog/DbBinlogTest.java |    38 +-
 .../apache/doris/binlog/MockBinlogConfigCache.java |     6 +-
 .../org/apache/doris/binlog/TableBinlogTest.java   |   251 +-
 .../doris/blockrule/SqlBlockRuleMgrTest.java       |    69 +
 .../org/apache/doris/catalog/AIResourceTest.java   |   241 +-
 .../java/org/apache/doris/catalog/BackendTest.java |    11 +
 .../doris/catalog/CatalogRecycleBinTest.java       |    49 +-
 .../java/org/apache/doris/catalog/ColumnTest.java  |     8 +
 .../org/apache/doris/catalog/ColumnTypeTest.java   |     8 +
 .../doris/catalog/CreateTableStreamTest.java       |   104 +
 .../org/apache/doris/catalog/CreateTableTest.java  |    23 +
 .../org/apache/doris/catalog/DatabaseTest.java     |    47 +-
 .../doris/catalog/DropMaterializedViewTest.java    |     1 +
 .../apache/doris/catalog/DropTableStreamTest.java  |    95 +
 .../doris/catalog/DynamicPartitionTableTest.java   |    31 +
 .../java/org/apache/doris/catalog/EnvTest.java     |    22 +-
 .../java/org/apache/doris/catalog/FakeEditLog.java |   126 +-
 .../java/org/apache/doris/catalog/FakeEnv.java     |    48 +-
 .../doris/catalog/FunctionToSqlConverterTest.java  |    36 +-
 .../catalog/FunctionToThriftConverterTest.java     |    35 +-
 .../org/apache/doris/catalog/JdbcResourceTest.java |    63 +-
 .../doris/catalog/ListPartitionInfoTest.java       |     2 +-
 .../doris/catalog/MaterializedIndexTest.java       |    13 +-
 .../apache/doris/catalog/MetadataViewerTest.java   |    61 +-
 .../org/apache/doris/catalog/MysqlTableTest.java   |    13 +-
 .../catalog/OlapTableRowBinlogSchemaTest.java      |    92 +
 .../org/apache/doris/catalog/OlapTableTest.java    |   321 +-
 .../apache/doris/catalog/OlapTableWrapperTest.java |   120 +
 .../doris/catalog/RangePartitionInfoTest.java      |     2 +-
 .../org/apache/doris/catalog/RefreshTableTest.java |     2 +-
 .../doris/catalog/ReplicaAllocationTest.java       |    40 +-
 .../java/org/apache/doris/catalog/ReplicaTest.java |     5 +-
 .../org/apache/doris/catalog/ResourceMgrTest.java  |    98 +-
 .../org/apache/doris/catalog/S3ResourceTest.java   |   130 +-
 .../org/apache/doris/catalog/SchemaTableTest.java  |    14 +
 .../doris/catalog/SessionVariablesNullFixTest.java |   127 +
 .../java/org/apache/doris/catalog/TableTest.java   |     8 +
 .../java/org/apache/doris/catalog/TabletTest.java  |    40 +-
 .../java/org/apache/doris/catalog/TypeTest.java    |     8 +
 .../org/apache/doris/catalog/UserPropertyTest.java |   116 +-
 .../catalog/constraint/ConstraintManagerTest.java  |     2 +-
 .../catalog/constraint/ConstraintPersistTest.java  |   148 +-
 .../catalog/stream/OlapTableStreamUpdateTest.java  |    56 +
 .../clone/ColocateTableCheckerAndBalancerTest.java |   517 +-
 .../org/apache/doris/clone/DiskRebalanceTest.java  |    86 +-
 .../java/org/apache/doris/clone/RebalanceTest.java |   182 +-
 .../org/apache/doris/clone/RebalancerTestUtil.java |    16 +
 .../org/apache/doris/cloud/CloudWarmUpJobTest.java |   163 +
 .../doris/cloud/backup/CloudRestoreJobTest.java    |   120 +-
 .../doris/cloud/cache/CacheHotspotManagerTest.java |    96 +-
 .../doris/cloud/catalog/CloudPartitionTest.java    |    74 +-
 .../doris/cloud/catalog/HdfsStorageVaultTest.java  |   287 +-
 .../org/apache/doris/cloud/load/CopyJobTest.java   |    13 +-
 .../doris/cloud/load/CopyLoadPendingTaskTest.java  |   275 +-
 .../doris/cloud/master/CloudReportHandlerTest.java |    42 +-
 .../apache/doris/cloud/stage/StageUtilTest.java    |    99 +-
 .../doris/cloud/storage/ObjectInfoAdapterTest.java |    57 +
 .../cloud/system/CloudSystemInfoServiceTest.java   |    66 +
 .../transaction/CloudGlobalTransactionMgrTest.java |   514 +-
 .../doris/cluster/ClusterGuardExceptionTest.java   |    48 +
 .../doris/cluster/ClusterGuardFactoryTest.java     |   392 +
 .../apache/doris/cluster/NoOpClusterGuardTest.java |    55 +
 .../doris/cluster/SystemInfoServiceTest.java       |   102 +-
 .../org/apache/doris/common/GenericPoolTest.java   |   109 +
 .../apache/doris/common/PropertyAnalyzerTest.java  |     3 +-
 .../proc/AlterProcDirFilterExpressionTest.java     |    79 +
 .../doris/common/proc/BackendProcNodeTest.java     |    42 +-
 .../doris/common/proc/BackendsProcDirTest.java     |   121 +-
 .../proc/CurrentQueryStatisticsProcDirTest.java    |    89 +
 .../apache/doris/common/proc/DbsProcDirTest.java   |   152 +-
 .../doris/common/proc/IndexSchemaProcNodeTest.java |     3 +-
 .../apache/doris/common/proc/ProcServiceTest.java  |    78 +
 .../doris/common/profile/AutoProfileTest.java      |    13 +-
 .../doris/common/profile/ProfileManagerTest.java   |    86 +-
 .../apache/doris/common/profile/ProfileTest.java   |    38 +-
 .../common/util/AutoBucketCalculatorTest.java      |    57 +-
 .../doris/common/util/AutoBucketUtilsTest.java     |   165 +-
 .../apache/doris/common/util/BrokerUtilTest.java   |   116 +-
 .../apache/doris/common/util/LocationPathTest.java |     2 +-
 .../apache/doris/common/util/TimeUtilsTest.java    |    28 +-
 .../org/apache/doris/common/util/UtilTest.java     |    27 +
 .../connector/ConnectorPluginManagerTest.java      |   143 +
 .../doris/connector/ConnectorSessionImplTest.java  |   181 +
 .../datasource/ConnectorColumnConverterTest.java   |   142 +
 .../doris/datasource/ExternalEqualsTest.java       |     8 +-
 .../ExternalMetaCacheRouteResolverTest.java        |    26 +-
 .../datasource/ExternalRowCountCacheTest.java      |   101 +-
 .../doris/datasource/FileQueryScanNodeTest.java    |    75 +-
 .../apache/doris/datasource/FileSplitterTest.java  |    24 +
 .../apache/doris/datasource/PathVisibleTest.java   |    33 +-
 ...PluginDrivenExternalCatalogConcurrencyTest.java |   359 +
 .../PluginDrivenExternalTableEngineTest.java       |   154 +
 .../doris/datasource/SplitAssignmentTest.java      |   134 +-
 .../doris/datasource/TestHMSCachedClient.java      |     2 +-
 .../datasource/hive/HMSExternalTableTest.java      |   119 +-
 .../datasource/hive/HMSTransactionPathTest.java    |   208 +-
 .../apache/doris/datasource/hive/HiveAcidTest.java |   255 +-
 .../datasource/hive/HiveDDLAndDMLPlanTest.java     |   233 +-
 .../datasource/hive/HiveMetaStoreCacheTest.java    |    87 +
 .../apache/doris/datasource/hive/HiveUtilTest.java |   175 +
 .../doris/datasource/hive/HmsCommitTest.java       |   325 +-
 .../datasource/hive/ThriftHMSCachedClientTest.java |   416 +
 .../datasource/hive/source/HiveScanNodeTest.java   |    44 +
 .../doris/datasource/hudi/HudiUtilsTest.java       |    69 +-
 .../datasource/iceberg/IcebergMetadataOpTest.java  |    69 +
 .../datasource/iceberg/IcebergPredicateTest.java   |     9 +-
 .../datasource/iceberg/IcebergTransactionTest.java |   157 +
 .../doris/datasource/iceberg/IcebergUtilsTest.java |    56 +
 .../dlf/client/IcebergDLFExternalCatalogTest.java  |     2 +-
 .../helper/IcebergRewritableDeletePlannerTest.java |   144 +
 .../iceberg/helper/IcebergWriterHelperTest.java    |    26 +
 .../iceberg/source/IcebergScanNodeTest.java        |    73 +
 .../datasource/jdbc/JdbcExternalCatalogTest.java   |   114 -
 .../datasource/jdbc/source/JdbcScanNodeTest.java   |   629 -
 .../datasource/jdbc/util/JdbcFieldSchemaTest.java  |    57 +
 .../datasource/lakesoul/LakeSoulPredicateTest.java |     9 +-
 .../mapping/JdbcIdentifierMappingTest.java         |   277 -
 .../paimon/source/PaimonScanNodeTest.java          |    94 +
 .../metastore/IcebergDlfRestCatalogTest.java       |    40 +-
 .../IcebergJdbcMetaStorePropertiesTest.java        |    72 +
 .../metastore/IcebergRestPropertiesTest.java       |   320 +
 .../IcebergS3TablesMetaStorePropertiesTest.java    |   272 +
 .../metastore/PaimonDlfRestCatalogTest.java        |    42 -
 .../PaimonJdbcMetaStorePropertiesTest.java         |    37 +
 .../property/storage/OSSPropertiesTest.java        |     2 +
 .../property/storage/S3PropertiesTest.java         |   116 +-
 .../property/storage/StoragePropertiesTest.java    |    91 +
 .../doris/datasource/s3tables/S3TablesTest.java    |     9 -
 .../systable/IcebergSysTableResolverTest.java      |    75 +
 .../TrinoConnectorPredicateTest.java               |    17 +-
 .../external/elasticsearch/EsNodeInfoTest.java     |    59 -
 .../elasticsearch/EsShardPartitionsTest.java       |    53 -
 .../doris/external/elasticsearch/EsTestCase.java   |   104 -
 .../doris/external/elasticsearch/EsUtilTest.java   |   295 -
 .../external/elasticsearch/PartitionPhaseTest.java |    83 -
 .../external/elasticsearch/QueryBuildersTest.java  |   451 -
 .../apache/doris/external/hms/HmsCatalogTest.java  |   301 +-
 .../external/iceberg/IcebergHadoopCatalogTest.java |    90 -
 .../doris/fs/FileSystemTransferUtilTest.java       |   218 +
 .../java/org/apache/doris/fs/MemoryFileSystem.java |   355 +
 .../org/apache/doris/fs/MemoryFileSystemTest.java  |   373 +
 .../org/apache/doris/fs/SchemaTypeMapperTest.java  |     1 +
 .../doris/fs/SpiSwitchingFileSystemTest.java       |   294 +
 ...TransactionScopeCachingDirectoryListerTest.java |    60 +-
 .../apache/doris/fs/obj/AzureObjStorageTest.java   |   272 -
 .../org/apache/doris/fs/obj/MockedS3Client.java    |   131 -
 .../org/apache/doris/fs/obj/S3FileSystemTest.java  |   246 -
 .../doris/fs/obj/S3ObjStorageGlobListTest.java     |   187 -
 .../org/apache/doris/fs/obj/S3ObjStorageTest.java  |   557 -
 .../doris/fs/remote/RemoteFileSystemTest.java      |   195 -
 .../org/apache/doris/http/DorisHttpTestCase.java   |   178 +-
 .../org/apache/doris/http/ForwardToMasterTest.java |    30 +-
 .../org/apache/doris/httpv2/rest/CopyIntoTest.java |    26 +-
 .../apache/doris/httpv2/rest/HttpApiAuthTest.java  |   158 +
 .../apache/doris/httpv2/rest/LoadActionTest.java   |    49 +
 .../apache/doris/info/TableNameInfoUtilsTest.java  |   148 +
 .../InsertOverwriteManagerTest.java                |    58 +-
 .../streaming/DataSourceConfigValidatorTest.java   |   227 +
 .../StreamingInsertJobCheckDataQualityTest.java    |   158 +
 .../streaming/StreamingJobPropertiesTest.java      |    78 +
 .../apache/doris/job/manager/JobManagerTest.java   |    48 +-
 .../doris/journal/bdbje/BDBDebuggerTest.java       |   114 +-
 .../doris/journal/bdbje/BDBEnvironmentTest.java    |    60 +-
 .../doris/journal/bdbje/BDBJEJournalTest.java      |   450 +-
 .../java/org/apache/doris/load/DeleteJobTest.java  |   154 +
 .../org/apache/doris/load/TabletLoadInfoTest.java  |     8 +
 .../doris/load/loadv2/BrokerLoadJobTest.java       |   503 +-
 .../load/loadv2/BrokerLoadPendingTaskTest.java     |   148 +-
 .../apache/doris/load/loadv2/ExportMgrTest.java    |    56 +-
 .../doris/load/loadv2/InsertLoadJobTest.java       |    54 +-
 .../org/apache/doris/load/loadv2/LoadJobTest.java  |   122 +-
 .../apache/doris/load/loadv2/LoadManagerTest.java  |   215 +-
 .../load/routineload/KafkaAwsMskIamAuthTest.java   |   491 +
 .../load/routineload/KafkaRoutineLoadJobTest.java  |   345 +-
 .../doris/load/routineload/RoutineLoadJobTest.java |   319 +-
 .../load/routineload/RoutineLoadManagerTest.java   |  1335 +-
 .../load/routineload/RoutineLoadSchedulerTest.java |   221 +-
 .../routineload/RoutineLoadTaskSchedulerTest.java  |   134 +-
 .../doris/master/MasterImplDeleteTaskTest.java     |   156 +
 .../java/org/apache/doris/metric/MetricsTest.java  |    36 +
 .../doris/mtmv/MTMVPartitionCheckUtilTest.java     |   226 +-
 .../apache/doris/mtmv/MTMVPartitionUtilTest.java   |   274 +-
 .../org/apache/doris/mtmv/MTMVPlanUtilTest.java    |   102 +-
 .../apache/doris/mtmv/MTMVRefreshSnapshotTest.java |    53 +-
 ...TMVRelatedPartitionDescRollUpGeneratorTest.java |   149 +-
 ...RelatedPartitionDescSyncLimitGeneratorTest.java |    46 +-
 .../apache/doris/mtmv/MTMVRelationManagerTest.java |    75 +-
 .../org/apache/doris/mtmv/MTMVRewriteUtilTest.java |   280 +-
 .../java/org/apache/doris/mtmv/MTMVTaskTest.java   |   120 +-
 .../test/java/org/apache/doris/mtmv/MTMVTest.java  |     2 +-
 .../java/org/apache/doris/mtmv/MTMVUtilTest.java   |     2 +-
 .../apache/doris/mysql/ConnectionExceedTest.java   |   257 +-
 .../apache/doris/mysql/MysqlAuthPacketTest.java    |    26 +-
 .../apache/doris/mysql/MysqlCapabilityTest.java    |     5 +-
 .../org/apache/doris/mysql/MysqlChannelTest.java   |    40 +-
 .../doris/mysql/MysqlHandshakePacketTest.java      |    28 +-
 .../org/apache/doris/mysql/MysqlProtoTest.java     |   349 +-
 .../authenticate/AuthenticatorManagerTest.java     |   463 +-
 .../authenticate/DefaultAuthenticatorTest.java     |    53 +-
 .../MysqlAuthPacketCredentialExtractorTest.java    |    90 +
 .../doris/mysql/authenticate/TestLogAppender.java  |    77 +
 ...AuthenticationIntegrationAuthenticatorTest.java |    26 +-
 .../authenticate/ldap/LdapAuthenticatorTest.java   |    76 +-
 .../mysql/authenticate/ldap/LdapClientTest.java    |    39 +-
 .../mysql/authenticate/ldap/LdapManagerTest.java   |    27 +-
 .../password/ClearPasswordResolverTest.java        |    63 +
 .../AuthenticationPluginAuthenticatorTest.java     |   178 +
 .../privilege/AccessControllerManagerTest.java     |   357 +-
 .../org/apache/doris/mysql/privilege/AuthTest.java |    23 +
 .../doris/mysql/privilege/CloudAuthTest.java       |    82 +-
 .../apache/doris/mysql/privilege/MockedAuth.java   |    73 +-
 .../doris/mysql/privilege/SetPasswordTest.java     |    49 +-
 .../doris/nereids/datasets/ssb/SSBUtils.java       |    19 +
 .../translator/PhysicalPlanTranslatorTest.java     |   177 +-
 .../nereids/jobs/cascades/DeriveStatsJobTest.java  |    35 +-
 .../joinorder/hypergraph/CircleDetectorTest.java   |    44 -
 .../joinorder/hypergraph/CompareOuterJoinTest.java |     4 +-
 .../joinorder/hypergraph/GraphSimplifierTest.java  |   295 -
 .../jobs/joinorder/hypergraph/HyperGraphTest.java  |   131 -
 .../jobs/joinorder/hypergraph/OtherJoinTest.java   |    89 -
 .../hypergraph/SubgraphEnumeratorTest.java         |   153 -
 .../jobs/joinorder/hypergraphv2/BitmapTest.java    |    64 +
 .../joinorder/hypergraphv2/CircleDetectorTest.java |    43 +
 .../GraphSimplifierConsistencyTest.java            |    92 +
 .../joinorder/hypergraphv2/HyperGraphTest.java     |    48 +
 .../jobs/joinorder/hypergraphv2/OtherJoinTest.java |    83 +
 .../hypergraphv2/SubgraphEnumeratorTest.java       |   153 +
 .../joinorder/joinhint/DistributeHintTest.java     |     4 +-
 .../doris/nereids/memo/StructInfoMapTest.java      |    80 +-
 .../doris/nereids/mv/IdStatisticsMapTest.java      |    66 +-
 .../org/apache/doris/nereids/mv/MTMVCacheTest.java |    99 +-
 .../nereids/mv/MtmvCacheNewConnectContextTest.java |    38 +-
 .../doris/nereids/mv/MvTableIdIsLongTest.java      |    35 +-
 .../nereids/mv/OptimizeGetAvailableMvsTest.java    |   363 +-
 .../mv/PointQueryShouldNotMvRewriteTest.java       |    37 +-
 .../mv/PreMaterializedViewRewriterTest.java        |    12 +-
 .../doris/nereids/mv/RelationMappingTest.java      |     5 +-
 .../doris/nereids/parser/EncryptSQLTest.java       |   822 +-
 .../nereids/parser/NereidsParserDigestTest.java    |     8 +-
 .../doris/nereids/parser/NereidsParserTest.java    |    22 +
 .../parser/ParseInsertPartitionSpecTest.java       |    22 +-
 .../doris/nereids/parser/ParserTestBase.java       |    23 +-
 .../nereids/parser/RoleMappingParserTest.java      |    77 +
 .../postprocess/MergeProjectPostProcessTest.java   |     6 +-
 .../PushDownFilterThroughProjectTest.java          |    12 +-
 .../nereids/postprocess/RuntimeFilterTest.java     |   268 +-
 .../nereids/privileges/TestCheckPrivileges.java    |    41 +-
 .../processor/post/ShuffleKeyPrunerTest.java       |   348 +
 .../properties/ChildOutputPropertyDeriverTest.java |    61 +-
 .../properties/DistributionSpecHashTest.java       |    38 +
 .../properties/RequestPropertyDeriverTest.java     |   183 +-
 .../properties/ShuffleKeyPruneUtilsTest.java       |   536 +
 .../nereids/rules/analysis/AnalyzeCTETest.java     |    14 -
 .../rules/analysis/AnalyzeWhereSubqueryTest.java   |    13 -
 .../nereids/rules/analysis/CheckAnalysisTest.java  |     5 +-
 .../analysis/CheckExpressionLegalityTest.java      |    27 +
 .../nereids/rules/analysis/CheckRowPolicyTest.java |    45 +-
 .../analysis/EliminateLogicalSelectHintTest.java   |    56 +
 .../rules/analysis/UserAuthenticationTest.java     |   293 +-
 .../rules/analysis/UserVariableAnalysisTest.java   |    56 +
 .../rules/exploration/mv/EliminateJoinTest.java    |   129 +
 .../exploration/mv/NullRejectInferenceTest.java    |    97 +
 .../rules/SimplifyConditionalFunctionTest.java     |    39 +-
 .../rules/StringEmptyToLengthRuleTest.java         |   194 +
 .../implementation/BucketedAggregateTest.java      |   154 +
 .../rules/implementation/ImplementationTest.java   |     5 +-
 .../rules/rewrite/AggregateUnionPlanTest.java      |   117 +
 .../rewrite/CollectFilterAboveConsumerTest.java    |    87 +
 .../rules/rewrite/CountLiteralRewriteTest.java     |    32 +
 .../DecomposeRepeatWithPreAggregationTest.java     |     1 +
 .../rewrite/DistinctAggregateRewriterTest.java     |    68 +-
 .../rules/rewrite/EliminateOrderByKeyTest.java     |     2 +-
 .../nereids/rules/rewrite/PartitionPrunerTest.java |    45 +-
 .../rules/rewrite/PruneNestedColumnTest.java       |   188 +-
 .../rules/rewrite/PruneOlapScanTabletTest.java     |    48 +-
 .../rules/rewrite/PushCountIntoUnionAllTest.java   |    30 +
 .../rewrite/PushDownCountThroughJoinTest.java      |    26 +
 .../rewrite/PushDownDistinctThroughJoinTest.java   |    25 +-
 .../rewrite/PushDownFilterThroughGenerateTest.java |    92 +
 .../rewrite/PushDownMinMaxSumThroughJoinTest.java  |    47 +-
 .../rules/rewrite/PushDownSumThroughJoinTest.java  |    29 +-
 .../rules/rewrite/PushProjectIntoUnionTest.java    |   133 +
 .../rules/rewrite/PushProjectThroughUnionTest.java |   122 +
 .../rules/rewrite/ShortCircuitPointQueryTest.java  |    78 +
 .../rules/rewrite/VariantPruningLogicTest.java     |    26 +-
 .../eageraggregation/EagerAggRewriterTest.java     |   128 +
 .../doris/nereids/sqltest/JoinOrderJobTest.java    |     9 +-
 .../apache/doris/nereids/sqltest/SqlTestBase.java  |    52 +
 .../doris/nereids/stats/StatsCalculatorTest.java   |    35 +-
 .../nereids/trees/expressions/CaseWhenTest.java    |   184 +
 .../nereids/trees/expressions/ExpressionTest.java  |    17 +
 .../expressions/functions/ExpressionTraitTest.java |    86 +
 .../functions/FieldDateTimeV2WildcardTest.java     |    47 +
 .../window/TimestampTzLeadLagSignatureTest.java    |    55 +
 .../doris/nereids/trees/plans/ConstraintTest.java  |    39 +-
 .../trees/plans/CreateTableCommandTest.java        |    21 +-
 .../trees/plans/ExplainTableStreamPlanTest.java    |   276 +
 .../doris/nereids/trees/plans/PlanEqualsTest.java  |    32 +-
 .../AdminCancelRepairTableCommandTest.java         |    84 +-
 .../plans/commands/AdminCopyTabletCommandTest.java |    68 +-
 .../AdminCreateClusterSnapshotCommandTest.java     |   108 +-
 .../AdminDropClusterSnapshotCommandTest.java       |   114 +-
 .../commands/AdminRepairTableCommandTest.java      |    71 +-
 .../AdminSetAutoClusterSnapshotCommandTest.java    |   112 +-
 ...SetClusterSnapshotFeatureSwitchCommandTest.java |   104 +-
 .../AdminSetPartitionVersionCommandTest.java       |     2 +-
 .../commands/AdminSetReplicaStatusCommandTest.java |    53 +-
 .../commands/AlterColocateGroupCommandTest.java    |    47 +-
 .../commands/AlterColumnStatsCommandTest.java      |    42 +-
 .../commands/AlterComputeGroupCommandTest.java     |   160 +-
 .../commands/AlterRoutineLoadCommandTest.java      |    69 +-
 .../commands/AlterStoragePolicyCommandTest.java    |   120 +-
 .../plans/commands/AlterSystemCommandTest.java     |    65 +-
 .../plans/commands/AlterTableCommandTest.java      |    55 +-
 .../plans/commands/AlterTableStatsCommandTest.java |   104 +-
 .../trees/plans/commands/AlterUserCommandTest.java |    19 +-
 .../plans/commands/AnalyzeTableCommandTest.java    |    65 +-
 .../AuthenticationIntegrationCommandTest.java      |   198 +-
 .../trees/plans/commands/BackupCommandTest.java    |    49 +-
 .../commands/CancelAlterTableCommandTest.java      |    50 +-
 .../plans/commands/CancelBackupCommandTest.java    |    58 +-
 .../commands/CancelBuildIndexCommandTest.java      |    47 +-
 .../CancelDecommissionBackendCommandTest.java      |    56 +-
 .../plans/commands/CleanQueryStatsCommandTest.java |    52 +-
 .../commands/CreateRepositoryCommandTest.java      |     6 +-
 .../plans/commands/CreateResourceCommandTest.java  |    20 +-
 .../commands/CreateStorageVaultCommandTest.java    |    23 +-
 .../plans/commands/CreateUserCommandTest.java      |    18 +-
 .../plans/commands/DropCachedStatsCommandTest.java |   101 +-
 .../commands/DropExpiredStatsCommandTest.java      |    28 +-
 .../commands/DropMaterializedViewCommandTest.java  |    37 +-
 .../plans/commands/DropResourceCommandTest.java    |    14 +-
 .../plans/commands/DropRowPolicyCommandTest.java   |    16 +-
 .../trees/plans/commands/DropStatsCommandTest.java |   141 +-
 .../plans/commands/IcebergDeleteCommandTest.java   |    29 +
 .../plans/commands/IcebergMergeCommandTest.java    |    55 +
 .../plans/commands/IcebergUpdateCommandTest.java   |    29 +
 .../trees/plans/commands/LoadCommandTest.java      |    28 +
 .../trees/plans/commands/MysqlLoadCommandTest.java |    52 +-
 .../trees/plans/commands/RestoreCommandTest.java   |    65 +-
 .../plans/commands/ShowAlterTableCommandTest.java  |    36 +
 .../plans/commands/ShowBackendsCommandTest.java    |   143 +-
 .../plans/commands/ShowBuildIndexCommandTest.java  |    34 +
 .../commands/ShowCatalogRecycleBinCommandTest.java |    77 +-
 .../trees/plans/commands/ShowDataCommandTest.java  |   203 +-
 .../plans/commands/ShowDatabasesCommandTest.java   |    52 +-
 .../plans/commands/ShowFrontendsCommandTest.java   |   149 +-
 .../trees/plans/commands/ShowIndexCommandTest.java |     2 +-
 .../plans/commands/ShowIndexStatsCommandTest.java  |   104 +-
 .../plans/commands/ShowPartitionsCommandTest.java  |     2 +-
 .../plans/commands/ShowQueryStatsCommandTest.java  |    94 +-
 .../commands/ShowReplicaStatusCommandTest.java     |    62 +-
 .../trees/plans/commands/ShowTableCommandTest.java |    50 +-
 .../plans/commands/ShowTableStatsCommandTest.java  |   130 +-
 .../plans/commands/ShowTableStatusCommandTest.java |   118 +-
 .../plans/commands/ShowTabletIdCommandTest.java    |    57 +-
 .../commands/ShowTabletsFromTableCommandTest.java  |    86 +-
 .../plans/commands/ShowTransactionCommandTest.java |    48 +-
 .../plans/commands/SqlBlockRuleCommandTest.java    |   124 +
 .../plans/commands/StopRoutineLoadCommandTest.java |    33 +-
 .../plans/commands/TruncateTableCommandTest.java   |    44 +-
 .../plans/commands/WarmUpClusterCommandTest.java   |    60 +-
 .../commands/insert/IcebergDeleteExecutorTest.java |   175 +
 .../commands/insert/IcebergMergeExecutorTest.java  |   178 +
 .../InsertIntoTableCommandTableStreamTest.java     |   130 +
 .../trees/plans/logical/LogicalFileScanTest.java   |    67 +
 .../doris/nereids/util/HyperGraphBuilder.java      |   726 +-
 .../doris/nereids/util/HyperGraphBuilderOld.java   |   710 +
 .../apache/doris/nereids/util/PlanConstructor.java |    25 +
 .../doris/nereids/util/TypeCoercionUtilsTest.java  |    18 +
 .../apache/doris/persist/CreateTableInfoTest.java  |     8 +
 .../apache/doris/persist/LoadJobV2PersistTest.java |    77 +-
 .../persist/RefreshExternalTableInfoTest.java      |     8 +
 .../gson/GsonDerivedClassSerializationTest.java    |     4 +-
 .../gson/GsonProtobufCompatibilityTest.java        |    40 +
 .../doris/planner/FederationBackendPolicyTest.java |   114 +-
 .../apache/doris/planner/HiveTableSinkTest.java    |   124 +-
 .../doris/planner/IcebergDeleteSinkTest.java       |   116 +
 .../apache/doris/planner/IcebergMergeSinkTest.java |   121 +
 .../doris/planner/ListPartitionPrunerV2Test.java   |   163 +-
 .../planner/LocalShuffleNodeCoverageTest.java      |    17 +-
 .../org/apache/doris/planner/OlapScanNodeTest.java |    53 +-
 .../org/apache/doris/planner/PlanNodeTest.java     |     4 +-
 .../org/apache/doris/qe/AuditLogHelperTest.java    |   104 +
 .../apache/doris/qe/AuditLogWorkloadGroupTest.java |   431 +
 .../doris/qe/ConnectAttributesForwardTest.java     |   128 +
 .../org/apache/doris/qe/ConnectContextTest.java    |   443 +-
 .../org/apache/doris/qe/ConnectSchedulerTest.java  |    41 +-
 .../java/org/apache/doris/qe/CoordinatorTest.java  |   139 +
 .../org/apache/doris/qe/OlapQueryCacheTest.java    |   184 +-
 .../doris/qe/ResultReceiverConsumerTest.java       |   149 +-
 .../org/apache/doris/qe/SessionVariablesTest.java  |    59 +-
 .../java/org/apache/doris/qe/ShowExecutorTest.java |   331 +-
 .../org/apache/doris/qe/ShowResultSetTest.java     |     5 +-
 .../doris/qe/StmtExecutorInternalQueryTest.java    |    47 +-
 .../java/org/apache/doris/qe/StmtExecutorTest.java |    93 +-
 .../java/org/apache/doris/qe/VariableMgrTest.java  |    46 +
 .../apache/doris/resource/ComputeGroupTest.java    |   111 +-
 .../workloadgroup/WorkloadGroupMgrTest.java        |    85 +-
 .../WorkloadRuntimeStatusMgrTest.java              |   285 +
 .../apache/doris/rpc/BackendServiceClientTest.java |     8 +-
 .../apache/doris/service/FrontendOptionsTest.java  |    25 +-
 .../doris/service/FrontendServiceImplTest.java     |   335 +-
 .../apache/doris/statistics/AnalysisJobTest.java   |   212 +-
 .../doris/statistics/AnalysisManagerTest.java      |   177 +-
 .../doris/statistics/AnalysisTaskExecutorTest.java |   188 +-
 .../org/apache/doris/statistics/AnalyzeTest.java   |   175 +-
 .../doris/statistics/BaseAnalysisTaskTest.java     |    58 +-
 .../org/apache/doris/statistics/CacheTest.java     |   583 +-
 .../doris/statistics/FollowerColumnSenderTest.java |    75 +-
 .../doris/statistics/HMSAnalysisTaskTest.java      |   217 +-
 .../apache/doris/statistics/HistogramTaskTest.java |    83 +-
 .../org/apache/doris/statistics/HistogramTest.java |     9 +-
 .../apache/doris/statistics/MVStatisticsTest.java  |    46 +-
 .../doris/statistics/OlapAnalysisTaskTest.java     |   739 +-
 .../statistics/StatisticsAutoCollectorTest.java    |   123 +-
 .../doris/statistics/StatisticsCacheTest.java      |   110 +
 .../statistics/StatisticsJobAppenderTest.java      |   402 +-
 .../doris/statistics/TableStatsMetaTest.java       |    20 +-
 .../doris/statistics/util/StatisticsUtilTest.java  |   560 +-
 .../org/apache/doris/system/HeartbeatMgrTest.java  |   219 +-
 .../FrontendsTableValuedFunctionTest.java          |    61 +-
 .../java/org/apache/doris/task/AgentTaskTest.java  |    29 +-
 .../transaction/DatabaseTransactionMgrTest.java    |   134 +
 .../transaction/FakeTransactionIDGenerator.java    |    51 +-
 .../transaction/GlobalTransactionMgrTest.java      |    26 +-
 .../TableStreamOffsetTransactionTest.java          |   166 +
 .../java/org/apache/doris/tso/TSOServiceTest.java  |   554 +
 .../org/apache/doris/tso/TSOTimestampTest.java     |   154 +
 .../doris/utframe/DemoMultiBackendsTest.java       |     2 +-
 .../apache/doris/utframe/TestWithFeService.java    |   106 +-
 .../extension/loader/ChildFirstClassLoader.java    |    29 +
 .../loader/DirectoryPluginRuntimeManager.java      |   104 +-
 fe/fe-filesystem/ENV_TEST_README.md                |   221 +
 fe/fe-filesystem/README.md                         |   406 +
 fe/fe-filesystem/fe-filesystem-api/pom.xml         |    73 +
 .../org/apache/doris/filesystem/BlockInfo.java     |    46 +
 .../apache/doris/filesystem/DorisInputFile.java    |    75 +
 .../apache/doris/filesystem/DorisInputStream.java  |    46 +
 .../apache/doris/filesystem/DorisOutputFile.java   |    33 +
 .../org/apache/doris/filesystem/FileEntry.java     |   103 +
 .../org/apache/doris/filesystem/FileIterator.java  |    31 +
 .../org/apache/doris/filesystem/FileSystem.java    |   188 +
 .../doris/filesystem/FileSystemIOException.java    |    31 +
 .../doris/filesystem/FileSystemTransferUtil.java   |   176 +
 .../apache/doris/filesystem/FileSystemType.java    |    50 +
 .../apache/doris/filesystem/FileSystemUtil.java    |    91 +
 .../org/apache/doris/filesystem/GlobListing.java   |    72 +
 .../java/org/apache/doris/filesystem/Location.java |   140 +
 .../apache/doris/filesystem/RemoteIterator.java    |    27 +
 .../doris/filesystem/SimpleRemoteIterator.java     |    42 +
 .../org/apache/doris/filesystem/BlockInfoTest.java |    63 +
 .../org/apache/doris/filesystem/EnvTestBase.java   |   100 +
 .../org/apache/doris/filesystem/FileEntryTest.java |   101 +
 .../filesystem/FileSystemDefaultMethodsTest.java   |   223 +
 .../filesystem/FileSystemTransferUtilTest.java     |    85 +
 .../doris/filesystem/FileSystemUtilTest.java       |   133 +
 .../apache/doris/filesystem/GlobListingTest.java   |    65 +
 .../org/apache/doris/filesystem/LocationTest.java  |   143 +
 .../doris/filesystem/SimpleRemoteIteratorTest.java |    60 +
 fe/fe-filesystem/fe-filesystem-azure/pom.xml       |    99 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../doris/filesystem/azure/AzureFileSystem.java    |   954 +
 .../filesystem/azure/AzureFileSystemProvider.java  |    82 +
 .../doris/filesystem/azure/AzureObjStorage.java    |   590 +
 .../apache/doris/filesystem/azure/AzureUri.java    |   202 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../filesystem/azure/AzureFileSystemEnvTest.java   |   236 +
 .../azure/AzureFileSystemProviderTest.java         |    66 +
 .../filesystem/azure/AzureFileSystemTest.java      |   705 +
 .../azure/AzureObjStorageExtensionTest.java        |   490 +
 .../doris/filesystem/azure/AzureUriTest.java       |   180 +
 fe/fe-filesystem/fe-filesystem-broker/pom.xml      |   110 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../filesystem/broker/BrokerClientFactory.java     |   130 +
 .../doris/filesystem/broker/BrokerClientPool.java  |    96 +
 .../broker/BrokerFileSystemProvider.java           |    85 +
 .../doris/filesystem/broker/BrokerInputFile.java   |   118 +
 .../doris/filesystem/broker/BrokerInputStream.java |   186 +
 .../doris/filesystem/broker/BrokerOutputFile.java  |   122 +
 .../filesystem/broker/BrokerOutputStream.java      |   118 +
 .../filesystem/broker/BrokerSpiFileSystem.java     |   371 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../filesystem/broker/BrokerClientFactoryTest.java |    74 +
 .../filesystem/broker/BrokerClientPoolTest.java    |    52 +
 .../broker/BrokerFileSystemProviderTest.java       |   149 +
 .../filesystem/broker/BrokerInputFileTest.java     |   135 +
 .../filesystem/broker/BrokerInputStreamTest.java   |   131 +
 .../filesystem/broker/BrokerOutputFileTest.java    |   171 +
 .../filesystem/broker/BrokerOutputStreamTest.java  |   102 +
 .../broker/BrokerSpiFileSystemEnvTest.java         |   176 +
 .../filesystem/broker/BrokerSpiFileSystemTest.java |   521 +
 fe/fe-filesystem/fe-filesystem-cos/pom.xml         |    90 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../filesystem/cos/CosFileSystemProvider.java      |    72 +
 .../apache/doris/filesystem/cos/CosObjStorage.java |   222 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../doris/filesystem/cos/CosFileSystemEnvTest.java |   207 +
 .../doris/filesystem/cos/CosObjStorageTest.java    |   207 +
 fe/fe-filesystem/fe-filesystem-hdfs/pom.xml        |   104 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../doris/filesystem/hdfs/DFSFileSystem.java       |   372 +
 .../doris/filesystem/hdfs/HdfsConfigBuilder.java   |    64 +
 .../doris/filesystem/hdfs/HdfsFileIterator.java    |    73 +
 .../filesystem/hdfs/HdfsFileSystemProvider.java    |    66 +
 .../doris/filesystem/hdfs/HdfsInputFile.java       |    82 +
 .../doris/filesystem/hdfs/HdfsOutputFile.java      |    74 +
 .../filesystem/hdfs/HdfsSeekableInputStream.java   |    94 +
 .../hdfs/KerberosHadoopAuthenticator.java          |   117 +
 .../filesystem/hdfs/SimpleHadoopAuthenticator.java |    63 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../filesystem/hdfs/DFSFileSystemEnvTest.java      |   215 +
 .../doris/filesystem/hdfs/DFSFileSystemTest.java   |   482 +
 .../filesystem/hdfs/HdfsConfigBuilderTest.java     |    98 +
 .../filesystem/hdfs/HdfsFileIteratorTest.java      |   102 +
 .../hdfs/HdfsSeekableInputStreamTest.java          |   191 +
 .../hdfs/KerberosHadoopAuthenticatorEnvTest.java   |   115 +
 .../hdfs/SimpleHadoopAuthenticatorTest.java        |    70 +
 fe/fe-filesystem/fe-filesystem-local/pom.xml       |    73 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../doris/filesystem/local/LocalFileSystem.java    |   363 +
 .../filesystem/local/LocalFileSystemProvider.java  |    47 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../filesystem/local/LocalFileSystemTest.java      |   409 +
 fe/fe-filesystem/fe-filesystem-obs/pom.xml         |    90 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../filesystem/obs/ObsFileSystemProvider.java      |    72 +
 .../apache/doris/filesystem/obs/ObsObjStorage.java |   220 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../doris/filesystem/obs/ObsFileSystemEnvTest.java |   202 +
 .../doris/filesystem/obs/ObsObjStorageTest.java    |   197 +
 fe/fe-filesystem/fe-filesystem-oss/pom.xml         |    84 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../filesystem/oss/OssFileSystemProvider.java      |    72 +
 .../apache/doris/filesystem/oss/OssObjStorage.java |   227 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../doris/filesystem/oss/OssFileSystemEnvTest.java |   202 +
 .../doris/filesystem/oss/OssObjStorageTest.java    |   195 +
 fe/fe-filesystem/fe-filesystem-s3/pom.xml          |   126 +
 .../src/main/assembly/plugin-zip.xml               |    65 +
 .../apache/doris/filesystem/s3/S3FileSystem.java   |  1099 +
 .../doris/filesystem/s3/S3FileSystemProvider.java  |    63 +
 .../apache/doris/filesystem/s3/S3ObjStorage.java   |   807 +
 .../apache/doris/filesystem/s3/S3OutputStream.java |   109 +
 .../java/org/apache/doris/filesystem/s3/S3Uri.java |   103 +
 ....apache.doris.filesystem.spi.FileSystemProvider |    18 +
 .../doris/filesystem/s3/S3FileSystemEnvTest.java   |   272 +
 .../filesystem/s3/S3FileSystemProviderTest.java    |    48 +
 .../doris/filesystem/s3/S3FileSystemTest.java      |  1059 +
 .../doris/filesystem/s3/S3ObjStorageEnvTest.java   |   225 +
 .../doris/filesystem/s3/S3ObjStorageMockTest.java  |   580 +
 .../doris/filesystem/s3/S3ObjStorageTest.java      |   214 +
 .../doris/filesystem/s3/S3OutputStreamTest.java    |   276 +
 .../org/apache/doris/filesystem/s3/S3UriTest.java  |   133 +
 fe/fe-filesystem/fe-filesystem-spi/pom.xml         |    82 +
 .../doris/filesystem/spi/FileSystemProvider.java   |    78 +
 .../doris/filesystem/spi/HadoopAuthenticator.java  |    45 +
 .../apache/doris/filesystem/spi/IOCallable.java    |    32 +
 .../apache/doris/filesystem/spi/ObjFileSystem.java |   124 +
 .../apache/doris/filesystem/spi/ObjStorage.java    |   135 +
 .../apache/doris/filesystem/spi/RemoteObject.java  |    59 +
 .../apache/doris/filesystem/spi/RemoteObjects.java |    48 +
 .../apache/doris/filesystem/spi/RequestBody.java   |    47 +
 .../doris/filesystem/spi/StsCredentials.java       |    47 +
 .../doris/filesystem/spi/UploadPartResult.java     |    40 +
 .../doris/filesystem/spi/ObjFileSystemTest.java    |   354 +
 fe/fe-filesystem/pom.xml                           |    74 +
 fe/fe-foundation/pom.xml                           |    55 +-
 .../apache/doris/foundation/fs/FsStorageType.java  |    38 +
 .../util/ConcurrentLong2LongHashMap.java           |   526 +
 .../util/ConcurrentLong2ObjectHashMap.java         |   487 +
 .../apache/doris/foundation/util/UUIDUtils.java    |    53 +
 .../util/ConcurrentLong2LongHashMapTest.java       |   458 +
 .../util/ConcurrentLong2ObjectHashMapTest.java     |   432 +
 fe/fe-grpc/pom.xml                                 |   148 +
 fe/fe-thrift/pom.xml                               |    38 +-
 fe/fe-type/pom.xml                                 |    42 +-
 .../java/org/apache/doris/catalog/PatternType.java |    27 +
 .../java/org/apache/doris/catalog/ScalarType.java  |     1 +
 .../org/apache/doris/catalog/VariantField.java     |    11 +-
 .../java/org/apache/doris/catalog/VariantType.java |     2 +
 fe/hive-udf/pom.xml                                |    40 +-
 fe/pom.xml                                         |   171 +-
 .../plugin/audit/custom/AuditLoaderPlugin.java     |     2 +-
 fs_brokers/cdc_client/build.sh                     |     2 +-
 fs_brokers/cdc_client/pom.xml                      |     5 +-
 .../connection/PostgresReplicationConnection.java  |    18 +-
 .../org/apache/doris/cdcclient/common/Env.java     |    20 +-
 .../cdcclient/config/GlobalExceptionHandler.java   |    17 +
 .../cdcclient/controller/ClientController.java     |    32 +-
 .../doris/cdcclient/exception/CommonException.java |    44 +
 .../doris/cdcclient/exception/StreamException.java |    44 +
 .../cdcclient/service/PipelineCoordinator.java     |   229 +-
 .../doris/cdcclient/sink/DorisBatchStreamLoad.java |    10 +-
 .../source/reader/JdbcIncrementalSourceReader.java |    34 +-
 .../cdcclient/source/reader/SourceReader.java      |     4 +-
 .../source/reader/mysql/MySqlSourceReader.java     |   137 +-
 .../reader/postgres/PostgresSourceReader.java      |   131 +-
 .../apache/doris/cdcclient/utils/ConfigUtil.java   |    22 +-
 .../apache/doris/cdcclient/utils/SmallFileMgr.java |    93 +
 .../source/PostgresConnectionPoolFactory.java      |    58 -
 .../src/main/resources/application.properties      |     3 +-
 .../source/reader/mysql/MySqlSourceReaderTest.java |    62 +
 .../doris/cdcclient/utils/ConfigUtilTest.java      |    85 +
 .../doris/cdcclient/utils/SmallFileMgrTest.java    |   119 +
 gensrc/proto/cloud.proto                           |    17 +-
 gensrc/proto/data.proto                            |     1 +
 gensrc/proto/internal_service.proto                |    15 +-
 gensrc/proto/olap_file.proto                       |    37 +-
 gensrc/proto/segment_v2.proto                      |     1 +
 gensrc/proto/types.proto                           |     1 +
 gensrc/script/Makefile                             |     2 +-
 gensrc/script/gen_build_version.sh                 |    29 +-
 gensrc/thrift/AgentService.thrift                  |    11 +-
 gensrc/thrift/BackendService.thrift                |     2 +
 gensrc/thrift/DataSinks.thrift                     |    43 +-
 gensrc/thrift/Descriptors.thrift                   |     7 +-
 gensrc/thrift/FrontendService.thrift               |    21 +
 gensrc/thrift/MasterService.thrift                 |     4 +-
 gensrc/thrift/PaloInternalService.thrift           |    27 +-
 gensrc/thrift/PlanNodes.thrift                     |    63 +-
 gensrc/thrift/Status.thrift                        |     1 +
 gensrc/thrift/Types.thrift                         |     3 +
 post-build.sh                                      |   232 +
 regression-test/conf/regression-conf.groovy        |     4 +
 .../data/ann_index_p0/ann_const_expr_vector.out    |    21 +
 .../data/ann_index_p0/ann_index_on_mow.out         |    31 +
 .../data/ann_index_p0/ivf_index_test.out           |    12 +
 .../data/ann_index_p0/ivf_on_disk_index_test.out   |    59 +
 .../data/ann_index_p0/ivf_on_disk_stream_load.csv  |     6 +
 .../data/ann_index_p0/ivf_on_disk_stream_load.json |     8 +
 .../data/arrow_flight_sql_p0/test_select.out       |     8 +-
 .../cache/ttl/ex02_alter_illegal_combo.out         |     3 +
 .../cache/ttl/ex06_ttl_restart_consistency.out     |    12 +
 .../ttl/ex08_clear_cache_query_concurrency.out     |     6 +
 .../ttl/st04_alter_ttl_n_to_0_runtime.out          |     0
 .../ttl/st06_warmup_ttl_type_assert.out            |     0
 .../{ => cache}/ttl/st07_qcs_consistency.out       |     0
 .../ttl/st10_drop_partition_cleanup.out            |     0
 .../{ => cache}/ttl/st10_drop_table_cleanup.out    |     0
 .../compaction/test_cloud_admin_compact_table.out  |    14 +
 .../different_serialize.out}                       |     0
 .../data/compaction/test_admin_compact_table.out   |    18 +
 .../test_rf_in_list_not_erased_by_scope_range.out  |     9 +
 .../datatype_p0/decimalv2/test_decimalv2_agg.out   |    16 +
 .../one_level_nestedtypes_with_s3data.out          |   582 +-
 .../timestamptz/test_timestamptz_agg_functions.out |    13 +
 .../timestamptz/test_timestamptz_array_index.out   |    19 +
 .../timestamptz/test_timestamptz_dst_fold.out      |    17 +
 .../timestamptz/test_timestamptz_dst_gap.out       |    11 +
 .../timestamptz/test_timestamptz_max_min_by.out    |     7 +
 .../test_timestamptz_storage_agg_key.out           |     9 +
 .../sql-functions/doc_date_functions_test.out      |     2 +-
 .../data/empty_relation/eliminate_empty.out        |     8 +-
 .../es/test_es_query_predicate_correctness.out     |    59 +
 .../hive/test_hive_lzo_text_format.out             |    54 +
 .../jdbc/test_jdbc_catalog_predicate_pushdown.out  |    17 +
 .../external_table_p0/jdbc/test_jdbc_query_tvf.out |     6 +
 .../jdbc/test_mysql_jdbc_catalog.out               |    28 +-
 .../jdbc/test_oracle_jdbc_catalog.out              |    21 +-
 .../paimon/test_paimon_partition_table.out         |    38 +-
 .../0-055c1ba4-03ab-4a0e-8829-15bb1a6d2d08.txn     |   Bin 0 -> 220 bytes
 .../1-242b9a64-71b6-4ce9-bc7d-a09c7bd82089.txn     |   Bin 0 -> 105 bytes
 .../2-43117771-3274-4c35-bbf7-948403ce6510.txn     |   Bin 0 -> 105 bytes
 .../tvf/lance/multi.lance/_versions/1.manifest     |   Bin 0 -> 289 bytes
 .../tvf/lance/multi.lance/_versions/2.manifest     |   Bin 0 -> 355 bytes
 .../tvf/lance/multi.lance/_versions/3.manifest     |   Bin 0 -> 419 bytes
 .../5605bf04-7859-468c-8f08-7c95a5444617.lance     |   Bin 0 -> 815 bytes
 .../82a4ff91-1bdd-487d-a008-9c5682a1dca0.lance     |   Bin 0 -> 815 bytes
 .../ca28aa58-00ae-48cc-ac5a-dc1746d1680b.lance     |   Bin 0 -> 815 bytes
 .../0-c6b23c0d-3ce1-45af-852f-25eeddb0fa8f.txn     |   Bin 0 -> 220 bytes
 .../tvf/lance/single.lance/_versions/1.manifest    |   Bin 0 -> 289 bytes
 .../f80e031c-321c-4729-849b-e4338790114e.lance     |   Bin 0 -> 815 bytes
 .../external_table_p0/tvf/lance/test_lance_tvf.out |    40 +
 .../tvf/test_hdfs_tvf_error_uri.out                |     5 -
 .../external_table_p2/tvf/test_iceberg_meta.out    |    22 -
 .../test_group_commit_interval_ms_property.out     |     9 +-
 .../test_count_match_all_pushdown.out              |    16 +
 .../cdc/test_streaming_mysql_job_alter_cred.out    |     6 +
 .../cdc/test_streaming_mysql_job_col_filter.out    |     9 +
 .../test_streaming_mysql_job_special_offset.out    |    11 +
 ...ob_ssl.out => test_streaming_mysql_job_ssl.out} |     0
 ... => test_streaming_mysql_job_table_mapping.out} |     0
 .../test_streaming_postgres_job_publication.out    |    13 +
 .../test_streaming_postgres_job_special_offset.out |    13 +
 .../cdc/tvf/test_cdc_stream_tvf_mysql.out          |    11 +
 .../cdc/tvf/test_cdc_stream_tvf_publication.out    |     7 +
 .../tvf/test_streaming_job_cdc_stream_mysql.out    |    11 +
 .../tvf/test_streaming_job_cdc_stream_postgres.out |    11 +
 ...g_job_cdc_stream_postgres_latest_alter_cred.out |    11 +
 ...eaming_job_cdc_stream_postgres_pause_resume.out |    13 +
 ...treaming_job_cdc_stream_postgres_restart_fe.out |    12 +
 ...t => test_streaming_insert_job_file_number.out} |     0
 regression-test/data/jsonb_p0/test_jsonb_cast.csv  |     2 +-
 regression-test/data/jsonb_p0/test_jsonb_cast.out  |     6 +-
 .../data/jsonb_p0/test_jsonb_unescaped.csv         |     2 +-
 .../jsonb_p0/test_jsonb_with_unescaped_string.out  |     4 +-
 .../test_broker_load_multi_filegroup.out           |     2 +
 .../test_insert_strict_mode_and_filter_ratio.out   |   116 +
 ...st_stream_load_strict_mode_and_filter_ratio.out |    23 +
 .../load_p0/stream_load/test_tinyint_overflow.csv  |    10 +
 .../load_p2/routine_load/test_routine_load.out     |  3718 +--
 .../data/mv_p0/test_casewhen/test_casewhen.out     |     2 +-
 .../testBucketedAggSyncMV.out                      |    13 +
 .../nereids_broadcast_shuffle_join/bc-shuffle.out  |     4 +-
 .../agg_function/test_regr_sxx.out                 |    34 -
 .../agg_function/test_regr_sxy.out                 |    34 -
 .../agg_function/test_regr_syy.out                 |    34 -
 .../data/nereids_p0/aggregate/aggregate.out        |   705 -
 .../data/nereids_p0/aggregate/aggregate_count1.out |     7 -
 .../aggregate/aggregate_groupby_null.out           |     4 -
 .../aggregate/aggregate_grouping_function.out      |    43 -
 .../aggregate/aggregate_having_grouping.out        |     9 -
 .../nereids_p0/aggregate/aggregate_output_null.out |     4 -
 .../data/nereids_p0/aggregate/datetype.csv         |    16 -
 .../data/nereids_p0/aggregate/window_funnel.out    |   133 -
 regression-test/data/nereids_p0/baseall.txt        |    16 -
 .../data/nereids_p0/cache/partition_cache.out      |    71 -
 .../test_nereids_alter_database_set_quota.out      |    31 -
 .../data/nereids_p0/eager_agg/eager_agg.out        |   313 -
 .../eliminate_outer_join/eliminate_outer_join.out  |   146 -
 .../nereids_p0/empty_table/sql/avg_decimal.out     |     4 -
 .../data/nereids_p0/except/test_query_except.out   |    16 -
 .../nereids_p0/explain/test_pushdown_explain.out   |   198 -
 .../nereids_p0/group_concat/test_group_concat.out  |    65 -
 .../grouping_sets/test_grouping_sets.out           |    77 -
 .../grouping_sets/test_grouping_sets1.out          |    31 -
 .../hash_shuffle_key_prune.out                     |   848 +
 .../data/nereids_p0/hint/test_leading.out          |  2818 --
 .../nereids_p0/insert_into_table/insert_cte.out    |    32 -
 .../data/nereids_p0/intersect/test_intersect.out   |     6 -
 .../data/nereids_p0/join/bucket_shuffle_join.out   |     5 -
 .../agg_output_as_right_tale_left_outer_order.out  |    14 -
 .../nereids_p0/join/sql/bucket_shuffle_join.out    |    11 -
 .../data/nereids_p0/join/sql/full_join.out         |    14 -
 .../data/nereids_p0/join/sql/issue_12689.out       |     3 -
 .../data/nereids_p0/join/sql/issue_7288.out        |    10 -
 .../data/nereids_p0/join/sql/test_outer_join.out   |    21 -
 .../sql/test_outer_join_with_delete_column.out     |    39 -
 .../data/nereids_p0/join/test_bitmap_filter.out    |    93 -
 regression-test/data/nereids_p0/join/test_join.out |  1204 -
 .../data/nereids_p0/join/test_join2.out            |   135 -
 .../data/nereids_p0/join/test_join3.out            |    29 -
 .../data/nereids_p0/join/test_join4.out            |    58 -
 .../data/nereids_p0/join/test_join5.out            |    26 -
 .../data/nereids_p0/join/test_left_join1.out       |     7 -
 .../data/nereids_p0/join/test_left_join_null.out   |     4 -
 .../nereids_p0/join/test_nestedloop_outer_join.out |    89 -
 .../join/test_nestedloop_semi_anti_join.out        |    50 -
 .../join/test_runtimefilter_on_datev2.out          |   378 -
 .../data/nereids_p0/keyword/order_group.out        |  1449 -
 .../data/nereids_p0/keyword/test_keyword.out       |   663 -
 .../large_wide_table/large_wide_table.out          |   103 -
 .../nereids_p0/lateral_view/test_issue_11986.out   |     5 -
 .../nereids_p0/lateral_view/test_issue_8850.out    |    23 -
 .../nereids_p0/limit/sql/predicateNotProjected.out |     6 -
 .../limit/sql/useRestrictiveLimitFromSubq.out      |     4 -
 .../data/nereids_p0/limit/sql/withGroupBy.out      |     5 -
 .../limit/sql/withGroupByAndOrderByInSubq.out      |     5 -
 .../nereids_p0/limit/sql/withGroupByInSubq.out     |     4 -
 .../data/nereids_p0/limit/sql/withJoinInSubq.out   |     4 -
 .../data/nereids_p0/limit/sql/withLimitZero.out    |     4 -
 .../data/nereids_p0/limit/sql/withOrderBy.out      |    13 -
 .../data/nereids_p0/limit/sql/withSimpleLimit.out  |     8 -
 .../data/nereids_p0/limit/sql/withSubq.out         |     4 -
 .../operator/test_arithmetic_operators.out         |   302 -
 .../nereids_p0/operator/test_logical_operators.out |   388 -
 .../data/nereids_p0/runtime_filter/check_rf.out    |    17 -
 .../runtime_filter/cte-runtime-filter.out          |    35 -
 .../nereids_p0/runtime_filter/runtime_filter.out   |    19 -
 .../select_no_from/sql/projectAggFuncs.out         |     7 -
 .../select_no_from/sql/projectConstants.out        |     4 -
 .../select_no_from/sql/projectFunctions.out        |     4 -
 .../select_no_from/sql/withGroupOrderHaving.out    |    10 -
 .../nereids_p0/select_no_from/sql/withUnionAll.out |     7 -
 .../select_no_from/sql/withWhereClause.out         |     7 -
 .../select_no_from/sql/withWhereFalse.out          |     7 -
 .../data/nereids_p0/set_operations/except.out      |   148 -
 .../set_operations/sql/except_1_order.out          |     6 -
 .../set_operations/sql/except_2_order.out          |     6 -
 .../set_operations/sql/except_3_order.out          |     8 -
 .../set_operations/sql/intersect_1_order.out       |     9 -
 .../set_operations/sql/intersect_2_order.out       |    10 -
 .../data/nereids_p0/show/test_show_create_view.out |     7 -
 .../data/nereids_p0/show/test_show_where.out       |    63 -
 regression-test/data/nereids_p0/sort/sort.out      |  3139 --
 .../test_aggregate_all_functions.out               |   276 -
 .../aggregate_functions/test_aggregate_bit.out     |    40 -
 .../aggregate_functions/test_aggregate_collect.out |    18 -
 .../test_aggregate_histogram.out                   |    14 -
 .../test_aggregate_retention.out                   |    59 -
 .../test_aggregate_sequence_match.out              |   115 -
 .../test_aggregate_window_functions.out            |   822 -
 .../test_approx_count_distinct.out                 |     7 -
 .../sql_functions/array_functions/sql/q01.out      |    37 -
 .../sql_functions/array_functions/sql/q02.out      |    49 -
 .../sql_functions/array_functions/sql/q03.out      |    15 -
 .../sql_functions/array_functions/sql/q04.out      |   118 -
 .../test_array_aggregation_functions.out           |    31 -
 .../array_functions/test_array_functions.out       |   591 -
 .../test_array_functions_by_literal.out            |   436 -
 .../test_array_functions_of_array_difference.out   |    10 -
 .../test_array_functions_with_where.out            |    35 -
 .../array_functions/test_issue_13606.out           |    11 -
 .../bitmap_functions/test_bitmap_function.out      |   465 -
 .../bitmap_functions/test_btimap_count.out         |    19 -
 .../case_function/test_case_function.out           |    41 -
 .../cast_function/test_cast_array_function.out     |    24 -
 .../test_cast_array_functions_by_literal.out       |    22 -
 .../cast_function/test_cast_function.out           |    40 -
 .../cast_function/test_cast_string_to_array.out    |    28 -
 .../conditional_functions/datetype.csv             |    16 -
 .../conditional_functions/test_coalesce.out        |   815 -
 .../test_conditional_function.out                  |   400 -
 .../conditional_functions/test_if.out              |    19 -
 .../conditional_functions/test_nullif.out          |   572 -
 .../conditional_functions/test_nvl.out             |     6 -
 .../conditional_functions/test_query_between.out   |    41 -
 .../conditional_functions/test_query_in.out        |   108 -
 .../conditional_functions/test_query_like.out      |    97 -
 .../conditional_functions/test_query_limit.out     |    37 -
 .../conditional_functions/test_query_where.out     |   136 -
 .../convertion_functions/sql/castAccessible.out    |     4 -
 .../datetime_functions/test_date_function.out      |   884 -
 .../datetime_functions/test_date_function_v2.out   |   222 -
 .../datetime_functions/test_dayofweek.out          |    19 -
 .../datetime_functions/test_time_lut.out           | 30601 -------------------
 .../datetime_functions/test_timestampdiff.out      |    13 -
 .../digital-masking/test_digital_masking.out       |     4 -
 .../encryption_digest/test_encryption_function.out |    99 -
 .../hash_functions/test_hash_function.out          |    36 -
 .../sql/dateTimeOperatorsAccessible.out            |    10 -
 .../horology_functions/sql/extractAccessible.out   |    10 -
 .../json_function/test_query_json_array.out        |     8 -
 .../json_function/test_query_json_insert.out       |    13 -
 .../json_function/test_query_json_object.out       |    22 -
 .../json_function/test_query_json_replace.out      |    13 -
 .../json_function/test_query_json_set.out          |    12 -
 .../json_functions/test_json_function.out          |    64 -
 .../sql_functions/math_functions/test_conv.out     |    25 -
 .../sql_functions/math_functions/test_multiply.out |     9 -
 .../sql_functions/math_functions/test_round.out    |    40 -
 .../math_functions/test_running_difference.out     |    50 -
 .../test_multi_string_position.out                 |    25 -
 .../search_functions/test_multi_string_search.out  |    67 -
 .../spatial_functions/test_gis_function.out        |  1142 -
 .../spatial_functions/test_st_astext.out           |     4 -
 .../sql/likeOperatorWorks_order.out                |     6 -
 .../string_functions/test_reverse.out              |     9 -
 .../string_functions/test_split_part.out           |     5 -
 .../string_functions/test_string_function.out      |   581 -
 .../string_functions/test_string_function_like.out |   130 -
 .../test_string_function_like_pushdown.out         |   159 -
 .../test_string_function_regexp.out                |    66 -
 .../sql_functions/table_function/explode.out       |    31 -
 .../table_function/explode_json_array.out          |    77 -
 .../sql_functions/table_function/explode_split.out |    33 -
 .../data/nereids_p0/sql_functions/test_in_expr.out |    58 -
 .../test_width_bucket_function.out                 |    95 -
 .../window_functions/sf0.01/nation.csv             |    25 -
 .../window_functions/sf0.01/region.csv             |     5 -
 .../sql_functions/window_functions/sql/leadLag.out |    35 -
 .../sql/noOrderAllRowsPeers_order.out              |    35 -
 .../window_functions/sql/rangeCurrent.out          |    28 -
 .../window_functions/sql/rangeCurrent_order.out    |    28 -
 .../sql/rangeNoPartition_order.out                 |    35 -
 .../window_functions/sql/rangeUnbounded.out        |    28 -
 .../window_functions/sql/rangeUnbounded_order.out  |    28 -
 .../window_functions/sql/rowsDifferentOrders.out   |    35 -
 .../window_functions/sql/rowsDisjointWindows.out   |    35 -
 .../window_functions/sql/rowsFirstLast.out         |    35 -
 .../window_functions/sql/rowsFrame2F3F.out         |    35 -
 .../window_functions/sql/rowsFrame2FUBF.out        |    35 -
 .../window_functions/sql/rowsFrame3P2P.out         |    35 -
 .../window_functions/sql/rowsFrameUBP2P.out        |    35 -
 .../window_functions/sql/rowsIdenticalWindows.out  |    35 -
 .../sql/rowsIntersectingWindows.out                |    35 -
 .../window_functions/sql/rowsUBPImplicitCR.out     |    35 -
 .../window_functions/sql/rowsUnbounded_order.out   |    28 -
 .../sql/windowSpecificationAAcpA.out               |    37 -
 .../sql/windowSpecificationABA.out                 |    37 -
 .../sql/windowSpecificationABcpA.out               |    37 -
 .../sql_functions/window_functions/tenk.data       | 10000 ------
 .../window_functions/test_ntile_function.csv       |     9 -
 .../window_functions/test_ntile_function.out       |    45 -
 .../test_select_stddev_variance_window.out         |  1021 -
 .../test_stddev_variance_window.csv                |    15 -
 .../sql_functions/window_functions/test_sum.out    |     6 -
 .../window_functions/test_window_fn.out            |   661 -
 .../window_functions/test_window_function.out      |   670 -
 .../window_functions/window_functions.out          |   112 -
 .../data/nereids_p0/subquery/test_subquery.out     |    42 -
 .../nereids_p0/system/test_query_sys_data_type.out |    14 -
 .../nereids_p0/system/test_query_sys_tables.out    |    43 -
 .../data/nereids_p0/system/test_runtime_filter.out |     3 -
 .../data/nereids_p0/test_char_implicit_cast.out    |    19 -
 .../data/nereids_p0/test_data_type_marks.out       |     8 -
 .../data/nereids_p0/test_dict_with_null.out        |   112 -
 .../data/nereids_p0/test_orderby_nullliteral.out   |     5 -
 .../data/nereids_p0/test_select_constant.out       |     7 -
 .../nereids_p0/test_select_with_predicate_like.out |    21 -
 .../type_inference/test_binary_predicate_cast.out  |     7 -
 .../nereids_p0/type_inference/test_largeint.out    |     4 -
 .../data/nereids_p0/union/test_union.out           |   372 -
 .../data/nereids_p0/wide_table/sql/wide_table.out  |    13 -
 regression-test/data/nereids_p0/with/test_with.out |    37 -
 .../with/test_with_and_two_phase_agg.out           |     7 -
 .../nereids_rules_p0/agg_strategy/agg_strategy.out |   156 +-
 .../distinct_agg_strategy_selector.out             |    41 -
 .../agg_strategy/test_variables.out                |    24 -
 .../nested_container_offset_pruning.out            |     7 +
 .../string_length_column_pruning.out               |    58 +
 .../constant_propagation/constant_propagation.out  |    12 +-
 .../count_null_not_count_star.out                  |    38 +
 .../lazy_materialize_topn.out                      |     6 +
 .../distinct_split/disitinct_split.out             |    75 +-
 .../filter_push_down/push_filter_through.out       |     8 +-
 .../mv/join_elim_p_f_key/join_elim_filter_edge.out |     5 +
 .../simplify_conditional_function.out              |     6 +
 ..._filter_above_consumer_with_unique_function.out |    24 +
 ...ilter_through_generate_with_unique_function.out |    26 +
 .../data/nereids_syntax_p0/constraint.out          |     4 +-
 .../data/opensky_p2/sql/avgDistance.out            |     2 +-
 regression-test/data/opensky_p2/sql/count.out      |     2 +-
 .../data/opensky_p2/sql/mostBusyOrigin.out         |    18 +-
 .../data/opensky_p2/sql/totalDistance.out          |     2 +-
 .../data/point_query_p0/test_point_query.out       |    14 +
 .../data/pythonudaf_p0/test_pythonudaf_drop.out    |     6 +
 .../test_pythonudaf_forbidden_module.out           |     4 +
 .../data/pythonudaf_p0/test_pythonudaf_inline.out  |    26 +
 .../test_pythonudaf_pkg_isolation.out              |    13 +
 .../data/pythonudf_p0/test_pythonudf_drop.out      |     6 +
 .../test_pythonudf_forbidden_module.out            |     4 +
 .../pythonudf_p0/test_pythonudf_inline_scalar.out  |     9 +
 .../pythonudf_p0/test_pythonudf_pkg_isolation.out  |    13 +
 .../pythonudtf_p0/test_pythonudtf_basic_inline.out |     4 +
 .../data/pythonudtf_p0/test_pythonudtf_drop.out    |     8 +
 .../test_pythonudtf_forbidden_module.out           |     6 +
 .../test_pythonudtf_pkg_isolation.out              |    17 +
 .../adaptive_batch_size/adaptive_batch_size.out    |    73 +
 .../aggregate/agg_group_concat.out                 |     0
 .../aggregate/agg_nullable.out                     |     0
 .../aggregate/agg_nullable_2.out                   |     0
 .../aggregate/agg_window_project.out               |     0
 .../aggregate/agg_with_distinct_project.out        |     0
 .../data/query_p0/aggregate/aggregate.out          |    60 +-
 .../data/query_p0/aggregate/aggregate_count1.out   |     3 +
 .../query_p0/aggregate/aggregate_function_kurt.out |     6 +-
 .../query_p0/aggregate/aggregate_function_skew.out |     6 +-
 .../aggregate/aggregate_groupby_simplify.out       |     0
 .../aggregate/aggregate_stddev_over_range.out      |     0
 .../data/query_p0/aggregate/map_agg.out            |     6 +-
 .../data/query_p0/aggregate/map_agg_v1.out         |     6 +-
 .../aggregate/select_random_distributed_tbl.out    |   128 +-
 .../aggregate/support_type/any_value/any_value.out |     2 +-
 .../query_p0/aggregate/support_type/avg/avg.out    |    10 +-
 .../query_p0/aggregate/support_type/corr/corr.out  |     4 +-
 .../support_type/corr_welford/corr_welford.out     |     4 +-
 .../aggregate/support_type/covar/covar.out         |     6 +-
 .../support_type/covar_samp/covar_samp.out         |     8 +-
 .../support_type/percentile/percentile.out         |    10 +-
 .../percentile_ap/percentile_approx.out            |    12 +-
 .../percentile_ap_w/percentile_approx_weighted.out |     2 +-
 .../support_type/regr_intercept/regr_intercept.out |     8 +-
 .../support_type/regr_slope/regr_slope.out         |     8 +-
 .../data/query_p0/aggregate/test_regr_avgx.out     |    63 +
 .../data/query_p0/aggregate/test_regr_avgy.out     |    63 +
 .../data/query_p0/aggregate/test_regr_count.out    |    63 +
 .../query_p0/aggregate/test_regr_intercept.out     |    57 +-
 .../data/query_p0/aggregate/test_regr_r2.out       |    65 +
 .../data/query_p0/aggregate/test_regr_slope.out    |    49 +-
 .../data/query_p0/aggregate/test_regr_sxx.out      |    49 +
 .../data/query_p0/aggregate/test_regr_sxy.out      |    49 +
 .../data/query_p0/aggregate/test_regr_syy.out      |    49 +
 .../data/query_p0/aggregate/window_funnel.out      |   133 +
 .../data/query_p0/aggregate/window_funnel_v2.out   |   144 +
 .../cache/test_partition_instance_query_cache.out  |     1 +
 .../colocate/test_multi_cast_colocate.out          |     0
 .../colocate/test_set_operation_colocate.out       |     0
 .../compress_materialize/compress_materialize.out  |     0
 .../compress_materialize/pushdown_encode.out       |     0
 .../create_table/test_create_blocked.out           |     0
 .../create_table/test_create_table.out             |     0
 .../create_table/test_ctas.out                     |     0
 .../data/{nereids_p0 => query_p0}/cte/cte.out      |     0
 .../cte/test_cte_filter_pushdown.out               |     0
 .../cte/test_cte_multicast_complex.out             |     0
 .../cte/test_cte_name_reuse.out                    |     0
 .../datatype/test_cast.out                         |     0
 .../datatype/test_date_acquire.out                 |     0
 .../datatype/test_datev1.out                       |     0
 .../datatype/test_decimalv2.out                    |     0
 .../{nereids_p0 => query_p0}/datatype/test_map.out |     0
 .../alter/test_nereids_alter_database_rename.out   |     0
 .../test_nereids_alter_database_set_quota.out      |    30 +
 .../ddl/describe/describe_command.out              |     0
 .../ddl/recover/test_recover_all.out               |     0
 .../ddl/recover/test_recover_db.out                |     0
 .../set_and_unset_variable_command.out             |     0
 .../ddl/show_authors/show_authors.out              |     0
 .../ddl/show_variables/show_variables_command.out  |     0
 .../ddl/show_view/show_view_command.out            |     0
 .../ddl/test_truncate_table_nereids.out            |     0
 .../ddl/use/use_command_nereids.out                |     0
 .../{nereids_p0 => query_p0}/delete/delete_cte.out |     0
 .../delete/delete_cte_ck.out                       |     0
 .../delete/delete_mow_partial_update.out           |     0
 .../delete/delete_using.out                        |     0
 .../delete/partial_update_delete.csv               |     0
 .../dist_expr_list/dist_expr_list.out              |     0
 .../data/query_p0/eager_agg/eager_agg.out          |   386 +
 .../eliminate_outer_join/eliminate_outer_join.out  |   146 +
 .../test_eliminate_outer_join.out                  |     0
 .../query_p0/explain/test_pushdown_explain.out     |   194 +
 .../explain/test_scan_preaggregation_explain.out   |     0
 .../fold_constant/fe_constant_cast_to_date.out     |     0
 .../fold_constant/fe_constant_cast_to_datetime.out |     0
 .../fe_constant_cast_to_fractional.out             |     0
 .../fold_constant/fe_constant_cast_to_int.out      |     0
 .../expression/fold_constant/fe_try_cast.out       |     0
 .../fold_constant/fold_constant_by_be.out          |     0
 .../fold_constant/fold_constant_by_fe.out          |     0
 .../fold_constant_string_arithmatic.out            |     0
 .../expression/fold_constant/json_constant.out     |     0
 .../expression/test_default_expr.out               |     0
 .../expression/topn_to_max.out                     |     0
 .../query_p0/group_concat/test_group_concat.out    |     4 +
 .../query_p0/grouping_sets/test_grouping_sets.out  |    50 +-
 .../{nereids_p0 => query_p0}/hint/fix_leading.out  |     0
 .../hint/multi_leading.out                         |     0
 .../data/{nereids_p0 => query_p0}/hint/t1.csv      |     0
 .../data/{nereids_p0 => query_p0}/hint/t2.csv      |     0
 .../data/{nereids_p0 => query_p0}/hint/t3.csv      |     0
 .../data/{nereids_p0 => query_p0}/hint/t4.csv      |     0
 .../data/{nereids_p0 => query_p0}/hint/t5.csv      |     0
 .../data/{nereids_p0 => query_p0}/hint/t6.csv      |     0
 .../hint/test_distribute.out                       |     0
 .../{nereids_p0 => query_p0}/hint/test_hint.out    |     0
 .../data/query_p0/hint/test_leading.out            |  2818 ++
 .../huge_compound/huge_compound.out                |     0
 .../insert_into_table/aggregate.out                |     0
 .../insert_into_table/complex_insert.out           |     0
 .../insert_into_table/duplicate.out                |     0
 .../data/query_p0/insert_into_table/insert_cte.out |    33 +
 .../insert_into_table/insert_values.out            |     0
 .../insert_into_table/nereids_insert_random.out    |     0
 .../insert_into_table/no_partition.out             |     0
 .../insert_into_table/partial_update.out           |     0
 .../insert_into_table/partial_update_complex.out   |     0
 .../insert_into_table/partial_update_seq_col.out   |     0
 .../insert_into_table/src.dat                      |     0
 .../insert_into_table/type_cast_aggregate.out      |     0
 .../insert_into_table/type_cast_duplicate.out      |     0
 .../insert_into_table/type_cast_unique.out         |     0
 .../insert_into_table/unique.out                   |     0
 .../update_on_current_timestamp.out                |     0
 .../javaudf/collect/test_javaudf_groupcount.out    |     0
 .../javaudf/collect/test_javaudf_murmurhash3.out   |     0
 .../javaudf/collect/test_javaudf_sessionize.out    |     0
 .../javaudf/date/test_javaudf_adddays.out          |     0
 .../javaudf/date/test_javaudf_addisoperioud.out    |     0
 .../javaudf/date/test_javaudf_daydiff.out          |     0
 .../json/test_javaudf_convertfromcamelcase.out     |     0
 .../json/test_javaudf_converttocamelcase.out       |     0
 .../javaudf/sanity/test_javaudf_assertequal.out    |     0
 .../javaudf/sanity/test_javaudf_assertlessthan.out |     0
 .../javaudf/sanity/test_javaudf_assertudf.out      |     0
 .../javaudf/sketch/test_javaudf_md5.out            |     0
 .../javaudf/test_javaudaf_my_date_datetime.out     |     0
 .../javaudf/test_javaudaf_mygroupconcat_string.out |     0
 .../javaudf/test_javaudaf_mysum_array.out          |     0
 .../javaudf/test_javaudaf_mysum_decimal.out        |     0
 .../javaudf/test_javaudaf_mysum_double.out         |     0
 .../javaudf/test_javaudaf_mysum_float_double.out   |     0
 .../javaudf/test_javaudaf_mysum_int.out            |     0
 .../javaudf/test_javaudaf_null_test.out            |     0
 .../javaudf/test_javaudf_array.out                 |     0
 .../javaudf/test_javaudf_boolean.out               |     0
 .../javaudf/test_javaudf_case.out                  |     0
 .../javaudf/test_javaudf_date.out                  |     0
 .../javaudf/test_javaudf_decimal.out               |     0
 .../javaudf/test_javaudf_float.out                 |     0
 .../javaudf/test_javaudf_int.out                   |     0
 .../javaudf/test_javaudf_ip.out                    |     0
 .../javaudf/test_javaudf_null.out                  |     0
 .../javaudf/test_javaudf_string.out                |     0
 .../join/asof/test_asof_join.out                   |     0
 .../join/asof/test_asof_join_build_expr_edge.out   |     0
 .../join/asof/test_asof_join_explicit.out          |     0
 .../join/asof/test_asof_join_expr.out              |     0
 .../join/asof/test_asof_join_large_bucket.out      |     0
 .../join/initial_join_order/initial_join_order.out |     0
 .../invalid_stats/invalid_stats_join_order.out     |     0
 .../join/outer_join_with_empty_node.out            |     0
 .../data/query_p0/join/rqg/rqg12257/rqg12257.out   |     2 -
 .../data/query_p0/join/sql/bucket_shuffle_join.out |     5 +
 regression-test/data/query_p0/join/test_join.out   |   392 +-
 .../{nereids_p0 => query_p0}/join/test_join_11.out |     0
 .../{nereids_p0 => query_p0}/join/test_join_12.out |     0
 .../{nereids_p0 => query_p0}/join/test_join_13.out |     0
 .../{nereids_p0 => query_p0}/join/test_join_14.out |     0
 .../{nereids_p0 => query_p0}/join/test_join_15.out |     0
 .../join/test_join_local_shuffle.out               |     0
 .../{nereids_p0 => query_p0}/join/test_join_on.out |     0
 .../data/query_p0/join/test_join_with_const.out    |     3 +-
 .../join/test_limit_join.out                       |     0
 .../join/test_mark_join.out                        |     0
 .../test_multilevel_join_agg_local_shuffle.out     |     0
 .../join/test_outer_join.out                       |     0
 .../query_p0/join/test_runtimefilter_on_datev2.out |    14 +
 .../join/test_runtimefilter_on_decimal.out         |     0
 .../test_clone_legacy_nullable_from_nereids.out    |     0
 .../limit/filterLimitProject.out                   |     0
 .../query_p0/limit/test_general_limit_pushdown.out |   131 +
 .../data/query_p0/limit/test_group_by_limit.out    |    18 +-
 .../query_p0/limit/test_unified_limit_pushdown.out |    43 +
 .../multi_distinct/multi_distinct_window.out       |     0
 .../operator/test_arithmetic_operators.out         |   190 +
 .../outfile/agg_state/test_outfile_agg_state.out   |     0
 .../agg_state_array/test_outfile_agg_array.out     |     0
 .../test_outfile_agg_state_bitmap.out              |     0
 .../outfile/hll/test_outfile_hll.out               |     0
 .../quantile_state/test_outfile_quantile_state.out |     0
 .../outfile/test_outfile.out                       |     0
 .../outfile/test_outfile_csv_with_names.out        |     0
 .../outfile/test_outfile_exception.out             |     0
 .../outfile/test_outfile_expr.out                  |     0
 .../outfile/test_outfile_parquet.out               |     0
 .../outfile/test_outfile_separator.out             |     0
 .../partition_topn/check_orderkey.out              |     0
 .../test_physical_translator.out                   |     0
 .../repeat/test_repeat_output_slot.out             |     0
 .../data/query_p0/runtime_filter/check_rf.out      |    17 +
 .../query_p0/runtime_filter/cte-runtime-filter.out |    35 +
 .../runtime_filter/expr-target.out                 |     0
 .../query_p0/runtime_filter/runtime_filter.out     |    19 +
 .../runtime_filter/set_operator_in_filter.out      |    23 +
 .../data/query_p0/runtimefilterV2/rfv2.out         |    20 +-
 .../test_stream_consumption_schema.out             |    13 +
 .../schema_table/test_stream_info_schema.out       |     6 +
 .../select_no_from/sql/projectAggFuncs.out         |     5 +-
 .../select_no_from/sql/projectFunctions.out        |     2 +-
 .../select_no_from/sql/withGroupOrderHaving.out    |     7 +-
 .../select_no_from/sql/withWhereClause.out         |     3 -
 .../query_p0/select_no_from/sql/withWhereFalse.out |     3 -
 .../select_tablets/select_with_tablets.out         |     0
 .../session_variable/test_default_limit.out        |     0
 .../session_variable/test_variable_between.out     |     0
 .../data/query_p0/set/test_user_var.out            |     3 +
 .../data/query_p0/set_operations/except.out        |   148 +
 .../set_operations/set_operation_exprid_reuse.out  |    44 +
 .../sql/intersect_nullable_not_nullable.out        |     6 -
 .../set_operations/test_pullup_predicate_null.out  |    32 +
 .../show/test_show_charset_command.out             |     0
 .../show/test_show_collation.out                   |     0
 .../show/test_show_columns_command.out             |     0
 .../show/test_show_commands_nereids.out            |     0
 .../show/test_show_create_catalog.out              |     0
 .../show/test_show_create_db_nereids.out           |     0
 .../data/query_p0/show/test_show_create_table.out  |     5 +-
 .../data/query_p0/show/test_show_create_view.out   |     7 +
 .../show/test_show_data_types.out                  |     0
 .../show/test_show_status_command.out              |     0
 .../show/test_show_warning_errors_command.out      |     0
 .../test_aggregate_all_functions.out               |   155 +-
 .../test_aggregate_all_functions2.out              |    38 +-
 .../test_aggregate_percentile_approx_weighted.out  |     0
 .../test_aggregate_percentile_no_cast.out          |     0
 .../test_aggregate_window_functions.out            |   822 +
 .../test_approx_count_distinct.out                 |     3 -
 .../sql_functions/array_functions/array_filter.csv |     0
 .../test_array_aggregation_functions.out           |    18 +-
 .../array_functions/test_array_contains_all.out    |     0
 .../test_array_distance_functions.out              |     6 +-
 .../array_functions/test_array_filter.out          |     0
 .../array_functions/test_array_with_scale_type.out |     2 +-
 .../bitmap_functions/test_bitmap_function.out      |    21 +
 .../case_function/test_case_function_null.out      |     4 +-
 .../cast_function/test_cast_function.out           |    15 +
 .../test_conditional_function.out                  |    15 +-
 .../conditional_functions/test_if.out              |    21 +-
 .../conditional_functions/test_if_cast.out         |    18 -
 .../conditional_functions/test_query_in.out        |    25 +-
 .../conditional_functions/test_query_like.out      |    12 +-
 .../conditional_functions/test_query_limit.out     |    67 +-
 .../conditional_functions/test_query_where.out     |    10 +-
 .../datetime_functions/test_add_sub_union_type.out |     0
 .../datetime_functions/test_date_function.out      |   285 +-
 .../datetime_functions/test_date_function_v2.out   |   224 +
 .../test_date_or_datetime_computation_negative.out |     0
 .../datetime_functions/test_time_lut.out           | 25200 +++++++++++++++
 .../encryption_digest/test_encryption_function.out |    41 +
 .../sql_functions/encryption_digest/test_md5.out   |     0
 .../hash_functions/test_hash_function.out          |    71 +
 .../hll_functions/test_hll_functions.out           |     5 +
 .../ip_functions/test_ipv4_to_ipv6_function.out    |     2 +
 .../test_ipv6_num_to_string_function.out           |     2 +
 .../ip_functions/test_is_ip_string_functions.out   |     3 +-
 .../ip_functions/test_to_ip_functions.out          |     2 +
 .../json_function/test_query_json_object.out       |    14 +
 .../sql_functions/math_functions/test_abs.out      |     0
 .../sql_functions/math_functions/test_conv.out     |    21 +
 .../math_functions/test_function_truncate.out      |    44 +-
 .../math_functions/test_least_greatest.out         |    12 +-
 .../test_math_unary_always_nullable.out            |    58 +-
 .../sql_functions/math_functions/test_multiply.out |     6 +-
 .../math_functions/test_normal_cdf.out             |    14 +-
 .../sql_functions/math_functions/test_round.out    |   255 +-
 .../math_functions/test_round_overflow.out         |     0
 .../sql_functions/math_functions/test_triangle.out |    66 +-
 .../spatial_functions/test_gis_function.out        |   831 +-
 .../string_functions/sql/analytic_query.out        |    20 +-
 .../sql_functions/string_functions/test_concat.out |     0
 .../string_functions/test_is_valid_utf8.out        |    60 +
 .../string_functions/test_money_format.out         |     2 +-
 .../string_functions/test_months_between.out       |   240 +-
 .../string_functions/test_split_by_string.out      |     0
 .../string_functions/test_string_function.out      |   227 +-
 .../string_functions/test_string_function_like.out |     4 +
 .../test_string_function_regexp.out                |    24 +-
 .../table_function/explode_array_decimal.out       |     3 -
 .../table_function/explode_json_array.out          |    96 +-
 .../sql_functions/table_function/explode_map.out   |     0
 .../sql_functions/table_function/explode_split.out |     6 +
 .../sql_functions/table_function/json_each.out     |   174 +
 .../sql_functions/table_function/posexplode.out    |     0
 .../sql_functions/test_arith_functions.out         |     0
 .../data/query_p0/sql_functions/test_in_expr.out   |     3 +
 .../test_width_bucket_function.out                 |    24 +-
 .../sql_functions/window_functions/sql/leadLag.out |    26 +-
 .../sql/noOrderAllRowsPeers_order.out              |    18 +-
 .../sql/rangeNoPartition_order.out                 |    18 +-
 .../window_functions/sql/rowsDifferentOrders.out   |    20 +-
 .../window_functions/sql/rowsDisjointWindows.out   |    64 +-
 .../window_functions/sql/rowsFrame2F3F.out         |    64 +-
 .../window_functions/sql/rowsFrame2FUBF.out        |    64 +-
 .../window_functions/sql/rowsFrame3P2P.out         |    64 +-
 .../window_functions/sql/rowsFrameUBP2P.out        |    64 +-
 .../window_functions/sql/rowsIdenticalWindows.out  |    64 +-
 .../sql/rowsIntersectingWindows.out                |    64 +-
 .../window_functions/sql/rowsUBPImplicitCR.out     |    64 +-
 .../sql/windowSpecificationAAcpA.out               |    68 +-
 .../sql/windowSpecificationABA.out                 |    68 +-
 .../sql/windowSpecificationABcpA.out               |    68 +-
 .../window_functions/test_count_star.out           |     0
 .../test_select_stddev_variance_window.out         |  1522 +-
 .../window_functions/test_window_fn.out            |   134 +-
 .../window_functions/test_window_function.out      |    40 +-
 .../stats/col_stats/hot_value_str_to_date.out      |     0
 .../stats/invalid_stats.out                        |     0
 .../stats/invalid_stats/invalid_stats.out          |     0
 .../subquery/correlated_scalar_subquery.out        |     0
 .../subquery/subquery_unnesting.out                |     0
 .../subquery/test_inlineview_with_project.out      |     0
 .../data/query_p0/subquery/test_subquery.out       |    33 +-
 .../subquery/test_subquery_in_project.out          |     0
 .../subquery/test_subquery_in_simple_case.out      |    36 +
 .../query_p0/system/test_query_sys_rowsets.out     |     1 +
 .../system/test_query_sys_scan_rowsets.out         |     1 +
 .../data/query_p0/system/test_table_properties.out |    33 +-
 .../test_alter_catalog_comment_command.out         |     0
 .../test_alter_catalog_properties_command.out      |     0
 .../test_alter_catalog_rename_command.out          |     0
 .../data/query_p0/test_char_implicit_cast.out      |     3 +
 .../test_create_catalog_command.out                |     0
 .../test_cte_subquery_many.out                     |     0
 .../test_delete_sign_mow.out                       |     0
 .../test_drop_catalog_command.out                  |     0
 .../test_filter_pushdown_set.out                   |     0
 .../test_nereids_encrypt_test.out                  |     0
 .../test_nestloop_join_nullable.out                |     0
 .../{nereids_p0 => query_p0}/test_user_var.out     |     0
 .../query_p0/topn_lazy/lazy_materialize_view.out   |    13 +
 .../topNLazyMaterializationUsingIndex.out          |     4 +-
 .../test_string_literal_vs_other_literal.out       |     0
 .../union/or_expansion.out                         |     0
 regression-test/data/query_p0/union/test_union.out |     8 +-
 .../data/query_p0/union/test_union_decimal_agg.out |     2 +-
 .../update/update_after_create_rollup.out          |     0
 .../{nereids_p0 => query_p0}/update/update_cte.out |     0
 .../update/update_unique_table.out                 |     0
 .../variables_persist/test_alias_function.out      |     0
 .../variables_persist/test_array_agg_view.out      |     0
 .../variables_persist/test_generated_column.out    |     0
 .../variables_persist/test_mtmv.out                |     0
 .../variables_persist/test_sync_mv.out             |     0
 .../variables_persist/test_view_var_persist.out    |     0
 .../variables_persist/use_view_create_mv.out       |     0
 regression-test/data/query_p0/with/test_with.out   |     5 +
 .../search/test_search_inverted_index_profile.out  |    22 +
 .../data/search/test_search_slash_in_term.out      |     5 +
 .../data/shape_check/clickbench/query11.out        |     2 +-
 .../data/shape_check/clickbench/query12.out        |     2 +-
 .../data/shape_check/clickbench/query13.out        |     2 +-
 .../data/shape_check/clickbench/query14.out        |     2 +-
 .../data/shape_check/clickbench/query15.out        |     2 +-
 .../data/shape_check/clickbench/query22.out        |     2 +-
 .../data/shape_check/clickbench/query23.out        |     2 +-
 .../data/shape_check/clickbench/query25.out        |     2 +-
 .../data/shape_check/clickbench/query26.out        |     2 +-
 .../data/shape_check/clickbench/query27.out        |     2 +-
 .../data/shape_check/clickbench/query28.out        |     2 +-
 .../data/shape_check/clickbench/query29.out        |     2 +-
 .../data/shape_check/clickbench/query31.out        |     2 +-
 .../data/shape_check/clickbench/query32.out        |     2 +-
 .../data/shape_check/clickbench/query37.out        |     2 +-
 .../data/shape_check/clickbench/query38.out        |     2 +-
 .../data/shape_check/ssb_sf100/shape/flat.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q1.1.out      |     2 +-
 .../data/shape_check/ssb_sf100/shape/q1.2.out      |     2 +-
 .../data/shape_check/ssb_sf100/shape/q1.3.out      |     2 +-
 .../data/shape_check/ssb_sf100/shape/q2.1.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q2.2.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q2.3.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q3.1.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q3.2.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q3.3.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q3.4.out      |     6 +-
 .../data/shape_check/ssb_sf100/shape/q4.1.out      |     8 +-
 .../data/shape_check/ssb_sf100/shape/q4.2.out      |     8 +-
 .../data/shape_check/ssb_sf100/shape/q4.3.out      |     8 +-
 .../tpcds_sf100/constraints/query23.out            |    18 +-
 .../tpcds_sf100/noStatsRfPrune/query1.out          |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query10.out         |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query11.out         |   105 +-
 .../tpcds_sf100/noStatsRfPrune/query12.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query13.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query14.out         |    42 +-
 .../tpcds_sf100/noStatsRfPrune/query15.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query16.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query17.out         |    16 +-
 .../tpcds_sf100/noStatsRfPrune/query18.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query19.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query2.out          |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query20.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query21.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query22.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query23.out         |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query24.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query25.out         |    16 +-
 .../tpcds_sf100/noStatsRfPrune/query26.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query27.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query29.out         |    16 +-
 .../tpcds_sf100/noStatsRfPrune/query3.out          |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query30.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query31.out         |    22 +-
 .../tpcds_sf100/noStatsRfPrune/query32.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query33.out         |    24 +-
 .../tpcds_sf100/noStatsRfPrune/query34.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query35.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query36.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query37.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query38.out         |    20 +-
 .../tpcds_sf100/noStatsRfPrune/query39.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query4.out          |   171 +-
 .../tpcds_sf100/noStatsRfPrune/query40.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query41.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query42.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query43.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query44.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query45.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query46.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query47.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query48.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query49.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query5.out          |    20 +-
 .../tpcds_sf100/noStatsRfPrune/query50.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query51.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query52.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query53.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query54.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query55.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query56.out         |    24 +-
 .../tpcds_sf100/noStatsRfPrune/query57.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query58.out         |    28 +-
 .../tpcds_sf100/noStatsRfPrune/query59.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query6.out          |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query60.out         |    24 +-
 .../tpcds_sf100/noStatsRfPrune/query61.out         |    22 +-
 .../tpcds_sf100/noStatsRfPrune/query62.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query63.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query64.out         |    22 +-
 .../tpcds_sf100/noStatsRfPrune/query65.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query66.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query67.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query68.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query69.out         |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query7.out          |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query70.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query71.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query72.out         |    16 +-
 .../tpcds_sf100/noStatsRfPrune/query73.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query74.out         |   105 +-
 .../tpcds_sf100/noStatsRfPrune/query75.out         |   119 +-
 .../tpcds_sf100/noStatsRfPrune/query77.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query78.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query79.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query8.out          |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query80.out         |    18 +-
 .../tpcds_sf100/noStatsRfPrune/query81.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query82.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query83.out         |    28 +-
 .../tpcds_sf100/noStatsRfPrune/query84.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query85.out         |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query86.out         |     2 +-
 .../tpcds_sf100/noStatsRfPrune/query87.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query88.out         |    48 +-
 .../tpcds_sf100/noStatsRfPrune/query89.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query90.out         |    12 +-
 .../tpcds_sf100/noStatsRfPrune/query91.out         |    10 +-
 .../tpcds_sf100/noStatsRfPrune/query92.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query93.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query94.out         |     8 +-
 .../tpcds_sf100/noStatsRfPrune/query95.out         |    24 +-
 .../tpcds_sf100/noStatsRfPrune/query96.out         |     6 +-
 .../tpcds_sf100/noStatsRfPrune/query97.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query98.out         |     4 +-
 .../tpcds_sf100/noStatsRfPrune/query99.out         |     2 +-
 .../tpcds_sf100/no_stats_shape/query1.out          |    10 +-
 .../tpcds_sf100/no_stats_shape/query10.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query11.out         |   105 +-
 .../tpcds_sf100/no_stats_shape/query12.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query13.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query14.out         |    60 +-
 .../tpcds_sf100/no_stats_shape/query15.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query16.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query17.out         |    20 +-
 .../tpcds_sf100/no_stats_shape/query18.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query19.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query2.out          |    14 +-
 .../tpcds_sf100/no_stats_shape/query20.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query21.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query22.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query23.out         |    18 +-
 .../tpcds_sf100/no_stats_shape/query24.out         |    18 +-
 .../tpcds_sf100/no_stats_shape/query25.out         |    20 +-
 .../tpcds_sf100/no_stats_shape/query26.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query27.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query29.out         |    20 +-
 .../tpcds_sf100/no_stats_shape/query3.out          |     4 +-
 .../tpcds_sf100/no_stats_shape/query30.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query31.out         |    26 +-
 .../tpcds_sf100/no_stats_shape/query32.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query33.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query34.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query35.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query36.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query37.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query38.out         |    18 +-
 .../tpcds_sf100/no_stats_shape/query39.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query4.out          |   171 +-
 .../tpcds_sf100/no_stats_shape/query40.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query41.out         |     2 +-
 .../tpcds_sf100/no_stats_shape/query42.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query43.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query44.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query45.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query46.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query47.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query48.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query49.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query5.out          |    28 +-
 .../tpcds_sf100/no_stats_shape/query50.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query51.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query52.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query53.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query54.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query55.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query56.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query57.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query58.out         |    30 +-
 .../tpcds_sf100/no_stats_shape/query59.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query6.out          |    12 +-
 .../tpcds_sf100/no_stats_shape/query60.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query61.out         |    22 +-
 .../tpcds_sf100/no_stats_shape/query62.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query63.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query64.out         |    54 +-
 .../tpcds_sf100/no_stats_shape/query65.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query66.out         |    16 +-
 .../tpcds_sf100/no_stats_shape/query67.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query68.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query69.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query7.out          |     8 +-
 .../tpcds_sf100/no_stats_shape/query70.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query71.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query72.out         |    22 +-
 .../tpcds_sf100/no_stats_shape/query73.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query74.out         |   105 +-
 .../tpcds_sf100/no_stats_shape/query75.out         |   119 +-
 .../tpcds_sf100/no_stats_shape/query76.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query77.out         |    20 +-
 .../tpcds_sf100/no_stats_shape/query78.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query79.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query8.out          |    10 +-
 .../tpcds_sf100/no_stats_shape/query80.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query81.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query82.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query83.out         |    30 +-
 .../tpcds_sf100/no_stats_shape/query84.out         |    10 +-
 .../tpcds_sf100/no_stats_shape/query85.out         |    14 +-
 .../tpcds_sf100/no_stats_shape/query86.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query87.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query88.out         |    48 +-
 .../tpcds_sf100/no_stats_shape/query89.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query90.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query91.out         |    12 +-
 .../tpcds_sf100/no_stats_shape/query92.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query93.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query94.out         |     8 +-
 .../tpcds_sf100/no_stats_shape/query95.out         |    24 +-
 .../tpcds_sf100/no_stats_shape/query96.out         |     6 +-
 .../tpcds_sf100/no_stats_shape/query97.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query98.out         |     4 +-
 .../tpcds_sf100/no_stats_shape/query99.out         |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query1.out    |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query10.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query11.out   |   115 +-
 .../shape_check/tpcds_sf100/rf_prune/query12.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query13.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query14.out   |    44 +-
 .../shape_check/tpcds_sf100/rf_prune/query15.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query16.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query17.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query18.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query19.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query2.out    |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query20.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query21.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query22.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query23.out   |    16 +-
 .../shape_check/tpcds_sf100/rf_prune/query24.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query25.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query26.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query27.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query29.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query3.out    |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query30.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query31.out   |    22 +-
 .../shape_check/tpcds_sf100/rf_prune/query32.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query33.out   |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query34.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query35.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query36.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query37.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query38.out   |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query39.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query4.out    |   171 +-
 .../shape_check/tpcds_sf100/rf_prune/query40.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query41.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query42.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query43.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query44.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query45.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query46.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query47.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query48.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query49.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query5.out    |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query50.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query51.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query52.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query53.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query54.out   |    24 +-
 .../shape_check/tpcds_sf100/rf_prune/query55.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query56.out   |    24 +-
 .../shape_check/tpcds_sf100/rf_prune/query57.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query58.out   |    26 +-
 .../shape_check/tpcds_sf100/rf_prune/query59.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query6.out    |    10 +-
 .../shape_check/tpcds_sf100/rf_prune/query60.out   |    24 +-
 .../shape_check/tpcds_sf100/rf_prune/query61.out   |    22 +-
 .../shape_check/tpcds_sf100/rf_prune/query62.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query63.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query64.out   |   141 +-
 .../shape_check/tpcds_sf100/rf_prune/query65.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query66.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query67.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query68.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query69.out   |    14 +-
 .../shape_check/tpcds_sf100/rf_prune/query7.out    |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query70.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query71.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query72.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query73.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query74.out   |   115 +-
 .../shape_check/tpcds_sf100/rf_prune/query75.out   |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query76.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query77.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query78.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query79.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query8.out    |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query80.out   |    24 +-
 .../shape_check/tpcds_sf100/rf_prune/query81.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query82.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query83.out   |    30 +-
 .../shape_check/tpcds_sf100/rf_prune/query84.out   |    10 +-
 .../shape_check/tpcds_sf100/rf_prune/query85.out   |    10 +-
 .../shape_check/tpcds_sf100/rf_prune/query86.out   |     2 +-
 .../shape_check/tpcds_sf100/rf_prune/query87.out   |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query88.out   |    48 +-
 .../shape_check/tpcds_sf100/rf_prune/query89.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query9.out    |    24 +-
 .../shape_check/tpcds_sf100/rf_prune/query90.out   |    12 +-
 .../shape_check/tpcds_sf100/rf_prune/query91.out   |    10 +-
 .../shape_check/tpcds_sf100/rf_prune/query92.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query93.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query94.out   |     8 +-
 .../shape_check/tpcds_sf100/rf_prune/query95.out   |    20 +-
 .../shape_check/tpcds_sf100/rf_prune/query96.out   |     6 +-
 .../shape_check/tpcds_sf100/rf_prune/query97.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query98.out   |     4 +-
 .../shape_check/tpcds_sf100/rf_prune/query99.out   |     2 +-
 .../data/shape_check/tpcds_sf100/shape/query1.out  |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query10.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query11.out |   115 +-
 .../data/shape_check/tpcds_sf100/shape/query12.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query13.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query14.out |    60 +-
 .../data/shape_check/tpcds_sf100/shape/query15.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query16.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query17.out |    20 +-
 .../data/shape_check/tpcds_sf100/shape/query18.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query19.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query2.out  |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query20.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query21.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query22.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query23.out |    18 +-
 .../data/shape_check/tpcds_sf100/shape/query24.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query25.out |    20 +-
 .../data/shape_check/tpcds_sf100/shape/query26.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query27.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query29.out |    20 +-
 .../data/shape_check/tpcds_sf100/shape/query3.out  |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query30.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query31.out |    26 +-
 .../data/shape_check/tpcds_sf100/shape/query32.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query33.out |    24 +-
 .../data/shape_check/tpcds_sf100/shape/query34.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query35.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query36.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query37.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query38.out |    18 +-
 .../data/shape_check/tpcds_sf100/shape/query39.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query4.out  |   171 +-
 .../data/shape_check/tpcds_sf100/shape/query40.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query41.out |     2 +-
 .../data/shape_check/tpcds_sf100/shape/query42.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query43.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query44.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query45.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query46.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query47.out |    14 +-
 .../data/shape_check/tpcds_sf100/shape/query48.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query49.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query5.out  |    28 +-
 .../data/shape_check/tpcds_sf100/shape/query50.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query51.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query52.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query53.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query54.out |    24 +-
 .../data/shape_check/tpcds_sf100/shape/query55.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query56.out |    24 +-
 .../data/shape_check/tpcds_sf100/shape/query57.out |    14 +-
 .../data/shape_check/tpcds_sf100/shape/query58.out |    28 +-
 .../data/shape_check/tpcds_sf100/shape/query59.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query6.out  |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query60.out |    24 +-
 .../data/shape_check/tpcds_sf100/shape/query61.out |    22 +-
 .../data/shape_check/tpcds_sf100/shape/query62.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query63.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query64.out |   143 +-
 .../data/shape_check/tpcds_sf100/shape/query65.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query66.out |    16 +-
 .../data/shape_check/tpcds_sf100/shape/query67.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query68.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query69.out |    14 +-
 .../data/shape_check/tpcds_sf100/shape/query7.out  |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query70.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query71.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query72.out |    16 +-
 .../data/shape_check/tpcds_sf100/shape/query73.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query74.out |   115 +-
 .../data/shape_check/tpcds_sf100/shape/query75.out |    20 +-
 .../data/shape_check/tpcds_sf100/shape/query76.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query77.out |    20 +-
 .../data/shape_check/tpcds_sf100/shape/query78.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query79.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query8.out  |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query80.out |    30 +-
 .../data/shape_check/tpcds_sf100/shape/query81.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query82.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query83.out |    30 +-
 .../data/shape_check/tpcds_sf100/shape/query84.out |    10 +-
 .../data/shape_check/tpcds_sf100/shape/query85.out |    14 +-
 .../data/shape_check/tpcds_sf100/shape/query86.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query87.out |    18 +-
 .../data/shape_check/tpcds_sf100/shape/query88.out |    48 +-
 .../data/shape_check/tpcds_sf100/shape/query89.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query9.out  |    24 +-
 .../data/shape_check/tpcds_sf100/shape/query90.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query91.out |    12 +-
 .../data/shape_check/tpcds_sf100/shape/query92.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query93.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query94.out |     8 +-
 .../data/shape_check/tpcds_sf100/shape/query95.out |    22 +-
 .../data/shape_check/tpcds_sf100/shape/query96.out |     6 +-
 .../data/shape_check/tpcds_sf100/shape/query97.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query98.out |     4 +-
 .../data/shape_check/tpcds_sf100/shape/query99.out |     8 +-
 .../tpcds_sf1000/bs_downgrade_shape/query13.out    |    10 +-
 .../tpcds_sf1000/bs_downgrade_shape/query19.out    |    10 +-
 .../tpcds_sf1000/bs_downgrade_shape/query44.out    |     4 +-
 .../tpcds_sf1000/bs_downgrade_shape/query45.out    |     8 +-
 .../tpcds_sf1000/bs_downgrade_shape/query54.out    |    24 +-
 .../tpcds_sf1000/bs_downgrade_shape/query56.out    |    24 +-
 .../tpcds_sf1000/bs_downgrade_shape/query6.out     |    12 +-
 .../tpcds_sf1000/bs_downgrade_shape/query61.out    |    22 +-
 .../tpcds_sf1000/bs_downgrade_shape/query68.out    |    12 +-
 .../tpcds_sf1000/bs_downgrade_shape/query8.out     |    10 +-
 .../tpcds_sf1000/bs_downgrade_shape/query91.out    |    12 +-
 .../tpcds_sf1000/bs_downgrade_shape/query95.out    |    20 +-
 .../tpcds_sf1000/eliminate_empty/query10_empty.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query1.out  |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query10.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query11.out |   105 +-
 .../data/shape_check/tpcds_sf1000/hint/query12.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query13.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query14.out |    60 +-
 .../data/shape_check/tpcds_sf1000/hint/query15.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query16.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query17.out |    18 +-
 .../data/shape_check/tpcds_sf1000/hint/query18.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query19.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query2.out  |    14 +-
 .../data/shape_check/tpcds_sf1000/hint/query20.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query21.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query22.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query23.out |    18 +-
 .../data/shape_check/tpcds_sf1000/hint/query24.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query25.out |    20 +-
 .../data/shape_check/tpcds_sf1000/hint/query26.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query27.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query29.out |    20 +-
 .../data/shape_check/tpcds_sf1000/hint/query3.out  |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query30.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query31.out |    28 +-
 .../data/shape_check/tpcds_sf1000/hint/query32.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query34.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query36.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query37.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query38.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query39.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query4.out  |   169 +-
 .../data/shape_check/tpcds_sf1000/hint/query40.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query41.out |     2 +-
 .../data/shape_check/tpcds_sf1000/hint/query42.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query43.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query44.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query45.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query46.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query47.out |    14 +-
 .../data/shape_check/tpcds_sf1000/hint/query48.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query49.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query5.out  |    28 +-
 .../data/shape_check/tpcds_sf1000/hint/query50.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query51.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query52.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query53.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query54.out |    24 +-
 .../data/shape_check/tpcds_sf1000/hint/query55.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query56.out |    24 +-
 .../data/shape_check/tpcds_sf1000/hint/query57.out |    14 +-
 .../data/shape_check/tpcds_sf1000/hint/query58.out |    28 +-
 .../data/shape_check/tpcds_sf1000/hint/query59.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query6.out  |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query60.out |    24 +-
 .../data/shape_check/tpcds_sf1000/hint/query61.out |    22 +-
 .../data/shape_check/tpcds_sf1000/hint/query62.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query63.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query64.out |    50 +-
 .../data/shape_check/tpcds_sf1000/hint/query65.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query66.out |    16 +-
 .../data/shape_check/tpcds_sf1000/hint/query67.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query68.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query69.out |    16 +-
 .../data/shape_check/tpcds_sf1000/hint/query7.out  |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query70.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query71.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query72.out |    16 +-
 .../data/shape_check/tpcds_sf1000/hint/query73.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query74.out |   103 +-
 .../data/shape_check/tpcds_sf1000/hint/query75.out |    20 +-
 .../data/shape_check/tpcds_sf1000/hint/query76.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query77.out |    20 +-
 .../data/shape_check/tpcds_sf1000/hint/query78.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query79.out |     8 +-
 .../data/shape_check/tpcds_sf1000/hint/query8.out  |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query80.out |    30 +-
 .../data/shape_check/tpcds_sf1000/hint/query81.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query82.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query84.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query85.out |    14 +-
 .../data/shape_check/tpcds_sf1000/hint/query86.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query87.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query88.out |    48 +-
 .../data/shape_check/tpcds_sf1000/hint/query89.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query9.out  |    24 +-
 .../data/shape_check/tpcds_sf1000/hint/query90.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query91.out |    12 +-
 .../data/shape_check/tpcds_sf1000/hint/query92.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query93.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query94.out |    10 +-
 .../data/shape_check/tpcds_sf1000/hint/query95.out |    20 +-
 .../data/shape_check/tpcds_sf1000/hint/query96.out |     6 +-
 .../data/shape_check/tpcds_sf1000/hint/query97.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query98.out |     4 +-
 .../data/shape_check/tpcds_sf1000/hint/query99.out |     8 +-
 .../data/shape_check/tpcds_sf1000/shape/query1.out |    12 +-
 .../shape_check/tpcds_sf1000/shape/query10.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query11.out     |   115 +-
 .../shape_check/tpcds_sf1000/shape/query12.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query13.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query14.out     |    60 +-
 .../shape_check/tpcds_sf1000/shape/query15.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query16.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query17.out     |    18 +-
 .../shape_check/tpcds_sf1000/shape/query18.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query19.out     |    10 +-
 .../data/shape_check/tpcds_sf1000/shape/query2.out |     8 +-
 .../shape_check/tpcds_sf1000/shape/query20.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query21.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query22.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query23.out     |    18 +-
 .../shape_check/tpcds_sf1000/shape/query24.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query25.out     |    18 +-
 .../shape_check/tpcds_sf1000/shape/query26.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query27.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query29.out     |    18 +-
 .../data/shape_check/tpcds_sf1000/shape/query3.out |     4 +-
 .../shape_check/tpcds_sf1000/shape/query30.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query31.out     |    26 +-
 .../shape_check/tpcds_sf1000/shape/query32.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query33.out     |    24 +-
 .../shape_check/tpcds_sf1000/shape/query34.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query35.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query36.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query37.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query38.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query39.out     |     8 +-
 .../data/shape_check/tpcds_sf1000/shape/query4.out |   171 +-
 .../shape_check/tpcds_sf1000/shape/query40.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query41.out     |     2 +-
 .../shape_check/tpcds_sf1000/shape/query42.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query43.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query44.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query45.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query46.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query47.out     |    14 +-
 .../shape_check/tpcds_sf1000/shape/query48.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query49.out     |    12 +-
 .../data/shape_check/tpcds_sf1000/shape/query5.out |    28 +-
 .../shape_check/tpcds_sf1000/shape/query50.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query51.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query52.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query53.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query54.out     |    28 +-
 .../shape_check/tpcds_sf1000/shape/query55.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query56.out     |    24 +-
 .../shape_check/tpcds_sf1000/shape/query57.out     |    14 +-
 .../shape_check/tpcds_sf1000/shape/query58.out     |    28 +-
 .../shape_check/tpcds_sf1000/shape/query59.out     |    12 +-
 .../data/shape_check/tpcds_sf1000/shape/query6.out |    12 +-
 .../shape_check/tpcds_sf1000/shape/query60.out     |    24 +-
 .../shape_check/tpcds_sf1000/shape/query61.out     |    22 +-
 .../shape_check/tpcds_sf1000/shape/query62.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query63.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query65.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query66.out     |    16 +-
 .../shape_check/tpcds_sf1000/shape/query67.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query68.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query69.out     |    16 +-
 .../data/shape_check/tpcds_sf1000/shape/query7.out |     8 +-
 .../shape_check/tpcds_sf1000/shape/query70.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query71.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query72.out     |    16 +-
 .../shape_check/tpcds_sf1000/shape/query73.out     |     8 +-
 .../shape_check/tpcds_sf1000/shape/query74.out     |   103 +-
 .../shape_check/tpcds_sf1000/shape/query75.out     |    20 +-
 .../shape_check/tpcds_sf1000/shape/query76.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query77.out     |    20 +-
 .../shape_check/tpcds_sf1000/shape/query78.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query79.out     |     8 +-
 .../data/shape_check/tpcds_sf1000/shape/query8.out |    10 +-
 .../shape_check/tpcds_sf1000/shape/query80.out     |    30 +-
 .../shape_check/tpcds_sf1000/shape/query81.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query82.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query83.out     |    30 +-
 .../shape_check/tpcds_sf1000/shape/query84.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query85.out     |    14 +-
 .../shape_check/tpcds_sf1000/shape/query86.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query87.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query88.out     |    48 +-
 .../shape_check/tpcds_sf1000/shape/query89.out     |     6 +-
 .../data/shape_check/tpcds_sf1000/shape/query9.out |    24 +-
 .../shape_check/tpcds_sf1000/shape/query90.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query91.out     |    12 +-
 .../shape_check/tpcds_sf1000/shape/query92.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query93.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query94.out     |    10 +-
 .../shape_check/tpcds_sf1000/shape/query95.out     |    20 +-
 .../shape_check/tpcds_sf1000/shape/query96.out     |     6 +-
 .../shape_check/tpcds_sf1000/shape/query97.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query98.out     |     4 +-
 .../shape_check/tpcds_sf1000/shape/query99.out     |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query1.out           |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query10.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query11.out          |   129 +-
 .../tpcds_sf1000_nopkfk/shape/query12.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query13.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query14.out          |    60 +-
 .../tpcds_sf1000_nopkfk/shape/query15.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query16.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query17.out          |    18 +-
 .../tpcds_sf1000_nopkfk/shape/query18.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query19.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query2.out           |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query20.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query21.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query22.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query23.out          |    22 +-
 .../tpcds_sf1000_nopkfk/shape/query24.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query25.out          |    18 +-
 .../tpcds_sf1000_nopkfk/shape/query26.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query27.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query29.out          |    18 +-
 .../tpcds_sf1000_nopkfk/shape/query3.out           |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query30.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query31.out          |    26 +-
 .../tpcds_sf1000_nopkfk/shape/query32.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query33.out          |    24 +-
 .../tpcds_sf1000_nopkfk/shape/query34.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query35.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query36.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query37.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query38.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query39.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query4.out           |   202 +-
 .../tpcds_sf1000_nopkfk/shape/query40.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query41.out          |     2 +-
 .../tpcds_sf1000_nopkfk/shape/query42.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query43.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query44.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query45.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query46.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query47.out          |    14 +-
 .../tpcds_sf1000_nopkfk/shape/query48.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query49.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query5.out           |    28 +-
 .../tpcds_sf1000_nopkfk/shape/query50.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query51.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query52.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query53.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query54.out          |    28 +-
 .../tpcds_sf1000_nopkfk/shape/query55.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query56.out          |    24 +-
 .../tpcds_sf1000_nopkfk/shape/query57.out          |    14 +-
 .../tpcds_sf1000_nopkfk/shape/query58.out          |    28 +-
 .../tpcds_sf1000_nopkfk/shape/query59.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query6.out           |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query60.out          |    24 +-
 .../tpcds_sf1000_nopkfk/shape/query61.out          |    22 +-
 .../tpcds_sf1000_nopkfk/shape/query62.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query63.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query65.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query66.out          |    16 +-
 .../tpcds_sf1000_nopkfk/shape/query67.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query68.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query69.out          |    16 +-
 .../tpcds_sf1000_nopkfk/shape/query7.out           |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query70.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query71.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query72.out          |    16 +-
 .../tpcds_sf1000_nopkfk/shape/query73.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query74.out          |   135 +-
 .../tpcds_sf1000_nopkfk/shape/query75.out          |    20 +-
 .../tpcds_sf1000_nopkfk/shape/query76.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query77.out          |    20 +-
 .../tpcds_sf1000_nopkfk/shape/query78.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query79.out          |     8 +-
 .../tpcds_sf1000_nopkfk/shape/query8.out           |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query80.out          |    30 +-
 .../tpcds_sf1000_nopkfk/shape/query81.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query82.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query83.out          |    30 +-
 .../tpcds_sf1000_nopkfk/shape/query84.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query85.out          |    14 +-
 .../tpcds_sf1000_nopkfk/shape/query86.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query87.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query88.out          |    48 +-
 .../tpcds_sf1000_nopkfk/shape/query89.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query9.out           |    24 +-
 .../tpcds_sf1000_nopkfk/shape/query90.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query91.out          |    12 +-
 .../tpcds_sf1000_nopkfk/shape/query92.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query93.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query94.out          |    10 +-
 .../tpcds_sf1000_nopkfk/shape/query95.out          |    20 +-
 .../tpcds_sf1000_nopkfk/shape/query96.out          |     6 +-
 .../tpcds_sf1000_nopkfk/shape/query97.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query98.out          |     4 +-
 .../tpcds_sf1000_nopkfk/shape/query99.out          |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query1.out   |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query10.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query11.out  |   119 +-
 .../shape_check/tpcds_sf10t_orc/shape/query12.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query13.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query14.out  |    58 +-
 .../shape_check/tpcds_sf10t_orc/shape/query15.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query16.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query17.out  |    20 +-
 .../shape_check/tpcds_sf10t_orc/shape/query18.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query19.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query2.out   |    14 +-
 .../shape_check/tpcds_sf10t_orc/shape/query20.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query21.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query22.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query23.out  |    22 +-
 .../shape_check/tpcds_sf10t_orc/shape/query24.out  |    16 +-
 .../shape_check/tpcds_sf10t_orc/shape/query25.out  |    20 +-
 .../shape_check/tpcds_sf10t_orc/shape/query26.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query27.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query29.out  |    20 +-
 .../shape_check/tpcds_sf10t_orc/shape/query3.out   |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query30.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query31.out  |    26 +-
 .../shape_check/tpcds_sf10t_orc/shape/query32.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query33.out  |    24 +-
 .../shape_check/tpcds_sf10t_orc/shape/query34.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query35.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query36.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query37.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query38.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query39.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query4.out   |   181 +-
 .../shape_check/tpcds_sf10t_orc/shape/query40.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query41.out  |     2 +-
 .../shape_check/tpcds_sf10t_orc/shape/query42.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query43.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query44.out  |     2 +-
 .../shape_check/tpcds_sf10t_orc/shape/query45.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query46.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query47.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query48.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query49.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query5.out   |    28 +-
 .../shape_check/tpcds_sf10t_orc/shape/query50.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query51.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query52.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query53.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query54.out  |    24 +-
 .../shape_check/tpcds_sf10t_orc/shape/query55.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query56.out  |    24 +-
 .../shape_check/tpcds_sf10t_orc/shape/query57.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query58.out  |    30 +-
 .../shape_check/tpcds_sf10t_orc/shape/query59.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query6.out   |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query60.out  |    24 +-
 .../shape_check/tpcds_sf10t_orc/shape/query61.out  |    22 +-
 .../shape_check/tpcds_sf10t_orc/shape/query62.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query63.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query64.out  |    54 +-
 .../shape_check/tpcds_sf10t_orc/shape/query65.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query66.out  |    16 +-
 .../shape_check/tpcds_sf10t_orc/shape/query67.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query68.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query69.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query7.out   |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query70.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query71.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query72.out  |    22 +-
 .../shape_check/tpcds_sf10t_orc/shape/query73.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query74.out  |   119 +-
 .../shape_check/tpcds_sf10t_orc/shape/query75.out  |   119 +-
 .../shape_check/tpcds_sf10t_orc/shape/query76.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query77.out  |    20 +-
 .../shape_check/tpcds_sf10t_orc/shape/query78.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query79.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query8.out   |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query80.out  |    24 +-
 .../shape_check/tpcds_sf10t_orc/shape/query81.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query82.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query83.out  |    30 +-
 .../shape_check/tpcds_sf10t_orc/shape/query84.out  |    10 +-
 .../shape_check/tpcds_sf10t_orc/shape/query85.out  |    14 +-
 .../shape_check/tpcds_sf10t_orc/shape/query86.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query87.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query88.out  |    48 +-
 .../shape_check/tpcds_sf10t_orc/shape/query89.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query90.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query91.out  |    12 +-
 .../shape_check/tpcds_sf10t_orc/shape/query92.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query93.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query94.out  |     8 +-
 .../shape_check/tpcds_sf10t_orc/shape/query95.out  |    20 +-
 .../shape_check/tpcds_sf10t_orc/shape/query96.out  |     6 +-
 .../shape_check/tpcds_sf10t_orc/shape/query97.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query98.out  |     4 +-
 .../shape_check/tpcds_sf10t_orc/shape/query99.out  |     8 +-
 .../check_point/probeShortcutFactor.out            |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q10.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q11.out           |     8 +-
 .../tpch_sf1000/nostats_rf_prune/q12.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q16.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q17.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q18.out           |     4 +-
 .../tpch_sf1000/nostats_rf_prune/q19.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q2.out            |     6 +-
 .../tpch_sf1000/nostats_rf_prune/q20-rewrite.out   |    12 +-
 .../tpch_sf1000/nostats_rf_prune/q20.out           |    12 +-
 .../tpch_sf1000/nostats_rf_prune/q21.out           |    14 +-
 .../tpch_sf1000/nostats_rf_prune/q22.out           |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q3.out            |     4 +-
 .../tpch_sf1000/nostats_rf_prune/q4.out            |     2 +-
 .../tpch_sf1000/nostats_rf_prune/q5.out            |    14 +-
 .../tpch_sf1000/nostats_rf_prune/q7.out            |     8 +-
 .../tpch_sf1000/nostats_rf_prune/q8.out            |    10 +-
 .../tpch_sf1000/nostats_rf_prune/q9.out            |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q10.out  |     4 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q11.out  |     8 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q12.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q14.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q16.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q17.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q18.out  |     4 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q19.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q2.out   |     8 +-
 .../tpch_sf1000/rf_prune/q20-rewrite.out           |    10 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q20.out  |    10 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q21.out  |    10 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q22.out  |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q3.out   |     4 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q4.out   |     2 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q5.out   |    10 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q7.out   |    10 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q8.out   |    12 +-
 .../data/shape_check/tpch_sf1000/rf_prune/q9.out   |     4 +-
 .../runtime_filter/test_pushdown_setop.out         |    16 +-
 .../data/shape_check/tpch_sf1000/shape/q10.out     |     6 +-
 .../data/shape_check/tpch_sf1000/shape/q11.out     |     8 +-
 .../data/shape_check/tpch_sf1000/shape/q12.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q14.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q15.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q16.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q17.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q18.out     |     6 +-
 .../data/shape_check/tpch_sf1000/shape/q19.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q2.out      |     8 +-
 .../shape_check/tpch_sf1000/shape/q20-rewrite.out  |    10 +-
 .../data/shape_check/tpch_sf1000/shape/q20.out     |    10 +-
 .../data/shape_check/tpch_sf1000/shape/q21.out     |    10 +-
 .../data/shape_check/tpch_sf1000/shape/q22.out     |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q3.out      |     4 +-
 .../data/shape_check/tpch_sf1000/shape/q4.out      |     2 +-
 .../data/shape_check/tpch_sf1000/shape/q5.out      |    10 +-
 .../data/shape_check/tpch_sf1000/shape/q7.out      |    10 +-
 .../data/shape_check/tpch_sf1000/shape/q8.out      |    14 +-
 .../data/shape_check/tpch_sf1000/shape/q9.out      |    16 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q10.out |     6 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q11.out |     8 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q12.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q13.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q14.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q15.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q16.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q17.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q18.out |     6 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q19.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q2.out  |     8 +-
 .../tpch_sf1000/shape_no_stats/q20-rewrite.out     |    12 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q20.out |    12 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q21.out |    14 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q22.out |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q3.out  |     4 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q4.out  |     2 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q5.out  |    14 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q7.out  |     8 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q8.out  |    14 +-
 .../shape_check/tpch_sf1000/shape_no_stats/q9.out  |    16 +-
 .../test_show_create_table_and_views_nereids.out   |     9 +-
 .../test_olap_table_stream_history_consumption.out |    46 +
 .../test_olap_table_stream_history_query.out       |   197 +
 .../sql/q01.out                                    |     0
 .../sql/q02.out                                    |     0
 .../sql/q03.out                                    |     0
 .../sql/q04.out                                    |     0
 .../sql/q05.out                                    |     0
 .../sql/q06.out                                    |     0
 .../sql/q07.out                                    |     0
 .../sql/q08.out                                    |     0
 .../sql/q09.out                                    |     0
 .../sql/q10.out                                    |     0
 .../sql/q11.out                                    |     0
 .../sql/q12.out                                    |     0
 .../sql/q13.out                                    |     0
 .../sql/q14.out                                    |     0
 .../sql/q15.out                                    |     0
 .../sql/q16.out                                    |     0
 .../sql/q17.out                                    |     0
 .../sql/q18.out                                    |     0
 .../sql/q19.out                                    |     0
 .../sql/q20.out                                    |     0
 .../sql/q21.out                                    |     0
 .../sql/q22.out                                    |     0
 .../publish/test_partial_update_publish_seq.out    |    38 +-
 .../test_p_seq_publish_read_from_old.out           |    10 +-
 .../test_partial_update_complex_type.out           |     8 +-
 .../compaction/test_compaction_nokey_variant.out   |    21 +
 .../doc_mode/test_variant_cast_strict.out          |    10 +
 .../data/variant_p0/duplicate_json_path.json       |     7 +
 .../data/variant_p0/nested/nested_in_top_array.out |   294 +-
 .../predefine/test_predefine_type_index.out        |     8 +
 .../data/variant_p0/test_json_object_flatten.out   |    39 +
 .../org/apache/doris/regression/suite/Suite.groovy |   281 +-
 .../doris/regression/suite/SuiteCluster.groovy     |    64 +-
 .../pipeline/cloud_p0/conf/be_custom.conf          |     2 +-
 .../pipeline/cloud_p0/conf/fe_custom.conf          |     1 +
 .../cloud_p0/conf/regression-conf-custom.groovy    |     5 +-
 regression-test/pipeline/cloud_p0/run.sh           |     2 +-
 .../pipeline/cloud_p1/conf/be_custom.conf          |     2 +-
 regression-test/pipeline/common/doris-utils.sh     |    14 +
 .../pipeline/common/get-hive-bootstrap-groups.sh   |    42 +
 regression-test/pipeline/common/github-utils.sh    |    43 +
 regression-test/pipeline/common/stage-timer.sh     |   129 +
 .../pipeline/common/test_stage_timer.py            |   149 +
 regression-test/pipeline/external/conf/be.conf     |     2 +-
 .../pipeline/external/external-stage-timer.sh      |   119 +
 .../pipeline/nonConcurrent/conf/be.conf            |     2 +-
 .../nonConcurrent/conf/regression-conf.groovy      |     2 +-
 regression-test/pipeline/p0/conf/be.conf           |     4 +-
 regression-test/pipeline/p0/conf/fe.conf           |     3 +-
 regression-test/pipeline/p1/conf/be.conf           |     2 +-
 .../pipeline/vault_p0/conf/be_custom.conf          |     2 +-
 regression-test/plugins/plugin_compaction.groovy   |     6 +-
 .../suites/ai_p0/test_ai_functions.groovy          |    26 +-
 .../ann_index_p0/ann_const_expr_vector.groovy      |   117 +
 .../suites/ann_index_p0/ann_index_basic.groovy     |    22 +-
 .../suites/ann_index_p0/ann_index_on_mow.groovy    |    66 +
 .../ann_index_p0/build_ann_index_test.groovy       |    59 +-
 .../ann_index_p0/cast_string_as_array.groovy       |     2 +-
 .../ann_index_p0/create_ann_index_test.groovy      |    87 +-
 .../create_tbl_with_ann_index_test.groovy          |    84 +
 .../suites/ann_index_p0/ivf_index_test.groovy      |    33 +-
 .../ann_index_p0/ivf_on_disk_index_test.groovy     |   229 +
 .../ann_index_p0/ivf_on_disk_stream_load.csv       |     6 +
 .../suites/arrow_flight_sql_p0/test_select.groovy  |    36 +-
 .../suites/auth/test_http_api_auth.groovy          |   216 +
 .../suites/auth_call/test_ddl_restore_auth.groovy  |    71 +-
 .../auth_p0/test_role_mapping_system_table.groovy  |   123 +
 ...rg_s3tables_catalog_credentials_provider.groovy |   105 +
 ...le_cleanup.sql => ex02_alter_illegal_combo.sql} |     0
 .../cache/ddl/ex06_ttl_restart_consistency.sql     |    30 +
 ....sql => ex08_clear_cache_query_concurrency.sql} |     0
 ...est_warm_up_cluster_event_cancel_expired.groovy |   203 +
 .../cache/ttl/ex02_alter_illegal_combo.groovy      |    62 +
 .../cache/ttl/ex06_ttl_restart_consistency.groovy  |   104 +
 .../ttl/ex08_clear_cache_query_concurrency.groovy  |   103 +
 .../cache/ttl/st06_warmup_ttl_type_assert.groovy   |     4 +
 .../cloud_p0/cache/ttl/st07_qcs_consistency.groovy |     8 +-
 .../cache/ttl/st10_drop_partition_cleanup.groovy   |     2 +-
 .../test_cloud_admin_compact_table.groovy          |   158 +
 .../test_packed_file_async_close_error.groovy      |    78 +
 .../test_create_table_and_create_mv_race.groovy    |   143 +
 .../tablets/test_tablet_stat_syncer.groovy         |   150 +
 .../cloud_p0/version/test_version_syncer.groovy    |   112 +
 .../test_sc_compaction_cross_v1_retry.groovy       |   158 +
 .../compaction/test_admin_compact_table.groovy     |   163 +
 .../compaction/test_be_compaction_tasks.groovy     |   167 +
 .../test_compaction_profile_action.groovy          |   196 +
 ...test_mow_compaction_and_rowset_not_exist.groovy |    11 +-
 .../test_time_series_compaction_policy.groovy      |    42 +
 .../test_inlineview_with_window_function.groovy    |     5 +-
 ...est_rf_in_list_not_erased_by_scope_range.groovy |    91 +
 .../test_non_mow_key_bounds_aggregation.groovy     |   177 +
 .../decimalv2/test_decimalv2_agg.groovy            |    32 +
 .../test_timestamptz_agg_functions.groovy          |    59 +
 .../test_timestamptz_array_index.groovy            |    83 +
 .../timestamptz/test_timestamptz_dst_fold.groovy   |   103 +
 .../timestamptz/test_timestamptz_dst_gap.groovy    |    61 +
 .../timestamptz/test_timestamptz_max_min_by.groovy |    67 +
 .../test_create_view_variant_nested_field.groovy   |   157 +
 .../export_p2/test_export_max_file_size.groovy     |     4 +-
 .../test_export_variant_10k_columns.groovy         |     0
 .../es/test_es_query_predicate_correctness.groovy  |   145 +
 .../hive/test_external_catalog_hive.groovy         |    15 +-
 .../hive/test_external_sql_block_rule.groovy       |    93 +-
 .../hive/test_hive_analyze_long_string.groovy      |   125 +
 .../hive/test_hive_date_timezone.groovy            |    29 +
 .../hive/test_hive_lzo_text_format.groovy          |   131 +
 ...ceberg_v3_row_lineage_rewrite_data_files.groovy |   244 +
 .../iceberg_branch_retention_and_snapshot.groovy   |    18 +-
 .../iceberg_tag_retention_and_consistency.groovy   |    20 +-
 .../iceberg/iceberg_branch_tag_operate.groovy      |     2 +-
 .../iceberg/test_iceberg_jdbc_catalog.groovy       |     8 +-
 ...st_iceberg_schema_change_with_timetravel.groovy |     2 +-
 .../iceberg/test_iceberg_sys_table.groovy          |   202 +-
 .../iceberg/test_iceberg_sys_table_auth.groovy     |    64 -
 ...est_iceberg_v2_to_v3_doris_spark_compare.groovy |   223 +
 ...test_iceberg_v3_row_lineage_query_insert.groovy |   304 +
 ...eberg_v3_row_lineage_update_delete_merge.groovy |   292 +
 .../iceberg/write/test_iceberg_write_insert.groovy |     5 +
 .../jdbc/test_clickhouse_jdbc_catalog.groovy       |    14 +-
 .../external_table_p0/jdbc/test_jdbc_call.groovy   |     2 +-
 .../test_jdbc_catalog_predicate_pushdown.groovy    |   114 +
 .../jdbc/test_jdbc_catalog_push_cast.groovy        |     6 +-
 .../jdbc/test_jdbc_query_mysql.groovy              |    23 -
 .../jdbc/test_jdbc_query_pg.groovy                 |    23 -
 .../jdbc/test_jdbc_query_tvf.groovy                |     5 +-
 .../jdbc/test_mysql_jdbc_catalog.groovy            |    16 +-
 .../jdbc/test_mysql_jdbc_catalog_nereids.groovy    |     2 +-
 .../test_mysql_jdbc_catalog_table_comment.groovy   |    17 +-
 .../jdbc/test_oracle_jdbc_catalog.groovy           |    21 +-
 .../jdbc/test_sqlserver_jdbc_catalog.groovy        |     1 +
 .../select/test_mysql_all_types_select.groovy      |     2 +
 .../select/test_oracle_all_types_select.groovy     |     1 +
 .../select/test_pg_all_types_select.groovy         |     2 +
 .../paimon/test_paimon_jdbc_catalog.groovy         |    66 +-
 .../paimon/test_paimon_partition_table.groovy      |    14 +-
 .../paimon/test_paimon_schema_change.groovy        |    39 +-
 .../external_table_p0/polaris/test_polaris.groovy  |     5 +-
 .../backup_restore_object_storage.groovy           |     4 +-
 .../iceberg_rest_on_hdfs.groovy                    |     5 +-
 .../tvf/lance/test_lance_tvf.groovy                |   119 +
 .../tvf/test_hdfs_tvf_error_uri.groovy             |    14 +-
 .../hive/test_hive_compress_type_large_data.groovy |    29 +-
 .../iceberg/test_hive_migrate_iceberg.groovy       |     1 +
 .../write/test_mc_write_catalog_block_bytes.groovy |   167 +
 .../maxcompute/write/test_mc_write_ctas.groovy     |     4 +-
 .../write/test_mc_write_large_data.groovy          |    49 -
 .../hive_on_hms_and_dlf.groovy                     |    33 +-
 .../iceberg_on_hms_and_filesystem_and_dlf.groovy   |    10 +-
 .../iceberg_rest_s3_storage_vended_test.groovy     |     5 +-
 .../iceberg_rest_storage_test.groovy               |     5 +-
 .../external_table_p2/tvf/test_iceberg_meta.groovy |    90 -
 .../cloud/test_cloud_ms_rpc_table_throttle.groovy  |   215 +
 .../test_audit_log_internal_query_failure.groovy   |    93 +
 .../test_forward_reopen_timeout.groovy             |   116 +
 .../test_skip_calc_between_segments.groovy         |     3 +-
 .../http_rest_api/post/test_query_stmt.groovy      |     2 +-
 .../insert_overwrite_error_message_percent.groovy  |    59 +
 .../insert_p0/test_insert_tablet_sink.groovy       |    10 +-
 .../test_drop_index_on_partition.groovy            |   273 +
 .../inverted_index_p0/test_bm25_score.groovy       |    49 +-
 .../test_bm25_score_variant.groovy                 |   106 +
 .../test_count_match_all_pushdown.groovy           |    83 +
 .../cdc/test_streaming_mysql_job_alter_cred.groovy |   160 +
 ...reaming_mysql_job_alter_props_restart_fe.groovy |   206 +
 .../cdc/test_streaming_mysql_job_col_filter.groovy |   175 +
 .../test_streaming_mysql_job_compute_group.groovy  |   127 +
 .../test_streaming_mysql_job_create_alter.groovy   |   113 +-
 .../cdc/test_streaming_mysql_job_lag.groovy        |    98 +
 .../cdc/test_streaming_mysql_job_metrics.groovy    |    51 +-
 .../cdc/test_streaming_mysql_job_priv.groovy       |    10 +-
 ...treaming_mysql_job_restart_fe_with_props.groovy |   143 +
 .../test_streaming_mysql_job_special_offset.groovy |   229 +
 ...ming_mysql_job_special_offset_restart_fe.groovy |   140 +
 .../cdc/test_streaming_mysql_job_ssl.groovy        |   158 +
 .../test_streaming_mysql_job_table_mapping.groovy  |   190 +
 .../cdc/test_streaming_postgres_job_lag.groovy     |   101 +
 .../cdc/test_streaming_postgres_job_priv.groovy    |     4 +-
 .../test_streaming_postgres_job_publication.groovy |   412 +
 ...st_streaming_postgres_job_special_offset.groovy |   249 +
 .../cdc/tvf/test_cdc_stream_tvf_mysql.groovy       |   218 +
 .../cdc/tvf/test_cdc_stream_tvf_postgres.groovy    |    87 +
 .../cdc/tvf/test_cdc_stream_tvf_publication.groovy |   262 +
 .../tvf/test_streaming_job_cdc_stream_mysql.groovy |   198 +
 ...eaming_job_cdc_stream_mysql_alter_offset.groovy |   164 +
 .../test_streaming_job_cdc_stream_postgres.groovy  |   131 +
 ...ob_cdc_stream_postgres_latest_alter_cred.groovy |   249 +
 ...ing_job_cdc_stream_postgres_pause_resume.groovy |   225 +
 ...aming_job_cdc_stream_postgres_restart_fe.groovy |   288 +
 .../streaming_job/test_streaming_insert_job.groovy |     5 +
 .../test_streaming_insert_job_compute_group.groovy |   158 +
 ...treaming_insert_job_compute_group_docker.groovy |   163 +
 ...st_streaming_insert_job_fetch_meta_error.groovy |     2 +-
 .../test_streaming_insert_job_file_number.groovy   |   111 +
 .../test_streaming_insert_job_filtered_rows.groovy |   100 +
 ...g_job_alter_offset_checkpoint_restart_fe.groovy |   151 +
 ...test_streaming_job_checkpoint_restart_fe.groovy |   144 +
 .../test_streaming_job_max_retry.groovy            |   110 +
 .../test_streaming_job_restart_fe.groovy           |    17 +-
 .../test_broker_load_multi_filegroup.groovy        |    57 +-
 .../test_group_commit_http_stream.groovy           |     4 +
 .../load_p0/insert/test_insert_statistic.groovy    |    42 +-
 .../test_insert_statistic_after_fe_restart.groovy  |    92 +
 ...test_insert_strict_mode_and_filter_ratio.groovy |   354 +-
 .../load_p0/msk_load/test_routine_load_msk.groovy  |   177 +
 .../test_routine_load_msk_public_access.groovy     |   105 +
 .../test_routine_load_be_restart.groovy            |    21 +-
 ..._routine_load_master_switch_exactly_once.groovy |   194 +
 ...mem_limit_exceeded_recovery_exactly_once.groovy |   192 +
 ...mow_partial_update_concurrent_compaction.groovy |   196 +
 ..._load_mow_partial_update_with_compaction.groovy |   211 +
 ...d_partial_update_new_key_error_atomicity.groovy |   214 +
 ...ne_load_partition_expansion_exactly_once.groovy |   156 +
 ...ad_same_job_offset_recovery_exactly_once.groovy |   180 +
 ...load_same_job_schema_replay_exactly_once.groovy |   215 +
 ...oad_too_many_tasks_recovery_exactly_once.groovy |   177 +
 .../load_p0/stream_load/test_json_load.groovy      |     2 -
 ...stream_load_strict_mode_and_filter_ratio.groovy |   103 +-
 .../test_tvf_strict_mode_and_filter_ratio.groovy   |    20 +-
 .../routine_load/ddl/agg_tbl_basic_create.sql      |     4 +-
 .../routine_load/ddl/dup_tbl_basic_create.sql      |     4 +-
 .../ddl/dup_tbl_basic_multi_table_create.sql       |     4 +-
 .../routine_load/ddl/mow_tbl_basic_create.sql      |     4 +-
 .../routine_load/ddl/uniq_tbl_basic_create.sql     |     4 +-
 .../ddl/uniq_tbl_basic_create_sequence.sql         |     4 +-
 .../load_p2/routine_load/test_routine_load.groovy  |     5 +-
 .../test_constraint_change_rewrite_mtmv.groovy     |   112 +
 .../mv_p0/test_casewhen/test_casewhen.groovy       |     2 +-
 .../testBucketedAggSyncMV.groovy                   |   100 +
 .../suites/mysql_compatibility_p0/metadata.groovy  |     4 +-
 .../agg_function/test_regr_sxx.groovy              |   107 -
 .../agg_function/test_regr_sxy.groovy              |   106 -
 .../agg_function/test_regr_syy.groovy              |   107 -
 .../aggregate/agg_distinct_case_when.groovy        |    54 -
 .../nereids_p0/aggregate/agg_error_msg.groovy      |    65 -
 .../nereids_p0/aggregate/agg_group_concat.groovy   |   113 -
 .../nereids_p0/aggregate/agg_nullable.groovy       |  1042 -
 .../nereids_p0/aggregate/agg_nullable_2.groovy     |  1053 -
 .../nereids_p0/aggregate/agg_union_random.groovy   |    56 -
 .../nereids_p0/aggregate/agg_window_project.groovy |   126 -
 .../suites/nereids_p0/aggregate/aggregate.groovy   |   373 -
 .../nereids_p0/aggregate/aggregate_count1.groovy   |   109 -
 .../aggregate_group_by_metric_type.groovy          |   122 -
 .../aggregate/aggregate_groupby_constant.groovy    |    76 -
 .../aggregate/aggregate_groupby_null.groovy        |    54 -
 .../aggregate/aggregate_groupby_simplify.groovy    |    23 -
 .../aggregate/aggregate_grouping_function.groovy   |    95 -
 .../aggregate/aggregate_having_grouping.groovy     |    58 -
 .../aggregate/aggregate_output_null.groovy         |    92 -
 .../nereids_p0/aggregate/window_funnel.groovy      |   747 -
 .../authorization/column_authorization.groovy      |    86 -
 .../authorization/view_authorization.groovy        |    95 -
 .../nereids_p0/cache/mtmv_with_sql_cache.groovy    |  1009 -
 .../nereids_p0/cache/mv_with_sql_cache.groovy      |   273 -
 .../cache/parse_sql_from_sql_cache.groovy          |  1250 -
 .../colocate/test_multi_cast_colocate.groovy       |    59 -
 .../colocate/test_set_operation_colocate.groovy    |   104 -
 .../create_table/test_create_blocked.groovy        |   156 -
 .../create_table/test_create_table.groovy          |    80 -
 .../nereids_p0/cte/test_cte_column_pruning.groovy  |   143 -
 .../nereids_p0/cte/test_cte_filter_pushdown.groovy |    79 -
 .../suites/nereids_p0/datatype/test_cast.groovy    |   245 -
 .../nereids_p0/datatype/test_date_acquire.groovy   |    37 -
 .../datatype/test_date_implicit_cast.groovy        |    88 -
 .../datatype/test_datetime_overflow.groovy         |    36 -
 .../suites/nereids_p0/datatype/test_datev1.groovy  |    89 -
 .../nereids_p0/datatype/test_decimalv2.groovy      |    90 -
 .../suites/nereids_p0/datatype/test_map.groovy     |    69 -
 .../ddl/alter/test_alter_user_nereids.groovy       |    29 -
 .../set_and_unset_variable_command.groovy          |   116 -
 .../suites/nereids_p0/delete/delete_cte.groovy     |   121 -
 .../suites/nereids_p0/delete/delete_cte_ck.groovy  |   123 -
 .../delete/delete_mow_partial_update.groovy        |   194 -
 .../suites/nereids_p0/delete/delete_using.groovy   |   131 -
 .../suites/nereids_p0/drop/drop_resource.groovy    |    31 -
 .../suites/nereids_p0/eager_agg/eager_agg.groovy   |   414 -
 .../eliminate_outer_join.groovy                    |   204 -
 .../suites/nereids_p0/empty_table/ddl/empty.sql    |     7 -
 .../suites/nereids_p0/empty_table/load.groovy      |    34 -
 .../nereids_p0/empty_table/sql/avg_decimal.sql     |     1 -
 .../except/test_analyzer_exception.groovy          |    30 -
 .../nereids_p0/except/test_bound_exception.groovy  |    52 -
 .../nereids_p0/except/test_query_except.groovy     |    27 -
 .../suites/nereids_p0/explain/explain_graph.groovy |    69 -
 .../explain/test_datetime_filter_stats0.groovy     |    49 -
 .../explain/test_global_partition_topn_plan.groovy |    77 -
 .../test_outerjoin_isnull_estimation.groovy        |    94 -
 .../explain/test_pushdown_explain.groovy           |   419 -
 .../test_scan_preaggregation_explain.groovy        |    49 -
 .../nereids_p0/expression/case_when_to_if.groovy   |    71 -
 .../fold_constant/fe_constant_cast_to_date.groovy  |   184 -
 .../fe_constant_cast_to_datetime.groovy            |   184 -
 .../fe_constant_cast_to_fractional.groovy          |   119 -
 .../fold_constant/fe_constant_cast_to_int.groovy   |   339 -
 .../expression/fold_constant/fe_try_cast.groovy    |    52 -
 .../fold_constant/fold_constant_by_be.groovy       |   124 -
 .../fold_constant/fold_constant_by_fe.groovy       |   217 -
 .../fold_constant/fold_constant_cast.groovy        |    51 -
 .../fold_constant_date_arithmatic.groovy           |    86 -
 .../fold_constant/fold_constant_nullable.groovy    |   178 -
 .../fold_constant_numeric_arithmatic.groovy        |   638 -
 .../fold_constant_string_arithmatic.groovy         |  2053 --
 .../nereids_p0/expression/topn_to_max.groovy       |    49 -
 .../nereids_p0/forbid_unknown_col_stats.groovy     |    48 -
 .../group_concat/test_group_concat.groovy          |   138 -
 .../grouping_sets/test_grouping_sets.groovy        |    59 -
 .../grouping_sets/test_grouping_sets1.groovy       |   114 -
 .../hash_shuffle_key_prune.groovy                  |   196 +
 .../suites/nereids_p0/hint/fix_leading.groovy      |   275 -
 .../suites/nereids_p0/hint/multi_leading.groovy    |   144 -
 .../suites/nereids_p0/hint/test_hint.groovy        |   224 -
 .../suites/nereids_p0/hint/test_leading.groovy     |  1159 -
 .../suites/nereids_p0/hint/test_use_mv.groovy      |   238 -
 .../nereids_p0/infer_expr_name/query13.groovy      |    81 -
 .../nereids_p0/infer_expr_name/query14.groovy      |   137 -
 .../nereids_p0/infer_expr_name/query15.groovy      |    49 -
 .../nereids_p0/infer_expr_name/query2.groovy       |    94 -
 .../nereids_p0/infer_expr_name/query23.groovy      |    80 -
 .../nereids_p0/infer_expr_name/query35.groovy      |   102 -
 .../nereids_p0/infer_expr_name/query38.groovy      |    51 -
 .../nereids_p0/infer_expr_name/query41.groovy      |    80 -
 .../nereids_p0/infer_expr_name/query42.groovy      |    53 -
 .../nereids_p0/infer_expr_name/query45.groovy      |    50 -
 .../nereids_p0/infer_expr_name/query59.groovy      |    81 -
 .../nereids_p0/infer_expr_name/query61.groovy      |    74 -
 .../nereids_p0/infer_expr_name/query62.groovy      |    63 -
 .../nereids_p0/infer_expr_name/query8.groovy       |   136 -
 .../nereids_p0/infer_expr_name/query85.groovy      |   115 -
 .../infer_predicate/infer_predicate.groovy         |    69 -
 .../nereids_p0/insert_into_table/aggregate.groovy  |   106 -
 .../insert_into_table/complex_insert.groovy        |   212 -
 .../nereids_p0/insert_into_table/duplicate.groovy  |   116 -
 .../insert_into_table/insert_auth.groovy           |    87 -
 .../nereids_p0/insert_into_table/insert_cte.groovy |    70 -
 .../insert_into_table/insert_values.groovy         |   197 -
 .../insert_into_table/nereids_insert_random.groovy |   133 -
 .../insert_into_table/no_partition.groovy          |   298 -
 .../insert_into_table/partial_update.groovy        |   286 -
 .../partial_update_complex.groovy                  |   133 -
 .../partial_update_seq_col.groovy                  |   123 -
 .../insert_into_table/type_cast_aggregate.groovy   |    90 -
 .../insert_into_table/type_cast_duplicate.groovy   |   100 -
 .../insert_into_table/type_cast_unique.groovy      |   154 -
 .../nereids_p0/insert_into_table/unique.groovy     |   186 -
 .../insert_into_table/unsupport_type.groovy        |    27 -
 .../update_on_current_timestamp.groovy             |   195 -
 .../nereids_p0/intersect/test_intersect.groovy     |    25 -
 .../javaudf/collect/test_javaudf_groupcount.groovy |    62 -
 .../collect/test_javaudf_murmurhash3.groovy        |    63 -
 .../javaudf/collect/test_javaudf_sessionize.groovy |    66 -
 .../javaudf/date/test_javaudf_adddays.groovy       |    63 -
 .../javaudf/date/test_javaudf_addisoperioud.groovy |    63 -
 .../javaudf/date/test_javaudf_daydiff.groovy       |    64 -
 .../json/test_javaudf_convertfromcamelcase.groovy  |    63 -
 .../json/test_javaudf_converttocamelcase.groovy    |    63 -
 .../javaudf/sanity/test_javaudf_assertequal.groovy |    65 -
 .../sanity/test_javaudf_assertlessthan.groovy      |    65 -
 .../javaudf/sanity/test_javaudf_assertudf.groovy   |    55 -
 .../javaudf/sketch/test_javaudf_md5.groovy         |    63 -
 .../nereids_p0/javaudf/test_alias_function.groovy  |    92 -
 .../javaudf/test_javaudaf_my_date_datetime.groovy  |   127 -
 .../test_javaudaf_mygroupconcat_string.groovy      |    78 -
 .../javaudf/test_javaudaf_mysum_array.groovy       |   126 -
 .../javaudf/test_javaudaf_mysum_decimal.groovy     |    74 -
 .../test_javaudaf_mysum_float_double.groovy        |    94 -
 .../javaudf/test_javaudaf_mysum_int.groovy         |    84 -
 .../javaudf/test_javaudaf_null_test.groovy         |    81 -
 .../nereids_p0/javaudf/test_javaudf_array.groovy   |   132 -
 .../nereids_p0/javaudf/test_javaudf_boolean.groovy |    75 -
 .../nereids_p0/javaudf/test_javaudf_case.groovy    |    73 -
 .../nereids_p0/javaudf/test_javaudf_date.groovy    |   211 -
 .../nereids_p0/javaudf/test_javaudf_decimal.groovy |    86 -
 .../nereids_p0/javaudf/test_javaudf_float.groovy   |    93 -
 .../nereids_p0/javaudf/test_javaudf_int.groovy     |   127 -
 .../nereids_p0/javaudf/test_javaudf_ip.groovy      |   146 -
 .../nereids_p0/javaudf/test_javaudf_null.groovy    |    74 -
 .../nereids_p0/javaudf/test_javaudf_string.groovy  |   107 -
 .../nereids_p0/join/asof/test_asof_join.groovy     |  1621 -
 .../asof/test_asof_join_build_expr_edge.groovy     |   401 -
 .../join/asof/test_asof_join_expr.groovy           |   477 -
 .../join/asof/test_asof_join_large_bucket.groovy   |   145 -
 .../join/colocate_join_with_rollup.groovy          |   192 -
 .../suites/nereids_p0/join/ddl/full_join_table.sql |    11 -
 .../suites/nereids_p0/join/ddl/left_table.sql      |    12 -
 .../suites/nereids_p0/join/ddl/right_table.sql     |    12 -
 .../suites/nereids_p0/join/ddl/table.sql           |    16 -
 .../suites/nereids_p0/join/ddl/table_1.sql         |    12 -
 .../suites/nereids_p0/join/ddl/table_2.sql         |    12 -
 .../suites/nereids_p0/join/ddl/table_3.sql         |    19 -
 .../join/ddl/test_bucket_shuffle_join.sql          |    16 -
 .../suites/nereids_p0/join/ddl/test_join.sql       |    11 -
 .../suites/nereids_p0/join/ddl/test_left_join1.sql |    12 -
 regression-test/suites/nereids_p0/join/load.groovy |    49 -
 .../join/outer_join_with_empty_node.groovy         |    83 -
 .../agg_output_as_right_tale_left_outer_order.sql  |     4 -
 .../nereids_p0/join/sql/bucket_shuffle_join.sql    |     4 -
 .../suites/nereids_p0/join/sql/full_join.sql       |     5 -
 .../suites/nereids_p0/join/sql/issue_12689.sql     |     6 -
 .../suites/nereids_p0/join/sql/issue_7288.sql      |     4 -
 .../suites/nereids_p0/join/sql/test_outer_join.sql |     5 -
 .../sql/test_outer_join_with_delete_column.sql     |    20 -
 .../nereids_p0/join/test_bitmap_filter.groovy      |    99 -
 .../suites/nereids_p0/join/test_join.groovy        |   242 -
 .../suites/nereids_p0/join/test_join2.groovy       |   170 -
 .../suites/nereids_p0/join/test_join3.groovy       |    98 -
 .../suites/nereids_p0/join/test_join4.groovy       |    61 -
 .../suites/nereids_p0/join/test_join5.groovy       |   173 -
 .../suites/nereids_p0/join/test_join_11.groovy     |   271 -
 .../suites/nereids_p0/join/test_join_12.groovy     |   210 -
 .../suites/nereids_p0/join/test_join_13.groovy     |   247 -
 .../suites/nereids_p0/join/test_join_14.groovy     |   227 -
 .../suites/nereids_p0/join/test_join_15.groovy     |   217 -
 .../nereids_p0/join/test_join_dphyper.groovy       |    37 -
 .../nereids_p0/join/test_join_local_shuffle.groovy |    85 -
 .../suites/nereids_p0/join/test_join_on.groovy     |    54 -
 .../suites/nereids_p0/join/test_left_join1.groovy  |    44 -
 .../nereids_p0/join/test_left_join_null.groovy     |    68 -
 .../suites/nereids_p0/join/test_limit_join.groovy  |   105 -
 .../nereids_p0/join/test_many_multi_join.groovy    |   906 -
 .../suites/nereids_p0/join/test_mark_join.groovy   |   166 -
 .../join/test_nestedloop_outer_join.groovy         |   128 -
 .../join/test_nestedloop_semi_anti_join.groovy     |    91 -
 .../join/test_other_conjuncts_nullable.groovy      |    64 -
 .../suites/nereids_p0/join/test_outer_join.groovy  |   113 -
 .../join/test_runtimefilter_on_datev2.groovy       |   335 -
 .../join/test_runtimefilter_on_decimal.groovy      |    68 -
 .../suites/nereids_p0/keyword/order_group.groovy   |   223 -
 .../suites/nereids_p0/keyword/test_keyword.groovy  |   122 -
 .../nereids_p0/large_wide_table/ddl/create.sql     |   194 -
 .../nereids_p0/large_wide_table/ddl/insert.sql     |     1 -
 .../large_wide_table/large_wide_table.groovy       |    27 -
 .../nereids_p0/lateral_view/test_issue_11986.sql   |     5 -
 .../nereids_p0/lateral_view/test_issue_8850.sql    |    14 -
 .../limit/OffsetInSubqueryWithJoin.groovy          |    44 -
 .../suites/nereids_p0/limit/ddl/lineitem.sql       |    18 -
 .../suites/nereids_p0/limit/ddl/nation.sql         |    12 -
 .../suites/nereids_p0/limit/ddl/part.sql           |    11 -
 .../suites/nereids_p0/limit/ddl/partsupp.sql       |     7 -
 .../suites/nereids_p0/limit/ddl/region.sql         |    10 -
 .../suites/nereids_p0/limit/ddl/supplier.sql       |     9 -
 .../suites/nereids_p0/limit/ddl/workers.sql        |    10 -
 .../nereids_p0/limit/filterLimitProject.groovy     |    58 -
 .../suites/nereids_p0/limit/load.groovy            |    65 -
 .../nereids_p0/limit/sql/predicateNotProjected.sql |     3 -
 .../limit/sql/useRestrictiveLimitFromSubq.sql      |     3 -
 .../suites/nereids_p0/limit/sql/withGroupBy.sql    |     4 -
 .../limit/sql/withGroupByAndOrderByInSubq.sql      |     4 -
 .../nereids_p0/limit/sql/withGroupByInSubq.sql     |     5 -
 .../suites/nereids_p0/limit/sql/withJoinInSubq.sql |     2 -
 .../suites/nereids_p0/limit/sql/withLimitZero.sql  |     3 -
 .../suites/nereids_p0/limit/sql/withOrderBy.sql    |     4 -
 .../nereids_p0/limit/sql/withSimpleLimit.sql       |     2 -
 .../suites/nereids_p0/limit/sql/withSubq.sql       |     3 -
 regression-test/suites/nereids_p0/load.groovy      |   120 -
 .../test_enable_local_exchange_before_agg.groovy   |   117 +
 .../operator/test_arithmetic_operators.groovy      |    82 -
 .../operator/test_logical_operators.groovy         |    44 -
 .../agg_state/test_outfile_agg_state.groovy        |    73 -
 .../agg_state_array/test_outfile_agg_array.groovy  |    72 -
 .../test_outfile_agg_state_bitmap.groovy           |    71 -
 .../nereids_p0/outfile/hll/test_outfile_hll.groovy |    74 -
 .../test_outfile_quantile_state.groovy             |    75 -
 .../suites/nereids_p0/outfile/test_outfile.groovy  |   262 -
 .../outfile/test_outfile_csv_with_names.groovy     |   179 -
 .../outfile/test_outfile_exception.groovy          |   166 -
 .../nereids_p0/outfile/test_outfile_expr.groovy    |   154 -
 .../nereids_p0/outfile/test_outfile_parquet.groovy |   185 -
 .../outfile/test_outfile_separator.groovy          |   112 -
 .../test_physical_translator.groovy                |    51 -
 .../repeat/test_repeat_output_slot.groovy          |    82 -
 .../nereids_p0/runtime_filter/expr-target.groovy   |   106 -
 .../select_no_from/sql/projectAggFuncs.sql         |    17 -
 .../select_no_from/sql/projectConstants.sql        |     2 -
 .../select_no_from/sql/projectFunctions.sql        |     2 -
 .../select_no_from/sql/withGroupOrderHaving.sql    |     9 -
 .../nereids_p0/select_no_from/sql/withUnionAll.sql |    11 -
 .../select_no_from/sql/withWhereClause.sql         |     3 -
 .../select_no_from/sql/withWhereFalse.sql          |     3 -
 .../select_tablets/select_with_tablets.groovy      |   118 -
 .../session_variable/test_default_limit.groovy     |   316 -
 .../session_variable/test_variable_between.groovy  |    33 -
 .../nereids_p0/set_operations/ddl/lineitem.sql     |    18 -
 .../nereids_p0/set_operations/ddl/nation.sql       |    12 -
 .../suites/nereids_p0/set_operations/ddl/part.sql  |    11 -
 .../nereids_p0/set_operations/ddl/partsupp.sql     |     7 -
 .../nereids_p0/set_operations/ddl/region.sql       |    10 -
 .../nereids_p0/set_operations/ddl/supplier.sql     |     9 -
 .../nereids_p0/set_operations/ddl/workers.sql      |    10 -
 .../suites/nereids_p0/set_operations/except.groovy |   131 -
 .../suites/nereids_p0/set_operations/load.groovy   |    64 -
 .../set_operations/sql/except_1_order.sql          |    10 -
 .../set_operations/sql/except_2_order.sql          |    10 -
 .../set_operations/sql/except_3_order.sql          |     3 -
 .../set_operations/sql/intersect_1_order.sql       |     8 -
 .../set_operations/sql/intersect_2_order.sql       |     8 -
 .../nereids_p0/show/test_array_show_create.groovy  |    72 -
 .../show/test_nereids_show_functions.groovy        |   196 -
 .../show/test_show_analyze_task_status_cmd.groovy  |    78 -
 .../show/test_show_clusters_command.groovy         |    27 -
 .../show/test_show_column_stats_command.groovy     |    54 -
 .../show/test_show_columns_command.groovy          |    60 -
 .../show/test_show_open_tables_command.groovy      |    32 -
 .../show/test_show_status_command.groovy           |    31 -
 .../test_show_warning_error_count_command.groovy   |    32 -
 .../suites/nereids_p0/show/test_show_where.groovy  |   103 -
 regression-test/suites/nereids_p0/sort/sort.groovy |   139 -
 .../test_aggregate_all_functions.groovy            |   544 -
 .../aggregate_functions/test_aggregate_bit.groovy  |    72 -
 .../test_aggregate_collect.groovy                  |    78 -
 ...est_aggregate_percentile_approx_weighted.groovy |    71 -
 .../test_aggregate_percentile_no_cast.groovy       |   133 -
 .../test_aggregate_retention.sql                   |    88 -
 .../test_aggregate_sequence_match.sql              |   105 -
 .../test_aggregate_window_functions.groovy         |   526 -
 .../test_approx_count_distinct.groovy              |    23 -
 .../sql_functions/array_functions/sql/q01.sql      |    29 -
 .../sql_functions/array_functions/sql/q02.sql      |    51 -
 .../sql_functions/array_functions/sql/q03.sql      |    12 -
 .../sql_functions/array_functions/sql/q04.sql      |   129 -
 .../test_array_aggregation_functions.groovy        |    60 -
 .../array_functions/test_array_contains_all.groovy |   125 -
 .../array_functions/test_array_filter.groovy       |   204 -
 .../array_functions/test_array_functions.groovy    |   211 -
 .../test_array_functions_by_literal.groovy         |   344 -
 ...test_array_functions_of_array_difference.groovy |    48 -
 .../test_array_functions_with_where.groovy         |    68 -
 .../array_functions/test_issue_13606.groovy        |    58 -
 .../bitmap_functions/test_bitmap_function.groovy   |   654 -
 .../case_function/test_case_function.groovy        |  1282 -
 .../cast_function/test_cast_array_function.groovy  |    52 -
 .../test_cast_array_functions_by_literal.groovy    |   128 -
 .../cast_function/test_cast_function.groovy        |    35 -
 .../cast_function/test_cast_string_to_array.groovy |    50 -
 .../conditional_functions/test_coalesce.groovy     |    38 -
 .../test_conditional_function.groovy               |   152 -
 .../conditional_functions/test_if.groovy           |    51 -
 .../conditional_functions/test_nullif.groovy       |   156 -
 .../conditional_functions/test_nvl.groovy          |    22 -
 .../test_query_between.groovy                      |    40 -
 .../conditional_functions/test_query_in.groovy     |   113 -
 .../conditional_functions/test_query_like.groovy   |    57 -
 .../conditional_functions/test_query_limit.groovy  |    63 -
 .../conditional_functions/test_query_where.groovy  |    60 -
 .../convertion_functions/sql/castAccessible.sql    |     2 -
 .../datetime_functions/test_date_function.groovy   |   898 -
 ...st_date_or_datetime_computation_negative.groovy |   316 -
 .../datetime_functions/test_dayofweek.groovy       |    22 -
 .../datetime_functions/test_time_lut.groovy        |   112 -
 .../datetime_functions/test_timestampdiff.groovy   |    41 -
 .../digital-masking/test_digital_masking.groovy    |    24 -
 .../test_encryption_function.groovy                |   111 -
 .../encryption_digest/test_md5.groovy              |    22 -
 .../hash_functions/test_hash_function.groovy       |    37 -
 .../sql/atTimeZoneAccessible.sql                   |     8 -
 .../sql/dateTimeOperatorsAccessible.sql            |    10 -
 .../horology_functions/sql/extractAccessible.sql   |     5 -
 .../json_function/test_query_json_array.groovy     |    48 -
 .../json_function/test_query_json_insert.groovy    |    48 -
 .../json_function/test_query_json_object.groovy    |    50 -
 .../json_function/test_query_json_replace.groovy   |    48 -
 .../json_function/test_query_json_set.groovy       |    48 -
 .../json_functions/test_get_json_double.groovy     |    24 -
 .../json_functions/test_json_function.groovy       |    70 -
 .../sql_functions/math_functions/test_abs.groovy   |    32 -
 .../sql_functions/math_functions/test_conv.groovy  |    45 -
 .../math_functions/test_multiply.groovy            |    34 -
 .../sql_functions/math_functions/test_round.groovy |    62 -
 .../math_functions/test_round_overflow.groovy      |    25 -
 .../test_multi_string_position.groovy              |    45 -
 .../test_multi_string_search.groovy                |    51 -
 .../spatial_functions/test_gis_function.groovy     |   508 -
 .../spatial_functions/test_st_astext.groovy        |    22 -
 .../string_functions/ddl/lineitem.sql              |    18 -
 .../sql_functions/string_functions/ddl/nation.sql  |    12 -
 .../sql_functions/string_functions/ddl/part.sql    |    11 -
 .../string_functions/ddl/partsupp.sql              |     7 -
 .../sql_functions/string_functions/ddl/region.sql  |    10 -
 .../string_functions/ddl/supplier.sql              |     9 -
 .../sql_functions/string_functions/ddl/workers.sql |    10 -
 .../sql_functions/string_functions/load.groovy     |    64 -
 .../sql/likeOperatorWorks_order.sql                |     1 -
 .../string_functions/test_reverse.groovy           |    24 -
 .../string_functions/test_split_by_string.groovy   |   197 -
 .../string_functions/test_split_part.groovy        |    38 -
 .../string_functions/test_string_function.groovy   |   297 -
 .../test_string_function_like.groovy               |    83 -
 .../test_string_function_like_pushdown.groovy      |    96 -
 .../test_string_function_regexp.groovy             |   117 -
 .../sql_functions/table_function/explode.groovy    |    43 -
 .../table_function/explode_json_array.groovy       |    67 -
 .../table_function/explode_map.groovy              |    58 -
 .../table_function/explode_split.groovy            |    47 -
 .../sql_functions/table_function/posexplode.groovy |   209 -
 .../sql_functions/test_arith_functions.groovy      |    54 -
 .../nereids_p0/sql_functions/test_in_expr.groovy   |   141 -
 .../test_width_bucket_function.groovy              |    88 -
 .../window_functions/ddl/lineitem.sql              |    18 -
 .../sql_functions/window_functions/ddl/nation.sql  |    12 -
 .../sql_functions/window_functions/ddl/part.sql    |    11 -
 .../window_functions/ddl/partsupp.sql              |     7 -
 .../sql_functions/window_functions/ddl/region.sql  |    10 -
 .../window_functions/ddl/supplier.sql              |     9 -
 .../sql_functions/window_functions/ddl/workers.sql |    10 -
 .../sql_functions/window_functions/load.groovy     |    66 -
 .../sql_functions/window_functions/sql/leadLag.sql |    12 -
 .../sql/noOrderAllRowsPeers_order.sql              |     4 -
 .../window_functions/sql/rangeCurrent_order.sql    |     2 -
 .../sql/rangeNoPartition_order.sql                 |     5 -
 .../window_functions/sql/rangeUnbounded_order.sql  |     2 -
 .../window_functions/sql/rowsDifferentOrders.sql   |    11 -
 .../window_functions/sql/rowsDisjointWindows.sql   |    11 -
 .../window_functions/sql/rowsFirstLast.sql         |     9 -
 .../window_functions/sql/rowsFrame2F3F.sql         |     8 -
 .../window_functions/sql/rowsFrame2FUBF.sql        |     4 -
 .../window_functions/sql/rowsFrame3P2P.sql         |     8 -
 .../window_functions/sql/rowsFrameUBP2P.sql        |     8 -
 .../window_functions/sql/rowsIdenticalWindows.sql  |    14 -
 .../sql/rowsIntersectingWindows.sql                |    15 -
 .../window_functions/sql/rowsUBPImplicitCR.sql     |     8 -
 .../window_functions/sql/rowsUnbounded_order.sql   |     2 -
 .../sql/windowSpecificationAAcpA.sql               |    12 -
 .../sql/windowSpecificationABA.sql                 |    11 -
 .../sql/windowSpecificationABcpA.sql               |    11 -
 .../window_functions/test_count_star.groovy        |    22 -
 .../window_functions/test_lead_lag_nullable.groovy |    80 -
 .../window_functions/test_ntile_function.groovy    |    89 -
 .../test_select_stddev_variance_window.groovy      |   217 -
 .../sql_functions/window_functions/test_sum.groovy |    27 -
 .../window_functions/test_window_fn.groovy         |   405 -
 .../window_functions/test_window_function.groovy   |   495 -
 .../nereids_p0/stats/col_stats/column_stats.groovy |   112 -
 .../stats/col_stats/hot_value_analyze_sync.groovy  |    36 -
 .../stats/invalid_stats/invalid_stats.groovy       |    78 -
 .../nereids_p0/stats/partitionRowCount.groovy      |    41 -
 .../subquery/correlated_scalar_subquery.groovy     |   251 -
 .../nereids_p0/subquery/subquery_unnesting.groovy  |   145 -
 .../subquery/test_inlineview_with_project.groovy   |    82 -
 .../nereids_p0/subquery/test_subquery.groovy       |   300 -
 .../subquery/test_subquery_in_project.groovy       |   200 -
 .../suites/nereids_p0/system/test_query_sys.groovy |    64 -
 .../system/test_query_sys_data_type.groovy         |    50 -
 .../nereids_p0/system/test_query_sys_tables.groovy |   196 -
 .../nereids_p0/system/test_runtime_filter.groovy   |    25 -
 .../test_alter_catalog_comment_command.groovy      |    54 -
 .../test_alter_catalog_properties_command.groovy   |    55 -
 .../test_alter_catalog_rename_command.groovy       |    55 -
 .../test_alter_database_properties_command.groovy  |    35 -
 .../nereids_p0/test_char_implicit_cast.groovy      |    27 -
 .../nereids_p0/test_create_catalog_command.groovy  |    43 -
 .../test_create_workload_policy_command.groovy     |    32 -
 .../suites/nereids_p0/test_data_type_marks.groovy  |    44 -
 .../suites/nereids_p0/test_dict_with_null.groovy   |    51 -
 .../nereids_p0/test_disable_parallel_scan.groovy   |    58 -
 .../nereids_p0/test_drop_catalog_command.groovy    |    43 -
 .../nereids_p0/test_filter_pushdown_set.groovy     |    42 -
 .../test_forbid_unknown_col_stats.groovy           |    56 -
 .../nereids_p0/test_install_plugin_command.groovy  |    57 -
 .../nereids_p0/test_lock_tables_command.groovy     |    51 -
 .../suites/nereids_p0/test_mv_select.groovy        |    80 -
 .../nereids_p0/test_orderby_nullliteral.groovy     |    40 -
 .../suites/nereids_p0/test_prune_tablet_mv.groovy  |    45 -
 .../suites/nereids_p0/test_select_constant.groovy  |    23 -
 .../test_select_with_predicate_like.groovy         |    38 -
 .../nereids_p0/test_selelct_hidden_col.groovy      |    40 -
 .../nereids_p0/test_show_stages_command.groovy     |    30 -
 .../suites/nereids_p0/test_timeout_fallback.groovy |    43 -
 .../suites/nereids_p0/test_transaction.groovy      |    75 -
 .../nereids_p0/test_unlock_tables_command.groovy   |    40 -
 .../suites/nereids_p0/test_user_var.groovy         |    73 -
 .../test_binary_predicate_cast.groovy              |    38 -
 .../nereids_p0/type_inference/test_largeint.groovy |    47 -
 .../suites/nereids_p0/union/or_expansion.groovy    |   257 -
 .../suites/nereids_p0/union/test_union.groovy      |   341 -
 .../suites/nereids_p0/update/update_cte.groovy     |   109 -
 .../nereids_p0/update/update_unique_table.groovy   |   116 -
 .../nereids_p0/wide_table/sql/wide_table.sql       |  2026 --
 .../suites/nereids_p0/with/test_with.groovy        |    55 -
 .../with/test_with_and_two_phase_agg.groovy        |    42 -
 .../agg_strategy/agg_strategy.groovy               |    32 +
 .../agg_strategy/distinct_agg_rewriter.groovy      |     1 +
 .../distinct_agg_strategy_selector.groovy          |    11 +-
 .../agg_strategy/test_variables.groovy             |     7 +-
 .../nested_container_offset_pruning.groovy         |    85 +
 .../string_length_column_pruning.groovy            |   580 +
 .../count_null_not_count_star.groovy               |   137 +
 .../lazy_materialize_topn.groovy                   |    75 -
 .../defer_materialize_topn/one_phase.groovy        |    50 -
 .../agg_with_roll_up/aggregate_with_roll_up.groovy |   201 +-
 .../mv/agg_with_roll_up/any_value_roll_up.groovy   |    48 +-
 .../mv/dimension/dimension_1.groovy                |    49 +-
 .../mv/dimension/dimension_2_3.groovy              |    35 +-
 .../mv/dimension/dimension_2_4.groovy              |    45 +-
 .../mv/dimension/dimension_2_5.groovy              |    27 +-
 .../mv/dimension/dimension_2_6.groovy              |    31 +-
 .../mv/dimension/dimension_2_full_join.groovy      |    25 +-
 .../mv/dimension/dimension_2_inner_join.groovy     |    25 +-
 .../mv/dimension/dimension_2_left_anti_join.groovy |    25 +-
 .../mv/dimension/dimension_2_left_join.groovy      |    33 +-
 .../mv/dimension/dimension_2_left_semi_join.groovy |    25 +-
 .../dimension/dimension_2_right_anti_join.groovy   |    25 +-
 .../mv/dimension/dimension_2_right_join.groovy     |    33 +-
 .../dimension/dimension_2_right_semi_join.groovy   |    25 +-
 .../mv/dimension/dimension_self_conn.groovy        |    25 +-
 .../dimension_2_join_agg.groovy                    |    43 +-
 .../mv/dimension_predicate/left_join_filter.groovy |     4 +-
 .../dimension_predicate/right_join_filter.groovy   |     4 +-
 .../mv/grouping_sets/grouping_sets.groovy          |     1 -
 .../cross_join_list_str_increment_create.groovy    |    10 +-
 .../cross_join_range_date_increment_create.groovy  |    10 +-
 ...cross_join_range_number_increment_create.groovy |    10 +-
 .../full_join_list_str_increment_create.groovy     |    10 +-
 .../full_join_range_date_increment_create.groovy   |    10 +-
 .../full_join_range_number_increment_create.groovy |    10 +-
 .../inner_join_list_str_increment_create.groovy    |    10 +-
 .../inner_join_range_date_increment_create.groovy  |    10 +-
 ...inner_join_range_number_increment_create.groovy |    10 +-
 ...left_anti_join_list_str_increment_create.groovy |    10 +-
 ...ft_anti_join_range_date_increment_create.groovy |    10 +-
 ..._anti_join_range_number_increment_create.groovy |    10 +-
 .../left_join_list_str_increment_create.groovy     |    10 +-
 .../left_join_range_date_increment_create.groovy   |    10 +-
 .../left_join_range_number_increment_create.groovy |    10 +-
 ...left_semi_join_list_str_increment_create.groovy |    10 +-
 ...ft_semi_join_range_date_increment_create.groovy |    10 +-
 ..._semi_join_range_number_increment_create.groovy |    10 +-
 ...ight_anti_join_list_str_increment_create.groovy |    10 +-
 ...ht_anti_join_range_date_increment_create.groovy |    10 +-
 ..._anti_join_range_number_increment_create.groovy |    10 +-
 .../right_join_list_str_increment_create.groovy    |    10 +-
 .../right_join_range_date_increment_create.groovy  |    10 +-
 ...right_join_range_number_increment_create.groovy |    10 +-
 ...ight_semi_join_list_str_increment_create.groovy |    10 +-
 ...ht_semi_join_range_date_increment_create.groovy |    10 +-
 ..._semi_join_range_number_increment_create.groovy |    10 +-
 .../self_conn_list_str_increment_create.groovy     |    10 +-
 .../self_conn_range_date_increment_create.groovy   |    10 +-
 .../self_conn_range_number_increment_create.groovy |    10 +-
 .../mv/join/dphyp_outer/outer_join_dphyp.groovy    |   984 +-
 .../outer_join_two_hop_null_reject.groovy          |   138 +
 .../join_elim_p_f_key/join_elim_filter_edge.groovy |    79 +
 .../join_elim_line_pattern.groovy                  |    24 +-
 .../join_elim_star_pattern.groovy                  |    36 +-
 .../inner_join_infer_and_derive.groovy             |    24 +-
 .../left_join_infer_and_derive.groovy              |     2 +-
 .../right_join_infer_and_derive.groovy             |     2 +-
 .../mv/nested_mtmv/nested_mtmv.groovy              |     8 +-
 .../mv/pre_rewrite/strategy/dp_hyper.groovy        |   298 +-
 .../runtime_filter/rf_pushdown_expr.groovy         |   105 +
 .../simplify_conditional_function.groovy           |    47 +
 ...lter_above_consumer_with_unique_function.groovy |    49 +
 ...er_through_generate_with_unique_function.groovy |    49 +
 .../suites/nereids_syntax_p0/set_operation.groovy  |     2 +-
 .../suites/nereids_tpch_p0/tpch/agg_cse.groovy     |     6 +-
 regression-test/suites/opensky_p2/load.groovy      |     2 +-
 .../test_auto_partition_retention_restart.groovy   |    94 +
 .../suites/point_query_p0/test_point_query.groovy  |    31 +
 .../pythonudaf_p0/test_pythonudaf_basic.groovy     |     2 +-
 ...st_pythonudaf_complex_aggregation_inline.groovy |    16 +-
 ...st_pythonudaf_complex_aggregation_module.groovy |     2 +-
 ..._pythonudaf_complex_state_objects_inline.groovy |     2 +-
 ..._pythonudaf_complex_state_objects_module.groovy |     2 +-
 .../test_pythonudaf_concurrent.groovy              |    13 +-
 .../test_pythonudaf_data_types.groovy              |    18 +-
 .../pythonudaf_p0/test_pythonudaf_drop.groovy      |   104 +-
 .../test_pythonudaf_edge_cases.groovy              |    18 +-
 .../test_pythonudaf_forbidden_module.groovy        |    85 +
 .../pythonudaf_p0/test_pythonudaf_inline.groovy    |   179 +-
 .../test_pythonudaf_inline_simple.groovy           |     2 +-
 .../test_pythonudaf_nested_query.groovy            |     8 +-
 .../test_pythonudaf_null_handling.groovy           |    12 +-
 .../test_pythonudaf_pkg_isolation.groovy           |    95 +
 .../pythonudaf_p0/test_pythonudaf_simple.groovy    |     2 +-
 .../test_pythonudaf_window_advanced_inline.groovy  |    14 +-
 .../test_pythonudaf_window_advanced_module.groovy  |     2 +-
 .../test_pythonudaf_window_functions.groovy        |    10 +-
 .../pythonudaf_p0/test_pythonudf_udaf_mixed.groovy |     2 +-
 .../test_pythonudwf_comprehensive.groovy           |     2 +-
 .../suites/pythonudaf_p0/udaf_scripts/datetime.py  |    37 +
 .../udaf_scripts/forbidden/datetime.py             |    37 +
 .../pythonudaf_p0/udaf_scripts/forbidden/os.py     |    37 +
 .../udaf_scripts/forbidden/pathlib.py              |    37 +
 .../pythonudaf_p0/udaf_scripts/forbidden/pickle.py |    37 +
 .../suites/pythonudaf_p0/udaf_scripts/os.py        |    37 +
 .../suites/pythonudaf_p0/udaf_scripts/pathlib.py   |    37 +
 .../suites/pythonudaf_p0/udaf_scripts/pickle.py    |    37 +
 .../udaf_scripts/python_udaf_forbidden_module.zip  |   Bin 0 -> 1968 bytes
 .../udaf_scripts/python_udaf_pkg_a/mypkg/mod_x.py  |    47 +
 .../udaf_scripts/python_udaf_pkg_a/mypkg/mod_y.py  |    47 +
 .../python_udaf_pkg_a/python_udaf_pkg_test.zip     |   Bin 0 -> 1759 bytes
 .../udaf_scripts/python_udaf_pkg_b/mypkg/mod_x.py  |    47 +
 .../udaf_scripts/python_udaf_pkg_b/mypkg/mod_y.py  |    47 +
 .../python_udaf_pkg_b/python_udaf_pkg_test.zip     |   Bin 0 -> 1766 bytes
 .../udaf_scripts/safepkg_udaf/pathlib.py           |    37 +
 .../test_python_udaf_complex.groovy                |     2 +-
 .../test_python_udf_business_logic.groovy          |     2 +-
 .../test_python_udf_external_api.groovy            |     2 +-
 .../test_python_udf_nlp_chinese.groovy             |     2 +-
 .../test_python_udtf_complex.groovy                |     2 +-
 .../sanity/test_pythonudf_assertequal.groovy       |     2 +-
 .../sanity/test_pythonudf_assertlessthan.groovy    |     2 +-
 .../pythonudf_p0/test_pythonudf_aggregate.groovy   |     2 +-
 .../test_pythonudf_always_nullable.groovy          |     2 +-
 .../pythonudf_p0/test_pythonudf_array.groovy       |     2 +-
 .../test_pythonudf_base_data_type.groovy           |     2 +-
 .../pythonudf_p0/test_pythonudf_boolean.groovy     |     2 +-
 .../test_pythonudf_complex_data_type.groovy        |     2 +-
 .../pythonudf_p0/test_pythonudf_concurrent.groovy  |     2 +-
 .../pythonudf_p0/test_pythonudf_data_types.groovy  |     2 +-
 .../suites/pythonudf_p0/test_pythonudf_drop.groovy |   146 +-
 .../test_pythonudf_error_handling.groovy           |    65 +-
 .../test_pythonudf_file_protocol.groovy            |     2 +-
 .../pythonudf_p0/test_pythonudf_float.groovy       |     2 +-
 .../test_pythonudf_forbidden_module.groovy         |    75 +
 .../test_pythonudf_global_function.groovy          |     2 +-
 .../test_pythonudf_inline_complex.groovy           |     2 +-
 .../test_pythonudf_inline_scalar.groovy            |    27 +-
 .../test_pythonudf_inline_vector.groovy            |     2 +-
 .../suites/pythonudf_p0/test_pythonudf_int.groovy  |     2 +-
 .../suites/pythonudf_p0/test_pythonudf_ip.groovy   |     2 +-
 .../suites/pythonudf_p0/test_pythonudf_map.groovy  |     2 +-
 .../test_pythonudf_mixed_params.groovy             |     2 +-
 .../pythonudf_p0/test_pythonudf_module.groovy      |     2 +-
 .../test_pythonudf_module_advanced.groovy          |     2 +-
 .../test_pythonudf_module_scalar.groovy            |     2 +-
 .../test_pythonudf_module_vector.groovy            |     2 +-
 .../test_pythonudf_multiline_inline.groovy         |     2 +-
 .../pythonudf_p0/test_pythonudf_no_input.groovy    |    64 +
 .../test_pythonudf_pkg_isolation.groovy            |    84 +
 .../pythonudf_p0/test_pythonudf_ret_map.groovy     |     2 +-
 .../test_pythonudf_schema_check.groovy             |     2 +-
 .../pythonudf_p0/test_pythonudf_string.groovy      |     2 +-
 .../pythonudf_p0/udf_scripts/forbidden/json.py     |    22 +
 .../pythonudf_p0/udf_scripts/forbidden/logging.py  |    22 +
 .../pythonudf_p0/udf_scripts/forbidden/sys.py      |    22 +
 .../udf_scripts/forbidden/threading.py             |    22 +
 .../suites/pythonudf_p0/udf_scripts/json.py        |    22 +
 .../suites/pythonudf_p0/udf_scripts/logging.py     |    22 +
 .../udf_scripts/python_udf_forbidden_module.zip    |   Bin 0 -> 1468 bytes
 .../udf_scripts/python_udf_pkg_a/mypkg/mod_x.py    |    22 +
 .../udf_scripts/python_udf_pkg_a/mypkg/mod_y.py    |    22 +
 .../python_udf_pkg_a/python_udf_pkg_test.zip       |   Bin 0 -> 1460 bytes
 .../udf_scripts/python_udf_pkg_b/mypkg/mod_x.py    |    22 +
 .../udf_scripts/python_udf_pkg_b/mypkg/mod_y.py    |    22 +
 .../python_udf_pkg_b/python_udf_pkg_test.zip       |   Bin 0 -> 1462 bytes
 .../udf_scripts/safepkg_udf/logging.py             |    22 +
 .../suites/pythonudf_p0/udf_scripts/sys.py         |    22 +
 .../suites/pythonudf_p0/udf_scripts/threading.py   |    22 +
 .../test_pythonudtf_basic_inline.groovy            |    76 +-
 .../test_pythonudtf_basic_module.groovy            |     2 +-
 .../test_pythonudtf_data_types_inline.groovy       |    42 +-
 .../test_pythonudtf_data_types_module.groovy       |     2 +-
 .../pythonudtf_p0/test_pythonudtf_drop.groovy      |    53 +-
 .../test_pythonudtf_edge_cases_inline.groovy       |    28 +-
 .../test_pythonudtf_edge_cases_module.groovy       |     2 +-
 .../test_pythonudtf_exceptions_inline.groovy       |    28 +-
 .../test_pythonudtf_exceptions_module.groovy       |     2 +-
 .../test_pythonudtf_forbidden_module.groovy        |    98 +
 .../test_pythonudtf_io_patterns_inline.groovy      |    22 +-
 .../test_pythonudtf_io_patterns_module.groovy      |     2 +-
 .../pythonudtf_p0/test_pythonudtf_no_input.groovy  |    68 +
 .../test_pythonudtf_pkg_isolation.groovy           |   129 +
 .../test_pythonudtf_sql_integration_inline.groovy  |     8 +-
 .../test_pythonudtf_sql_integration_module.groovy  |     2 +-
 .../suites/pythonudtf_p0/udtf_scripts/base64.py    |    21 +
 .../pythonudtf_p0/udtf_scripts/forbidden/base64.py |    21 +
 .../udtf_scripts/forbidden/importlib.py            |    21 +
 .../udtf_scripts/forbidden/inspect.py              |    21 +
 .../udtf_scripts/forbidden/ipaddress.py            |    21 +
 .../suites/pythonudtf_p0/udtf_scripts/importlib.py |    21 +
 .../suites/pythonudtf_p0/udtf_scripts/inspect.py   |    21 +
 .../suites/pythonudtf_p0/udtf_scripts/ipaddress.py |    21 +
 .../udtf_scripts/python_udtf_forbidden_module.zip  |   Bin 0 -> 1550 bytes
 .../udtf_scripts/python_udtf_pkg_a/mypkg/mod_x.py  |    21 +
 .../udtf_scripts/python_udtf_pkg_a/mypkg/mod_y.py  |    21 +
 .../python_udtf_pkg_a/python_udtf_pkg_test.zip     |   Bin 0 -> 1456 bytes
 .../udtf_scripts/python_udtf_pkg_b/mypkg/mod_x.py  |    21 +
 .../udtf_scripts/python_udtf_pkg_b/mypkg/mod_y.py  |    21 +
 .../python_udtf_pkg_b/python_udtf_pkg_test.zip     |   Bin 0 -> 1461 bytes
 .../udtf_scripts/safepkg_udtf/inspect.py           |    21 +
 .../adaptive_batch_size/adaptive_batch_size.groovy |   208 +
 .../admin/test_nereids_admin_check_tablet.groovy   |     0
 .../aggregate/agg_distinct_case_when.groovy        |    52 +
 .../suites/query_p0/aggregate/agg_error_msg.groovy |    63 +
 .../query_p0/aggregate/agg_group_concat.groovy     |   111 +
 .../suites/query_p0/aggregate/agg_nullable.groovy  |  1040 +
 .../query_p0/aggregate/agg_nullable_2.groovy       |  1051 +
 .../query_p0/aggregate/agg_union_random.groovy     |    54 +
 .../query_p0/aggregate/agg_window_project.groovy   |   124 +
 .../aggregate/agg_with_distinct_project.groovy     |     0
 .../suites/query_p0/aggregate/aggregate.groovy     |    77 +-
 .../query_p0/aggregate/aggregate_count1.groovy     |    32 +
 .../aggregate_group_by_metric_type.groovy          |    12 +-
 .../aggregate/aggregate_groupby_constant.groovy    |    74 +
 .../aggregate/aggregate_groupby_simplify.groovy    |    21 +
 .../aggregate/aggregate_stddev_over_range.groovy   |     0
 .../suites/query_p0/aggregate/array_agg.groovy     |     2 -
 .../aggregate/non_standard_aggregate.groovy        |     0
 .../aggregate/select_random_distributed_tbl.groovy |     1 -
 .../query_p0/aggregate/test_regr_avgx.groovy       |   174 +
 .../query_p0/aggregate/test_regr_avgy.groovy       |   174 +
 .../query_p0/aggregate/test_regr_count.groovy      |   174 +
 .../query_p0/aggregate/test_regr_intercept.groovy  |    34 +-
 .../suites/query_p0/aggregate/test_regr_r2.groovy  |   172 +
 .../query_p0/aggregate/test_regr_slope.groovy      |    34 +-
 .../suites/query_p0/aggregate/test_regr_sxx.groovy |   114 +
 .../suites/query_p0/aggregate/test_regr_sxy.groovy |   113 +
 .../suites/query_p0/aggregate/test_regr_syy.groovy |   114 +
 .../suites/query_p0/aggregate/window_funnel.groovy |   745 +
 .../query_p0/aggregate/window_funnel_v2.groovy     |   902 +
 .../authorization/column_authorization.groovy      |    85 +
 .../authorization/view_authorization.groovy        |    94 +
 .../query_p0/cache/mtmv_with_sql_cache.groovy      |  1003 +
 .../suites/query_p0/cache/mv_with_sql_cache.groovy |   271 +
 .../query_p0/cache/parse_sql_from_sql_cache.groovy |  1192 +
 .../cache/prepare_stmt_with_sql_cache.groovy       |     0
 .../suites/query_p0/cache/sql_cache.groovy         |     2 -
 .../test_partition_instance_query_cache.groovy     |     1 -
 .../query_p0/cast/test_complextype_to_json.groovy  |     2 -
 .../colocate/test_multi_cast_colocate.groovy       |    57 +
 .../colocate/test_set_operation_colocate.groovy    |   102 +
 .../compress_materialize.groovy                    |     0
 .../compress_materialize/pushdown_encode.groovy    |     0
 .../create_table/ddl/data.sql                      |     0
 .../create_table/ddl/table.sql                     |     0
 .../create_table/test_create_blocked.groovy        |   154 +
 .../query_p0/create_table/test_create_table.groovy |    78 +
 .../create_table/test_create_table_like.groovy     |     0
 .../create_table/test_ctas.groovy                  |     0
 .../create_table/test_ctas_auto_partition.groovy   |     0
 .../costbasedrewrite_producer.groovy               |     0
 .../cte/subquery_in_cte/subquery_in_cte.groovy     |     0
 .../query_p0/cte/test_cte_column_pruning.groovy    |   141 +
 .../query_p0/cte/test_cte_filter_pushdown.groovy   |    77 +
 .../cte/test_cte_multicast_complex.groovy          |     0
 .../test_cte_multiuse_no_union_not_inline.groovy   |   145 +
 .../test_cte_nondeterministic_not_inline.groovy    |   123 +
 .../cte/test_cte_with_duplicate_consumer.groovy    |     0
 .../suites/query_p0/datatype/test_cast.groovy      |   243 +
 .../query_p0/datatype/test_date_acquire.groovy     |    35 +
 .../datatype/test_date_implicit_cast.groovy        |    86 +
 .../datatype/test_datetime_overflow.groovy         |    34 +
 .../suites/query_p0/datatype/test_datev1.groovy    |    87 +
 .../suites/query_p0/datatype/test_decimalv2.groovy |    89 +
 .../suites/query_p0/datatype/test_map.groovy       |    67 +
 .../ddl/account/test_nereids_role.groovy           |     0
 ...test_nereids_admin_set_partition_version.groovy |     0
 .../admin/test_nereids_admin_set_tbl_status.groovy |     0
 .../ddl/alter/test_alter_user_nereids.groovy       |    27 +
 .../test_nereids_alter_database_rename.groovy      |     0
 .../test_nereids_alter_database_set_quota.groovy   |     0
 .../ddl/clean/test_clean_label_nereids.groovy      |     0
 .../ddl/describe/describe_command.groovy           |     0
 .../ddl/grant/test_grant_nereids.groovy            |     0
 .../ddl/grant/test_revoke_role_nereids.groovy      |     0
 .../test_nereids_rebalance_disk.groovy             |     0
 .../ddl/recover/test_recover_all.groovy            |     0
 .../ddl/recover/test_recover_db.groovy             |     0
 .../show_create_repository_command.groovy          |     0
 .../repository/show_repositories_command.groovy    |     0
 .../set_and_unset_variable_command.groovy          |   114 +
 .../show/show_light_schema_change_process_nereids  |     0
 .../ddl/show/show_proc_nereids.groovy              |     0
 .../ddl/show_authors/show_authors.groovy           |     0
 .../ddl/show_trash/test_nereids_trash.groovy       |     0
 .../show_variables/show_variables_command.groovy   |     0
 .../ddl/show_view/show_view_command.groovy         |     0
 .../ddl/test_truncate_table_nereids.groovy         |     0
 .../ddl/use/switch_command_nereids.groovy          |     0
 .../ddl/use/use_command_nereids.groovy             |     0
 .../suites/query_p0/delete/delete_cte.groovy       |   119 +
 .../suites/query_p0/delete/delete_cte_ck.groovy    |   121 +
 .../delete/delete_mow_partial_update.groovy        |   191 +
 .../suites/query_p0/delete/delete_using.groovy     |   129 +
 .../delta_row/delta_row.groovy                     |     0
 .../dist_expr_list/dist_expr_list.groovy           |     0
 .../suites/query_p0/drop/drop_resource.groovy      |    29 +
 .../drop/drop_table.groovy                         |     0
 .../suites/query_p0/eager_agg/eager_agg.groovy     |   566 +
 .../{nereids_p0 => query_p0}/eager_agg/load.groovy |     0
 .../eliminate_outer_join.groovy                    |   202 +
 .../query_p0/except/test_analyzer_exception.groovy |    28 +
 .../query_p0/except/test_bound_exception.groovy    |    50 +
 .../explain/explain_dml.groovy                     |     0
 .../suites/query_p0/explain/explain_graph.groovy   |    67 +
 .../explain/test_datetime_filter_stats0.groovy     |    47 +
 .../explain/test_global_partition_topn_plan.groovy |    75 +
 .../test_outerjoin_isnull_estimation.groovy        |    92 +
 .../query_p0/explain/test_pushdown_explain.groovy  |   392 +
 .../test_scan_preaggregation_explain.groovy        |    47 +
 .../query_p0/expression/case_when_to_if.groovy     |    69 +
 .../expression/expression_depth_check.groovy       |     0
 .../fold_constant/fe_constant_cast_to_date.groovy  |   182 +
 .../fe_constant_cast_to_datetime.groovy            |   182 +
 .../fe_constant_cast_to_fractional.groovy          |   117 +
 .../fold_constant/fe_constant_cast_to_int.groovy   |   337 +
 .../expression/fold_constant/fe_try_cast.groovy    |    51 +
 .../fold_constant/fold_constant_by_be.groovy       |   122 +
 .../fold_constant/fold_constant_by_fe.groovy       |   215 +
 .../fold_constant/fold_constant_cast.groovy        |    49 +
 .../fold_constant_date_arithmatic.groovy           |    84 +
 .../fold_constant/fold_constant_ip.groovy          |     0
 .../fold_constant/fold_constant_nullable.groovy    |   176 +
 .../fold_constant_numeric_arithmatic.groovy        |   636 +
 .../fold_constant_string_arithmatic.groovy         |  2051 ++
 .../expression/fold_constant/json_constant.groovy  |     0
 .../expression/fold_constant/load.groovy           |     0
 .../expression/operator_precedence.groovy          |     0
 .../expression/test_default_expr.groovy            |     0
 .../suites/query_p0/expression/topn_to_max.groovy  |    47 +
 .../query_p0/forbid_unknown_col_stats.groovy       |    46 +
 .../query_p0/group_concat/test_group_concat.groovy |    28 +
 .../grouping_sets/test_grouping_sets.groovy        |    10 +
 .../hbo/hbo_agg_stage_opt_test.groovy              |     0
 .../hbo/hbo_cache_usability_test.groovy            |     0
 .../hbo/hbo_data_maintain_test.groovy              |     0
 .../hbo/hbo_join_side_opt_test.groovy              |     0
 .../hbo/hbo_parameterization_test.groovy           |     0
 .../hbo/hbo_rf_safe_test.groovy                    |     0
 .../hbo/hbo_skew_shuffle_to_bc_test.groovy         |     0
 .../hbo/hbo_slow_query_test.groovy                 |     0
 .../suites/query_p0/hint/fix_leading.groovy        |   273 +
 .../suites/query_p0/hint/multi_leading.groovy      |   142 +
 .../suites/query_p0/hint/test_hint.groovy          |   222 +
 .../suites/query_p0/hint/test_leading.groovy       |  1157 +
 .../suites/query_p0/hint/test_use_mv.groovy        |   236 +
 .../huge_compound/huge_compound.groovy             |     0
 .../infer_expr_name/load.groovy                    |     0
 .../suites/query_p0/infer_expr_name/query13.groovy |    79 +
 .../suites/query_p0/infer_expr_name/query14.groovy |   135 +
 .../suites/query_p0/infer_expr_name/query15.groovy |    47 +
 .../suites/query_p0/infer_expr_name/query2.groovy  |    92 +
 .../suites/query_p0/infer_expr_name/query23.groovy |    78 +
 .../suites/query_p0/infer_expr_name/query35.groovy |   100 +
 .../suites/query_p0/infer_expr_name/query38.groovy |    49 +
 .../suites/query_p0/infer_expr_name/query41.groovy |    78 +
 .../suites/query_p0/infer_expr_name/query42.groovy |    51 +
 .../suites/query_p0/infer_expr_name/query45.groovy |    48 +
 .../suites/query_p0/infer_expr_name/query59.groovy |    79 +
 .../suites/query_p0/infer_expr_name/query61.groovy |    72 +
 .../suites/query_p0/infer_expr_name/query62.groovy |    61 +
 .../suites/query_p0/infer_expr_name/query8.groovy  |   134 +
 .../suites/query_p0/infer_expr_name/query85.groovy |   113 +
 .../infer_predicate/infer_predicate.groovy         |    67 +
 .../query_p0/insert_into_table/aggregate.groovy    |   104 +
 .../insert_into_table/complex_insert.groovy        |   210 +
 .../insert_into_table/ddl/agg_nop_t.sql            |     0
 .../insert_into_table/ddl/agg_t.sql                |     0
 .../insert_into_table/ddl/agg_type_cast.sql        |     0
 .../insert_into_table/ddl/dup_nop_t.sql            |     0
 .../insert_into_table/ddl/dup_t.sql                |     0
 .../insert_into_table/ddl/dup_type_cast.sql        |     0
 .../insert_into_table/ddl/json_t.sql               |     0
 .../insert_into_table/ddl/map_t.sql                |     0
 .../insert_into_table/ddl/random_t.sql             |     0
 .../insert_into_table/ddl/uni_nop_t.sql            |     0
 .../insert_into_table/ddl/uni_t.sql                |     0
 .../insert_into_table/ddl/uni_type_cast.sql        |     0
 .../query_p0/insert_into_table/duplicate.groovy    |   114 +
 .../query_p0/insert_into_table/insert_auth.groovy  |    85 +
 .../query_p0/insert_into_table/insert_cte.groovy   |    69 +
 .../insert_into_table/insert_values.groovy         |   195 +
 .../insert_into_table/load.groovy                  |     0
 .../insert_into_table/nereids_insert_random.groovy |   131 +
 .../query_p0/insert_into_table/no_partition.groovy |   296 +
 .../insert_into_table/partial_update.groovy        |   284 +
 .../partial_update_complex.groovy                  |   131 +
 .../partial_update_seq_col.groovy                  |   121 +
 .../insert_into_table/type_cast_aggregate.groovy   |    88 +
 .../insert_into_table/type_cast_duplicate.groovy   |    98 +
 .../insert_into_table/type_cast_unique.groovy      |   152 +
 .../query_p0/insert_into_table/unique.groovy       |   184 +
 .../insert_into_table/unsupport_type.groovy        |    26 +
 .../update_on_current_timestamp.groovy             |   193 +
 .../javaudf/collect/test_javaudf_groupcount.groovy |    60 +
 .../collect/test_javaudf_murmurhash3.groovy        |    61 +
 .../javaudf/collect/test_javaudf_sessionize.groovy |    64 +
 .../javaudf/date/test_javaudf_adddays.groovy       |    61 +
 .../javaudf/date/test_javaudf_addisoperioud.groovy |    61 +
 .../javaudf/date/test_javaudf_daydiff.groovy       |    62 +
 .../json/test_javaudf_convertfromcamelcase.groovy  |    61 +
 .../json/test_javaudf_converttocamelcase.groovy    |    61 +
 .../javaudf/sanity/test_javaudf_assertequal.groovy |    63 +
 .../sanity/test_javaudf_assertlessthan.groovy      |    63 +
 .../javaudf/sanity/test_javaudf_assertudf.groovy   |    53 +
 .../javaudf/sketch/test_javaudf_md5.groovy         |    61 +
 .../query_p0/javaudf/test_alias_function.groovy    |    90 +
 .../javaudf/test_javaudaf_my_date_datetime.groovy  |   125 +
 .../test_javaudaf_mygroupconcat_string.groovy      |    76 +
 .../javaudf/test_javaudaf_mysum_array.groovy       |   124 +
 .../javaudf/test_javaudaf_mysum_decimal.groovy     |    72 +
 .../test_javaudaf_mysum_float_double.groovy        |    92 +
 .../javaudf/test_javaudaf_mysum_int.groovy         |    82 +
 .../javaudf/test_javaudaf_null_test.groovy         |    79 +
 .../query_p0/javaudf/test_javaudf_array.groovy     |   130 +
 .../query_p0/javaudf/test_javaudf_boolean.groovy   |    73 +
 .../query_p0/javaudf/test_javaudf_case.groovy      |    71 +
 .../query_p0/javaudf/test_javaudf_date.groovy      |   209 +
 .../query_p0/javaudf/test_javaudf_decimal.groovy   |    84 +
 .../query_p0/javaudf/test_javaudf_float.groovy     |    91 +
 .../query_p0/javaudf/test_javaudf_int.groovy       |   125 +
 .../suites/query_p0/javaudf/test_javaudf_ip.groovy |   144 +
 .../query_p0/javaudf/test_javaudf_null.groovy      |    72 +
 .../query_p0/javaudf/test_javaudf_string.groovy    |   105 +
 .../query_p0/join/asof/test_asof_join.groovy       |  1621 +
 .../asof/test_asof_join_build_expr_edge.groovy     |   401 +
 .../join/asof/test_asof_join_explicit.groovy       |     0
 .../query_p0/join/asof/test_asof_join_expr.groovy  |   477 +
 .../join/asof/test_asof_join_large_bucket.groovy   |   145 +
 .../query_p0/join/colocate_join_with_rollup.groovy |   190 +
 .../initial_join_order/initial_join_order.groovy   |     0
 .../invalid_stats/invalid_stats_join_order.groovy  |     0
 .../join/outer_join_with_empty_node.groovy         |    81 +
 .../query_p0/join/sql/bucket_shuffle_join.sql      |     1 +
 .../join/test_bitmap_filter_nereids.groovy         |     2 -
 .../suites/query_p0/join/test_join_11.groovy       |   269 +
 .../suites/query_p0/join/test_join_12.groovy       |   208 +
 .../suites/query_p0/join/test_join_13.groovy       |   245 +
 .../suites/query_p0/join/test_join_14.groovy       |   225 +
 .../suites/query_p0/join/test_join_15.groovy       |   215 +
 .../query_p0/join/test_join_decimal256.groovy      |     1 -
 .../suites/query_p0/join/test_join_dphyper.groovy  |    35 +
 .../query_p0/join/test_join_local_shuffle.groovy   |    83 +
 .../suites/query_p0/join/test_join_on.groovy       |    52 +
 .../query_p0/join/test_join_with_cast_array.groovy |     2 -
 .../query_p0/join/test_join_with_const.groovy      |     2 -
 .../suites/query_p0/join/test_limit_join.groovy    |   103 +
 .../query_p0/join/test_many_multi_join.groovy      |   906 +
 .../suites/query_p0/join/test_mark_join.groovy     |   164 +
 .../test_multilevel_join_agg_local_shuffle.groovy  |     0
 .../join/test_other_conjuncts_nullable.groovy      |    62 +
 .../suites/query_p0/join/test_outer_join.groovy    |   111 +
 .../join/test_runtime_filter_decimal256.groovy     |     1 -
 .../join/test_runtimefilter_on_datev2.groovy       |   112 +-
 .../join/test_runtimefilter_on_decimal.groovy      |    66 +
 .../translate_tuple_id/join_input_tuple_id.groovy  |     0
 .../suites/query_p0/keyword/order_group.groovy     |     2 -
 .../suites/query_p0/keyword/test_keyword.groovy    |     9 -
 .../test_clone_legacy_nullable_from_nereids.groovy |     0
 .../query_p0/limit/filterLimitProject.groovy       |    56 +
 .../limit/test_general_limit_pushdown.groovy       |   287 +
 .../limit/test_unified_limit_pushdown.groovy       |   233 +
 .../literal/test_compare_literal.groovy            |     0
 regression-test/suites/query_p0/load.groovy        |     5 +-
 .../multi_distinct/multi_distinct_window.groovy    |     0
 .../operator/test_arithmetic_operators.groovy      |    17 +-
 .../agg_state/test_outfile_agg_state.groovy        |    73 +
 .../agg_state_array/test_outfile_agg_array.groovy  |    72 +
 .../test_outfile_agg_state_bitmap.groovy           |    71 +
 .../query_p0/outfile/hll/test_outfile_hll.groovy   |    74 +
 .../test_outfile_quantile_state.groovy             |    75 +
 .../suites/query_p0/outfile/test_outfile.groovy    |   260 +
 .../outfile/test_outfile_csv_with_names.groovy     |   177 +
 .../query_p0/outfile/test_outfile_exception.groovy |   164 +
 .../query_p0/outfile/test_outfile_expr.groovy      |   152 +
 .../query_p0/outfile/test_outfile_parquet.groovy   |   183 +
 .../query_p0/outfile/test_outfile_separator.groovy |   110 +
 .../partition_topn/check_orderkey.groovy           |     0
 .../test_physical_translator.groovy                |    49 +
 .../pkfk/test_pk_fk_drop_table.groovy              |     0
 .../query_p0/repeat/test_repeat_output_slot.groovy |    80 +
 .../runtime_filter/check_rf.groovy                 |     0
 .../runtime_filter/cte-runtime-filter.groovy       |     0
 .../query_p0/runtime_filter/expr-target.groovy     |   106 +
 .../runtime_filter/runtime_filter.groovy           |     0
 .../runtime_filter/set_operator_in_filter.groovy   |   138 +
 .../schema_table/test_sql_block_rule_status.groovy |    12 +-
 .../test_stream_consumption_schema.groovy          |   137 +
 .../schema_table/test_stream_info_schema.groovy    |    55 +
 .../select_no_from/sql/projectAggFuncs.sql         |     1 -
 .../select_no_from/sql/withGroupOrderHaving.sql    |     1 -
 .../select_no_from/sql/withWhereClause.sql         |     1 -
 .../query_p0/select_no_from/sql/withWhereFalse.sql |     1 -
 .../select_tablets/select_with_tablets.groovy      |   116 +
 .../session_variable/test_default_limit.groovy     |    40 +-
 .../session_variable/test_variable_between.groovy  |    30 +
 .../suites/query_p0/set/test_user_var.groovy       |    28 +
 .../suites/query_p0/set_operations/except.groovy   |   129 +
 .../set_operation_exprid_reuse.groovy              |   174 +
 .../test_pullup_predicate_null.groovy              |   137 +
 .../show/test_help_command.groovy                  |     0
 .../show/test_last_insert_nereids.groovy           |     0
 .../show/test_nereids_show_alter_table.groovy      |     0
 .../show/test_nereids_show_backup.groovy           |     0
 .../show/test_nereids_show_build_index.groovy      |     0
 .../show/test_nereids_show_create_user.groovy      |     0
 .../show/test_nereids_show_data_skew.groovy        |     0
 .../show/test_nereids_show_export.groovy           |     0
 .../show/test_nereids_show_functions.groovy        |   196 +
 .../show/test_nereids_show_global_functions.groovy |     0
 .../show/test_nereids_show_grants.groovy           |     0
 .../show/test_nereids_show_index.groovy            |     0
 .../show/test_nereids_show_load.groovy             |     0
 .../show/test_nereids_show_load_warnings.groovy    |     0
 .../show/test_nereids_show_partitions.groovy       |     0
 .../show/test_nereids_show_plugins.groovy          |     0
 .../show/test_nereids_show_privileges.groovy       |     0
 .../show/test_nereids_show_replica_dist.groovy     |     0
 .../show/test_nereids_show_resources.groovy        |     0
 .../show/test_nereids_show_restore.groovy          |     0
 .../show/test_nereids_show_snapshot.groovy         |     0
 .../show/test_nereids_show_table_creation.groovy   |     0
 .../test_nereids_show_tablet_storage_format.groovy |     0
 .../show/test_nereids_show_views.groovy            |     0
 .../show/test_nereids_showpartitionid.groovy       |     0
 .../show/test_nereids_showtableid.groovy           |     0
 .../show/test_show_analyze_task_status_cmd.groovy  |    78 +
 .../show/test_show_catalog.groovy                  |     0
 .../show/test_show_charset_command.groovy          |     0
 .../show/test_show_clusters_command.groovy         |    27 +
 .../show/test_show_collation.groovy                |     0
 .../show/test_show_column_stats_command.groovy     |    54 +
 .../query_p0/show/test_show_columns_command.groovy |    60 +
 .../show/test_show_commands_nereids.groovy         |     0
 .../show/test_show_create_catalog.groovy           |     0
 .../show/test_show_create_db_nereids.groovy        |     0
 .../show/test_show_create_function.groovy          |     0
 .../show/test_show_create_table_nereids.groovy     |     0
 .../show/test_show_create_view.groovy              |     0
 .../show/test_show_data_types.groovy               |     0
 .../show/test_show_database_id_nereids.groovy      |     0
 .../show/test_show_diagnose_tablet.groovy          |     0
 .../show/test_show_open_tables_command.groovy      |    32 +
 .../show/test_show_process_list_command.groovy     |     0
 .../show/test_show_python_packages_command.groovy  |     0
 .../show/test_show_python_versions_command.groovy  |     0
 .../query_p0/show/test_show_status_command.groovy  |    31 +
 .../show/test_show_storage_policy_nereids.groovy   |     0
 .../show/test_show_storage_vault_command.groovy    |     0
 .../show/test_show_user_properties_command.groovy  |     0
 .../test_show_warning_error_count_command.groovy   |    32 +
 .../show/test_show_warning_errors_command.groovy   |     0
 .../slot_bind/test_bind_slot.groovy                |     0
 regression-test/suites/query_p0/sort/sort.groovy   |     4 -
 .../suites/query_p0/sort/topn_2pr_rule.groovy      |    76 -
 .../test_aggregate_all_functions.groovy            |     5 +
 ...est_aggregate_percentile_approx_weighted.groovy |    69 +
 .../test_aggregate_percentile_no_cast.groovy       |   131 +
 .../test_aggregate_window_functions.groovy         |   524 +
 .../test_approx_count_distinct.groovy              |     3 -
 .../array_functions/test_array_contains_all.groovy |   123 +
 .../array_functions/test_array_filter.groovy       |   202 +
 .../array_functions/test_array_functions.groovy    |     1 -
 .../bitmap_functions/test_bitmap_function.groovy   |    15 +-
 .../case_function/test_case_function_null.groovy   |     2 -
 .../cast_function/test_cast_function.groovy        |     5 +
 .../test_conditional_function.groovy               |     4 +
 .../conditional_functions/test_if.groovy           |    26 +
 .../conditional_functions/test_query_in.groovy     |    58 +-
 .../conditional_functions/test_query_limit.groovy  |    20 -
 .../test_add_sub_union_type.groovy                 |     0
 .../datetime_functions/test_date_floor_ceil.groovy |     2 -
 .../datetime_functions/test_date_function.groovy   |   247 +-
 .../test_date_function_v2.groovy                   |     0
 ...st_date_or_datetime_computation_negative.groovy |   315 +
 .../datetime_functions/test_time_lut.groovy        |    84 +
 .../test_encryption_function.groovy                |    52 +
 .../encryption_digest/test_md5.groovy              |    20 +
 .../hash_functions/test_hash_function.groovy       |    67 +
 .../hll_functions/test_hll_functions.groovy        |     6 +
 .../ip_functions/test_cut_ipv6_function.groovy     |     2 -
 .../ip_functions/test_ipv4_cidr_to_range.groovy    |     2 -
 .../ip_functions/test_ipv4_to_ipv6_function.groovy |     2 -
 .../test_ipv6_cidr_to_range_function.groovy        |     2 -
 .../test_ipv6_num_to_string_function.groovy        |     2 -
 .../test_is_ip_address_in_range_function.groovy    |     2 -
 .../test_is_ip_string_functions.groovy             |     2 -
 .../ip_functions/test_to_ip_functions.groovy       |     2 -
 .../json_function/test_query_json_object.groovy    |     2 +
 .../test_mapagg_with_jsonfuncs.groovy              |     2 -
 .../sql_functions/math_functions/test_abs.groovy   |    30 +
 .../sql_functions/math_functions/test_conv.groovy  |    25 +
 .../sql_functions/math_functions/test_round.groovy |     5 -
 .../math_functions/test_round_overflow.groovy      |    23 +
 .../test_multi_string_search.groovy                |     7 +
 .../spatial_functions/test_gis_function.groovy     |   354 +
 .../sql_functions/string_functions/test_concat.sql |     0
 .../string_functions/test_is_valid_utf8.groovy     |    80 +
 .../string_functions/test_split_by_string.groovy   |   195 +
 .../string_functions/test_split_part.groovy        |     5 +
 .../string_functions/test_string_function.groovy   |   104 +
 .../test_string_function_like.groovy               |    17 +
 .../table_function/explode_map.groovy              |    56 +
 .../table_function/explode_split.groovy            |     2 +
 .../sql_functions/table_function/json_each.groovy  |   419 +
 .../sql_functions/table_function/posexplode.groovy |   207 +
 .../sql_functions/test_arith_functions.groovy      |    52 +
 .../query_p0/sql_functions/test_in_expr.groovy     |    19 +
 .../window_functions/test_count_star.groovy        |    22 +
 .../window_functions/test_lead_lag_nullable.groovy |    78 +
 .../window_functions/test_ntile_function.groovy    |     2 +-
 .../test_select_stddev_variance_window.groovy      |     2 -
 .../window_functions/test_window_fn.groovy         |     1 -
 .../query_p0/stats/col_stats/column_stats.groovy   |   110 +
 .../stats/col_stats/estimate_string_as_date.groovy |     0
 .../stats/col_stats/hot_value_analyze_sync.groovy  |    61 +
 .../stats/col_stats/hot_value_str_to_date.groovy   |     0
 .../stats/invalid_stats/invalid_stats.groovy       |    76 +
 .../suites/query_p0/stats/partitionRowCount.groovy |    41 +
 .../stats/partition_col_stats.groovy               |     0
 .../stats/partition_key_minmax.groovy              |     0
 .../suites/query_p0/stats/query_stats_test.groovy  |     1 -
 .../stats/virtual_column.groovy                    |     0
 .../subquery/correlated_scalar_subquery.groovy     |   249 +
 .../query_p0/subquery/subquery_unnesting.groovy    |   143 +
 .../subquery/test_correlated_filter_removed.groovy |     0
 .../subquery/test_inlineview_with_project.groovy   |    80 +
 .../suites/query_p0/subquery/test_subquery.groovy  |   253 +
 .../subquery/test_subquery_in_project.groovy       |   198 +
 .../subquery/test_subquery_in_simple_case.groovy   |    80 +
 .../system/test_explain_information_schema.groovy  |     0
 .../suites/query_p0/system/test_query_sys.groovy   |    22 +
 .../{nereids_p0 => query_p0}/tablesample.groovy    |     0
 .../test_alter_catalog_comment_command.groovy      |    54 +
 .../test_alter_catalog_properties_command.groovy   |    55 +
 .../test_alter_catalog_rename_command.groovy       |    55 +
 .../test_alter_database_properties_command.groovy  |    35 +
 .../test_alter_resource_nereids.groovy             |     0
 .../test_alter_storage_policy_command.groovy       |     0
 .../suites/query_p0/test_char_implicit_cast.groovy |     1 +
 .../test_compound_predicate_constant_child.groovy  |     2 -
 .../query_p0/test_create_catalog_command.groovy    |    43 +
 .../test_create_workload_policy_command.groovy     |    32 +
 .../test_cte_subquery_many.groovy                  |     0
 .../test_delete_sign_mow.sql                       |     0
 .../query_p0/test_disable_parallel_scan.groovy     |    56 +
 .../query_p0/test_drop_catalog_command.groovy      |    43 +
 .../test_drop_storage_policy_command.groovy        |     0
 .../query_p0/test_filter_pushdown_set.groovy       |    40 +
 .../query_p0/test_forbid_unknown_col_stats.groovy  |    54 +
 .../query_p0/test_install_plugin_command.groovy    |    57 +
 .../query_p0/test_lock_tables_command.groovy       |    51 +
 .../suites/query_p0/test_mv_select.groovy          |    78 +
 .../test_nereids_encrypt_test.groovy               |     0
 .../test_nereids_other_commands.groovy             |     0
 .../test_nestloop_join_nullable.groovy             |     0
 .../suites/query_p0/test_prune_tablet_mv.groovy    |    43 +
 .../test_repeat_no_stackflow.groovy                |     0
 .../suites/query_p0/test_row_policy.groovy         |     2 -
 .../test_select_with_predicate_like.groovy         |    36 +
 .../suites/query_p0/test_selelct_hidden_col.groovy |    38 +
 .../query_p0/test_show_stages_command.groovy       |    30 +
 .../suites/query_p0/test_timeout_fallback.groovy   |    42 +
 .../suites/query_p0/test_transaction.groovy        |    73 +
 .../query_p0/test_unlock_tables_command.groovy     |    40 +
 ...st_unsupported_start_transaction_command.groovy |     0
 .../suites/query_p0/test_user_var.groovy           |    71 +
 .../topn_lazy/lazy_materialize_view.groovy         |    83 +
 .../topNLazyMaterializationUsingIndex.groovy       |     4 +-
 .../test_string_literal_vs_other_literal.groovy    |     0
 .../suites/query_p0/union/or_expansion.groovy      |   255 +
 .../union/push_limit_with_eliminate_union.groovy   |     0
 .../suites/query_p0/union/test_union.groovy        |    69 +-
 .../update/update_after_create_rollup.groovy       |     0
 .../suites/query_p0/update/update_cte.groovy       |   107 +
 .../query_p0/update/update_unique_table.groovy     |   114 +
 .../variables_persist/load.groovy                  |     0
 .../variables_persist/test_alias_function.groovy   |     0
 .../variables_persist/test_array_agg_view.groovy   |     0
 .../variables_persist/test_generated_column.groovy |     0
 .../variables_persist/test_mtmv.groovy             |     0
 .../variables_persist/test_sync_mv.groovy          |     0
 .../variables_persist/test_view_var_persist.groovy |     0
 .../variables_persist/use_view_create_mv.groovy    |     0
 .../suites/query_p0/with/test_with.groovy          |     3 +
 .../rec_cte_from_ck_doc/rec_cte_from_ck_doc.groovy |    18 +
 .../test_search_inverted_index_profile.groovy      |   302 +
 .../suites/search/test_search_slash_in_term.groovy |     7 +
 .../suites/show_p0/test_show_data.groovy           |     4 +-
 .../sql_block_rule_p0/test_sql_block_rule.groovy   |   111 +-
 .../suites/statistics/analyze_stats.groovy         |     2 +-
 .../statistics/test_analyze_long_string.groovy     |   288 +
 .../suites/statistics/test_scale_num_nulls.groovy  |    61 +
 ...est_partition_rebalancer_medium_mismatch.groovy |   178 +
 ...st_olap_table_stream_history_consumption.groovy |   148 +
 .../test_olap_table_stream_history_query.groovy    |   132 +
 .../tpch_sf100_unique_mor_p2/ddl/customer.sql      |    17 +
 .../tpch_sf100_unique_mor_p2/ddl/customer_dup.sql  |    16 +
 .../ddl/customer_dup_load.sql                      |     6 +
 .../ddl/customer_load.sql                          |     0
 .../tpch_sf100_unique_mor_p2/ddl/lineitem.sql      |    25 +
 .../tpch_sf100_unique_mor_p2/ddl/lineitem_dup.sql  |    24 +
 .../ddl/lineitem_dup_load.sql                      |     6 +
 .../tpch_sf100_unique_mor_p2/ddl/lineitem_load.sql |     6 +
 .../suites/tpch_sf100_unique_mor_p2/ddl/nation.sql |    13 +
 .../tpch_sf100_unique_mor_p2/ddl/nation_dup.sql    |    12 +
 .../ddl/nation_dup_load.sql                        |     6 +
 .../ddl/nation_load.sql                            |     0
 .../suites/tpch_sf100_unique_mor_p2/ddl/orders.sql |    18 +
 .../tpch_sf100_unique_mor_p2/ddl/orders_dup.sql    |    17 +
 .../ddl/orders_dup_load.sql                        |     6 +
 .../tpch_sf100_unique_mor_p2/ddl/orders_load.sql   |     6 +
 .../suites/tpch_sf100_unique_mor_p2/ddl/part.sql   |    18 +
 .../tpch_sf100_unique_mor_p2/ddl/part_dup.sql      |    17 +
 .../tpch_sf100_unique_mor_p2/ddl/part_dup_load.sql |     6 +
 .../ddl/part_load.sql                              |     0
 .../tpch_sf100_unique_mor_p2/ddl/partsupp.sql      |    14 +
 .../tpch_sf100_unique_mor_p2/ddl/partsupp_dup.sql  |    13 +
 .../ddl/partsupp_dup_load.sql                      |     6 +
 .../tpch_sf100_unique_mor_p2/ddl/partsupp_load.sql |     6 +
 .../suites/tpch_sf100_unique_mor_p2/ddl/region.sql |    12 +
 .../tpch_sf100_unique_mor_p2/ddl/region_dup.sql    |    11 +
 .../ddl/region_dup_load.sql                        |     6 +
 .../ddl/region_load.sql                            |     0
 .../tpch_sf100_unique_mor_p2/ddl/supplier.sql      |    16 +
 .../tpch_sf100_unique_mor_p2/ddl/supplier_dup.sql  |    15 +
 .../ddl/supplier_dup_load.sql                      |     6 +
 .../ddl/supplier_load.sql                          |     0
 .../suites/tpch_sf100_unique_mor_p2/load.groovy    |    97 +
 .../sql/q01.sql                                    |     0
 .../sql/q02.sql                                    |     0
 .../sql/q03.sql                                    |     0
 .../sql/q04.sql                                    |     0
 .../sql/q05.sql                                    |     0
 .../sql/q06.sql                                    |     0
 .../sql/q07.sql                                    |     0
 .../sql/q08.sql                                    |     0
 .../sql/q09.sql                                    |     0
 .../sql/q10.sql                                    |     0
 .../sql/q11.sql                                    |     0
 .../sql/q12.sql                                    |     0
 .../sql/q13.sql                                    |     0
 .../sql/q14.sql                                    |     0
 .../sql/q15.sql                                    |     0
 .../sql/q16.sql                                    |     0
 .../sql/q17.sql                                    |     0
 .../sql/q18.sql                                    |     0
 .../sql/q19.sql                                    |     0
 .../sql/q20.sql                                    |     0
 .../sql/q21.sql                                    |     0
 .../sql/q22.sql                                    |     0
 .../test_mor_value_predicate_pushdown.groovy       |    49 +
 .../test_read_mor_as_dup.groovy                    |    56 +
 regression-test/suites/tso_p0/test_tso_api.groovy  |   117 +
 .../tso_p0/test_tso_rowset_commit_tso.groovy       |    78 +
 .../test_compact_multi_segments.groovy             |     4 +
 .../test_schema_change_add_key_column.groovy       |     3 +
 .../publish/test_partial_update_publish_seq.groovy |     8 +-
 .../test_p_seq_publish_read_from_old.groovy        |     4 +-
 .../test_compaction_nokey_variant.groovy           |    71 +
 .../suites/variant_p0/delete_update.groovy         |    40 +
 .../doc_mode/test_variant_cast_strict.groovy       |   129 +
 .../suites/variant_p0/duplicate_json_path.groovy   |   106 +
 regression-test/suites/variant_p0/nested.groovy    |   188 -
 .../suites/variant_p0/nested/load.groovy           |   200 -
 .../variant_p0/nested/nested_in_top_array.groovy   |   135 -
 .../suites/variant_p0/nested/sql/q01.sql           |    13 -
 regression-test/suites/variant_p0/nested2.groovy   |   164 -
 .../predefine/predefined_typed_to_sparse.groovy    |     2 +-
 .../predefine/test_predefine_type_index.groovy     |    14 +-
 .../variant_p0/test_json_object_flatten.groovy     |    84 +
 run-fe-ut.sh                                       |     8 +-
 run-fs-env-test.sh                                 |   105 +
 run-regression-test.sh                             |    14 +-
 thirdparty/build-thirdparty.sh                     |     3 +-
 thirdparty/download-thirdparty.sh                  |    54 +-
 ...he-arrow-17.0.0-flight-safe-finish-status.patch |   216 +
 ...arrow-17.0.0-force-write-int96-timestamps.patch |    98 +
 .../test/download-thirdparty-fallback-test.sh      |   100 +
 thirdparty/test/juicefs-default-mirror-test.sh     |    43 +
 thirdparty/vars.sh                                 |     4 +-
 tools/fast-compile-fe.sh                           |   553 +
 tools/maintainers/check_review.py                  |    64 -
 tools/pipeline-tracing/README.md                   |    36 -
 tools/pipeline-tracing/origin-to-show.py           |    90 -
 .../ddl/create-tpcds-tables-sf10000.sql            |     4 +-
 tools/tpch-tools/ddl/create-tpch-tables-sf1000.sql |     2 +-
 7218 files changed, 343479 insertions(+), 225066 deletions(-)
 create mode 100644 .claude/skills/be-code-style/SKILL.md
 create mode 100644 .claude/skills/clang-tidy-check/SKILL.md
 create mode 100644 .claude/skills/doris-docker-regression/SKILL.md
 create mode 100644 .claude/skills/fe-code-style/SKILL.md
 create mode 100644 .github/workflows/gitleaks-pr-check.yml
 create mode 100644 .github/workflows/opencode-review-comment.yml
 create mode 100644 .github/workflows/opencode-review-runner.yml
 create mode 100644 .github/workflows/opencode-review-sync-result.yml
 delete mode 100644 .github/workflows/opencode-review.yml
 delete mode 100644 .github/workflows/pr-approve-status.yml
 create mode 100644 .gitleaks.toml
 create mode 100644 be/benchmark/benchmark_column_view.hpp
 create mode 100644 be/benchmark/benchmark_hybrid_set.hpp
 create mode 100644 be/benchmark/benchmark_string_replace.hpp
 create mode 100644 be/benchmark/benchmark_zone_map_index.hpp
 create mode 100644 be/cmake/rust.cmake
 create mode 100644 be/src/cloud/cloud_ms_backpressure_handler.cpp
 create mode 100644 be/src/cloud/cloud_ms_backpressure_handler.h
 create mode 100644 be/src/cloud/cloud_ms_rpc_rate_limit_services.cpp
 create mode 100644 be/src/cloud/cloud_ms_rpc_rate_limit_services.h
 create mode 100644 be/src/cloud/cloud_ms_rpc_rate_limiters.cpp
 create mode 100644 be/src/cloud/cloud_ms_rpc_rate_limiters.h
 create mode 100644 be/src/cloud/cloud_throttle_state_machine.cpp
 create mode 100644 be/src/cloud/cloud_throttle_state_machine.h
 delete mode 100644 be/src/common/compile_check_begin.h
 delete mode 100644 be/src/common/compile_check_end.h
 create mode 100644 be/src/common/thread_safety_annotations.h
 delete mode 100644 be/src/core/value/map_value.cpp
 delete mode 100644 be/src/core/value/struct_value.cpp
 create mode 100644 be/src/exec/common/hash_table/hash_crc32_return32.h
 create mode 100644 be/src/exec/common/memory.cpp
 create mode 100644 be/src/exec/common/memory.h
 delete mode 100644 be/src/exec/es/es_scan_reader.cpp
 delete mode 100644 be/src/exec/es/es_scroll_parser.cpp
 delete mode 100644 be/src/exec/es/es_scroll_query.cpp
 create mode 100644 be/src/exec/operator/bucketed_aggregation_sink_operator.cpp
 create mode 100644 be/src/exec/operator/bucketed_aggregation_sink_operator.h
 create mode 100644 be/src/exec/operator/bucketed_aggregation_source_operator.cpp
 create mode 100644 be/src/exec/operator/bucketed_aggregation_source_operator.h
 delete mode 100644 be/src/exec/operator/es_scan_operator.cpp
 delete mode 100644 be/src/exec/operator/es_scan_operator.h
 delete mode 100644 be/src/exec/pipeline/pipeline_tracing.cpp
 delete mode 100644 be/src/exec/pipeline/pipeline_tracing.h
 delete mode 100644 be/src/exec/scan/es_scanner.cpp
 delete mode 100644 be/src/exec/scan/es_scanner.h
 delete mode 100644 be/src/exec/sort/vsort_exec_exprs.cpp
 delete mode 100644 be/src/exec/sort/vsort_exec_exprs.h
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_bitmap_expr_cal.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_bitmap_expr_cal_count.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_bitmap_intersect.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_bitmap_intersect_count.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_bitmap_union_count.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orth_intersect_count.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_orthogonal_bitmap_impl.h
 create mode 100644 be/src/exprs/aggregate/aggregate_function_regr.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_regr.h
 delete mode 100644 be/src/exprs/aggregate/aggregate_function_regr_union.cpp
 delete mode 100644 be/src/exprs/aggregate/aggregate_function_regr_union.h
 create mode 100644 be/src/exprs/aggregate/aggregate_function_window_funnel_v2.cpp
 create mode 100644 be/src/exprs/aggregate/aggregate_function_window_funnel_v2.h
 create mode 100644 be/src/exprs/bitset_container.h
 create mode 100644 be/src/exprs/function/cast/cast_to_timestamptz_impl.hpp
 create mode 100644 be/src/exprs/function/cast/cast_wrapper_decls.h
 create mode 100644 be/src/exprs/function/cast/function_cast_bool.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_date.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_decimal.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_float.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_int.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_ip.cpp
 create mode 100644 be/src/exprs/function/cast/function_cast_timestamptz.cpp
 delete mode 100644 be/src/exprs/function/function_string.h
 create mode 100644 be/src/exprs/function/function_string_basic.cpp
 create mode 100644 be/src/exprs/function/function_string_concat.h
 create mode 100644 be/src/exprs/function/function_string_digest.cpp
 create mode 100644 be/src/exprs/function/function_string_format.h
 create mode 100644 be/src/exprs/function/function_string_mask.cpp
 create mode 100644 be/src/exprs/function/function_string_misc.cpp
 create mode 100644 be/src/exprs/function/function_string_replace.h
 create mode 100644 be/src/exprs/function/function_string_search.cpp
 create mode 100644 be/src/exprs/function/function_string_url.cpp
 create mode 100644 be/src/exprs/table_function/vjson_each.cpp
 create mode 100644 be/src/exprs/table_function/vjson_each.h
 create mode 100644 be/src/format/column_descriptor.h
 create mode 100644 be/src/format/count_reader.h
 create mode 100644 be/src/format/generic_reader.cpp
 create mode 100644 be/src/format/lance/lance_ffi.h
 create mode 100644 be/src/format/lance/lance_rust_reader.cpp
 create mode 100644 be/src/format/lance/lance_rust_reader.h
 create mode 100644 be/src/format/table/es/es_http_reader.cpp
 create mode 100644 be/src/format/table/es/es_http_reader.h
 create mode 100644 be/src/format/table/es/es_scan_reader.cpp
 rename be/src/{exec => format/table}/es/es_scan_reader.h (100%)
 create mode 100644 be/src/format/table/es/es_scroll_parser.cpp
 rename be/src/{exec => format/table}/es/es_scroll_parser.h (100%)
 create mode 100644 be/src/format/table/es/es_scroll_query.cpp
 rename be/src/{exec => format/table}/es/es_scroll_query.h (100%)
 create mode 100644 be/src/format/table/iceberg_delete_file_reader_helper.cpp
 create mode 100644 be/src/format/table/iceberg_delete_file_reader_helper.h
 create mode 100644 be/src/format/table/iceberg_reader_mixin.h
 create mode 100644 be/src/format/table/table_schema_change_helper.cpp
 create mode 100644 be/src/format/table/table_schema_change_helper.h
 create mode 100644 be/src/information_schema/schema_backend_ms_rpc_table_throttlers_scanner.cpp
 create mode 100644 be/src/information_schema/schema_backend_ms_rpc_table_throttlers_scanner.h
 create mode 100644 be/src/information_schema/schema_compaction_tasks_scanner.cpp
 create mode 100644 be/src/information_schema/schema_compaction_tasks_scanner.h
 create mode 100644 be/src/information_schema/schema_role_mappings_scanner.cpp
 create mode 100644 be/src/information_schema/schema_role_mappings_scanner.h
 create mode 100644 be/src/information_schema/schema_table_stream_consumption_scanner.cpp
 create mode 100644 be/src/information_schema/schema_table_stream_consumption_scanner.h
 create mode 100644 be/src/information_schema/schema_table_streams_scanner.cpp
 create mode 100644 be/src/information_schema/schema_table_streams_scanner.h
 create mode 100644 be/src/runtime/aws_msk_iam_auth.cpp
 create mode 100644 be/src/runtime/aws_msk_iam_auth.h
 create mode 100644 be/src/rust/doris-native/Cargo.lock
 create mode 100644 be/src/rust/doris-native/Cargo.toml
 create mode 100644 be/src/rust/doris-native/README.md
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/Cargo.toml
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/build.rs
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/glibc_compat.c
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/src/error.rs
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/src/ffi.rs
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/src/lance_reader.rs
 create mode 100644 be/src/rust/doris-native/crates/doris-ffi/src/lib.rs
 create mode 100644 be/src/rust/doris-native/rust-toolchain.toml
 delete mode 100644 be/src/service/http/action/adjust_tracing_dump.cpp
 delete mode 100644 be/src/service/http/action/adjust_tracing_dump.h
 create mode 100644 be/src/service/http/action/compaction_profile_action.cpp
 create mode 100644 be/src/service/http/action/compaction_profile_action.h
 create mode 100644 be/src/storage/adaptive_thread_pool_controller.cpp
 create mode 100644 be/src/storage/adaptive_thread_pool_controller.h
 create mode 100644 be/src/storage/cache/ann_index_ivf_list_cache.cpp
 create mode 100644 be/src/storage/cache/ann_index_ivf_list_cache.h
 delete mode 100644 be/src/storage/cache/schema_cache.cpp
 delete mode 100644 be/src/storage/cache/schema_cache.h
 create mode 100644 be/src/storage/compaction_task_tracker.cpp
 create mode 100644 be/src/storage/compaction_task_tracker.h
 create mode 100644 be/src/storage/predicate/predicate_creator_comparison.cpp
 create mode 100644 be/src/storage/predicate/predicate_creator_in_list_in.cpp
 create mode 100644 be/src/storage/predicate/predicate_creator_in_list_not_in.cpp
 create mode 100644 be/src/storage/rowset/group_rowset_writer.cpp
 create mode 100644 be/src/storage/rowset/group_rowset_writer.h
 create mode 100644 be/src/storage/segment/adaptive_block_size_predictor.cpp
 create mode 100644 be/src/storage/segment/adaptive_block_size_predictor.h
 create mode 100644 be/src/util/block_budget.h
 delete mode 100644 be/src/util/counts.h
 delete mode 100644 be/src/util/io_helper.cpp
 delete mode 100644 be/src/util/io_helper.h
 create mode 100644 be/src/util/percentile_util.h
 create mode 100644 be/test/cloud/cloud_ms_backpressure_handler_test.cpp
 create mode 100644 be/test/cloud/cloud_ms_rpc_rate_limiters_test.cpp
 create mode 100644 be/test/cloud/cloud_schema_change_job_test.cpp
 create mode 100644 be/test/cloud/cloud_tablet_hotspot_gc_test.cpp
 create mode 100644 be/test/cloud/cloud_throttle_state_machine_test.cpp
 create mode 100644 be/test/common/block_budget_test.cpp
 create mode 100644 be/test/core/column/predicate_column_test.cpp
 create mode 100644 be/test/core/data_type/data_type_insert_default_test.cpp
 create mode 100644 be/test/core/data_type_serde/data_type_serde_datelike_batch_test.cpp
 create mode 100644 be/test/exec/common/hash_table/hash_crc32_return32_test.cpp
 create mode 100644 be/test/exec/operator/nested_loop_join_probe_operator_test.cpp
 create mode 100644 be/test/exec/runtime_filter/sync_size_callback_test.cpp
 create mode 100644 be/test/exec/runtime_filter/vruntimefilter_wrapper_sampling_test.cpp
 create mode 100644 be/test/exec/scan/scanner_late_arrival_rf_test.cpp
 create mode 100644 be/test/exec/schema_scanner/schema_role_mappings_scanner_test.cpp
 create mode 100644 be/test/exec/test_data/iceberg_mixed_position_delete_parquet/mixed_encoding_position_delete.parquet
 create mode 100644 be/test/exprs/aggregate/aggregate_function_min_max_test.cpp
 create mode 100644 be/test/exprs/aggregate/vec_window_funnel_v2_test.cpp
 create mode 100644 be/test/exprs/function/function_json_object_flatten_test.cpp
 create mode 100644 be/test/format/count_reader_test.cpp
 create mode 100644 be/test/format/csv/csv_reader_test.cpp
 create mode 100644 be/test/format/json/json_reader_test.cpp
 create mode 100644 be/test/format/lance/lance_rust_reader_test.cpp
 create mode 100644 be/test/format/lance/standalone_lance_test.cpp
 create mode 100644 be/test/format/parquet/parquet_column_convert_test.cpp
 create mode 100644 be/test/format/table/es_http_reader_test.cpp
 create mode 100644 be/test/format/table/iceberg/iceberg_delete_file_reader_helper_test.cpp
 create mode 100644 be/test/format/table/table_format_reader_test.cpp
 create mode 100644 be/test/olap/rowset/group_rowset_builder_test.cpp
 create mode 100644 be/test/runtime/aws_msk_iam_auth_test.cpp
 create mode 100644 be/test/runtime/fragment_mgr_cross_cluster_cancel_test.cpp
 create mode 100644 be/test/runtime/runtime_state_block_budget_test.cpp
 create mode 100644 be/test/service/http/compaction_action_test.cpp
 create mode 100644 be/test/storage/adaptive_thread_pool_controller_test.cpp
 create mode 100644 be/test/storage/cache/ann_index_ivf_list_cache_test.cpp
 create mode 100644 be/test/storage/compaction_task_tracker_test.cpp
 create mode 100644 be/test/storage/index/ann/extract_query_vector_test.cpp
 create mode 100644 be/test/storage/iterator/block_reader_agg_flush_test.cpp
 create mode 100644 be/test/storage/iterator/block_reader_batch_max_rows_test.cpp
 create mode 100644 be/test/storage/iterator/vcollect_iterator_collected_enough_test.cpp
 create mode 100644 be/test/storage/segment/adaptive_block_size_predictor_test.cpp
 delete mode 100644 be/test/storage/segment/inverted_index_query_param_test.cpp
 create mode 100644 be/test/storage/segment/segment_column_raw_data_bytes_test.cpp
 create mode 100644 be/test/storage/segment/segment_iterator_limit_opt_test.cpp
 create mode 100644 be/test/storage/test_data/tablet_meta_test.hdr
 delete mode 100644 be/test/util/counts_test.cpp
 create mode 100644 be/test/util/percentile_util_test.cpp
 create mode 100644 be/test/util/test_data/stat_cpu_busy_after
 create mode 100644 be/test/util/test_data/stat_cpu_busy_before
 create mode 100644 be/test/util/test_data/stat_cpu_iowait_after
 create mode 100644 be/test/util/test_data/stat_cpu_recovery_after
 create mode 100644 be/test/util/test_data/stat_cpu_regressed_after
 create mode 100755 build-support/run-clang-tidy.sh
 create mode 100644 cloud/src/common/http_helper.cpp
 create mode 100644 cloud/src/common/http_helper.h
 create mode 100644 cloud/src/snapshot/snapshot_manager_factory.cpp
 create mode 100644 cloud/src/snapshot/snapshot_manager_factory.h
 delete mode 100644 common/cpp/s3_rate_limiter.cpp
 delete mode 100644 common/cpp/s3_rate_limiter.h
 create mode 100644 common/cpp/token_bucket_rate_limiter.cpp
 create mode 100644 common/cpp/token_bucket_rate_limiter.h
 create mode 100644 docker/thirdparties/docker-compose/hive/README.md
 create mode 100644 docker/thirdparties/docker-compose/hive/README_ZH.md
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/auxlib/lzo-hadoop-1.0.6.tar.gz
 create mode 100755 docker/thirdparties/docker-compose/hive/scripts/bin/hadoop
 create mode 100755 docker/thirdparties/docker-compose/hive/scripts/bin/hive
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/bootstrap/bootstrap-groups.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/bootstrap/hive2_only.preinstalled_hql.list
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/bootstrap/hive2_only.run_sh.list
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/bootstrap/hive3_only.download_dir.list
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/bootstrap/hive3_only.run_sh.list
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/create_preinstalled_scripts/employees.csv
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/create_preinstalled_scripts/run86.hql
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/hive-common-lib.sh
 delete mode 100755 docker/thirdparties/docker-compose/hive/scripts/hive-metastore.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/hive-module-lib.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/init-hive-baseline.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/preinstalled_data/text_lzo/part-m-00000.lzo
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/preinstalled_data/text_lzo/part-m-00000.lzo.index
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/refresh-hive-modules.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/reset-hive-state.sh
 create mode 100755 docker/thirdparties/docker-compose/hive/scripts/snapshot-hive-baseline.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/start-hive-metastore.sh
 create mode 100644 docker/thirdparties/docker-compose/hive/scripts/start-hive-server.sh
 create mode 100644 docker/thirdparties/docker-compose/iceberg/scripts/create_preinstalled_scripts/iceberg/run29.sql
 copy docker/thirdparties/docker-compose/{postgresql => mysql}/certs/root.crt (100%)
 copy docker/thirdparties/docker-compose/{postgresql => mysql}/certs/server.crt (100%)
 copy docker/thirdparties/docker-compose/{postgresql => mysql}/certs/server.key (100%)
 create mode 100644 docker/thirdparties/docker-health.sh
 create mode 100644 docker/thirdparties/jindofs-helpers.sh
 create mode 100644 docker/thirdparties/test/juicefs-helpers-mirror-test.sh
 create mode 100644 docker/thirdparties/test/run-thirdparties-docker-hive-bootstrap-groups-test.sh
 copy {pytest => extension/dbt-doris/test/functional}/__init__.py (100%)
 copy {pytest => extension/dbt-doris/test/functional/adapter}/__init__.py (100%)
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_connection.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_cross_database.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_incremental.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_seed.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_snapshot.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_table.py
 create mode 100644 extension/dbt-doris/test/functional/adapter/test_doris_view.py
 create mode 100644 fe/.mvn/maven-build-cache-config.xml
 create mode 100644 fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/jdbc/JdbcDriverUtils.java
 delete mode 100644 fe/be-java-extensions/java-common/src/main/resources/log4j2.xml
 create mode 100644 fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJdbcDriverUtils.java
 create mode 100644 fe/be-java-extensions/paimon-scanner/src/test/java/org/apache/doris/paimon/PaimonJdbcDriverUtilsTest.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/pom.xml
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/DefinitionBackedRoleMappingEvaluator.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/IntegrationPropertyRoleMappingEvaluator.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/NoOpRoleMappingEvaluator.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/RoleMappingDefinition.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/RoleMappingDefinitionProvider.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/RoleMappingEvaluator.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/main/java/org/apache/doris/authentication/rolemapping/UnifiedRoleMappingCelEngine.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/test/java/org/apache/doris/authentication/plugin/oidc/playground/RoleMappingCelPlayground.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/test/java/org/apache/doris/authentication/plugin/oidc/playground/RoleMappingCelPlaygroundTest.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/test/java/org/apache/doris/authentication/rolemapping/IntegrationPropertyRoleMappingEvaluatorTest.java
 create mode 100644 fe/fe-authentication/fe-authentication-role-mapping/src/test/java/org/apache/doris/authentication/rolemapping/UnifiedRoleMappingCelEngineTest.java
 rename fe/{fe-core => fe-catalog}/src/main/antlr4/org/apache/doris/analysis/SearchLexer.g4 (100%)
 rename fe/{fe-core => fe-catalog}/src/main/antlr4/org/apache/doris/analysis/SearchParser.g4 (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/AnalyzerSelector.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/ArrayLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/BetweenPredicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/BinaryPredicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/BoolLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/CaseExpr.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/CaseWhenClause.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/CastExpr.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/ColumnAccessPath.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/ColumnAccessPathType.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/DateLiteral.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/EncryptKeyName.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/Expr.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/ExprVisitor.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/FloatLiteral.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/FunctionParams.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/IPv4Literal.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/IPv6Literal.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/InPredicate.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/InformationFunction.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/IntLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/InvertedIndexProperties.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/IsNullPredicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/JsonLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/LambdaFunctionCallExpr.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/LambdaFunctionExpr.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/LargeIntLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/LikePredicate.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/LiteralExpr.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/MapLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/MatchPredicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/MaxLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/NullLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/NumericLiteralExpr.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/OrderByElement.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/Predicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/SearchDslParser.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/SearchPredicate.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/SetType.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/SlotDescriptor.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/SlotId.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/SlotRef.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/StringLiteral.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/StructLiteral.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/TimeV2Literal.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/TimestampArithmeticExpr.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/TryCastExpr.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/TupleId.java (100%)
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/analysis/VarBinaryLiteral.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/VariableExpr.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/AggregateFunction.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/AggregateType.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/AliasFunction.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/Column.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/ColumnType.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/Function.java
 rename fe/{fe-core => fe-catalog}/src/main/java/org/apache/doris/catalog/FunctionName.java (100%)
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/GeneratedColumnInfo.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/Index.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/NameSpaceContext.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/ScalarFunction.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/catalog/info/TableNameInfo.java
 create mode 100644 fe/fe-catalog/src/main/java/org/apache/doris/persist/gson/GsonUtilsCatalog.java
 rename fe/{fe-core => fe-common}/src/main/java/org/apache/doris/common/Id.java (100%)
 rename fe/{fe-core => fe-common}/src/main/java/org/apache/doris/common/IdGenerator.java (100%)
 rename fe/{fe-core => fe-common}/src/main/java/org/apache/doris/common/TreeNode.java (100%)
 create mode 100644 fe/fe-common/src/main/java/org/apache/doris/persist/gson/GsonUtilsBase.java
 rename fe/{fe-core => fe-common}/src/main/java/org/apache/doris/persist/gson/RuntimeTypeAdapterFactory.java (100%)
 create mode 100644 fe/fe-common/src/main/java/org/apache/doris/qe/GlobalVariable.java
 create mode 100644 fe/fe-common/src/main/java/org/apache/doris/qe/VarAttrDef.java
 create mode 100644 fe/fe-connector/fe-connector-api/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/Connector.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorCapability.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorColumn.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorDatabaseMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorHttpSecurityHook.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorIdentifierOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorPartitionInfo.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorPropertyMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorPushdownOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorSchemaOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorSession.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorStatisticsOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorTableOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorTableSchema.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorTableStatistics.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorTestResult.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorType.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorValidationContext.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/ConnectorWriteOps.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/DorisConnectorException.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorDeleteHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorInsertHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorMergeHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorPartitionHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/ConnectorTransactionHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/NamedColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/handle/PassthroughQueryTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorAnd.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorBetween.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorColumnAssignment.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorColumnRef.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorComparison.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorDomain.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorExpression.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorFilterConstraint.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorFunctionCall.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorIn.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorIsNull.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorLike.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorLiteral.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorNot.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorOr.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ConnectorRange.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/FilterApplicationResult.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/LimitApplicationResult.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/pushdown/ProjectionApplicationResult.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/scan/ConnectorDeleteFile.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/scan/ConnectorScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/scan/ConnectorScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/scan/ConnectorScanRangeType.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/scan/ScanNodePropertiesResult.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/write/ConnectorWriteConfig.java
 create mode 100644 fe/fe-connector/fe-connector-api/src/main/java/org/apache/doris/connector/api/write/ConnectorWriteType.java
 create mode 100644 fe/fe-connector/fe-connector-es/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsConnector.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsConnectorRestClient.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsFieldContext.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsHostAddress.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsMajorVersion.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsMappingUtils.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsMetadataFetcher.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsMetadataState.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsNodeInfo.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsQueryDslBuilder.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsQueryDslResult.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsShardPartitions.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsShardRouting.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/java/org/apache/doris/connector/es/EsTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsConnectorRestClientTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsMajorVersionTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsMappingUtilsTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsNodeInfoAndScanRangeTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsQueryDslBuilderTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsScanPlanProviderTest.java
 create mode 100644 fe/fe-connector/fe-connector-es/src/test/java/org/apache/doris/connector/es/EsTypeMappingTest.java
 create mode 100644 fe/fe-connector/fe-connector-hive/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveConnector.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveFileFormat.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveTableFormatDetector.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveTableType.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/java/org/apache/doris/connector/hive/HiveTextProperties.java
 create mode 100644 fe/fe-connector/fe-connector-hive/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-hms/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsClient.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsClientConfig.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsClientException.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsConfHelper.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsDatabaseInfo.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsPartitionInfo.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsTableInfo.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/HmsTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-hms/src/main/java/org/apache/doris/connector/hms/ThriftHmsClient.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiConnector.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/java/org/apache/doris/connector/hudi/HudiTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-hudi/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-iceberg/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergConnector.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/java/org/apache/doris/connector/iceberg/IcebergTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-iceberg/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-jdbc/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcDbType.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcDorisConnector.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcFunctionPushdownConfig.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcIdentifierMapper.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcIdentifierQuoter.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcQueryBuilder.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/JdbcUrlNormalizer.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcClickHouseConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcDB2ConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcFieldInfo.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcGbaseConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcMySQLConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcOceanBaseConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcOracleConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcPostgreSQLConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcSQLServerConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcSapHanaConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/java/org/apache/doris/connector/jdbc/client/JdbcTrinoConnectorClient.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcConnectorMetadataTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcConnectorProviderValidateTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcDbTypeTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcDorisConnectorTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcFunctionPushdownConfigTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcIdentifierMapperTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcIdentifierQuoterTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcQueryBuilderTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcScanRangeAndPropertiesTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/JdbcUrlNormalizerTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/client/JdbcConnectorClientClassLoaderTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/client/JdbcDB2ConnectorClientTest.java
 create mode 100644 fe/fe-connector/fe-connector-jdbc/src/test/java/org/apache/doris/connector/jdbc/client/JdbcSQLServerConnectorClientTest.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MCConnectorClientFactory.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MCConnectorEndpoint.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MCConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MCTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeDorisConnector.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputePredicateConverter.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/MaxComputeTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/java/org/apache/doris/connector/maxcompute/McStructureHelper.java
 create mode 100644 fe/fe-connector/fe-connector-maxcompute/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-paimon/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonConnector.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonConnectorMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonConnectorProperties.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonPredicateConverter.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/java/org/apache/doris/connector/paimon/PaimonTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-paimon/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/fe-connector-spi/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-spi/src/main/java/org/apache/doris/connector/spi/ConnectorContext.java
 create mode 100644 fe/fe-connector/fe-connector-spi/src/main/java/org/apache/doris/connector/spi/ConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-spi/src/main/java/org/apache/doris/connector/spi/package-info.java
 create mode 100644 fe/fe-connector/fe-connector-trino/pom.xml
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoBootstrap.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoColumnHandle.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoConnectorDorisMetadata.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoConnectorProvider.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoDorisConnector.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoJsonSerializer.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoPluginManager.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoPredicateConverter.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoScanPlanProvider.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoScanRange.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoServicesProvider.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoTableHandle.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/java/org/apache/doris/connector/trino/TrinoTypeMapping.java
 create mode 100644 fe/fe-connector/fe-connector-trino/src/main/resources/META-INF/services/org.apache.doris.connector.spi.ConnectorProvider
 create mode 100644 fe/fe-connector/pom.xml
 create mode 100644 fe/fe-core/src/main/assembly/fe-lib.xml
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ArithmeticExpr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ColWithComment.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnRefExpr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/CompoundPredicate.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteral.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/DateLiteralUtils.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteral.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/DecimalLiteralUtils.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/DescriptorToThriftConverter.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyName.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ExprToColumnLabelVisitor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ExprToExprNameVisitor.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionParams.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ImportColumnsStmt.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ImportDeleteOnStmt.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ImportSequenceStmt.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/ImportWhereStmt.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/InPredicate.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExpr.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/LiteralExprUtils.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/OrderByElement.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/PlaceHolderExpr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/SlotDescriptor.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/TimeV2Literal.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/VariableExpr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/analysis/VirtualSlotRef.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/authentication/RoleMappingMeta.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/authentication/RoleMappingMgr.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateType.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/AliasFunction.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnToProtobuf.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnToThrift.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/Function.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/GeneratedColumnInfo.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/Index.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/IndexToPbConvertor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/IndexToThriftConvertor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTableWrapper.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/RowBinlogTableWrapper.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarFunction.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/AbstractTableStreamUpdate.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/BaseTableStream.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/OlapTableStream.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/OlapTableStreamUpdate.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/OlapTableStreamWrapper.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/StreamTableInfo.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/TableStreamBuildFactory.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/TableStreamManager.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/catalog/stream/TableStreamUpdateInfo.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/AzureRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/BosRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/CosRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/DefaultRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/ListObjectsResult.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/MockRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/ObjectFile.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/ObjectInfo.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/ObjectInfoAdapter.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/ObsRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/OssRemote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/RemoteBase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/S3Remote.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/cloud/storage/TosRemote.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cluster/ClusterGuard.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cluster/ClusterGuardException.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cluster/ClusterGuardFactory.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/cluster/NoOpClusterGuard.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryFragmentProcNode.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryInfoProvider.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQuerySqlProcDir.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatementsProcNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/common/util/UniqueIdUtils.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/ConnectorFactory.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/ConnectorPluginManager.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/ConnectorSessionBuilder.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/ConnectorSessionImpl.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/DefaultConnectorContext.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/connector/DefaultConnectorValidationContext.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/ConnectorColumnConverter.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/ExprToConnectorExpressionConverter.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/FilePartitionUtils.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/PluginDrivenExternalCatalog.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/PluginDrivenExternalDatabase.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/PluginDrivenExternalTable.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/PluginDrivenScanNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/PluginDrivenSplit.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/DorisEsException.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsExternalCatalog.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsExternalDatabase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsExternalTable.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsMajorVersion.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsMetaStateTracker.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsNodeInfo.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsProperties.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsRestClient.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsSchemaCacheValue.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsShardPartitions.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsShardRouting.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsTablePartitions.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUrls.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/EsUtil.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/MappingPhase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/PartitionPhase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/QueryBuilders.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/SearchContext.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/SearchPhase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/es/source/EsScanNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergSysExternalTable.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/helper/IcebergRewritableDeletePlan.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/helper/IcebergRewritableDeletePlanner.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/s3tables/CustomAwsCredentialsProvider.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/JdbcExternalCatalog.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/JdbcExternalDatabase.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/JdbcExternalTable.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/JdbcNameUtil.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/JdbcSchemaCacheValue.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/sink/JdbcTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcFunctionPushDownRule.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcScanNode.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/source/JdbcSplit.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/mapping/IdentifierMapping.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/mapping/JdbcIdentifierMapping.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOperations.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/property/common/IcebergAwsAssumeRoleProperties.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/property/common/IcebergAwsClientCredentialsProperties.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/datasource/property/fileformat/LanceFileFormatProperties.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystem.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemDescriptor.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemIOException.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemPluginManager.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemProvider.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemProviderImpl.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemType.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FileSystemUtil.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/FsStorageTypeAdapter.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/GlobListResult.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/LocalDfsFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/PersistentFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/RemoteFileRemoteIterator.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/RemoteFiles.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/RemoteIterator.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/SimpleRemoteIterator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/SpiSwitchingFileSystem.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/StoragePropertiesConverter.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/StorageTypeMapper.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/DorisInput.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/DorisInputFile.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/DorisInputStream.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/DorisOutputFile.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/ParsedPath.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/hdfs/HdfsInput.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/hdfs/HdfsInputFile.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/hdfs/HdfsInputStream.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/hdfs/HdfsOutputFile.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/io/hdfs/HdfsOutputStream.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/obj/AzureObjStorage.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/obj/ObjStorage.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/obj/RemoteObject.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/obj/RemoteObjects.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/obj/S3ObjStorage.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/BrokerFileOperations.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/BrokerOpParams.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/FileOperations.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/HDFSFileOperations.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/HDFSOpParams.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/operations/OpParams.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/AzureFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/BrokerFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/ObjFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/RemoteFile.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/RemoteFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/S3FileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/SwitchingFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/DFSFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/DFSFileSystemPhantomReference.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/JFSFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/OFSFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/OSSHdfsFileSystem.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/fs/remote/dfs/RemoteFSPhantomManager.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TSOAction.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/ClusterGuardAction.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/info/BaseTableRefInfo.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/info/TableNameInfo.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/info/TableNameInfoUtils.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/streaming/PostgresResourceValidator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/job/offset/jdbc/JdbcTvfSourceOffsetProvider.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/mysql/authenticate/AuthenticationFailureSummary.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/mysql/authenticate/MysqlAuthPacketCredentialExtractor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/mysql/authenticate/password/AuthPacketAwarePasswordResolver.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundConnectorTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundJdbcTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/RunTimeFilterTranslatorV2.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/CircleDetector.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/ConflictRulesMaker.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/GraphSimplifier.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/HyperElement.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/HyperGraph.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/SubgraphEnumerator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/bitmap/LongBitmap.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/bitmap/LongBitmapIterator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/bitmap/LongBitmapReverseIterator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/bitmap/LongBitmapSubsetIterator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/edge/Edge.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/node/AbstractNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/node/DPhyperNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/receiver/AbstractReceiver.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/receiver/Counter.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/receiver/PlanReceiver.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RecomputePhysicalPropertiesPostProcessor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ShuffleKeyPruner.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/runtimefilterv2/PushDownContext.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/runtimefilterv2/PushDownVisitor.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/runtimefilterv2/RuntimeFilterContextV2.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/runtimefilterv2/RuntimeFilterV2.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/runtimefilterv2/RuntimeFilterV2Generator.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/properties/ShuffleKeyPruneUtils.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/StringEmptyToLengthRule.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalConnectorTableSinkToPhysicalConnectorTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalDeferMaterializeOlapScanToPhysicalDeferMaterializeOlapScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalDeferMaterializeResultSinkToPhysicalDeferMaterializeResultSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalDeferMaterializeTopNToPhysicalDeferMaterializeTopN.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalEsScanToPhysicalEsScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalJdbcScanToPhysicalJdbcScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalJdbcTableSinkToPhysicalJdbcTableSink.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/CTEInliner.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DeferMaterializeTopNResult.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/NormalizeOlapTableStreamScan.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/AGENTS.md
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgx.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrAvgy.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrCount.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/RegrR2.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/WindowFunnelV2.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/JsonEach.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/JsonEachOuter.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/JsonEachText.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/generator/JsonEachTextOuter.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/IsValidUtf8.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonObjectFlatten.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/MurmurHash3U64V2.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/CdcStream.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/table/IcebergMeta.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateRoleMappingCommand.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateStreamCommand.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropRoleMappingCommand.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStreamCommand.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowCreateStreamCommand.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateStreamInfo.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/JdbcInsertCommandContext.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/JdbcInsertExecutor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/PluginDrivenInsertCommandContext.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/PluginDrivenInsertExecutor.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/worker/job/UnassignedLocalTVFSinkJob.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalConnectorTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeOlapScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeResultSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalDeferMaterializeTopN.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalEsScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJdbcTableSink.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapTableStreamScan.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalBucketedHashAggregate.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalConnectorTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeOlapScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeResultSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalDeferMaterializeTopN.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalEsScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalJdbcScan.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalJdbcTableSink.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/util/RowStoreFetchChecker.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/persist/DropRoleMappingOperationLog.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/planner/BucketedAggregationNode.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/planner/PluginDrivenTableSink.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/planner/RuntimeFilterGenerator.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/qe/GlobalVariable.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/statistics/AnalyzeSkipException.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/tablefunction/CdcStreamTableValuedFunction.java
 delete mode 100644 fe/fe-core/src/main/java/org/apache/doris/tablefunction/IcebergTableValuedFunction.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/transaction/PluginDrivenTransactionManager.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/tso/TSOService.java
 create mode 100644 fe/fe-core/src/main/java/org/apache/doris/tso/TSOTimestamp.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/alter/AlterJobV2RetryTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/alter/ReplayModifyViewDefTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/analysis/DateLiteralUtilsTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/analysis/DecimalLiteralUtilsTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/analysis/DescriptorToThriftConverterTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/analysis/ExprGsonSerializationTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/authentication/RoleMappingMgrTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/backup/BrokerStorageTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableStreamTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/catalog/DropTableStreamTest.java
 create mode 100755 fe/fe-core/src/test/java/org/apache/doris/catalog/OlapTableRowBinlogSchemaTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/catalog/OlapTableWrapperTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/catalog/SessionVariablesNullFixTest.java
 create mode 100755 fe/fe-core/src/test/java/org/apache/doris/catalog/stream/OlapTableStreamUpdateTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/cloud/CloudWarmUpJobTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/cloud/storage/ObjectInfoAdapterTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/cluster/ClusterGuardExceptionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/cluster/ClusterGuardFactoryTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/cluster/NoOpClusterGuardTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/common/proc/AlterProcDirFilterExpressionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDirTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/connector/ConnectorPluginManagerTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/connector/ConnectorSessionImplTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/ConnectorColumnConverterTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/PluginDrivenExternalCatalogConcurrencyTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/PluginDrivenExternalTableEngineTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/hive/HiveUtilTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/hive/ThriftHMSCachedClientTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/iceberg/helper/IcebergRewritableDeletePlannerTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/jdbc/JdbcExternalCatalogTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/jdbc/source/JdbcScanNodeTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/jdbc/util/JdbcFieldSchemaTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/mapping/JdbcIdentifierMappingTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/datasource/systable/IcebergSysTableResolverTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsNodeInfoTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsShardPartitionsTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsTestCase.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsUtilTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/PartitionPhaseTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/external/iceberg/IcebergHadoopCatalogTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/FileSystemTransferUtilTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/MemoryFileSystem.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/MemoryFileSystemTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/SpiSwitchingFileSystemTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/obj/AzureObjStorageTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/obj/MockedS3Client.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/obj/S3FileSystemTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/obj/S3ObjStorageGlobListTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/obj/S3ObjStorageTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/fs/remote/RemoteFileSystemTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/httpv2/rest/HttpApiAuthTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/httpv2/rest/LoadActionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/info/TableNameInfoUtilsTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/DataSourceConfigValidatorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJobCheckDataQualityTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/load/DeleteJobTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/load/routineload/KafkaAwsMskIamAuthTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/master/MasterImplDeleteTaskTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/mysql/authenticate/MysqlAuthPacketCredentialExtractorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/mysql/authenticate/TestLogAppender.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/mysql/authenticate/password/ClearPasswordResolverTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/mysql/authenticate/plugin/AuthenticationPluginAuthenticatorTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/CircleDetectorTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifierTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/HyperGraphTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/OtherJoinTest.java
 delete mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/SubgraphEnumeratorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/BitmapTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/CircleDetectorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/GraphSimplifierConsistencyTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/HyperGraphTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/OtherJoinTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraphv2/SubgraphEnumeratorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/parser/RoleMappingParserTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/processor/post/ShuffleKeyPrunerTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ShuffleKeyPruneUtilsTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/EliminateLogicalSelectHintTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/UserVariableAnalysisTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/mv/NullRejectInferenceTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/rules/StringEmptyToLengthRuleTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/implementation/BucketedAggregateTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/AggregateUnionPlanTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/CollectFilterAboveConsumerTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownFilterThroughGenerateTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushProjectIntoUnionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushProjectThroughUnionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ShortCircuitPointQueryTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/CaseWhenTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/ExpressionTraitTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/FieldDateTimeV2WildcardTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/functions/window/TimestampTzLeadLagSignatureTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/ExplainTableStreamPlanTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/IcebergMergeCommandTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/SqlBlockRuleCommandTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/insert/IcebergDeleteExecutorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/insert/IcebergMergeExecutorTest.java
 create mode 100755 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/insert/InsertIntoTableCommandTableStreamTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScanTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/nereids/util/HyperGraphBuilderOld.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/persist/gson/GsonProtobufCompatibilityTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/planner/IcebergDeleteSinkTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/planner/IcebergMergeSinkTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/qe/AuditLogHelperTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/qe/AuditLogWorkloadGroupTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/qe/ConnectAttributesForwardTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/qe/CoordinatorTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/resource/workloadschedpolicy/WorkloadRuntimeStatusMgrTest.java
 create mode 100755 fe/fe-core/src/test/java/org/apache/doris/transaction/TableStreamOffsetTransactionTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/tso/TSOServiceTest.java
 create mode 100644 fe/fe-core/src/test/java/org/apache/doris/tso/TSOTimestampTest.java
 create mode 100644 fe/fe-filesystem/ENV_TEST_README.md
 create mode 100644 fe/fe-filesystem/README.md
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/BlockInfo.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/DorisInputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/DorisInputStream.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/DorisOutputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileEntry.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileIterator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileSystemIOException.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileSystemTransferUtil.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileSystemType.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/FileSystemUtil.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/GlobListing.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/Location.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/RemoteIterator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/main/java/org/apache/doris/filesystem/SimpleRemoteIterator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/BlockInfoTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/EnvTestBase.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/FileEntryTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/FileSystemDefaultMethodsTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/FileSystemTransferUtilTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/FileSystemUtilTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/GlobListingTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/LocationTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-api/src/test/java/org/apache/doris/filesystem/SimpleRemoteIteratorTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/java/org/apache/doris/filesystem/azure/AzureFileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/java/org/apache/doris/filesystem/azure/AzureFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/java/org/apache/doris/filesystem/azure/AzureObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/java/org/apache/doris/filesystem/azure/AzureUri.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/test/java/org/apache/doris/filesystem/azure/AzureFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/test/java/org/apache/doris/filesystem/azure/AzureFileSystemProviderTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/test/java/org/apache/doris/filesystem/azure/AzureFileSystemTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/test/java/org/apache/doris/filesystem/azure/AzureObjStorageExtensionTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-azure/src/test/java/org/apache/doris/filesystem/azure/AzureUriTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerClientFactory.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerClientPool.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerInputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerInputStream.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerOutputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerOutputStream.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/java/org/apache/doris/filesystem/broker/BrokerSpiFileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerClientFactoryTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerClientPoolTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerFileSystemProviderTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerInputFileTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerInputStreamTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerOutputFileTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerOutputStreamTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerSpiFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-broker/src/test/java/org/apache/doris/filesystem/broker/BrokerSpiFileSystemTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/main/java/org/apache/doris/filesystem/cos/CosFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/main/java/org/apache/doris/filesystem/cos/CosObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/test/java/org/apache/doris/filesystem/cos/CosFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-cos/src/test/java/org/apache/doris/filesystem/cos/CosObjStorageTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/DFSFileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsConfigBuilder.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsFileIterator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsInputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsOutputFile.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/HdfsSeekableInputStream.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/KerberosHadoopAuthenticator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/java/org/apache/doris/filesystem/hdfs/SimpleHadoopAuthenticator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/DFSFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/DFSFileSystemTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/HdfsConfigBuilderTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/HdfsFileIteratorTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/HdfsSeekableInputStreamTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/KerberosHadoopAuthenticatorEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-hdfs/src/test/java/org/apache/doris/filesystem/hdfs/SimpleHadoopAuthenticatorTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/src/main/java/org/apache/doris/filesystem/local/LocalFileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/src/main/java/org/apache/doris/filesystem/local/LocalFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-local/src/test/java/org/apache/doris/filesystem/local/LocalFileSystemTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/main/java/org/apache/doris/filesystem/obs/ObsFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/main/java/org/apache/doris/filesystem/obs/ObsObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/test/java/org/apache/doris/filesystem/obs/ObsFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-obs/src/test/java/org/apache/doris/filesystem/obs/ObsObjStorageTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/main/java/org/apache/doris/filesystem/oss/OssFileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/main/java/org/apache/doris/filesystem/oss/OssObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/test/java/org/apache/doris/filesystem/oss/OssFileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-oss/src/test/java/org/apache/doris/filesystem/oss/OssObjStorageTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/assembly/plugin-zip.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/java/org/apache/doris/filesystem/s3/S3FileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/java/org/apache/doris/filesystem/s3/S3FileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/java/org/apache/doris/filesystem/s3/S3ObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/java/org/apache/doris/filesystem/s3/S3OutputStream.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/java/org/apache/doris/filesystem/s3/S3Uri.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/main/resources/META-INF/services/org.apache.doris.filesystem.spi.FileSystemProvider
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3FileSystemEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3FileSystemProviderTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3FileSystemTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3ObjStorageEnvTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3ObjStorageMockTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3ObjStorageTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3OutputStreamTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-s3/src/test/java/org/apache/doris/filesystem/s3/S3UriTest.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/pom.xml
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/FileSystemProvider.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/HadoopAuthenticator.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/IOCallable.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/ObjFileSystem.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/ObjStorage.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/RemoteObject.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/RemoteObjects.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/RequestBody.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/StsCredentials.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/main/java/org/apache/doris/filesystem/spi/UploadPartResult.java
 create mode 100644 fe/fe-filesystem/fe-filesystem-spi/src/test/java/org/apache/doris/filesystem/spi/ObjFileSystemTest.java
 create mode 100644 fe/fe-filesystem/pom.xml
 create mode 100644 fe/fe-foundation/src/main/java/org/apache/doris/foundation/fs/FsStorageType.java
 create mode 100644 fe/fe-foundation/src/main/java/org/apache/doris/foundation/util/ConcurrentLong2LongHashMap.java
 create mode 100644 fe/fe-foundation/src/main/java/org/apache/doris/foundation/util/ConcurrentLong2ObjectHashMap.java
 create mode 100644 fe/fe-foundation/src/main/java/org/apache/doris/foundation/util/UUIDUtils.java
 create mode 100644 fe/fe-foundation/src/test/java/org/apache/doris/foundation/util/ConcurrentLong2LongHashMapTest.java
 create mode 100644 fe/fe-foundation/src/test/java/org/apache/doris/foundation/util/ConcurrentLong2ObjectHashMapTest.java
 create mode 100644 fe/fe-grpc/pom.xml
 create mode 100644 fe/fe-type/src/main/java/org/apache/doris/catalog/PatternType.java
 create mode 100644 fs_brokers/cdc_client/src/main/java/org/apache/doris/cdcclient/exception/CommonException.java
 create mode 100644 fs_brokers/cdc_client/src/main/java/org/apache/doris/cdcclient/exception/StreamException.java
 delete mode 100644 fs_brokers/cdc_client/src/main/java/org/apache/flink/cdc/connectors/postgres/source/PostgresConnectionPoolFactory.java
 create mode 100644 fs_brokers/cdc_client/src/test/java/org/apache/doris/cdcclient/source/reader/mysql/MySqlSourceReaderTest.java
 create mode 100644 fs_brokers/cdc_client/src/test/java/org/apache/doris/cdcclient/utils/ConfigUtilTest.java
 create mode 100755 post-build.sh
 create mode 100644 regression-test/data/ann_index_p0/ann_const_expr_vector.out
 create mode 100644 regression-test/data/ann_index_p0/ann_index_on_mow.out
 create mode 100644 regression-test/data/ann_index_p0/ivf_on_disk_index_test.out
 create mode 100644 regression-test/data/ann_index_p0/ivf_on_disk_stream_load.csv
 create mode 100644 regression-test/data/ann_index_p0/ivf_on_disk_stream_load.json
 create mode 100644 regression-test/data/cloud_p0/cache/ttl/ex02_alter_illegal_combo.out
 create mode 100644 regression-test/data/cloud_p0/cache/ttl/ex06_ttl_restart_consistency.out
 create mode 100644 regression-test/data/cloud_p0/cache/ttl/ex08_clear_cache_query_concurrency.out
 copy regression-test/data/cloud_p0/{ => cache}/ttl/st04_alter_ttl_n_to_0_runtime.out (100%)
 copy regression-test/data/cloud_p0/{ => cache}/ttl/st06_warmup_ttl_type_assert.out (100%)
 copy regression-test/data/cloud_p0/{ => cache}/ttl/st07_qcs_consistency.out (100%)
 copy regression-test/data/cloud_p0/{ => cache}/ttl/st10_drop_partition_cleanup.out (100%)
 copy regression-test/data/cloud_p0/{ => cache}/ttl/st10_drop_table_cleanup.out (100%)
 create mode 100644 regression-test/data/cloud_p0/compaction/test_cloud_admin_compact_table.out
 rename regression-test/data/cloud_p0/{diffrent_serialize/diffrent_serialize.out => different_serialize/different_serialize.out} (100%)
 create mode 100644 regression-test/data/compaction/test_admin_compact_table.out
 create mode 100644 regression-test/data/correctness_p0/test_rf_in_list_not_erased_by_scope_range.out
 create mode 100644 regression-test/data/datatype_p0/timestamptz/test_timestamptz_agg_functions.out
 create mode 100644 regression-test/data/datatype_p0/timestamptz/test_timestamptz_array_index.out
 create mode 100644 regression-test/data/datatype_p0/timestamptz/test_timestamptz_dst_fold.out
 create mode 100644 regression-test/data/datatype_p0/timestamptz/test_timestamptz_dst_gap.out
 create mode 100644 regression-test/data/datatype_p0/timestamptz/test_timestamptz_max_min_by.out
 create mode 100644 regression-test/data/external_table_p0/es/test_es_query_predicate_correctness.out
 create mode 100644 regression-test/data/external_table_p0/hive/test_hive_lzo_text_format.out
 create mode 100644 regression-test/data/external_table_p0/jdbc/test_jdbc_catalog_predicate_pushdown.out
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_transactions/0-055c1ba4-03ab-4a0e-8829-15bb1a6d2d08.txn
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_transactions/1-242b9a64-71b6-4ce9-bc7d-a09c7bd82089.txn
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_transactions/2-43117771-3274-4c35-bbf7-948403ce6510.txn
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_versions/1.manifest
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_versions/2.manifest
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/_versions/3.manifest
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/data/5605bf04-7859-468c-8f08-7c95a5444617.lance
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/data/82a4ff91-1bdd-487d-a008-9c5682a1dca0.lance
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/multi.lance/data/ca28aa58-00ae-48cc-ac5a-dc1746d1680b.lance
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/single.lance/_transactions/0-c6b23c0d-3ce1-45af-852f-25eeddb0fa8f.txn
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/single.lance/_versions/1.manifest
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/single.lance/data/f80e031c-321c-4729-849b-e4338790114e.lance
 create mode 100644 regression-test/data/external_table_p0/tvf/lance/test_lance_tvf.out
 delete mode 100644 regression-test/data/external_table_p2/tvf/test_iceberg_meta.out
 create mode 100644 regression-test/data/inverted_index_p0/test_count_match_all_pushdown.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/test_streaming_mysql_job_alter_cred.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/test_streaming_mysql_job_col_filter.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/test_streaming_mysql_job_special_offset.out
 copy regression-test/data/job_p0/streaming_job/cdc/{test_streaming_postgres_job_ssl.out => test_streaming_mysql_job_ssl.out} (100%)
 copy regression-test/data/job_p0/streaming_job/cdc/{test_streaming_postgres_job_table_mapping.out => test_streaming_mysql_job_table_mapping.out} (100%)
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/test_streaming_postgres_job_publication.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/test_streaming_postgres_job_special_offset.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_cdc_stream_tvf_mysql.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_cdc_stream_tvf_publication.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_mysql.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_latest_alter_cred.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_pause_resume.out
 create mode 100644 regression-test/data/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_restart_fe.out
 copy regression-test/data/job_p0/streaming_job/{test_streaming_insert_job_crud.out => test_streaming_insert_job_file_number.out} (100%)
 create mode 100644 regression-test/data/load_p0/stream_load/test_tinyint_overflow.csv
 create mode 100644 regression-test/data/mv_p0/ut/testBucketedAggSyncMV/testBucketedAggSyncMV.out
 delete mode 100644 regression-test/data/nereids_function_p0/agg_function/test_regr_sxx.out
 delete mode 100644 regression-test/data/nereids_function_p0/agg_function/test_regr_sxy.out
 delete mode 100644 regression-test/data/nereids_function_p0/agg_function/test_regr_syy.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate_count1.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate_groupby_null.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate_grouping_function.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate_having_grouping.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/aggregate_output_null.out
 delete mode 100644 regression-test/data/nereids_p0/aggregate/datetype.csv
 delete mode 100644 regression-test/data/nereids_p0/aggregate/window_funnel.out
 delete mode 100644 regression-test/data/nereids_p0/baseall.txt
 delete mode 100644 regression-test/data/nereids_p0/cache/partition_cache.out
 delete mode 100644 regression-test/data/nereids_p0/ddl/alter/test_nereids_alter_database_set_quota.out
 delete mode 100644 regression-test/data/nereids_p0/eager_agg/eager_agg.out
 delete mode 100644 regression-test/data/nereids_p0/eliminate_outer_join/eliminate_outer_join.out
 delete mode 100644 regression-test/data/nereids_p0/empty_table/sql/avg_decimal.out
 delete mode 100644 regression-test/data/nereids_p0/except/test_query_except.out
 delete mode 100644 regression-test/data/nereids_p0/explain/test_pushdown_explain.out
 delete mode 100644 regression-test/data/nereids_p0/group_concat/test_group_concat.out
 delete mode 100644 regression-test/data/nereids_p0/grouping_sets/test_grouping_sets.out
 delete mode 100644 regression-test/data/nereids_p0/grouping_sets/test_grouping_sets1.out
 create mode 100644 regression-test/data/nereids_p0/hash_shuffle_key_prune/hash_shuffle_key_prune.out
 delete mode 100644 regression-test/data/nereids_p0/hint/test_leading.out
 delete mode 100644 regression-test/data/nereids_p0/insert_into_table/insert_cte.out
 delete mode 100644 regression-test/data/nereids_p0/intersect/test_intersect.out
 delete mode 100644 regression-test/data/nereids_p0/join/bucket_shuffle_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/agg_output_as_right_tale_left_outer_order.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/bucket_shuffle_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/full_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/issue_12689.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/issue_7288.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/test_outer_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/sql/test_outer_join_with_delete_column.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_bitmap_filter.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_join2.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_join3.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_join4.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_join5.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_left_join1.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_left_join_null.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_nestedloop_outer_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_nestedloop_semi_anti_join.out
 delete mode 100644 regression-test/data/nereids_p0/join/test_runtimefilter_on_datev2.out
 delete mode 100644 regression-test/data/nereids_p0/keyword/order_group.out
 delete mode 100644 regression-test/data/nereids_p0/keyword/test_keyword.out
 delete mode 100644 regression-test/data/nereids_p0/large_wide_table/large_wide_table.out
 delete mode 100644 regression-test/data/nereids_p0/lateral_view/test_issue_11986.out
 delete mode 100644 regression-test/data/nereids_p0/lateral_view/test_issue_8850.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/predicateNotProjected.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/useRestrictiveLimitFromSubq.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withGroupBy.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withGroupByAndOrderByInSubq.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withGroupByInSubq.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withJoinInSubq.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withLimitZero.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withOrderBy.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withSimpleLimit.out
 delete mode 100644 regression-test/data/nereids_p0/limit/sql/withSubq.out
 delete mode 100644 regression-test/data/nereids_p0/operator/test_arithmetic_operators.out
 delete mode 100644 regression-test/data/nereids_p0/operator/test_logical_operators.out
 delete mode 100644 regression-test/data/nereids_p0/runtime_filter/check_rf.out
 delete mode 100644 regression-test/data/nereids_p0/runtime_filter/cte-runtime-filter.out
 delete mode 100644 regression-test/data/nereids_p0/runtime_filter/runtime_filter.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/projectAggFuncs.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/projectConstants.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/projectFunctions.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/withGroupOrderHaving.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/withUnionAll.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/withWhereClause.out
 delete mode 100644 regression-test/data/nereids_p0/select_no_from/sql/withWhereFalse.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/except.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/sql/except_1_order.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/sql/except_2_order.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/sql/except_3_order.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/sql/intersect_1_order.out
 delete mode 100644 regression-test/data/nereids_p0/set_operations/sql/intersect_2_order.out
 delete mode 100644 regression-test/data/nereids_p0/show/test_show_create_view.out
 delete mode 100644 regression-test/data/nereids_p0/show/test_show_where.out
 delete mode 100644 regression-test/data/nereids_p0/sort/sort.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_all_functions.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_bit.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_collect.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_histogram.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_retention.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_sequence_match.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/aggregate_functions/test_approx_count_distinct.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/sql/q01.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/sql/q02.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/sql/q03.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/sql/q04.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_array_aggregation_functions.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_array_functions.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_array_functions_by_literal.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_array_functions_of_array_difference.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_array_functions_with_where.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/array_functions/test_issue_13606.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/bitmap_functions/test_btimap_count.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/case_function/test_case_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/cast_function/test_cast_array_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/cast_function/test_cast_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/cast_function/test_cast_string_to_array.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/datetype.csv
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_coalesce.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_conditional_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_if.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_nullif.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_nvl.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_query_between.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_query_in.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_query_like.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_query_limit.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/conditional_functions/test_query_where.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/convertion_functions/sql/castAccessible.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/datetime_functions/test_date_function_v2.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/datetime_functions/test_dayofweek.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/datetime_functions/test_time_lut.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/datetime_functions/test_timestampdiff.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/digital-masking/test_digital_masking.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/encryption_digest/test_encryption_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/hash_functions/test_hash_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/horology_functions/sql/extractAccessible.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_function/test_query_json_array.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_function/test_query_json_insert.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_function/test_query_json_object.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_function/test_query_json_replace.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_function/test_query_json_set.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/json_functions/test_json_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/math_functions/test_conv.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/math_functions/test_multiply.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/math_functions/test_round.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/math_functions/test_running_difference.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/search_functions/test_multi_string_position.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/search_functions/test_multi_string_search.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/spatial_functions/test_gis_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/spatial_functions/test_st_astext.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/sql/likeOperatorWorks_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_reverse.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_split_part.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_like_pushdown.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/string_functions/test_string_function_regexp.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/table_function/explode.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/table_function/explode_json_array.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/table_function/explode_split.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/test_in_expr.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/width_bucket_fuctions/test_width_bucket_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sf0.01/nation.csv
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sf0.01/region.csv
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/leadLag.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/noOrderAllRowsPeers_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rangeCurrent.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rangeCurrent_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rangeNoPartition_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rangeUnbounded.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rangeUnbounded_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsDifferentOrders.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsDisjointWindows.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsFirstLast.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsFrame2F3F.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsFrame2FUBF.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsFrame3P2P.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsFrameUBP2P.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsIdenticalWindows.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsIntersectingWindows.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsUBPImplicitCR.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/rowsUnbounded_order.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/windowSpecificationAAcpA.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/windowSpecificationABA.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/sql/windowSpecificationABcpA.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/tenk.data
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_ntile_function.csv
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_ntile_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_select_stddev_variance_window.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_stddev_variance_window.csv
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_sum.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_window_fn.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/test_window_function.out
 delete mode 100644 regression-test/data/nereids_p0/sql_functions/window_functions/window_functions.out
 delete mode 100644 regression-test/data/nereids_p0/subquery/test_subquery.out
 delete mode 100644 regression-test/data/nereids_p0/system/test_query_sys_data_type.out
 delete mode 100644 regression-test/data/nereids_p0/system/test_query_sys_tables.out
 delete mode 100644 regression-test/data/nereids_p0/system/test_runtime_filter.out
 delete mode 100644 regression-test/data/nereids_p0/test_char_implicit_cast.out
 delete mode 100644 regression-test/data/nereids_p0/test_data_type_marks.out
 delete mode 100644 regression-test/data/nereids_p0/test_dict_with_null.out
 delete mode 100644 regression-test/data/nereids_p0/test_orderby_nullliteral.out
 delete mode 100644 regression-test/data/nereids_p0/test_select_constant.out
 delete mode 100644 regression-test/data/nereids_p0/test_select_with_predicate_like.out
 delete mode 100644 regression-test/data/nereids_p0/type_inference/test_binary_predicate_cast.out
 delete mode 100644 regression-test/data/nereids_p0/type_inference/test_largeint.out
 delete mode 100644 regression-test/data/nereids_p0/union/test_union.out
 delete mode 100644 regression-test/data/nereids_p0/wide_table/sql/wide_table.out
 delete mode 100644 regression-test/data/nereids_p0/with/test_with.out
 delete mode 100644 regression-test/data/nereids_p0/with/test_with_and_two_phase_agg.out
 create mode 100644 regression-test/data/nereids_rules_p0/column_pruning/nested_container_offset_pruning.out
 create mode 100644 regression-test/data/nereids_rules_p0/column_pruning/string_length_column_pruning.out
 create mode 100644 regression-test/data/nereids_rules_p0/count_null_not_count_star/count_null_not_count_star.out
 create mode 100644 regression-test/data/nereids_rules_p0/defer_materialize_topn/lazy_materialize_topn.out
 create mode 100644 regression-test/data/nereids_rules_p0/mv/join_elim_p_f_key/join_elim_filter_edge.out
 create mode 100644 regression-test/data/nereids_rules_p0/unique_function/collect_filter_above_consumer_with_unique_function.out
 create mode 100644 regression-test/data/nereids_rules_p0/unique_function/push_down_filter_through_generate_with_unique_function.out
 create mode 100644 regression-test/data/pythonudaf_p0/test_pythonudaf_forbidden_module.out
 create mode 100644 regression-test/data/pythonudaf_p0/test_pythonudaf_pkg_isolation.out
 create mode 100644 regression-test/data/pythonudf_p0/test_pythonudf_forbidden_module.out
 create mode 100644 regression-test/data/pythonudf_p0/test_pythonudf_pkg_isolation.out
 create mode 100644 regression-test/data/pythonudtf_p0/test_pythonudtf_forbidden_module.out
 create mode 100644 regression-test/data/pythonudtf_p0/test_pythonudtf_pkg_isolation.out
 create mode 100644 regression-test/data/query_p0/adaptive_batch_size/adaptive_batch_size.out
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/agg_group_concat.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/agg_nullable.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/agg_nullable_2.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/agg_window_project.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/agg_with_distinct_project.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/aggregate_groupby_simplify.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/aggregate/aggregate_stddev_over_range.out (100%)
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_avgx.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_avgy.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_count.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_r2.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_sxx.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_sxy.out
 create mode 100644 regression-test/data/query_p0/aggregate/test_regr_syy.out
 create mode 100644 regression-test/data/query_p0/aggregate/window_funnel.out
 create mode 100644 regression-test/data/query_p0/aggregate/window_funnel_v2.out
 rename regression-test/data/{nereids_p0 => query_p0}/colocate/test_multi_cast_colocate.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/colocate/test_set_operation_colocate.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/compress_materialize/compress_materialize.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/compress_materialize/pushdown_encode.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/create_table/test_create_blocked.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/create_table/test_create_table.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/create_table/test_ctas.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/cte/cte.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/cte/test_cte_filter_pushdown.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/cte/test_cte_multicast_complex.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/cte/test_cte_name_reuse.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/datatype/test_cast.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/datatype/test_date_acquire.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/datatype/test_datev1.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/datatype/test_decimalv2.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/datatype/test_map.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/alter/test_nereids_alter_database_rename.out (100%)
 create mode 100644 regression-test/data/query_p0/ddl/alter/test_nereids_alter_database_set_quota.out
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/describe/describe_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/recover/test_recover_all.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/recover/test_recover_db.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/set_and_unset_commands/set_and_unset_variable_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/show_authors/show_authors.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/show_variables/show_variables_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/show_view/show_view_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/test_truncate_table_nereids.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/ddl/use/use_command_nereids.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/delete/delete_cte.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/delete/delete_cte_ck.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/delete/delete_mow_partial_update.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/delete/delete_using.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/delete/partial_update_delete.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/dist_expr_list/dist_expr_list.out (100%)
 create mode 100644 regression-test/data/query_p0/eager_agg/eager_agg.out
 create mode 100644 regression-test/data/query_p0/eliminate_outer_join/eliminate_outer_join.out
 rename regression-test/data/{nereids_p0 => query_p0}/eliminate_outer_join/test_eliminate_outer_join.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/explain/test_scan_preaggregation_explain.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fe_constant_cast_to_date.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fe_constant_cast_to_datetime.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fe_constant_cast_to_fractional.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fe_constant_cast_to_int.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fe_try_cast.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fold_constant_by_be.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fold_constant_by_fe.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/fold_constant_string_arithmatic.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/fold_constant/json_constant.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/test_default_expr.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/expression/topn_to_max.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/fix_leading.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/multi_leading.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t1.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t2.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t3.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t4.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t5.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/t6.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/test_distribute.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/hint/test_hint.out (100%)
 create mode 100644 regression-test/data/query_p0/hint/test_leading.out
 rename regression-test/data/{nereids_p0 => query_p0}/huge_compound/huge_compound.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/aggregate.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/complex_insert.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/duplicate.out (100%)
 create mode 100644 regression-test/data/query_p0/insert_into_table/insert_cte.out
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/insert_values.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/nereids_insert_random.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/no_partition.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/partial_update.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/partial_update_complex.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/partial_update_seq_col.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/src.dat (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/type_cast_aggregate.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/type_cast_duplicate.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/type_cast_unique.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/unique.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/insert_into_table/update_on_current_timestamp.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/collect/test_javaudf_groupcount.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/collect/test_javaudf_murmurhash3.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/collect/test_javaudf_sessionize.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/date/test_javaudf_adddays.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/date/test_javaudf_addisoperioud.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/date/test_javaudf_daydiff.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/json/test_javaudf_convertfromcamelcase.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/json/test_javaudf_converttocamelcase.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/sanity/test_javaudf_assertequal.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/sanity/test_javaudf_assertlessthan.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/sanity/test_javaudf_assertudf.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/sketch/test_javaudf_md5.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_my_date_datetime.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mygroupconcat_string.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mysum_array.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mysum_decimal.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mysum_double.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mysum_float_double.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_mysum_int.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudaf_null_test.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_array.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_boolean.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_case.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_date.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_decimal.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_float.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_int.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_ip.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_null.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/javaudf/test_javaudf_string.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/asof/test_asof_join.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/asof/test_asof_join_build_expr_edge.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/asof/test_asof_join_explicit.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/asof/test_asof_join_expr.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/asof/test_asof_join_large_bucket.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/initial_join_order/initial_join_order.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/invalid_stats/invalid_stats_join_order.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/outer_join_with_empty_node.out (100%)
 create mode 100644 regression-test/data/query_p0/join/sql/bucket_shuffle_join.out
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_11.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_12.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_13.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_14.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_15.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_local_shuffle.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_join_on.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_limit_join.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_mark_join.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_multilevel_join_agg_local_shuffle.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_outer_join.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/join/test_runtimefilter_on_decimal.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/legacy/test_clone_legacy_nullable_from_nereids.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/limit/filterLimitProject.out (100%)
 create mode 100644 regression-test/data/query_p0/limit/test_general_limit_pushdown.out
 create mode 100644 regression-test/data/query_p0/limit/test_unified_limit_pushdown.out
 rename regression-test/data/{nereids_p0 => query_p0}/multi_distinct/multi_distinct_window.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/agg_state/test_outfile_agg_state.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/agg_state_array/test_outfile_agg_array.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/agg_state_bitmap/test_outfile_agg_state_bitmap.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/hll/test_outfile_hll.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/quantile_state/test_outfile_quantile_state.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile_csv_with_names.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile_exception.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile_expr.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile_parquet.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/outfile/test_outfile_separator.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/partition_topn/check_orderkey.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/physical_translator/test_physical_translator.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/repeat/test_repeat_output_slot.out (100%)
 create mode 100644 regression-test/data/query_p0/runtime_filter/check_rf.out
 create mode 100644 regression-test/data/query_p0/runtime_filter/cte-runtime-filter.out
 rename regression-test/data/{nereids_p0 => query_p0}/runtime_filter/expr-target.out (100%)
 create mode 100644 regression-test/data/query_p0/runtime_filter/runtime_filter.out
 create mode 100644 regression-test/data/query_p0/runtime_filter/set_operator_in_filter.out
 create mode 100644 regression-test/data/query_p0/schema_table/test_stream_consumption_schema.out
 create mode 100644 regression-test/data/query_p0/schema_table/test_stream_info_schema.out
 rename regression-test/data/{nereids_p0 => query_p0}/select_tablets/select_with_tablets.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/session_variable/test_default_limit.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/session_variable/test_variable_between.out (100%)
 create mode 100644 regression-test/data/query_p0/set_operations/except.out
 create mode 100644 regression-test/data/query_p0/set_operations/set_operation_exprid_reuse.out
 create mode 100644 regression-test/data/query_p0/set_operations/test_pullup_predicate_null.out
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_charset_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_collation.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_columns_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_commands_nereids.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_create_catalog.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_create_db_nereids.out (100%)
 create mode 100644 regression-test/data/query_p0/show/test_show_create_view.out
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_data_types.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_status_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/show/test_show_warning_errors_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/aggregate_functions/test_aggregate_percentile_approx_weighted.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.out (100%)
 create mode 100644 regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.out
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/array_functions/array_filter.csv (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/array_functions/test_array_contains_all.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/array_functions/test_array_filter.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/datetime_functions/test_add_sub_union_type.out (100%)
 create mode 100644 regression-test/data/query_p0/sql_functions/datetime_functions/test_date_function_v2.out
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/encryption_digest/test_md5.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/math_functions/test_abs.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/math_functions/test_round_overflow.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/string_functions/test_concat.out (100%)
 create mode 100644 regression-test/data/query_p0/sql_functions/string_functions/test_is_valid_utf8.out
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/string_functions/test_split_by_string.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/table_function/explode_map.out (100%)
 create mode 100644 regression-test/data/query_p0/sql_functions/table_function/json_each.out
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/table_function/posexplode.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/test_arith_functions.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/sql_functions/window_functions/test_count_star.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/stats/col_stats/hot_value_str_to_date.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/stats/invalid_stats.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/stats/invalid_stats/invalid_stats.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/subquery/correlated_scalar_subquery.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/subquery/subquery_unnesting.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/subquery/test_inlineview_with_project.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/subquery/test_subquery_in_project.out (100%)
 create mode 100644 regression-test/data/query_p0/subquery/test_subquery_in_simple_case.out
 rename regression-test/data/{nereids_p0 => query_p0}/test_alter_catalog_comment_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_alter_catalog_properties_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_alter_catalog_rename_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_create_catalog_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_cte_subquery_many.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_delete_sign_mow.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_drop_catalog_command.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_filter_pushdown_set.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_nereids_encrypt_test.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_nestloop_join_nullable.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/test_user_var.out (100%)
 create mode 100644 regression-test/data/query_p0/topn_lazy/lazy_materialize_view.out
 rename regression-test/data/{nereids_p0 => query_p0}/type_inference/test_string_literal_vs_other_literal.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/union/or_expansion.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/update/update_after_create_rollup.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/update/update_cte.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/update/update_unique_table.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_alias_function.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_array_agg_view.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_generated_column.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_mtmv.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_sync_mv.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/test_view_var_persist.out (100%)
 rename regression-test/data/{nereids_p0 => query_p0}/variables_persist/use_view_create_mv.out (100%)
 create mode 100644 regression-test/data/search/test_search_inverted_index_profile.out
 create mode 100644 regression-test/data/table_stream_p0/test_olap_table_stream_history_consumption.out
 create mode 100644 regression-test/data/table_stream_p0/test_olap_table_stream_history_query.out
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q01.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q02.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q03.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q04.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q05.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q06.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q07.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q08.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q09.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q10.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q11.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q12.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q13.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q14.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q15.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q16.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q17.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q18.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q19.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q20.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q21.out (100%)
 copy regression-test/data/{tpch_sf100_p2 => tpch_sf100_unique_mor_p2}/sql/q22.out (100%)
 create mode 100644 regression-test/data/variant_p0/compaction/test_compaction_nokey_variant.out
 create mode 100644 regression-test/data/variant_p0/doc_mode/test_variant_cast_strict.out
 create mode 100644 regression-test/data/variant_p0/duplicate_json_path.json
 create mode 100644 regression-test/data/variant_p0/test_json_object_flatten.out
 create mode 100755 regression-test/pipeline/common/get-hive-bootstrap-groups.sh
 create mode 100644 regression-test/pipeline/common/stage-timer.sh
 create mode 100644 regression-test/pipeline/common/test_stage_timer.py
 create mode 100644 regression-test/pipeline/external/external-stage-timer.sh
 create mode 100644 regression-test/suites/ann_index_p0/ann_const_expr_vector.groovy
 create mode 100644 regression-test/suites/ann_index_p0/ann_index_on_mow.groovy
 create mode 100644 regression-test/suites/ann_index_p0/ivf_on_disk_index_test.groovy
 create mode 100644 regression-test/suites/ann_index_p0/ivf_on_disk_stream_load.csv
 create mode 100644 regression-test/suites/auth/test_http_api_auth.groovy
 create mode 100644 regression-test/suites/auth_p0/test_role_mapping_system_table.groovy
 create mode 100644 regression-test/suites/aws_iam_role_p0/test_iceberg_s3tables_catalog_credentials_provider.groovy
 copy regression-test/suites/cloud_p0/cache/ddl/{st10_drop_table_cleanup.sql => ex02_alter_illegal_combo.sql} (100%)
 create mode 100644 regression-test/suites/cloud_p0/cache/ddl/ex06_ttl_restart_consistency.sql
 copy regression-test/suites/cloud_p0/cache/ddl/{st10_drop_table_cleanup.sql => ex08_clear_cache_query_concurrency.sql} (100%)
 create mode 100644 regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/cluster/test_warm_up_cluster_event_cancel_expired.groovy
 create mode 100644 regression-test/suites/cloud_p0/cache/ttl/ex02_alter_illegal_combo.groovy
 create mode 100644 regression-test/suites/cloud_p0/cache/ttl/ex06_ttl_restart_consistency.groovy
 create mode 100644 regression-test/suites/cloud_p0/cache/ttl/ex08_clear_cache_query_concurrency.groovy
 create mode 100644 regression-test/suites/cloud_p0/compaction/test_cloud_admin_compact_table.groovy
 create mode 100644 regression-test/suites/cloud_p0/packed_file/test_packed_file_async_close_error.groovy
 create mode 100644 regression-test/suites/cloud_p0/partition/test_create_table_and_create_mv_race.groovy
 create mode 100644 regression-test/suites/cloud_p0/tablets/test_tablet_stat_syncer.groovy
 create mode 100644 regression-test/suites/cloud_p0/version/test_version_syncer.groovy
 create mode 100644 regression-test/suites/cloud_p1/schema_change/compaction_optimization/test_sc_compaction_cross_v1_retry.groovy
 create mode 100644 regression-test/suites/compaction/test_admin_compact_table.groovy
 create mode 100644 regression-test/suites/compaction/test_be_compaction_tasks.groovy
 create mode 100644 regression-test/suites/compaction/test_compaction_profile_action.groovy
 create mode 100644 regression-test/suites/correctness_p0/test_rf_in_list_not_erased_by_scope_range.groovy
 create mode 100644 regression-test/suites/data_model_p0/duplicate/test_non_mow_key_bounds_aggregation.groovy
 create mode 100644 regression-test/suites/datatype_p0/timestamptz/test_timestamptz_agg_functions.groovy
 create mode 100644 regression-test/suites/datatype_p0/timestamptz/test_timestamptz_array_index.groovy
 create mode 100644 regression-test/suites/datatype_p0/timestamptz/test_timestamptz_dst_fold.groovy
 create mode 100644 regression-test/suites/datatype_p0/timestamptz/test_timestamptz_dst_gap.groovy
 create mode 100644 regression-test/suites/datatype_p0/timestamptz/test_timestamptz_max_min_by.groovy
 create mode 100644 regression-test/suites/ddl_p0/create_view_nereids/test_create_view_variant_nested_field.groovy
 rename regression-test/suites/{export_p0 => export_p2}/test_export_variant_10k_columns.groovy (100%)
 create mode 100644 regression-test/suites/external_table_p0/es/test_es_query_predicate_correctness.groovy
 create mode 100644 regression-test/suites/external_table_p0/hive/test_hive_analyze_long_string.groovy
 create mode 100644 regression-test/suites/external_table_p0/hive/test_hive_lzo_text_format.groovy
 create mode 100644 regression-test/suites/external_table_p0/iceberg/action/test_iceberg_v3_row_lineage_rewrite_data_files.groovy
 create mode 100644 regression-test/suites/external_table_p0/iceberg/test_iceberg_v2_to_v3_doris_spark_compare.groovy
 create mode 100644 regression-test/suites/external_table_p0/iceberg/test_iceberg_v3_row_lineage_query_insert.groovy
 create mode 100644 regression-test/suites/external_table_p0/iceberg/test_iceberg_v3_row_lineage_update_delete_merge.groovy
 create mode 100644 regression-test/suites/external_table_p0/jdbc/test_jdbc_catalog_predicate_pushdown.groovy
 delete mode 100644 regression-test/suites/external_table_p0/jdbc/test_jdbc_query_mysql.groovy
 delete mode 100644 regression-test/suites/external_table_p0/jdbc/test_jdbc_query_pg.groovy
 create mode 100644 regression-test/suites/external_table_p0/tvf/lance/test_lance_tvf.groovy
 create mode 100644 regression-test/suites/external_table_p2/maxcompute/write/test_mc_write_catalog_block_bytes.groovy
 delete mode 100644 regression-test/suites/external_table_p2/tvf/test_iceberg_meta.groovy
 create mode 100644 regression-test/suites/fault_injection_p0/cloud/test_cloud_ms_rpc_table_throttle.groovy
 create mode 100644 regression-test/suites/fault_injection_p0/test_audit_log_internal_query_failure.groovy
 create mode 100644 regression-test/suites/fault_injection_p0/test_forward_reopen_timeout.groovy
 create mode 100644 regression-test/suites/insert_overwrite_p0/insert_overwrite_error_message_percent.groovy
 create mode 100644 regression-test/suites/inverted_index_p0/index_change/test_drop_index_on_partition.groovy
 create mode 100644 regression-test/suites/inverted_index_p0/test_bm25_score_variant.groovy
 create mode 100644 regression-test/suites/inverted_index_p0/test_count_match_all_pushdown.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_alter_cred.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_alter_props_restart_fe.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_col_filter.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_compute_group.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_lag.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_restart_fe_with_props.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_special_offset.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_special_offset_restart_fe.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_ssl.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_mysql_job_table_mapping.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_postgres_job_lag.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_postgres_job_publication.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/test_streaming_postgres_job_special_offset.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_cdc_stream_tvf_mysql.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_cdc_stream_tvf_postgres.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_cdc_stream_tvf_publication.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_mysql.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_mysql_alter_offset.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_latest_alter_cred.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_pause_resume.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/cdc/tvf/test_streaming_job_cdc_stream_postgres_restart_fe.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_insert_job_compute_group.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_insert_job_compute_group_docker.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_insert_job_file_number.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_insert_job_filtered_rows.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_job_alter_offset_checkpoint_restart_fe.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_job_checkpoint_restart_fe.groovy
 create mode 100644 regression-test/suites/job_p0/streaming_job/test_streaming_job_max_retry.groovy
 create mode 100644 regression-test/suites/load_p0/insert/test_insert_statistic_after_fe_restart.groovy
 create mode 100644 regression-test/suites/load_p0/msk_load/test_routine_load_msk.groovy
 create mode 100644 regression-test/suites/load_p0/msk_load/test_routine_load_msk_public_access.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_master_switch_exactly_once.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_mem_limit_exceeded_recovery_exactly_once.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_mow_partial_update_concurrent_compaction.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_mow_partial_update_with_compaction.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_partial_update_new_key_error_atomicity.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_partition_expansion_exactly_once.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_same_job_offset_recovery_exactly_once.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_same_job_schema_replay_exactly_once.groovy
 create mode 100644 regression-test/suites/load_p0/routine_load/test_routine_load_too_many_tasks_recovery_exactly_once.groovy
 create mode 100644 regression-test/suites/mtmv_p0/test_constraint_change_rewrite_mtmv.groovy
 create mode 100644 regression-test/suites/mv_p0/ut/testBucketedAggSyncMV/testBucketedAggSyncMV.groovy
 delete mode 100644 regression-test/suites/nereids_function_p0/agg_function/test_regr_sxx.groovy
 delete mode 100644 regression-test/suites/nereids_function_p0/agg_function/test_regr_sxy.groovy
 delete mode 100644 regression-test/suites/nereids_function_p0/agg_function/test_regr_syy.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_distinct_case_when.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_error_msg.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_group_concat.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_nullable.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_nullable_2.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_union_random.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/agg_window_project.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_count1.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_group_by_metric_type.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_groupby_constant.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_groupby_null.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_groupby_simplify.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_grouping_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_having_grouping.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/aggregate_output_null.groovy
 delete mode 100644 regression-test/suites/nereids_p0/aggregate/window_funnel.groovy
 delete mode 100644 regression-test/suites/nereids_p0/authorization/column_authorization.groovy
 delete mode 100644 regression-test/suites/nereids_p0/authorization/view_authorization.groovy
 delete mode 100644 regression-test/suites/nereids_p0/cache/mtmv_with_sql_cache.groovy
 delete mode 100644 regression-test/suites/nereids_p0/cache/mv_with_sql_cache.groovy
 delete mode 100644 regression-test/suites/nereids_p0/cache/parse_sql_from_sql_cache.groovy
 delete mode 100644 regression-test/suites/nereids_p0/colocate/test_multi_cast_colocate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/colocate/test_set_operation_colocate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/create_table/test_create_blocked.groovy
 delete mode 100644 regression-test/suites/nereids_p0/create_table/test_create_table.groovy
 delete mode 100644 regression-test/suites/nereids_p0/cte/test_cte_column_pruning.groovy
 delete mode 100644 regression-test/suites/nereids_p0/cte/test_cte_filter_pushdown.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_date_acquire.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_date_implicit_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_datetime_overflow.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_datev1.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_decimalv2.groovy
 delete mode 100644 regression-test/suites/nereids_p0/datatype/test_map.groovy
 delete mode 100644 regression-test/suites/nereids_p0/ddl/alter/test_alter_user_nereids.groovy
 delete mode 100644 regression-test/suites/nereids_p0/ddl/set_and_unset_commands/set_and_unset_variable_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/delete/delete_cte.groovy
 delete mode 100644 regression-test/suites/nereids_p0/delete/delete_cte_ck.groovy
 delete mode 100644 regression-test/suites/nereids_p0/delete/delete_mow_partial_update.groovy
 delete mode 100644 regression-test/suites/nereids_p0/delete/delete_using.groovy
 delete mode 100644 regression-test/suites/nereids_p0/drop/drop_resource.groovy
 delete mode 100644 regression-test/suites/nereids_p0/eager_agg/eager_agg.groovy
 delete mode 100644 regression-test/suites/nereids_p0/eliminate_outer_join/eliminate_outer_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/empty_table/ddl/empty.sql
 delete mode 100644 regression-test/suites/nereids_p0/empty_table/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/empty_table/sql/avg_decimal.sql
 delete mode 100644 regression-test/suites/nereids_p0/except/test_analyzer_exception.groovy
 delete mode 100644 regression-test/suites/nereids_p0/except/test_bound_exception.groovy
 delete mode 100644 regression-test/suites/nereids_p0/except/test_query_except.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/explain_graph.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/test_datetime_filter_stats0.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/test_global_partition_topn_plan.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/test_outerjoin_isnull_estimation.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/test_pushdown_explain.groovy
 delete mode 100644 regression-test/suites/nereids_p0/explain/test_scan_preaggregation_explain.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/case_when_to_if.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fe_constant_cast_to_date.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fe_constant_cast_to_datetime.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fe_constant_cast_to_fractional.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fe_constant_cast_to_int.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fe_try_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_by_be.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_by_fe.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_date_arithmatic.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_nullable.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_numeric_arithmatic.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/fold_constant/fold_constant_string_arithmatic.groovy
 delete mode 100644 regression-test/suites/nereids_p0/expression/topn_to_max.groovy
 delete mode 100644 regression-test/suites/nereids_p0/forbid_unknown_col_stats.groovy
 delete mode 100644 regression-test/suites/nereids_p0/group_concat/test_group_concat.groovy
 delete mode 100644 regression-test/suites/nereids_p0/grouping_sets/test_grouping_sets.groovy
 delete mode 100644 regression-test/suites/nereids_p0/grouping_sets/test_grouping_sets1.groovy
 create mode 100644 regression-test/suites/nereids_p0/hash_shuffle_key_prune/hash_shuffle_key_prune.groovy
 delete mode 100644 regression-test/suites/nereids_p0/hint/fix_leading.groovy
 delete mode 100644 regression-test/suites/nereids_p0/hint/multi_leading.groovy
 delete mode 100644 regression-test/suites/nereids_p0/hint/test_hint.groovy
 delete mode 100644 regression-test/suites/nereids_p0/hint/test_leading.groovy
 delete mode 100644 regression-test/suites/nereids_p0/hint/test_use_mv.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query13.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query14.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query15.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query2.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query23.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query35.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query38.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query41.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query42.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query45.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query59.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query61.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query62.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query8.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_expr_name/query85.groovy
 delete mode 100644 regression-test/suites/nereids_p0/infer_predicate/infer_predicate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/aggregate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/complex_insert.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/duplicate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/insert_auth.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/insert_cte.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/insert_values.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/nereids_insert_random.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/no_partition.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/partial_update.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/partial_update_complex.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/partial_update_seq_col.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/type_cast_aggregate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/type_cast_duplicate.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/type_cast_unique.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/unique.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/unsupport_type.groovy
 delete mode 100644 regression-test/suites/nereids_p0/insert_into_table/update_on_current_timestamp.groovy
 delete mode 100644 regression-test/suites/nereids_p0/intersect/test_intersect.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/collect/test_javaudf_groupcount.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/collect/test_javaudf_murmurhash3.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/collect/test_javaudf_sessionize.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/date/test_javaudf_adddays.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/date/test_javaudf_addisoperioud.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/date/test_javaudf_daydiff.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/json/test_javaudf_convertfromcamelcase.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/json/test_javaudf_converttocamelcase.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/sanity/test_javaudf_assertequal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/sanity/test_javaudf_assertlessthan.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/sanity/test_javaudf_assertudf.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/sketch/test_javaudf_md5.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_my_date_datetime.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_mygroupconcat_string.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_mysum_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_mysum_decimal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_mysum_float_double.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_mysum_int.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudaf_null_test.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_boolean.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_case.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_date.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_decimal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_float.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_int.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_ip.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_null.groovy
 delete mode 100644 regression-test/suites/nereids_p0/javaudf/test_javaudf_string.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/asof/test_asof_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/asof/test_asof_join_build_expr_edge.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/asof/test_asof_join_expr.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/asof/test_asof_join_large_bucket.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/colocate_join_with_rollup.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/full_join_table.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/left_table.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/right_table.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/table.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/table_1.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/table_2.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/table_3.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/test_bucket_shuffle_join.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/test_join.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/ddl/test_left_join1.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/outer_join_with_empty_node.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/agg_output_as_right_tale_left_outer_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/bucket_shuffle_join.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/full_join.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/issue_12689.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/issue_7288.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/test_outer_join.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/sql/test_outer_join_with_delete_column.sql
 delete mode 100644 regression-test/suites/nereids_p0/join/test_bitmap_filter.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join2.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join3.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join4.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join5.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_11.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_12.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_13.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_14.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_15.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_dphyper.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_local_shuffle.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_join_on.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_left_join1.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_left_join_null.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_limit_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_many_multi_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_mark_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_nestedloop_outer_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_nestedloop_semi_anti_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_other_conjuncts_nullable.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_outer_join.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_runtimefilter_on_datev2.groovy
 delete mode 100644 regression-test/suites/nereids_p0/join/test_runtimefilter_on_decimal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/keyword/order_group.groovy
 delete mode 100644 regression-test/suites/nereids_p0/keyword/test_keyword.groovy
 delete mode 100644 regression-test/suites/nereids_p0/large_wide_table/ddl/create.sql
 delete mode 100644 regression-test/suites/nereids_p0/large_wide_table/ddl/insert.sql
 delete mode 100644 regression-test/suites/nereids_p0/large_wide_table/large_wide_table.groovy
 delete mode 100644 regression-test/suites/nereids_p0/lateral_view/test_issue_11986.sql
 delete mode 100644 regression-test/suites/nereids_p0/lateral_view/test_issue_8850.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/OffsetInSubqueryWithJoin.groovy
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/lineitem.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/nation.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/part.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/partsupp.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/region.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/supplier.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/ddl/workers.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/filterLimitProject.groovy
 delete mode 100644 regression-test/suites/nereids_p0/limit/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/predicateNotProjected.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/useRestrictiveLimitFromSubq.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withGroupBy.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withGroupByAndOrderByInSubq.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withGroupByInSubq.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withJoinInSubq.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withLimitZero.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withOrderBy.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withSimpleLimit.sql
 delete mode 100644 regression-test/suites/nereids_p0/limit/sql/withSubq.sql
 delete mode 100644 regression-test/suites/nereids_p0/load.groovy
 create mode 100644 regression-test/suites/nereids_p0/local_shuffle/test_enable_local_exchange_before_agg.groovy
 delete mode 100644 regression-test/suites/nereids_p0/operator/test_arithmetic_operators.groovy
 delete mode 100644 regression-test/suites/nereids_p0/operator/test_logical_operators.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/agg_state/test_outfile_agg_state.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/agg_state_array/test_outfile_agg_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/agg_state_bitmap/test_outfile_agg_state_bitmap.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/hll/test_outfile_hll.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/quantile_state/test_outfile_quantile_state.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_csv_with_names.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_exception.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_expr.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_parquet.groovy
 delete mode 100644 regression-test/suites/nereids_p0/outfile/test_outfile_separator.groovy
 delete mode 100644 regression-test/suites/nereids_p0/physical_translator/test_physical_translator.groovy
 delete mode 100644 regression-test/suites/nereids_p0/repeat/test_repeat_output_slot.groovy
 delete mode 100644 regression-test/suites/nereids_p0/runtime_filter/expr-target.groovy
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/projectAggFuncs.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/projectConstants.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/projectFunctions.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/withGroupOrderHaving.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/withUnionAll.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/withWhereClause.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_no_from/sql/withWhereFalse.sql
 delete mode 100644 regression-test/suites/nereids_p0/select_tablets/select_with_tablets.groovy
 delete mode 100644 regression-test/suites/nereids_p0/session_variable/test_default_limit.groovy
 delete mode 100644 regression-test/suites/nereids_p0/session_variable/test_variable_between.groovy
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/lineitem.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/nation.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/part.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/partsupp.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/region.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/supplier.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/ddl/workers.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/except.groovy
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/sql/except_1_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/sql/except_2_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/sql/except_3_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/sql/intersect_1_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/set_operations/sql/intersect_2_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/show/test_array_show_create.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_nereids_show_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_analyze_task_status_cmd.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_clusters_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_column_stats_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_columns_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_open_tables_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_status_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_warning_error_count_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/show/test_show_where.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sort/sort.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_all_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_bit.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_collect.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_approx_weighted.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_percentile_no_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_retention.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_sequence_match.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_aggregate_window_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/aggregate_functions/test_approx_count_distinct.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/sql/q01.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/sql/q02.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/sql/q03.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/sql/q04.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_aggregation_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_contains_all.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_filter.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_functions_by_literal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_functions_of_array_difference.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_array_functions_with_where.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/array_functions/test_issue_13606.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/bitmap_functions/test_bitmap_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/case_function/test_case_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/cast_function/test_cast_array_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/cast_function/test_cast_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/cast_function/test_cast_string_to_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_coalesce.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_conditional_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_if.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_nullif.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_nvl.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_query_between.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_query_in.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_query_like.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_query_limit.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/conditional_functions/test_query_where.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/convertion_functions/sql/castAccessible.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_date_or_datetime_computation_negative.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_dayofweek.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_time_lut.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/datetime_functions/test_timestampdiff.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/digital-masking/test_digital_masking.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/encryption_digest/test_encryption_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/encryption_digest/test_md5.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/hash_functions/test_hash_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/horology_functions/sql/atTimeZoneAccessible.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/horology_functions/sql/extractAccessible.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_function/test_query_json_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_function/test_query_json_insert.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_function/test_query_json_object.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_function/test_query_json_replace.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_function/test_query_json_set.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_functions/test_get_json_double.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/json_functions/test_json_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/math_functions/test_abs.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/math_functions/test_conv.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/math_functions/test_multiply.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/math_functions/test_round.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/math_functions/test_round_overflow.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/search_functions/test_multi_string_position.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/search_functions/test_multi_string_search.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_gis_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/spatial_functions/test_st_astext.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/lineitem.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/nation.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/part.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/partsupp.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/region.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/supplier.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/ddl/workers.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/sql/likeOperatorWorks_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_reverse.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_split_by_string.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_split_part.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_like_pushdown.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/string_functions/test_string_function_regexp.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/table_function/explode.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/table_function/explode_json_array.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/table_function/explode_map.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/table_function/explode_split.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/table_function/posexplode.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/test_arith_functions.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/test_in_expr.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/width_bucket_fuctions/test_width_bucket_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/lineitem.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/nation.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/part.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/partsupp.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/region.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/supplier.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/ddl/workers.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/load.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/leadLag.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/noOrderAllRowsPeers_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rangeCurrent_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rangeNoPartition_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rangeUnbounded_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsDifferentOrders.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsDisjointWindows.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsFirstLast.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsFrame2F3F.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsFrame2FUBF.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsFrame3P2P.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsFrameUBP2P.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsIdenticalWindows.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsIntersectingWindows.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsUBPImplicitCR.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/rowsUnbounded_order.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/windowSpecificationAAcpA.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/windowSpecificationABA.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/sql/windowSpecificationABcpA.sql
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_count_star.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_lead_lag_nullable.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_ntile_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_select_stddev_variance_window.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_sum.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_fn.groovy
 delete mode 100644 regression-test/suites/nereids_p0/sql_functions/window_functions/test_window_function.groovy
 delete mode 100644 regression-test/suites/nereids_p0/stats/col_stats/column_stats.groovy
 delete mode 100644 regression-test/suites/nereids_p0/stats/col_stats/hot_value_analyze_sync.groovy
 delete mode 100644 regression-test/suites/nereids_p0/stats/invalid_stats/invalid_stats.groovy
 delete mode 100644 regression-test/suites/nereids_p0/stats/partitionRowCount.groovy
 delete mode 100644 regression-test/suites/nereids_p0/subquery/correlated_scalar_subquery.groovy
 delete mode 100644 regression-test/suites/nereids_p0/subquery/subquery_unnesting.groovy
 delete mode 100644 regression-test/suites/nereids_p0/subquery/test_inlineview_with_project.groovy
 delete mode 100644 regression-test/suites/nereids_p0/subquery/test_subquery.groovy
 delete mode 100644 regression-test/suites/nereids_p0/subquery/test_subquery_in_project.groovy
 delete mode 100644 regression-test/suites/nereids_p0/system/test_query_sys.groovy
 delete mode 100644 regression-test/suites/nereids_p0/system/test_query_sys_data_type.groovy
 delete mode 100644 regression-test/suites/nereids_p0/system/test_query_sys_tables.groovy
 delete mode 100644 regression-test/suites/nereids_p0/system/test_runtime_filter.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_alter_catalog_comment_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_alter_catalog_properties_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_alter_catalog_rename_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_alter_database_properties_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_char_implicit_cast.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_create_catalog_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_create_workload_policy_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_data_type_marks.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_dict_with_null.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_disable_parallel_scan.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_drop_catalog_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_filter_pushdown_set.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_forbid_unknown_col_stats.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_install_plugin_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_lock_tables_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_mv_select.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_orderby_nullliteral.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_prune_tablet_mv.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_select_constant.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_select_with_predicate_like.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_selelct_hidden_col.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_show_stages_command.groovy
 delete mode 100644 regression-test/suites/nereids_p0/test_timeout_fallback.groovy
... 569 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


(doris) 05/05: [fix](local shuffle) UnionNode propagates HASH only when downstream requires shuffle for correctness

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

924060929 pushed a commit to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 8ab2182213f50ae30b06fba8bc482e78e24ba2d0
Author: 924060929 <la...@selectdb.com>
AuthorDate: Tue May 12 23:09:39 2026 +0800

    [fix](local shuffle) UnionNode propagates HASH only when downstream requires shuffle for correctness
    
    PR #62438 introduced a semantic split for required_data_distribution=HASH:
      - "I'm a shuffled operator, downstream depends on hash for correctness"
        (finalize AggSink, HashJoin partitioned, Intersect/Except)
      - "I'd like hash distribution for performance optimization"
        (StreamingAgg pre-agg with enable_local_exchange_before_agg=true)
    
    Old FE UnionNode used parentRequire.preferType().isHashShuffle() as the
    trigger to propagate hash to its inputs. This conflated the two intents —
    once StreamingAgg started requesting HASH (PR #62438), every union under
    a streaming preagg over-inserted HASH LE on each input branch.
    
    Mirror BE's _followed_by_shuffled_operator propagation:
      - PlanNode.requiresShuffleForCorrectness() — default false, override in
        AggregationNode (finalize+keys), HashJoinNode (partitioned/bucket-shuffle/
        colocate), IntersectNode/ExceptNode (always).
      - PlanTranslatorContext.shuffledAncestorMap — per-node flag, set by parent
        in enforceRequire before recursing.
      - SetOperationNode reads the flag instead of parentRequire type.
    
    Reduces FE/BE consistency mismatches from 4 to 3 (only pre-existing NLJ
    optimization differences remain).
---
 .../glue/translator/PlanTranslatorContext.java     | 15 ++++++++++
 .../org/apache/doris/planner/AggregationNode.java  |  7 +++++
 .../java/org/apache/doris/planner/ExceptNode.java  |  6 ++++
 .../org/apache/doris/planner/HashJoinNode.java     |  9 ++++++
 .../org/apache/doris/planner/IntersectNode.java    |  6 ++++
 .../java/org/apache/doris/planner/PlanNode.java    | 32 ++++++++++++++++++++++
 .../org/apache/doris/planner/SetOperationNode.java | 13 +++++----
 .../planner/LocalShuffleNodeCoverageTest.java      |  5 ++--
 8 files changed, 86 insertions(+), 7 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
index db9c8964cec..a0e6fd124c2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
@@ -111,6 +111,13 @@ public class PlanTranslatorContext {
 
     private final Map<PlanNodeId, Boolean> serialAncestorInPipelineMap = Maps.newHashMap();
 
+    // Whether any ancestor (or this node itself) requires shuffle for correctness, with
+    // a HASH or NOOP path connecting them. Mirrors BE's _followed_by_shuffled_operator
+    // propagation in pipeline_fragment_context.cpp. UnionNode reads this to decide whether
+    // to propagate hash requirement to its inputs (only when downstream needs shuffle for
+    // correctness, not just for performance like StreamingAgg pre-agg).
+    private final Map<PlanNodeId, Boolean> shuffledAncestorMap = Maps.newHashMap();
+
     // Whether the current fragment uses LocalShuffleAssignedJob (pooling scan with
     // ignoreDataDistribution → _parallel_instances=1 in BE). When true, serial operators
     // indicate real pipeline bottlenecks needing PASSTHROUGH fan-out (heavy_ops).
@@ -252,6 +259,14 @@ public class PlanTranslatorContext {
         return serialAncestorInPipelineMap.getOrDefault(node.getId(), false);
     }
 
+    public void setHasShuffleForCorrectnessAncestor(PlanNode node, boolean value) {
+        shuffledAncestorMap.put(node.getId(), value);
+    }
+
+    public boolean hasShuffleForCorrectnessAncestor(PlanNode node) {
+        return shuffledAncestorMap.getOrDefault(node.getId(), false);
+    }
+
     public SlotDescriptor addSlotDesc(TupleDescriptor t) {
         return descTable.addSlotDescriptor(t);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
index ca364960ead..2ef65394456 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
@@ -351,6 +351,13 @@ public class AggregationNode extends PlanNode {
         return aggInfo.getGroupingExprs();
     }
 
+    @Override
+    public boolean requiresShuffleForCorrectness() {
+        // BE: AggSink/DistinctStreamingAgg.is_shuffled_operator() = !partition_exprs.empty() && needs_finalize
+        // (StreamingAgg pre-agg doesn't override → false).
+        return needsFinalize && !aggInfo.getGroupingExprs().isEmpty();
+    }
+
     private boolean canUseDistinctStreamingAgg(SessionVariable sessionVariable) {
         return aggInfo.getAggregateExprs().isEmpty() && sortByGroupKey == null
                 && sessionVariable.enableDistinctStreamingAggregation;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java
index ae728da571b..1052b6bd118 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ExceptNode.java
@@ -30,4 +30,10 @@ public class ExceptNode extends SetOperationNode {
     protected void toThrift(TPlanNode msg) {
         toThrift(msg, TPlanNodeType.EXCEPT_NODE);
     }
+
+    @Override
+    public boolean requiresShuffleForCorrectness() {
+        // BE: SetSinkOperatorX / SetSourceOperatorX.is_shuffled_operator() = true (unconditional).
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
index 87c3094a361..ae01b515cab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
@@ -132,6 +132,15 @@ public class HashJoinNode extends JoinNodeBase {
         return isColocate;
     }
 
+    @Override
+    public boolean requiresShuffleForCorrectness() {
+        // BE: HashJoinBuild/Probe.is_shuffled_operator() = PARTITIONED || BUCKET_SHUFFLE || COLOCATE.
+        // (BROADCAST and NONE are not shuffled — they don't depend on hash distribution.)
+        return distrMode == DistributionMode.PARTITIONED
+                || distrMode == DistributionMode.BUCKET_SHUFFLE
+                || isColocate;
+    }
+
     public Map<ExprId, SlotId> getHashOutputExprSlotIdMap() {
         return hashOutputExprSlotIdMap;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/IntersectNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/IntersectNode.java
index 89f4002ea4d..5d784c03152 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/IntersectNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/IntersectNode.java
@@ -30,4 +30,10 @@ public class IntersectNode extends SetOperationNode {
     protected void toThrift(TPlanNode msg) {
         toThrift(msg, TPlanNodeType.INTERSECT_NODE);
     }
+
+    @Override
+    public boolean requiresShuffleForCorrectness() {
+        // BE: SetSinkOperatorX / SetSourceOperatorX.is_shuffled_operator() = true (unconditional).
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
index 3a2438a85dd..c3d38b89bd2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
@@ -840,6 +840,23 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
         return fragment != null && isSerialNode() && fragment.useSerialSource(context);
     }
 
+    /**
+     * "I depend on hash distribution for correctness, not just performance optimization."
+     * Used by UnionNode to decide whether to propagate hash requirement to its inputs:
+     * when a downstream operator requires shuffle for correctness, Union must pre-shuffle
+     * its inputs so the merged output is hash-distributed.
+     *
+     * Default is false; only operators that truly need hash for correctness override
+     * (finalize AggSink with group keys, HashJoin PARTITIONED/BUCKET_SHUFFLE, Intersect,
+     * Except). Operators that request hash for performance only (StreamingAgg pre-agg
+     * with enable_local_exchange_before_agg) MUST NOT override.
+     *
+     * Mirrors BE's OperatorBase::is_shuffled_operator().
+     */
+    public boolean requiresShuffleForCorrectness() {
+        return false;
+    }
+
     public boolean hasSerialChildren() {
         if (children.isEmpty()) {
             return isSerialNode();
@@ -980,6 +997,21 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
         boolean childHasSerialAncestor = inheritedSerial || isSerialNode();
         translatorContext.setHasSerialAncestorInPipeline(child, childHasSerialAncestor);
 
+        // 1b. Propagate shuffle-for-correctness-ancestor flag to child.
+        // Mirrors BE's _followed_by_shuffled_operator: a downstream operator needs hash
+        // distribution for correctness, and the chain to here goes through HASH or NOOP
+        // requirements (so the dependency is preserved).
+        //   propagate = ((inheritedShuffled || self.requiresShuffleForCorrectness)
+        //                && require is hash)
+        //            || (inheritedShuffled && require is noop/passthrough)
+        boolean inheritedShuffled = translatorContext.hasShuffleForCorrectnessAncestor(this);
+        boolean selfOrInheritedShuffled = inheritedShuffled || requiresShuffleForCorrectness();
+        boolean requireIsHash = require.preferType().isHashShuffle();
+        boolean requireIsNoop = require.preferType() == LocalExchangeNode.LocalExchangeType.NOOP;
+        boolean childShuffledAncestor = (selfOrInheritedShuffled && requireIsHash)
+                || (inheritedShuffled && requireIsNoop);
+        translatorContext.setHasShuffleForCorrectnessAncestor(child, childShuffledAncestor);
+
         // 2. Recurse child (Layer 2: child declares its own require/output)
         Pair<PlanNode, LocalExchangeType> childOutput =
                 child.enforceAndDeriveLocalExchange(translatorContext, this, require);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
index a7d89278f0c..1c7d399b2b4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
@@ -210,11 +210,14 @@ public abstract class SetOperationNode extends PlanNode {
         LocalExchangeType outputType;
         PlanNode firstChild = children.isEmpty() ? null : children.get(0);
         if (this instanceof UnionNode) {
-            // Propagate parent's hash requirement to children when parent requires hash distribution.
-            // Matches BE's UnionSinkOperatorX which returns GLOBAL_HASH(_distribute_exprs) whenever
-            // _followed_by_shuffled_operator=true, regardless of whether _distribute_exprs is empty.
-            boolean canPropagateHash = parentRequire.preferType().isHashShuffle();
-            requireChild = canPropagateHash ? parentRequire : LocalExchangeTypeRequire.noRequire();
+            // Propagate parent's hash requirement to children ONLY when a downstream operator
+            // requires shuffle for correctness (not just performance optimization). Matches BE's
+            // UnionSinkOperatorX which returns GLOBAL_HASH(_distribute_exprs) whenever
+            // _followed_by_shuffled_operator=true. The flag is propagated by enforceRequire
+            // from operators with requiresShuffleForCorrectness()=true (finalize agg, hash join,
+            // intersect/except) through hash/noop links.
+            boolean canPropagateHash = translatorContext.hasShuffleForCorrectnessAncestor(this);
+            requireChild = canPropagateHash ? parentRequire.autoRequireHash() : LocalExchangeTypeRequire.noRequire();
             outputType = canPropagateHash
                     ? AddLocalExchange.resolveExchangeType(requireChild, translatorContext, this, firstChild)
                     : LocalExchangeType.NOOP;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
index 9f3fea43869..4d86a4aacc0 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
@@ -348,8 +348,9 @@ public class LocalShuffleNodeCoverageTest {
         UnionNode unionNode = new UnionNode(nextPlanNodeId(), new TupleId(NEXT_ID.getAndIncrement()));
         TrackingPlanNode unionChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
         unionNode.addChild(unionChild);
-        // UnionNode propagates parent hash require to children when parent requires hash.
-        // resolveExchangeType with RequireHash → LOCAL_EXECUTION_HASH_SHUFFLE
+        // UnionNode propagates parent hash require to children only when a downstream operator
+        // requires shuffle for correctness. Simulate that via the context flag.
+        ctx.setHasShuffleForCorrectnessAncestor(unionNode, true);
         Pair<PlanNode, LocalExchangeType> unionOutput = unionNode.enforceAndDeriveLocalExchange(
                 ctx, null, LocalExchangeTypeRequire.requireHash());
         Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, unionOutput.second);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


(doris) 01/05: [refactor](local shuffle) FE local exchange planning - squashed for rebase

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

924060929 pushed a commit to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 75857dd29bc26de70092f4370176cb88ba266ab2
Author: 924060929 <la...@selectdb.com>
AuthorDate: Tue May 12 16:29:03 2026 +0800

    [refactor](local shuffle) FE local exchange planning - squashed for rebase
---
 .idea/vcs.xml                                      |   56 +-
 .../exec/exchange/local_exchange_sink_operator.cpp |   73 +-
 .../exec/exchange/local_exchange_sink_operator.h   |   28 +-
 .../exchange/local_exchange_source_operator.cpp    |    5 +-
 .../exec/exchange/local_exchange_source_operator.h |   38 +-
 be/src/exec/exchange/local_exchanger.h             |   42 +-
 be/src/exec/operator/aggregation_sink_operator.h   |    8 +-
 be/src/exec/operator/analytic_sink_operator.h      |    8 +-
 be/src/exec/operator/assert_num_rows_operator.h    |    2 +-
 .../distinct_streaming_aggregation_operator.h      |   10 +-
 be/src/exec/operator/exchange_source_operator.h    |    8 +-
 be/src/exec/operator/hashjoin_build_sink.h         |   12 +-
 be/src/exec/operator/hashjoin_probe_operator.h     |   14 +-
 .../operator/nested_loop_join_build_operator.h     |    6 +-
 .../operator/nested_loop_join_probe_operator.h     |    4 +-
 be/src/exec/operator/operator.cpp                  |    4 +-
 be/src/exec/operator/operator.h                    |    6 +-
 .../exec/operator/partition_sort_sink_operator.h   |    4 +-
 .../partitioned_hash_join_probe_operator.cpp       |    2 -
 .../partitioned_hash_join_probe_operator.h         |   14 +-
 .../operator/partitioned_hash_join_sink_operator.h |    6 +-
 .../exec/operator/rec_cte_anchor_sink_operator.h   |    2 +-
 be/src/exec/operator/rec_cte_sink_operator.h       |    2 +-
 be/src/exec/operator/rec_cte_source_operator.h     |    2 +-
 be/src/exec/operator/scan_operator.h               |    4 +-
 be/src/exec/operator/set_probe_sink_operator.h     |    6 +-
 be/src/exec/operator/set_sink_operator.h           |    4 +-
 be/src/exec/operator/set_source_operator.h         |    4 +-
 be/src/exec/operator/sort_sink_operator.h          |   10 +-
 .../exec/operator/streaming_aggregation_operator.h |    7 +-
 be/src/exec/operator/table_function_operator.h     |    2 +-
 be/src/exec/operator/union_sink_operator.h         |    4 +-
 be/src/exec/operator/union_source_operator.h       |    4 +-
 be/src/exec/pipeline/dependency.h                  |   50 +-
 be/src/exec/pipeline/pipeline.cpp                  |    3 +-
 be/src/exec/pipeline/pipeline.h                    |   11 +-
 be/src/exec/pipeline/pipeline_fragment_context.cpp |  301 +-
 be/src/exec/pipeline/pipeline_fragment_context.h   |   30 +-
 be/src/runtime/exec_env_init.cpp                   |   11 +
 be/src/runtime/runtime_state.h                     |    7 +-
 be/src/udf/python/python_udf_runtime.cpp           |    2 -
 be/test/exec/pipeline/local_exchanger_test.cpp     |   10 +-
 be/test/exec/pipeline/pipeline_test.cpp            |   21 +-
 fe/.idea/vcs.xml                                   |    5 +
 .../doris/common/profile/SummaryProfile.java       |    8 +
 .../doris/datasource/tvf/source/TVFScanNode.java   |   11 +
 .../org/apache/doris/nereids/NereidsPlanner.java   |   20 +-
 .../glue/translator/PhysicalPlanTranslator.java    |   67 +-
 .../glue/translator/PlanTranslatorContext.java     |   26 +
 .../nereids/rules/rewrite/AccessPathInfo.java      |   12 +
 .../apache/doris/nereids/trees/plans/PlanType.java |    1 +
 .../trees/plans/distribute/DistributePlanner.java  |    3 +-
 .../job/UnassignedScanBucketOlapTableJob.java      |    2 +-
 .../org/apache/doris/planner/AddLocalExchange.java |  159 ++
 .../org/apache/doris/planner/AggregationNode.java  |  105 +-
 .../org/apache/doris/planner/AnalyticEvalNode.java |   72 +-
 .../apache/doris/planner/AssertNumRowsNode.java    |   18 +-
 .../java/org/apache/doris/planner/CTEScanNode.java |   10 +
 .../java/org/apache/doris/planner/DataSink.java    |    5 +
 .../org/apache/doris/planner/DataStreamSink.java   |    1 +
 .../org/apache/doris/planner/EmptySetNode.java     |   10 +
 .../org/apache/doris/planner/ExchangeNode.java     |   33 +-
 .../org/apache/doris/planner/HashJoinNode.java     |   75 +
 .../apache/doris/planner/LocalExchangeNode.java    |  316 +++
 .../apache/doris/planner/MaterializationNode.java  |   16 +-
 .../apache/doris/planner/NestedLoopJoinNode.java   |   64 +-
 .../org/apache/doris/planner/OlapScanNode.java     |   18 +
 .../apache/doris/planner/PartitionSortNode.java    |   31 +
 .../org/apache/doris/planner/PlanFragment.java     |    2 +-
 .../java/org/apache/doris/planner/PlanNode.java    |  181 +-
 .../org/apache/doris/planner/RecursiveCteNode.java |   24 +
 .../apache/doris/planner/RecursiveCteScanNode.java |   12 +-
 .../java/org/apache/doris/planner/RepeatNode.java  |   18 +-
 .../org/apache/doris/planner/RuntimeFilter.java    |    2 +-
 .../java/org/apache/doris/planner/ScanNode.java    |   16 +-
 .../java/org/apache/doris/planner/SelectNode.java  |   18 +-
 .../org/apache/doris/planner/SetOperationNode.java |   49 +
 .../java/org/apache/doris/planner/SortNode.java    |   47 +-
 .../apache/doris/planner/TableFunctionNode.java    |   24 +
 .../java/org/apache/doris/planner/UnionNode.java   |    2 +-
 .../main/java/org/apache/doris/qe/Coordinator.java |    5 +-
 .../org/apache/doris/qe/NereidsCoordinator.java    |   11 +
 .../java/org/apache/doris/qe/SessionVariable.java  |   22 +
 .../java/org/apache/doris/qe/StmtExecutor.java     |    4 +-
 .../doris/qe/runtime/ThriftPlansBuilder.java       |   91 +-
 .../rules/analysis/AnalyzeWhereSubqueryTest.java   |   10 +
 .../planner/LocalShuffleNodeCoverageTest.java      |  662 +++++
 .../apache/doris/qe/LocalExchangePlannerTest.java  |  372 +++
 gensrc/thrift/PaloInternalService.thrift           |    4 +-
 gensrc/thrift/Partitions.thrift                    |   36 +
 gensrc/thrift/PlanNodes.thrift                     |   22 +-
 .../test_multilevel_join_agg_local_shuffle.out     | 2865 ++++++++++++++++++++
 .../plugins/plugin_profile_plan_tree.groovy        |  274 ++
 .../local_shuffle/print_known_diff_trees.groovy    |   80 +
 .../test_local_shuffle_fe_be_consistency.groovy    |  940 +++++++
 .../test_local_shuffle_rqg_bugs.groovy             | 1557 +++++++++++
 .../test_old_coordinator_local_shuffle.groovy      |  102 +
 .../test_multilevel_join_agg_local_shuffle.groovy  |  879 ++++++
 98 files changed, 9944 insertions(+), 322 deletions(-)

diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 0a185d9bdc7..fcaf31b9f91 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,34 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-  -->
 <project version="4">
-    <component name="IssueNavigationConfiguration">
-        <option name="links">
-            <list>
-                <IssueNavigationLink>
-                    <option name="issueRegexp" value="#(\d+)" />
-                    <option name="linkRegexp" value="https://github.com/apache/doris/pull/$1" />
-                </IssueNavigationLink>
-            </list>
-        </option>
-    </component>
-    <component name="VcsDirectoryMappings">
-        <mapping directory="$PROJECT_DIR$" vcs="Git" />
-        <mapping directory="$PROJECT_DIR$/be/src/apache-orc" vcs="Git" />
-        <mapping directory="$PROJECT_DIR$/be/src/clucene" vcs="Git" />
-    </component>
-</project>
+  <component name="IssueNavigationConfiguration">
+    <option name="links">
+      <list>
+        <IssueNavigationLink>
+          <option name="issueRegexp" value="#(\d+)" />
+          <option name="linkRegexp" value="https://github.com/apache/doris/pull/$1" />
+        </IssueNavigationLink>
+      </list>
+    </option>
+  </component>
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.github/actions/action-pr-title" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.github/actions/ccache-action" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.github/actions/get-workflow-origin" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.github/actions/label-when-approved-action" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/.github/actions/paths-filter" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/be/src/apache-orc" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/contrib/apache-orc" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/contrib/clucene" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/contrib/faiss" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/contrib/openblas" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/be/src/exec/exchange/local_exchange_sink_operator.cpp b/be/src/exec/exchange/local_exchange_sink_operator.cpp
index 2f9443208e7..eba93289e65 100644
--- a/be/src/exec/exchange/local_exchange_sink_operator.cpp
+++ b/be/src/exec/exchange/local_exchange_sink_operator.cpp
@@ -37,24 +37,31 @@ std::vector<Dependency*> LocalExchangeSinkLocalState::dependencies() const {
     return deps;
 }
 
-Status LocalExchangeSinkOperatorX::init(RuntimeState* state, ExchangeType type,
-                                        const int num_buckets, const bool use_global_hash_shuffle,
+Status LocalExchangeSinkOperatorX::init(RuntimeState* state, TLocalPartitionType::type type,
+                                        const int num_buckets,
                                         const std::map<int, int>& shuffle_idx_to_instance_idx) {
+    DCHECK(!_planned_by_fe);
     _name = "LOCAL_EXCHANGE_SINK_OPERATOR(" + get_exchange_type_name(type) + ")";
     _type = type;
-    if (_type == ExchangeType::HASH_SHUFFLE) {
-        _shuffle_idx_to_instance_idx.clear();
-        _use_global_shuffle = use_global_hash_shuffle;
+    if (_type == TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE) {
         // For shuffle join, if data distribution has been broken by previous operator, we
         // should use a HASH_SHUFFLE local exchanger to shuffle data again. To be mentioned,
         // we should use map shuffle idx to instance idx because all instances will be
         // distributed to all BEs. Otherwise, we should use shuffle idx directly.
-        if (use_global_hash_shuffle) {
-            _shuffle_idx_to_instance_idx = shuffle_idx_to_instance_idx;
+        _shuffle_idx_to_instance_idx = shuffle_idx_to_instance_idx;
+        if (state->query_options().__isset.enable_new_shuffle_hash_method &&
+            state->query_options().enable_new_shuffle_hash_method) {
+            _partitioner = std::make_unique<Crc32CHashPartitioner>(_num_partitions);
         } else {
-            for (int i = 0; i < _num_partitions; i++) {
-                _shuffle_idx_to_instance_idx[i] = i;
-            }
+            _partitioner = std::make_unique<
+                    Crc32HashPartitioner<ShuffleChannelIds>>(
+                    _num_partitions);
+        }
+        RETURN_IF_ERROR(_partitioner->init(_texprs));
+    } else if (_type == TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE) {
+        _shuffle_idx_to_instance_idx.clear();
+        for (int i = 0; i < _num_partitions; i++) {
+            _shuffle_idx_to_instance_idx[i] = i;
         }
         if (state->query_options().__isset.enable_new_shuffle_hash_method &&
             state->query_options().enable_new_shuffle_hash_method) {
@@ -64,7 +71,7 @@ Status LocalExchangeSinkOperatorX::init(RuntimeState* state, ExchangeType type,
                     std::make_unique<Crc32HashPartitioner<ShuffleChannelIds>>(_num_partitions);
         }
         RETURN_IF_ERROR(_partitioner->init(_texprs));
-    } else if (_type == ExchangeType::BUCKET_HASH_SHUFFLE) {
+    } else if (_type == TLocalPartitionType::BUCKET_HASH_SHUFFLE) {
         DCHECK_GT(num_buckets, 0);
         _partitioner = std::make_unique<Crc32HashPartitioner<ShuffleChannelIds>>(num_buckets);
         RETURN_IF_ERROR(_partitioner->init(_texprs));
@@ -72,9 +79,36 @@ Status LocalExchangeSinkOperatorX::init(RuntimeState* state, ExchangeType type,
     return Status::OK();
 }
 
+Status LocalExchangeSinkOperatorX::init_partitioner(RuntimeState* state) {
+    DCHECK(_planned_by_fe);
+    // Set operator name to include exchange type (base class init(tnode) only sets generic name).
+    _name = "LOCAL_EXCHANGE_SINK_OPERATOR(" + get_exchange_type_name(_type) + ")";
+    if (_type == TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE ||
+        _type == TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE) {
+        if (state->query_options().__isset.enable_new_shuffle_hash_method &&
+            state->query_options().enable_new_shuffle_hash_method) {
+            _partitioner = std::make_unique<Crc32CHashPartitioner>(_num_partitions);
+        } else {
+            _partitioner = std::make_unique<
+                    Crc32HashPartitioner<ShuffleChannelIds>>(
+                    _num_partitions);
+        }
+        RETURN_IF_ERROR(_partitioner->init(_texprs));
+    } else if (_type == TLocalPartitionType::BUCKET_HASH_SHUFFLE) {
+        DCHECK_GT(_num_partitions, 0);
+        _partitioner =
+                std::make_unique<Crc32HashPartitioner<ShuffleChannelIds>>(
+                        _num_partitions);
+        RETURN_IF_ERROR(_partitioner->init(_texprs));
+    }
+    return Status::OK();
+}
+
 Status LocalExchangeSinkOperatorX::prepare(RuntimeState* state) {
     RETURN_IF_ERROR(DataSinkOperatorX<LocalExchangeSinkLocalState>::prepare(state));
-    if (_type == ExchangeType::HASH_SHUFFLE || _type == ExchangeType::BUCKET_HASH_SHUFFLE) {
+    if (_type == TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE ||
+        _type == TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE ||
+        _type == TLocalPartitionType::BUCKET_HASH_SHUFFLE) {
         RETURN_IF_ERROR(_partitioner->prepare(state, _child->row_desc()));
         RETURN_IF_ERROR(_partitioner->open(state));
     }
@@ -88,11 +122,6 @@ Status LocalExchangeSinkLocalState::init(RuntimeState* state, LocalSinkStateInfo
     SCOPED_TIMER(_init_timer);
     _compute_hash_value_timer = ADD_TIMER(custom_profile(), "ComputeHashValueTime");
     _distribute_timer = ADD_TIMER(custom_profile(), "DistributeDataTime");
-    if (_parent->cast<LocalExchangeSinkOperatorX>()._type == ExchangeType::HASH_SHUFFLE) {
-        custom_profile()->add_info_string(
-                "UseGlobalShuffle",
-                std::to_string(_parent->cast<LocalExchangeSinkOperatorX>()._use_global_shuffle));
-    }
     custom_profile()->add_info_string(
             "PartitionExprsSize",
             std::to_string(_parent->cast<LocalExchangeSinkOperatorX>()._partitioned_exprs_num));
@@ -108,8 +137,7 @@ Status LocalExchangeSinkLocalState::open(RuntimeState* state) {
     _exchanger = _shared_state->exchanger.get();
     DCHECK(_exchanger != nullptr);
 
-    if (_exchanger->get_type() == ExchangeType::HASH_SHUFFLE ||
-        _exchanger->get_type() == ExchangeType::BUCKET_HASH_SHUFFLE) {
+    if (is_shuffled_exchange(_exchanger->get_type())) {
         auto& p = _parent->cast<LocalExchangeSinkOperatorX>();
         RETURN_IF_ERROR(p._partitioner->clone(state, _partitioner));
     }
@@ -132,12 +160,11 @@ Status LocalExchangeSinkLocalState::close(RuntimeState* state, Status exec_statu
 std::string LocalExchangeSinkLocalState::debug_string(int indentation_level) const {
     fmt::memory_buffer debug_string_buffer;
     fmt::format_to(debug_string_buffer,
-                   "{}, _use_global_shuffle: {}, _channel_id: {}, _num_partitions: {}, "
+                   "{},  _channel_id: {}, _num_partitions: {}, "
                    "_num_senders: {}, _num_sources: {}, "
                    "_running_sink_operators: {}, _running_source_operators: {}",
-                   Base::debug_string(indentation_level),
-                   _parent->cast<LocalExchangeSinkOperatorX>()._use_global_shuffle, _channel_id,
-                   _exchanger->_num_partitions, _exchanger->_num_senders, _exchanger->_num_sources,
+                   Base::debug_string(indentation_level), _channel_id, _exchanger->_num_partitions,
+                   _exchanger->_num_senders, _exchanger->_num_sources,
                    _exchanger->_running_sink_operators, _exchanger->_running_source_operators);
     return fmt::to_string(debug_string_buffer);
 }
diff --git a/be/src/exec/exchange/local_exchange_sink_operator.h b/be/src/exec/exchange/local_exchange_sink_operator.h
index f1ca1935457..eb698fd9736 100644
--- a/be/src/exec/exchange/local_exchange_sink_operator.h
+++ b/be/src/exec/exchange/local_exchange_sink_operator.h
@@ -79,6 +79,17 @@ public:
               _texprs(texprs),
               _partitioned_exprs_num(texprs.size()),
               _shuffle_idx_to_instance_idx(bucket_seq_to_instance_idx) {}
+
+    LocalExchangeSinkOperatorX(int operator_id, int dest_id, const TPlanNode& tnode,
+                               int num_partitions,
+                               const std::map<int, int>& shuffle_id_to_instance_idx)
+            : Base(operator_id, tnode, dest_id),
+              _type(tnode.local_exchange_node.partition_type),
+              _num_partitions(num_partitions),
+              _texprs(tnode.local_exchange_node.distribute_expr_lists),
+              _partitioned_exprs_num(tnode.local_exchange_node.distribute_expr_lists.size()),
+              _shuffle_idx_to_instance_idx(shuffle_id_to_instance_idx),
+              _planned_by_fe(true) {}
 #ifdef BE_TEST
     LocalExchangeSinkOperatorX(const std::vector<TExpr>& texprs,
                                const std::map<int, int>& bucket_seq_to_instance_idx)
@@ -89,18 +100,19 @@ public:
               _shuffle_idx_to_instance_idx(bucket_seq_to_instance_idx) {}
 #endif
 
-    Status init(const TPlanNode& tnode, RuntimeState* state) override {
-        return Status::InternalError("{} should not init with TPlanNode", Base::_name);
-    }
-
     Status init(const TDataSink& tsink) override {
         return Status::InternalError("{} should not init with TPlanNode", Base::_name);
     }
 
-    Status init(RuntimeState* state, ExchangeType type, const int num_buckets,
-                const bool use_global_hash_shuffle,
+    Status init(RuntimeState* state, TLocalPartitionType::type type, const int num_buckets,
                 const std::map<int, int>& shuffle_idx_to_instance_idx) override;
 
+    // Initialize partitioner for FE-planned local exchange nodes. The FE-planned constructor
+    // already sets _type, _num_partitions, _texprs, and _shuffle_idx_to_instance_idx from the
+    // TPlanNode, but does not create the partitioner. This method creates the partitioner so
+    // that prepare() can call _partitioner->prepare() without null dereference.
+    Status init_partitioner(RuntimeState* state);
+
     Status prepare(RuntimeState* state) override;
 
     Status sink(RuntimeState* state, Block* in_block, bool eos) override;
@@ -115,13 +127,13 @@ public:
 private:
     friend class LocalExchangeSinkLocalState;
     friend class ShuffleExchanger;
-    ExchangeType _type;
+    TLocalPartitionType::type _type;
     const int _num_partitions;
     const std::vector<TExpr>& _texprs;
     const size_t _partitioned_exprs_num;
     std::unique_ptr<PartitionerBase> _partitioner;
     std::map<int, int> _shuffle_idx_to_instance_idx;
-    bool _use_global_shuffle = false;
+    const bool _planned_by_fe = false;
 };
 
 } // namespace doris
diff --git a/be/src/exec/exchange/local_exchange_source_operator.cpp b/be/src/exec/exchange/local_exchange_source_operator.cpp
index ad092656f21..d6bf8ac7e21 100644
--- a/be/src/exec/exchange/local_exchange_source_operator.cpp
+++ b/be/src/exec/exchange/local_exchange_source_operator.cpp
@@ -31,8 +31,7 @@ Status LocalExchangeSourceLocalState::init(RuntimeState* state, LocalStateInfo&
     DCHECK(_exchanger != nullptr);
     _get_block_failed_counter =
             ADD_COUNTER_WITH_LEVEL(custom_profile(), "GetBlockFailedTime", TUnit::UNIT, 1);
-    if (_exchanger->get_type() == ExchangeType::HASH_SHUFFLE ||
-        _exchanger->get_type() == ExchangeType::BUCKET_HASH_SHUFFLE) {
+    if (is_shuffled_exchange(_exchanger->get_type())) {
         _copy_data_timer = ADD_TIMER(custom_profile(), "CopyDataTime");
     }
 
@@ -60,7 +59,7 @@ Status LocalExchangeSourceLocalState::close(RuntimeState* state) {
 }
 
 std::vector<Dependency*> LocalExchangeSourceLocalState::dependencies() const {
-    if ((_exchanger->get_type() == ExchangeType::PASS_TO_ONE) && _channel_id != 0) {
+    if ((_exchanger->get_type() == TLocalPartitionType::PASS_TO_ONE) && _channel_id != 0) {
         // If this is a PASS_TO_ONE exchange and is not the first task, source operators always
         // return empty result so no dependencies here.
         return {};
diff --git a/be/src/exec/exchange/local_exchange_source_operator.h b/be/src/exec/exchange/local_exchange_source_operator.h
index 58252b24ec2..2f3fc2d5294 100644
--- a/be/src/exec/exchange/local_exchange_source_operator.h
+++ b/be/src/exec/exchange/local_exchange_source_operator.h
@@ -63,20 +63,47 @@ class LocalExchangeSourceOperatorX final : public OperatorX<LocalExchangeSourceL
 public:
     using Base = OperatorX<LocalExchangeSourceLocalState>;
     LocalExchangeSourceOperatorX(ObjectPool* pool, int id) : Base(pool, id, id) {}
+    LocalExchangeSourceOperatorX(ObjectPool* pool, const TPlanNode& tnode, int operator_id,
+                                 const DescriptorTbl& descs)
+            : Base(pool, tnode, operator_id, descs),
+              _exchange_type(tnode.local_exchange_node.partition_type),
+              _planned_by_fe(true) {}
 #ifdef BE_TEST
     LocalExchangeSourceOperatorX() = default;
 #endif
-    Status init(ExchangeType type) override {
+    Status init(TLocalPartitionType::type type) override {
+        DCHECK(!_planned_by_fe);
         _op_name = "LOCAL_EXCHANGE_OPERATOR(" + get_exchange_type_name(type) + ")";
         _exchange_type = type;
         return Status::OK();
     }
-    Status prepare(RuntimeState* state) override { return Status::OK(); }
+    Status prepare(RuntimeState* state) override {
+        if (_planned_by_fe) {
+            RETURN_IF_ERROR(Base::prepare(state));
+            // Base::prepare() resets _op_name from tnode node_type; restore the type-qualified name.
+            _op_name = "LOCAL_EXCHANGE_OPERATOR(" + get_exchange_type_name(_exchange_type) + ")";
+            return Status::OK();
+        }
+        return Status::OK();
+    }
     const RowDescriptor& intermediate_row_desc() const override {
+        if (_planned_by_fe) {
+            return Base::intermediate_row_desc();
+        }
         return _child->intermediate_row_desc();
     }
-    RowDescriptor& row_descriptor() override { return _child->row_descriptor(); }
-    const RowDescriptor& row_desc() const override { return _child->row_desc(); }
+    RowDescriptor& row_descriptor() override {
+        if (_planned_by_fe) {
+            return Base::row_descriptor();
+        }
+        return _child->row_descriptor();
+    }
+    const RowDescriptor& row_desc() const override {
+        if (_planned_by_fe) {
+            return Base::row_desc();
+        }
+        return _child->row_desc();
+    }
 
     Status get_block(RuntimeState* state, Block* block, bool* eos) override;
 
@@ -85,7 +112,8 @@ public:
 private:
     friend class LocalExchangeSourceLocalState;
 
-    ExchangeType _exchange_type;
+    TLocalPartitionType::type _exchange_type;
+    const bool _planned_by_fe = false;
 };
 
 } // namespace doris
diff --git a/be/src/exec/exchange/local_exchanger.h b/be/src/exec/exchange/local_exchanger.h
index b2a0166943f..e0a821a3643 100644
--- a/be/src/exec/exchange/local_exchanger.h
+++ b/be/src/exec/exchange/local_exchanger.h
@@ -142,7 +142,7 @@ public:
                              SourceInfo&& source_info) = 0;
     virtual Status sink(RuntimeState* state, Block* in_block, bool eos, Profile&& profile,
                         SinkInfo& sink_info) = 0;
-    virtual ExchangeType get_type() const = 0;
+    virtual TLocalPartitionType::type get_type() const = 0;
     // Called if a local exchanger source operator are closed. Free the unused data block in data_queue.
     virtual void close(SourceInfo&& source_info) = 0;
     // Called if all local exchanger source operators are closed. We free the memory in
@@ -227,16 +227,19 @@ using BlockWrapperSPtr = std::shared_ptr<ExchangerBase::BlockWrapper>;
 template <typename BlockType>
 class Exchanger : public ExchangerBase {
 public:
-    Exchanger(int running_sink_operators, int num_partitions, int free_block_limit)
-            : ExchangerBase(running_sink_operators, num_partitions, free_block_limit) {
+    Exchanger(int running_sink_operators, int num_partitions, int free_block_limit,
+              TLocalPartitionType::type type)
+            : ExchangerBase(running_sink_operators, num_partitions, free_block_limit), _type(type) {
         _data_queue.resize(num_partitions);
         _m.resize(num_partitions);
         for (size_t i = 0; i < num_partitions; i++) {
             _m[i] = std::make_unique<std::mutex>();
         }
     }
-    Exchanger(int running_sink_operators, int num_sources, int num_partitions, int free_block_limit)
-            : ExchangerBase(running_sink_operators, num_sources, num_partitions, free_block_limit) {
+    Exchanger(int running_sink_operators, int num_sources, int num_partitions, int free_block_limit,
+              TLocalPartitionType::type type)
+            : ExchangerBase(running_sink_operators, num_sources, num_partitions, free_block_limit),
+              _type(type) {
         _data_queue.resize(num_sources);
         _m.resize(num_sources);
         for (size_t i = 0; i < num_sources; i++) {
@@ -244,6 +247,7 @@ public:
         }
     }
     ~Exchanger() override = default;
+    TLocalPartitionType::type get_type() const override { return _type; }
     std::string data_queue_debug_string(int i) override {
         return fmt::format("Data Queue {}: [size approx = {}, eos = {}]", i,
                            _data_queue[i].data_queue.size_approx(), _data_queue[i].eos);
@@ -260,6 +264,7 @@ protected:
     bool _dequeue_data(BlockType& block, bool* eos, Block* data_block, int channel_id);
     std::vector<BlockQueue<BlockType>> _data_queue;
     std::vector<std::unique_ptr<std::mutex>> _m;
+    const TLocalPartitionType::type _type;
 };
 
 class LocalExchangeSourceLocalState;
@@ -269,9 +274,9 @@ class ShuffleExchanger : public Exchanger<PartitionedBlock> {
 public:
     ENABLE_FACTORY_CREATOR(ShuffleExchanger);
     ShuffleExchanger(int running_sink_operators, int num_sources, int num_partitions,
-                     int free_block_limit)
+                     int free_block_limit, TLocalPartitionType::type type)
             : Exchanger<PartitionedBlock>(running_sink_operators, num_sources, num_partitions,
-                                          free_block_limit) {
+                                          free_block_limit, type) {
         DCHECK_GT(num_partitions, 0);
         DCHECK_GT(num_sources, 0);
         _partition_rows_histogram.resize(running_sink_operators);
@@ -283,7 +288,6 @@ public:
     Status get_block(RuntimeState* state, Block* block, bool* eos, Profile&& profile,
                      SourceInfo&& source_info) override;
     void close(SourceInfo&& source_info) override;
-    ExchangeType get_type() const override { return ExchangeType::HASH_SHUFFLE; }
 
 protected:
     Status _split_rows(RuntimeState* state, const std::vector<uint32_t>& channel_ids, Block* block,
@@ -299,24 +303,22 @@ class BucketShuffleExchanger final : public ShuffleExchanger {
     BucketShuffleExchanger(int running_sink_operators, int num_sources, int num_partitions,
                            int free_block_limit)
             : ShuffleExchanger(running_sink_operators, num_sources, num_partitions,
-                               free_block_limit) {}
+                               free_block_limit, TLocalPartitionType::BUCKET_HASH_SHUFFLE) {}
     ~BucketShuffleExchanger() override = default;
-    ExchangeType get_type() const override { return ExchangeType::BUCKET_HASH_SHUFFLE; }
 };
 
 class PassthroughExchanger final : public Exchanger<BlockWrapperSPtr> {
 public:
     ENABLE_FACTORY_CREATOR(PassthroughExchanger);
     PassthroughExchanger(int running_sink_operators, int num_partitions, int free_block_limit)
-            : Exchanger<BlockWrapperSPtr>(running_sink_operators, num_partitions,
-                                          free_block_limit) {}
+            : Exchanger<BlockWrapperSPtr>(running_sink_operators, num_partitions, free_block_limit,
+                                          TLocalPartitionType::PASSTHROUGH) {}
     ~PassthroughExchanger() override = default;
     Status sink(RuntimeState* state, Block* in_block, bool eos, Profile&& profile,
                 SinkInfo& sink_info) override;
 
     Status get_block(RuntimeState* state, Block* block, bool* eos, Profile&& profile,
                      SourceInfo&& source_info) override;
-    ExchangeType get_type() const override { return ExchangeType::PASSTHROUGH; }
     void close(SourceInfo&& source_info) override;
 };
 
@@ -324,29 +326,28 @@ class PassToOneExchanger final : public Exchanger<BlockWrapperSPtr> {
 public:
     ENABLE_FACTORY_CREATOR(PassToOneExchanger);
     PassToOneExchanger(int running_sink_operators, int num_partitions, int free_block_limit)
-            : Exchanger<BlockWrapperSPtr>(running_sink_operators, num_partitions,
-                                          free_block_limit) {}
+            : Exchanger<BlockWrapperSPtr>(running_sink_operators, num_partitions, free_block_limit,
+                                          TLocalPartitionType::PASS_TO_ONE) {}
     ~PassToOneExchanger() override = default;
     Status sink(RuntimeState* state, Block* in_block, bool eos, Profile&& profile,
                 SinkInfo& sink_info) override;
 
     Status get_block(RuntimeState* state, Block* block, bool* eos, Profile&& profile,
                      SourceInfo&& source_info) override;
-    ExchangeType get_type() const override { return ExchangeType::PASS_TO_ONE; }
     void close(SourceInfo&& source_info) override;
 };
 class BroadcastExchanger final : public Exchanger<BroadcastBlock> {
 public:
     ENABLE_FACTORY_CREATOR(BroadcastExchanger);
     BroadcastExchanger(int running_sink_operators, int num_partitions, int free_block_limit)
-            : Exchanger<BroadcastBlock>(running_sink_operators, num_partitions, free_block_limit) {}
+            : Exchanger<BroadcastBlock>(running_sink_operators, num_partitions, free_block_limit,
+                                        TLocalPartitionType::BROADCAST) {}
     ~BroadcastExchanger() override = default;
     Status sink(RuntimeState* state, Block* in_block, bool eos, Profile&& profile,
                 SinkInfo& sink_info) override;
 
     Status get_block(RuntimeState* state, Block* block, bool* eos, Profile&& profile,
                      SourceInfo&& source_info) override;
-    ExchangeType get_type() const override { return ExchangeType::BROADCAST; }
     void close(SourceInfo&& source_info) override;
 };
 
@@ -357,8 +358,8 @@ public:
     ENABLE_FACTORY_CREATOR(AdaptivePassthroughExchanger);
     AdaptivePassthroughExchanger(int running_sink_operators, int num_partitions,
                                  int free_block_limit)
-            : Exchanger<PartitionedBlock>(running_sink_operators, num_partitions,
-                                          free_block_limit) {
+            : Exchanger<PartitionedBlock>(running_sink_operators, num_partitions, free_block_limit,
+                                          TLocalPartitionType::ADAPTIVE_PASSTHROUGH) {
         _partition_rows_histogram.resize(running_sink_operators);
         _tmp_eos.resize(num_partitions);
         _tmp_block.resize(num_partitions);
@@ -368,7 +369,6 @@ public:
 
     Status get_block(RuntimeState* state, Block* block, bool* eos, Profile&& profile,
                      SourceInfo&& source_info) override;
-    ExchangeType get_type() const override { return ExchangeType::ADAPTIVE_PASSTHROUGH; }
 
     void close(SourceInfo&& source_info) override;
 
diff --git a/be/src/exec/operator/aggregation_sink_operator.h b/be/src/exec/operator/aggregation_sink_operator.h
index f0cc6b70d4e..ea7c19bcb82 100644
--- a/be/src/exec/operator/aggregation_sink_operator.h
+++ b/be/src/exec/operator/aggregation_sink_operator.h
@@ -159,7 +159,7 @@ public:
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_partition_exprs.empty()) {
             return _needs_finalize
-                           ? DataDistribution(ExchangeType::NOOP)
+                           ? DataDistribution(TLocalPartitionType::NOOP)
                            : DataSinkOperatorX<AggSinkLocalState>::required_data_distribution(
                                      state);
         }
@@ -167,8 +167,10 @@ public:
             return DataSinkOperatorX<AggSinkLocalState>::required_data_distribution(state);
         }
         return _is_colocate && _require_bucket_distribution
-                       ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                       : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+                       ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                          _partition_exprs)
+                       : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                          _partition_exprs);
     }
     bool is_colocated_operator() const override { return _is_colocate; }
     bool is_shuffled_operator() const override {
diff --git a/be/src/exec/operator/analytic_sink_operator.h b/be/src/exec/operator/analytic_sink_operator.h
index 9a64ba1d0b7..2a989020a7f 100644
--- a/be/src/exec/operator/analytic_sink_operator.h
+++ b/be/src/exec/operator/analytic_sink_operator.h
@@ -212,11 +212,13 @@ public:
     Status sink(RuntimeState* state, Block* in_block, bool eos) override;
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_partition_by_eq_expr_ctxs.empty()) {
-            return {ExchangeType::PASSTHROUGH};
+            return {TLocalPartitionType::PASSTHROUGH};
         } else {
             return _is_colocate && _require_bucket_distribution
-                           ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                           : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+                           ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                              _partition_exprs)
+                           : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                              _partition_exprs);
         }
     }
 
diff --git a/be/src/exec/operator/assert_num_rows_operator.h b/be/src/exec/operator/assert_num_rows_operator.h
index 29da76e8a96..4c71266c626 100644
--- a/be/src/exec/operator/assert_num_rows_operator.h
+++ b/be/src/exec/operator/assert_num_rows_operator.h
@@ -47,7 +47,7 @@ public:
     [[nodiscard]] bool is_source() const override { return false; }
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return {ExchangeType::PASSTHROUGH};
+        return {TLocalPartitionType::PASSTHROUGH};
     }
 
 private:
diff --git a/be/src/exec/operator/distinct_streaming_aggregation_operator.h b/be/src/exec/operator/distinct_streaming_aggregation_operator.h
index abf42eb50cc..cb4156c9864 100644
--- a/be/src/exec/operator/distinct_streaming_aggregation_operator.h
+++ b/be/src/exec/operator/distinct_streaming_aggregation_operator.h
@@ -116,7 +116,7 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_needs_finalize && _probe_expr_ctxs.empty()) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
         if (!_needs_finalize && !state->enable_local_exchange_before_agg()) {
             return StatefulOperatorX<DistinctStreamingAggLocalState>::required_data_distribution(
@@ -124,11 +124,13 @@ public:
         }
         if (_needs_finalize || (!_probe_expr_ctxs.empty() && !_is_streaming_preagg)) {
             return _is_colocate && _require_bucket_distribution
-                           ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                           : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+                           ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                              _partition_exprs)
+                           : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                              _partition_exprs);
         }
         if (state->enable_distinct_streaming_agg_force_passthrough()) {
-            return {ExchangeType::PASSTHROUGH};
+            return {TLocalPartitionType::PASSTHROUGH};
         } else {
             return StatefulOperatorX<DistinctStreamingAggLocalState>::required_data_distribution(
                     state);
diff --git a/be/src/exec/operator/exchange_source_operator.h b/be/src/exec/operator/exchange_source_operator.h
index da00e088586..d47250080a1 100644
--- a/be/src/exec/operator/exchange_source_operator.h
+++ b/be/src/exec/operator/exchange_source_operator.h
@@ -112,13 +112,13 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (OperatorX<ExchangeLocalState>::is_serial_operator()) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
         return _partition_type == TPartitionType::HASH_PARTITIONED
-                       ? DataDistribution(ExchangeType::HASH_SHUFFLE)
+                       ? DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE)
                : _partition_type == TPartitionType::BUCKET_SHFFULE_HASH_PARTITIONED
-                       ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE)
-                       : DataDistribution(ExchangeType::NOOP);
+                       ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE)
+                       : DataDistribution(TLocalPartitionType::NOOP);
     }
 
 private:
diff --git a/be/src/exec/operator/hashjoin_build_sink.h b/be/src/exec/operator/hashjoin_build_sink.h
index be77ef6cc69..cf546e6dddb 100644
--- a/be/src/exec/operator/hashjoin_build_sink.h
+++ b/be/src/exec/operator/hashjoin_build_sink.h
@@ -134,15 +134,17 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         } else if (_is_broadcast_join) {
-            return _child->is_serial_operator() ? DataDistribution(ExchangeType::PASS_TO_ONE)
-                                                : DataDistribution(ExchangeType::NOOP);
+            return _child->is_serial_operator() ? DataDistribution(TLocalPartitionType::PASS_TO_ONE)
+                                                : DataDistribution(TLocalPartitionType::NOOP);
         }
         return _join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
                                _join_distribution == TJoinDistributionType::COLOCATE
-                       ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                       : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+                       ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                          _partition_exprs)
+                       : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                          _partition_exprs);
     }
 
     bool is_shuffled_operator() const override {
diff --git a/be/src/exec/operator/hashjoin_probe_operator.h b/be/src/exec/operator/hashjoin_probe_operator.h
index da60e8b5231..371a43fe1eb 100644
--- a/be/src/exec/operator/hashjoin_probe_operator.h
+++ b/be/src/exec/operator/hashjoin_probe_operator.h
@@ -135,21 +135,23 @@ public:
     bool need_more_input_data(RuntimeState* state) const override;
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         } else if (_is_broadcast_join) {
             if (state->enable_broadcast_join_force_passthrough()) {
-                return DataDistribution(ExchangeType::PASSTHROUGH);
+                return DataDistribution(TLocalPartitionType::PASSTHROUGH);
             } else {
                 return _child && _child->is_serial_operator()
-                               ? DataDistribution(ExchangeType::PASSTHROUGH)
-                               : DataDistribution(ExchangeType::NOOP);
+                               ? DataDistribution(TLocalPartitionType::PASSTHROUGH)
+                               : DataDistribution(TLocalPartitionType::NOOP);
             }
         }
 
         return (_join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
                                 _join_distribution == TJoinDistributionType::COLOCATE
-                        ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                        : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs));
+                        ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                           _partition_exprs)
+                        : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                           _partition_exprs));
     }
     bool is_broadcast_join() const { return _is_broadcast_join; }
 
diff --git a/be/src/exec/operator/nested_loop_join_build_operator.h b/be/src/exec/operator/nested_loop_join_build_operator.h
index 265a8767b3e..b6be8eb9254 100644
--- a/be/src/exec/operator/nested_loop_join_build_operator.h
+++ b/be/src/exec/operator/nested_loop_join_build_operator.h
@@ -68,10 +68,10 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
-        return _child->is_serial_operator() ? DataDistribution(ExchangeType::BROADCAST)
-                                            : DataDistribution(ExchangeType::NOOP);
+        return _child->is_serial_operator() ? DataDistribution(TLocalPartitionType::BROADCAST)
+                                            : DataDistribution(TLocalPartitionType::NOOP);
     }
 
 private:
diff --git a/be/src/exec/operator/nested_loop_join_probe_operator.h b/be/src/exec/operator/nested_loop_join_probe_operator.h
index aea6972f428..40fecd8f4ec 100644
--- a/be/src/exec/operator/nested_loop_join_probe_operator.h
+++ b/be/src/exec/operator/nested_loop_join_probe_operator.h
@@ -239,9 +239,9 @@ public:
         if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
             _join_op == TJoinOp::RIGHT_OUTER_JOIN || _join_op == TJoinOp::RIGHT_ANTI_JOIN ||
             _join_op == TJoinOp::RIGHT_SEMI_JOIN || _join_op == TJoinOp::FULL_OUTER_JOIN) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
-        return {ExchangeType::ADAPTIVE_PASSTHROUGH};
+        return {TLocalPartitionType::ADAPTIVE_PASSTHROUGH};
     }
 
     const RowDescriptor& row_desc() const override {
diff --git a/be/src/exec/operator/operator.cpp b/be/src/exec/operator/operator.cpp
index 96f7933d5d5..491e35ecd80 100644
--- a/be/src/exec/operator/operator.cpp
+++ b/be/src/exec/operator/operator.cpp
@@ -143,8 +143,8 @@ Status PipelineXSinkLocalState<SharedStateArg>::terminate(RuntimeState* state) {
 
 DataDistribution OperatorBase::required_data_distribution(RuntimeState* /*state*/) const {
     return _child && _child->is_serial_operator() && !is_source()
-                   ? DataDistribution(ExchangeType::PASSTHROUGH)
-                   : DataDistribution(ExchangeType::NOOP);
+                   ? DataDistribution(TLocalPartitionType::PASSTHROUGH)
+                   : DataDistribution(TLocalPartitionType::NOOP);
 }
 
 const RowDescriptor& OperatorBase::row_desc() const {
diff --git a/be/src/exec/operator/operator.h b/be/src/exec/operator/operator.h
index d4b09a4aed3..d1d4cb58e63 100644
--- a/be/src/exec/operator/operator.h
+++ b/be/src/exec/operator/operator.h
@@ -600,8 +600,8 @@ public:
     virtual bool reset_to_rerun(RuntimeState* state, OperatorXBase* root) const { return false; }
 
     Status init(const TDataSink& tsink) override;
-    [[nodiscard]] virtual Status init(RuntimeState* state, ExchangeType type, const int num_buckets,
-                                      const bool use_global_hash_shuffle,
+    [[nodiscard]] virtual Status init(RuntimeState* state, TLocalPartitionType::type type,
+                                      const int num_buckets,
                                       const std::map<int, int>& shuffle_idx_to_instance_idx) {
         return Status::InternalError("init() is only implemented in local exchange!");
     }
@@ -849,7 +849,7 @@ public:
     Status init(const TDataSink& tsink) override {
         throw Exception(Status::FatalError("should not reach here!"));
     }
-    virtual Status init(ExchangeType type) {
+    virtual Status init(TLocalPartitionType::type type) {
         throw Exception(Status::FatalError("should not reach here!"));
     }
     [[noreturn]] virtual const std::vector<TRuntimeFilterDesc>& runtime_filter_descs() {
diff --git a/be/src/exec/operator/partition_sort_sink_operator.h b/be/src/exec/operator/partition_sort_sink_operator.h
index 48b709d3f1f..6d098a1c9bd 100644
--- a/be/src/exec/operator/partition_sort_sink_operator.h
+++ b/be/src/exec/operator/partition_sort_sink_operator.h
@@ -95,9 +95,9 @@ public:
     Status sink(RuntimeState* state, Block* in_block, bool eos) override;
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_topn_phase == TPartTopNPhase::TWO_PHASE_GLOBAL) {
-            return DataDistribution(ExchangeType::HASH_SHUFFLE, _distribute_exprs);
+            return DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE, _distribute_exprs);
         }
-        return {ExchangeType::PASSTHROUGH};
+        return {TLocalPartitionType::PASSTHROUGH};
     }
 
     size_t get_reserve_mem_size(RuntimeState* state, bool eos) override;
diff --git a/be/src/exec/operator/partitioned_hash_join_probe_operator.cpp b/be/src/exec/operator/partitioned_hash_join_probe_operator.cpp
index 56e80cee3f8..d5c760dbc7b 100644
--- a/be/src/exec/operator/partitioned_hash_join_probe_operator.cpp
+++ b/be/src/exec/operator/partitioned_hash_join_probe_operator.cpp
@@ -523,8 +523,6 @@ PartitionedHashJoinProbeOperatorX::PartitionedHashJoinProbeOperatorX(ObjectPool*
                                                                      int operator_id,
                                                                      const DescriptorTbl& descs)
         : JoinProbeOperatorX<PartitionedHashJoinProbeLocalState>(pool, tnode, operator_id, descs),
-          _join_distribution(tnode.hash_join_node.__isset.dist_type ? tnode.hash_join_node.dist_type
-                                                                    : TJoinDistributionType::NONE),
           _distribution_partition_exprs(tnode.__isset.distribute_expr_lists
                                                 ? tnode.distribute_expr_lists[0]
                                                 : std::vector<TExpr> {}),
diff --git a/be/src/exec/operator/partitioned_hash_join_probe_operator.h b/be/src/exec/operator/partitioned_hash_join_probe_operator.h
index 15767504d85..d9bca3aab30 100644
--- a/be/src/exec/operator/partitioned_hash_join_probe_operator.h
+++ b/be/src/exec/operator/partitioned_hash_join_probe_operator.h
@@ -228,16 +228,8 @@ public:
     Status pull(doris::RuntimeState* state, Block* output_block, bool* eos) const override;
 
     bool need_more_input_data(RuntimeState* state) const override;
-    DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
-            return {ExchangeType::NOOP};
-        }
-        return (_join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
-                                _join_distribution == TJoinDistributionType::COLOCATE
-                        ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE,
-                                           _distribution_partition_exprs)
-                        : DataDistribution(ExchangeType::HASH_SHUFFLE,
-                                           _distribution_partition_exprs));
+    DataDistribution required_data_distribution(RuntimeState* state) const override {
+        return _inner_probe_operator->required_data_distribution(state);
     }
 
     size_t revocable_mem_size(RuntimeState* state) const override;
@@ -285,8 +277,6 @@ private:
                                                 RuntimeState* state, Block* output_block,
                                                 bool* eos) const;
 
-    const TJoinDistributionType::type _join_distribution;
-
     std::shared_ptr<HashJoinBuildSinkOperatorX> _inner_sink_operator;
     std::shared_ptr<HashJoinProbeOperatorX> _inner_probe_operator;
 
diff --git a/be/src/exec/operator/partitioned_hash_join_sink_operator.h b/be/src/exec/operator/partitioned_hash_join_sink_operator.h
index c6dc2cdfb94..e3c818a33c8 100644
--- a/be/src/exec/operator/partitioned_hash_join_sink_operator.h
+++ b/be/src/exec/operator/partitioned_hash_join_sink_operator.h
@@ -127,14 +127,14 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
 
         return _join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
                                _join_distribution == TJoinDistributionType::COLOCATE
-                       ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE,
+                       ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
                                           _distribution_partition_exprs)
-                       : DataDistribution(ExchangeType::HASH_SHUFFLE,
+                       : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
                                           _distribution_partition_exprs);
     }
 
diff --git a/be/src/exec/operator/rec_cte_anchor_sink_operator.h b/be/src/exec/operator/rec_cte_anchor_sink_operator.h
index 42661ee4181..e49ccf7b8c1 100644
--- a/be/src/exec/operator/rec_cte_anchor_sink_operator.h
+++ b/be/src/exec/operator/rec_cte_anchor_sink_operator.h
@@ -66,7 +66,7 @@ public:
     bool is_serial_operator() const override { return true; }
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return {ExchangeType::NOOP};
+        return {TLocalPartitionType::NOOP};
     }
 
     Status terminate(RuntimeState* state) override {
diff --git a/be/src/exec/operator/rec_cte_sink_operator.h b/be/src/exec/operator/rec_cte_sink_operator.h
index a071cf55761..d42a6da4e35 100644
--- a/be/src/exec/operator/rec_cte_sink_operator.h
+++ b/be/src/exec/operator/rec_cte_sink_operator.h
@@ -77,7 +77,7 @@ public:
     bool is_serial_operator() const override { return true; }
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return {ExchangeType::NOOP};
+        return {TLocalPartitionType::NOOP};
     }
 
     Status sink(RuntimeState* state, Block* input_block, bool eos) override {
diff --git a/be/src/exec/operator/rec_cte_source_operator.h b/be/src/exec/operator/rec_cte_source_operator.h
index 83e55937998..18ec1a0f267 100644
--- a/be/src/exec/operator/rec_cte_source_operator.h
+++ b/be/src/exec/operator/rec_cte_source_operator.h
@@ -206,7 +206,7 @@ public:
     bool is_serial_operator() const override { return true; }
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return {ExchangeType::NOOP};
+        return {TLocalPartitionType::NOOP};
     }
 
     Status get_block(RuntimeState* state, Block* block, bool* eos) override {
diff --git a/be/src/exec/operator/scan_operator.h b/be/src/exec/operator/scan_operator.h
index f2ba87d4291..e5ff76eac73 100644
--- a/be/src/exec/operator/scan_operator.h
+++ b/be/src/exec/operator/scan_operator.h
@@ -368,9 +368,9 @@ public:
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (OperatorX<LocalStateType>::is_serial_operator()) {
             // `is_serial_operator()` returns true means we ignore the distribution.
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
-        return {ExchangeType::BUCKET_HASH_SHUFFLE};
+        return {TLocalPartitionType::BUCKET_HASH_SHUFFLE};
     }
 
     void set_low_memory_mode(RuntimeState* state) override {
diff --git a/be/src/exec/operator/set_probe_sink_operator.h b/be/src/exec/operator/set_probe_sink_operator.h
index c736e2af229..ff47755d3d0 100644
--- a/be/src/exec/operator/set_probe_sink_operator.h
+++ b/be/src/exec/operator/set_probe_sink_operator.h
@@ -103,8 +103,10 @@ public:
 
     Status sink(RuntimeState* state, Block* in_block, bool eos) override;
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return _is_colocate ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                            : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+        return _is_colocate ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                               _partition_exprs)
+                            : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                               _partition_exprs);
     }
 
     std::shared_ptr<BasicSharedState> create_shared_state() const override { return nullptr; }
diff --git a/be/src/exec/operator/set_sink_operator.h b/be/src/exec/operator/set_sink_operator.h
index e1c937f1471..154fa7969d6 100644
--- a/be/src/exec/operator/set_sink_operator.h
+++ b/be/src/exec/operator/set_sink_operator.h
@@ -114,8 +114,8 @@ public:
 
     Status sink(RuntimeState* state, Block* in_block, bool eos) override;
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return _is_colocate ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                            : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+        return _is_colocate ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE, _partition_exprs)
+                            : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE, _partition_exprs);
     }
 
     size_t get_reserve_mem_size(RuntimeState* state, bool eos) override;
diff --git a/be/src/exec/operator/set_source_operator.h b/be/src/exec/operator/set_source_operator.h
index 40887f35fab..3655cc86bbf 100644
--- a/be/src/exec/operator/set_source_operator.h
+++ b/be/src/exec/operator/set_source_operator.h
@@ -81,8 +81,8 @@ public:
     bool is_shuffled_operator() const override { return true; }
     bool is_colocated_operator() const override { return _is_colocate; }
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return _is_colocate ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE)
-                            : DataDistribution(ExchangeType::HASH_SHUFFLE);
+        return _is_colocate ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE)
+                            : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
     }
 
     Status get_block(RuntimeState* state, Block* block, bool* eos) override;
diff --git a/be/src/exec/operator/sort_sink_operator.h b/be/src/exec/operator/sort_sink_operator.h
index eda5bb31b53..62916ca7ca2 100644
--- a/be/src/exec/operator/sort_sink_operator.h
+++ b/be/src/exec/operator/sort_sink_operator.h
@@ -80,13 +80,15 @@ public:
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
         if (_is_analytic_sort) {
             return _is_colocate && _require_bucket_distribution
-                           ? DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _partition_exprs)
-                           : DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+                           ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
+                                              _partition_exprs)
+                           : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                              _partition_exprs);
         } else if (_merge_by_exchange) {
             // The current sort node is used for the ORDER BY
-            return {ExchangeType::PASSTHROUGH};
+            return {TLocalPartitionType::PASSTHROUGH};
         } else {
-            return {ExchangeType::NOOP};
+            return {TLocalPartitionType::NOOP};
         }
     }
     bool is_colocated_operator() const override { return _is_colocate; }
diff --git a/be/src/exec/operator/streaming_aggregation_operator.h b/be/src/exec/operator/streaming_aggregation_operator.h
index 40a8de28244..80b64de1c9f 100644
--- a/be/src/exec/operator/streaming_aggregation_operator.h
+++ b/be/src/exec/operator/streaming_aggregation_operator.h
@@ -224,18 +224,19 @@ public:
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_child && _child->is_hash_join_probe() &&
             state->enable_streaming_agg_hash_join_force_passthrough()) {
-            return DataDistribution(ExchangeType::PASSTHROUGH);
+            return DataDistribution(TLocalPartitionType::PASSTHROUGH);
         }
         if (!_needs_finalize && !state->enable_local_exchange_before_agg()) {
             return StatefulOperatorX<StreamingAggLocalState>::required_data_distribution(state);
         }
         if (_partition_exprs.empty()) {
             return _needs_finalize
-                           ? DataDistribution(ExchangeType::NOOP)
+                           ? DataDistribution(TLocalPartitionType::NOOP)
                            : StatefulOperatorX<StreamingAggLocalState>::required_data_distribution(
                                      state);
         }
-        return DataDistribution(ExchangeType::HASH_SHUFFLE, _partition_exprs);
+        return DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
+                                _partition_exprs);
     }
 
 private:
diff --git a/be/src/exec/operator/table_function_operator.h b/be/src/exec/operator/table_function_operator.h
index 0a55c090596..de6e546af1d 100644
--- a/be/src/exec/operator/table_function_operator.h
+++ b/be/src/exec/operator/table_function_operator.h
@@ -116,7 +116,7 @@ public:
     }
 
     DataDistribution required_data_distribution(RuntimeState* /*state*/) const override {
-        return {ExchangeType::PASSTHROUGH};
+        return {TLocalPartitionType::PASSTHROUGH};
     }
 
     Status push(RuntimeState* state, Block* input_block, bool eos) const override {
diff --git a/be/src/exec/operator/union_sink_operator.h b/be/src/exec/operator/union_sink_operator.h
index 4842ab6b243..f172e120ac8 100644
--- a/be/src/exec/operator/union_sink_operator.h
+++ b/be/src/exec/operator/union_sink_operator.h
@@ -116,10 +116,10 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_require_bucket_distribution) {
-            return DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE, _distribute_exprs);
+            return DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE, _distribute_exprs);
         }
         if (_followed_by_shuffled_operator) {
-            return DataDistribution(ExchangeType::HASH_SHUFFLE, _distribute_exprs);
+            return DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE, _distribute_exprs);
         }
         return Base::required_data_distribution(state);
     }
diff --git a/be/src/exec/operator/union_source_operator.h b/be/src/exec/operator/union_source_operator.h
index 748c9a48e60..2b1d3e10d95 100644
--- a/be/src/exec/operator/union_source_operator.h
+++ b/be/src/exec/operator/union_source_operator.h
@@ -101,10 +101,10 @@ public:
 
     DataDistribution required_data_distribution(RuntimeState* state) const override {
         if (_require_bucket_distribution) {
-            return DataDistribution(ExchangeType::BUCKET_HASH_SHUFFLE);
+            return DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE);
         }
         if (_followed_by_shuffled_operator) {
-            return DataDistribution(ExchangeType::HASH_SHUFFLE);
+            return DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
         }
         return Base::required_data_distribution(state);
     }
diff --git a/be/src/exec/pipeline/dependency.h b/be/src/exec/pipeline/dependency.h
index dbb4b938ad4..cc36a977e5d 100644
--- a/be/src/exec/pipeline/dependency.h
+++ b/be/src/exec/pipeline/dependency.h
@@ -828,50 +828,44 @@ public:
     Status hash_table_init();
 };
 
-enum class ExchangeType : uint8_t {
-    NOOP = 0,
-    // Shuffle data by Crc32CHashPartitioner
-    HASH_SHUFFLE = 1,
-    // Round-robin passthrough data blocks.
-    PASSTHROUGH = 2,
-    // Shuffle data by Crc32HashPartitioner<ShuffleChannelIds> (e.g. same as storage engine).
-    BUCKET_HASH_SHUFFLE = 3,
-    // Passthrough data blocks to all channels.
-    BROADCAST = 4,
-    // Passthrough data to channels evenly in an adaptive way.
-    ADAPTIVE_PASSTHROUGH = 5,
-    // Send all data to the first channel.
-    PASS_TO_ONE = 6,
-};
+inline bool is_shuffled_exchange(TLocalPartitionType::type idx) {
+    return idx == TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE ||
+           idx == TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE ||
+           idx == TLocalPartitionType::BUCKET_HASH_SHUFFLE;
+}
 
-inline std::string get_exchange_type_name(ExchangeType idx) {
+inline std::string get_exchange_type_name(TLocalPartitionType::type idx) {
     switch (idx) {
-    case ExchangeType::NOOP:
+    case TLocalPartitionType::NOOP:
         return "NOOP";
-    case ExchangeType::HASH_SHUFFLE:
-        return "HASH_SHUFFLE";
-    case ExchangeType::PASSTHROUGH:
+    case TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE:
+        return "GLOBAL_HASH_SHUFFLE";
+    case TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE:
+        return "LOCAL_HASH_SHUFFLE";
+    case TLocalPartitionType::PASSTHROUGH:
         return "PASSTHROUGH";
-    case ExchangeType::BUCKET_HASH_SHUFFLE:
+    case TLocalPartitionType::BUCKET_HASH_SHUFFLE:
         return "BUCKET_HASH_SHUFFLE";
-    case ExchangeType::BROADCAST:
+    case TLocalPartitionType::BROADCAST:
         return "BROADCAST";
-    case ExchangeType::ADAPTIVE_PASSTHROUGH:
+    case TLocalPartitionType::ADAPTIVE_PASSTHROUGH:
         return "ADAPTIVE_PASSTHROUGH";
-    case ExchangeType::PASS_TO_ONE:
+    case TLocalPartitionType::PASS_TO_ONE:
         return "PASS_TO_ONE";
+    case TLocalPartitionType::LOCAL_MERGE_SORT:
+        return "LOCAL_MERGE_SORT";
     }
     throw Exception(Status::FatalError("__builtin_unreachable"));
 }
 
 struct DataDistribution {
-    DataDistribution(ExchangeType type) : distribution_type(type) {}
-    DataDistribution(ExchangeType type, const std::vector<TExpr>& partition_exprs_)
+    DataDistribution(TLocalPartitionType::type type) : distribution_type(type) {}
+    DataDistribution(TLocalPartitionType::type type, const std::vector<TExpr>& partition_exprs_)
             : distribution_type(type), partition_exprs(partition_exprs_) {}
     DataDistribution(const DataDistribution& other) = default;
-    bool need_local_exchange() const { return distribution_type != ExchangeType::NOOP; }
+    bool need_local_exchange() const { return distribution_type != TLocalPartitionType::NOOP; }
     DataDistribution& operator=(const DataDistribution& other) = default;
-    ExchangeType distribution_type;
+    TLocalPartitionType::type distribution_type;
     std::vector<TExpr> partition_exprs;
 };
 
diff --git a/be/src/exec/pipeline/pipeline.cpp b/be/src/exec/pipeline/pipeline.cpp
index de3c852ada1..c63267800ed 100644
--- a/be/src/exec/pipeline/pipeline.cpp
+++ b/be/src/exec/pipeline/pipeline.cpp
@@ -54,8 +54,7 @@ bool Pipeline::need_to_local_exchange(const DataDistribution target_data_distrib
         return true;
     }
 
-    if (target_data_distribution.distribution_type != ExchangeType::BUCKET_HASH_SHUFFLE &&
-        target_data_distribution.distribution_type != ExchangeType::HASH_SHUFFLE) {
+    if (!is_shuffled_exchange(target_data_distribution.distribution_type)) {
         // Always do local exchange if non-hash-partition exchanger is required.
         // For example, `PASSTHROUGH` exchanger is always required to distribute data evenly.
         return true;
diff --git a/be/src/exec/pipeline/pipeline.h b/be/src/exec/pipeline/pipeline.h
index 3dc9e2353f7..817c379692e 100644
--- a/be/src/exec/pipeline/pipeline.h
+++ b/be/src/exec/pipeline/pipeline.h
@@ -68,16 +68,15 @@ public:
 
     [[nodiscard]] PipelineId id() const { return _pipeline_id; }
 
-    static bool is_hash_exchange(ExchangeType idx) {
-        return idx == ExchangeType::HASH_SHUFFLE || idx == ExchangeType::BUCKET_HASH_SHUFFLE;
+    static bool is_hash_exchange(TLocalPartitionType::type idx) {
+        return is_shuffled_exchange(idx);
     }
 
     // For HASH_SHUFFLE, BUCKET_HASH_SHUFFLE, and ADAPTIVE_PASSTHROUGH,
     // data is processed and shuffled on the sink.
     // Compared to PASSTHROUGH, this is a relatively heavy operation.
-    static bool heavy_operations_on_the_sink(ExchangeType idx) {
-        return idx == ExchangeType::HASH_SHUFFLE || idx == ExchangeType::BUCKET_HASH_SHUFFLE ||
-               idx == ExchangeType::ADAPTIVE_PASSTHROUGH;
+    static bool heavy_operations_on_the_sink(TLocalPartitionType::type idx) {
+        return is_shuffled_exchange(idx) || idx == TLocalPartitionType::ADAPTIVE_PASSTHROUGH;
     }
 
     bool need_to_local_exchange(const DataDistribution target_data_distribution,
@@ -165,7 +164,7 @@ private:
 
     // Input data distribution of this pipeline. We do local exchange when input data distribution
     // does not match the target data distribution.
-    DataDistribution _data_distribution {ExchangeType::NOOP};
+    DataDistribution _data_distribution {TLocalPartitionType::NOOP};
 
     // How many tasks should be created ?
     int _num_tasks = 1;
diff --git a/be/src/exec/pipeline/pipeline_fragment_context.cpp b/be/src/exec/pipeline/pipeline_fragment_context.cpp
index 8570c771232..cac696397c1 100644
--- a/be/src/exec/pipeline/pipeline_fragment_context.cpp
+++ b/be/src/exec/pipeline/pipeline_fragment_context.cpp
@@ -290,6 +290,32 @@ Status PipelineFragmentContext::_build_and_prepare_full_pipeline(ThreadPool* thr
         RETURN_IF_ERROR(_build_pipelines(_runtime_state->obj_pool(), *_query_ctx->desc_tbl,
                                          &_root_op, root_pipeline));
 
+        // Propagate _num_instances from LOCAL_EXCHANGE pipelines to ancestor pipelines
+        // that inherited reduced num_tasks from a serial operator.
+        _propagate_local_exchange_num_tasks();
+
+        // Create deferred local exchangers now that all pipelines have final num_tasks.
+        RETURN_IF_ERROR(_create_deferred_local_exchangers());
+
+        // Raise num_tasks for pipelines whose serial non-scan operators (e.g.,
+        // UNPARTITIONED Exchange) reduced num_tasks below _num_instances.
+        // Without this, fragment instances 1+ have no task for these pipelines
+        // and downstream operators fail with "must set shared state".
+        //
+        // This applies to ALL pipelines (not just deferred exchanger upstreams):
+        // fragments with UNION/INTERSECT/EXCEPT + serial Exchange in child
+        // pipelines also need the raise, even without FE-planned local exchange.
+        //
+        // Exception: serial scan sources (pooling scan) keep num_tasks=1 — the
+        // PassthroughExchanger(1, N) handles the fan-out correctly.
+        // NOTE: Do NOT raise pipelines whose source is a serial operator
+        // (Exchange or scan) — they legitimately have 1 task, and raising
+        // them causes crashes (e.g., 4 Exchange tasks but only 1 receives
+        // data).  The correct fix for shared state injection across
+        // instances is handled by the FE: it inserts local exchange nodes
+        // between serial operators and their downstream consumers, creating
+        // proper pipeline boundaries with _num_instances tasks.
+
         // 3. Create sink operator
         if (!_params.fragment.__isset.output_sink) {
             return Status::InternalError("No output sink in this fragment!");
@@ -307,7 +333,7 @@ Status PipelineFragmentContext::_build_and_prepare_full_pipeline(ThreadPool* thr
         }
     }
     // 4. Build local exchanger
-    if (_runtime_state->enable_local_shuffle()) {
+    if (_runtime_state->plan_local_shuffle()) {
         SCOPED_TIMER(_plan_local_exchanger_timer);
         RETURN_IF_ERROR(_plan_local_exchange(_params.num_buckets,
                                              _params.bucket_seq_to_instance_idx,
@@ -690,6 +716,150 @@ Status PipelineFragmentContext::_build_pipelines(ObjectPool* pool, const Descrip
     return Status::OK();
 }
 
+Status PipelineFragmentContext::_create_deferred_local_exchangers() {
+    for (auto& info : _deferred_exchangers) {
+        const int sender_count = info.upstream_pipe->num_tasks();
+        switch (info.partition_type) {
+        case TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE:
+        case TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE:
+            info.shared_state->exchanger = ShuffleExchanger::create_unique(
+                    sender_count, _num_instances, info.num_partitions, info.free_blocks_limit,
+                    info.partition_type);
+            break;
+        case TLocalPartitionType::BUCKET_HASH_SHUFFLE:
+            info.shared_state->exchanger = BucketShuffleExchanger::create_unique(
+                    sender_count, _num_instances, info.num_partitions, info.free_blocks_limit);
+            break;
+        case TLocalPartitionType::PASSTHROUGH:
+            info.shared_state->exchanger = PassthroughExchanger::create_unique(
+                    sender_count, _num_instances, info.free_blocks_limit);
+            break;
+        case TLocalPartitionType::BROADCAST:
+            info.shared_state->exchanger = BroadcastExchanger::create_unique(
+                    sender_count, _num_instances, info.free_blocks_limit);
+            break;
+        case TLocalPartitionType::PASS_TO_ONE:
+            if (_runtime_state->enable_share_hash_table_for_broadcast_join()) {
+                info.shared_state->exchanger = PassToOneExchanger::create_unique(
+                        sender_count, _num_instances, info.free_blocks_limit);
+            } else {
+                info.shared_state->exchanger = BroadcastExchanger::create_unique(
+                        sender_count, _num_instances, info.free_blocks_limit);
+            }
+            break;
+        case TLocalPartitionType::ADAPTIVE_PASSTHROUGH:
+            info.shared_state->exchanger = AdaptivePassthroughExchanger::create_unique(
+                    sender_count, _num_instances, info.free_blocks_limit);
+            break;
+        default:
+            return Status::InternalError("Unsupported FE-planned local exchange type: " +
+                                         std::to_string(static_cast<int>(info.partition_type)));
+        }
+    }
+    _deferred_exchangers.clear();
+    return Status::OK();
+}
+
+void PipelineFragmentContext::_propagate_local_exchange_num_tasks() {
+    if (_deferred_exchangers.empty()) {
+        return;
+    }
+    // Fix num_tasks mismatches between paired pipelines created by pipeline-splitting
+    // operators (AGG, SORT, JOIN).  These pairs share state via inject_shared_state and
+    // must have consistent num_tasks; otherwise instance 1+ tasks access null shared_state.
+    //
+    // Pass 1 (upward): when FE inserts LOCAL_EXCHANGE_NODE below a splitting operator,
+    // the LE pipeline gets _num_instances but ancestor pipelines still have the reduced
+    // count.  Raise them to _num_instances (skip serial source operators).
+    //
+    // Pass 2 (downward): when a serial Exchange feeds a splitting operator (e.g., scalar
+    // merge-finalize AGG), the sink pipeline has 1 task but the source pipeline may have
+    // been raised (by LE or by inheriting _num_instances from add_pipeline).  Lower it
+    // to match, unless it contains LocalExchangeSource (deliberately raised by LE).
+    std::unordered_map<PipelineId, PipelinePtr> id_to_pipe;
+    for (auto& p : _pipelines) {
+        id_to_pipe[p->id()] = p;
+    }
+
+    // Pass 1 (upward): raise downstream pipelines to _num_instances when any upstream
+    // dependency was already raised by LOCAL_EXCHANGE.
+    bool changed = true;
+    while (changed) {
+        changed = false;
+        for (const auto& [downstream_id, upstream_ids] : _dag) {
+            auto dit = id_to_pipe.find(downstream_id);
+            if (dit == id_to_pipe.end()) {
+                continue;
+            }
+            auto& downstream = dit->second;
+            if (downstream->num_tasks() >= _num_instances) {
+                continue;
+            }
+            if (!downstream->operators().empty() &&
+                downstream->operators().front()->is_serial_operator()) {
+                continue;
+            }
+            for (auto upstream_id : upstream_ids) {
+                auto uit = id_to_pipe.find(upstream_id);
+                if (uit != id_to_pipe.end() && uit->second->num_tasks() >= _num_instances) {
+                    downstream->set_num_tasks(_num_instances);
+                    changed = true;
+                    break;
+                }
+            }
+        }
+    }
+
+    // Pass 2 (downward): when a pipeline-splitting operator (AGG, SORT, JOIN) creates
+    // paired pipelines (source + sink), they share state via inject_shared_state and must
+    // have consistent num_tasks.  If the sink pipeline has a serial source (Exchange) with
+    // num_tasks < _num_instances, but the source pipeline was raised (by inheriting from
+    // an LE-fixed parent during add_pipeline), lower the source pipeline to match.
+    // Skip pipelines containing LocalExchangeSource — they were deliberately raised.
+    //
+    // Example: serial Exchange → AGG(merge finalize) → LOCAL_EXCHANGE → NLJ
+    //   P_sink  = [Exchange, AGGSink]   num_tasks=1  (serial)
+    //   P_source = [AGGSource]          num_tasks=_num_instances (inherited)
+    //   → lower P_source to 1; the LE above fans out the 1 result to N NLJ tasks.
+    changed = true;
+    while (changed) {
+        changed = false;
+        for (const auto& [downstream_id, upstream_ids] : _dag) {
+            auto dit = id_to_pipe.find(downstream_id);
+            if (dit == id_to_pipe.end()) {
+                continue;
+            }
+            auto& downstream = dit->second;
+            if (downstream->num_tasks() <= 1) {
+                continue;
+            }
+            // Don't lower pipelines that contain LocalExchangeSource — they were
+            // deliberately raised to _num_instances by LOCAL_EXCHANGE processing.
+            bool has_le_source = false;
+            for (auto& op : downstream->operators()) {
+                if (dynamic_cast<LocalExchangeSourceOperatorX*>(op.get())) {
+                    has_le_source = true;
+                    break;
+                }
+            }
+            if (has_le_source) {
+                continue;
+            }
+            for (auto upstream_id : upstream_ids) {
+                auto uit = id_to_pipe.find(upstream_id);
+                if (uit != id_to_pipe.end() &&
+                    uit->second->num_tasks() < downstream->num_tasks() &&
+                    !uit->second->operators().empty() &&
+                    uit->second->operators().front()->is_serial_operator()) {
+                    downstream->set_num_tasks(uit->second->num_tasks());
+                    changed = true;
+                    break;
+                }
+            }
+        }
+    }
+}
+
 Status PipelineFragmentContext::_create_tree_helper(
         ObjectPool* pool, const std::vector<TPlanNode>& tnodes, const DescriptorTbl& descs,
         OperatorPtr parent, int* node_idx, OperatorPtr* root, PipelinePtr& cur_pipe, int child_idx,
@@ -723,7 +893,7 @@ Status PipelineFragmentContext::_create_tree_helper(
         *root = op;
     }
     /**
-     * `ExchangeType::HASH_SHUFFLE` should be used if an operator is followed by a shuffled operator (shuffled hash join, union operator followed by co-located operators).
+     * `TLocalPartitionType::HASH_SHUFFLE` should be used if an operator is followed by a shuffled operator (shuffled hash join, union operator followed by co-located operators).
      *
      * For plan:
      * LocalExchange(id=0) -> Aggregation(id=1) -> ShuffledHashJoin(id=2)
@@ -743,7 +913,7 @@ Status PipelineFragmentContext::_create_tree_helper(
                                              : op->is_shuffled_operator())) &&
              Pipeline::is_hash_exchange(required_data_distribution.distribution_type)) ||
             (followed_by_shuffled_operator &&
-             required_data_distribution.distribution_type == ExchangeType::NOOP);
+             required_data_distribution.distribution_type == TLocalPartitionType::NOOP);
 
     current_require_bucket_distribution =
             ((require_bucket_distribution ||
@@ -751,7 +921,7 @@ Status PipelineFragmentContext::_create_tree_helper(
                                              : op->is_colocated_operator())) &&
              Pipeline::is_hash_exchange(required_data_distribution.distribution_type)) ||
             (require_bucket_distribution &&
-             required_data_distribution.distribution_type == ExchangeType::NOOP);
+             required_data_distribution.distribution_type == TLocalPartitionType::NOOP);
 
     if (num_children == 0) {
         _use_serial_source = op->is_serial_operator();
@@ -810,28 +980,35 @@ Status PipelineFragmentContext::_add_local_exchange_impl(
             sink_id, local_exchange_id, use_global_hash_shuffle ? _total_instances : _num_instances,
             data_distribution.partition_exprs, bucket_seq_to_instance_idx);
     if (bucket_seq_to_instance_idx.empty() &&
-        data_distribution.distribution_type == ExchangeType::BUCKET_HASH_SHUFFLE) {
-        data_distribution.distribution_type = ExchangeType::HASH_SHUFFLE;
+        data_distribution.distribution_type == TLocalPartitionType::BUCKET_HASH_SHUFFLE) {
+        data_distribution.distribution_type =
+                use_global_hash_shuffle ? TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE
+                                        : TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE;
+    }
+    if (!use_global_hash_shuffle &&
+        data_distribution.distribution_type == TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE) {
+        data_distribution.distribution_type = TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE;
     }
     RETURN_IF_ERROR(new_pip->set_sink(sink));
     RETURN_IF_ERROR(new_pip->sink()->init(_runtime_state.get(), data_distribution.distribution_type,
-                                          num_buckets, use_global_hash_shuffle,
-                                          shuffle_idx_to_instance_idx));
+                                          num_buckets, shuffle_idx_to_instance_idx));
 
     // 2. Create and initialize LocalExchangeSharedState.
     std::shared_ptr<LocalExchangeSharedState> shared_state =
             LocalExchangeSharedState::create_shared(_num_instances);
     switch (data_distribution.distribution_type) {
-    case ExchangeType::HASH_SHUFFLE:
+    case TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE:
+    case TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE:
         shared_state->exchanger = ShuffleExchanger::create_unique(
                 std::max(cur_pipe->num_tasks(), _num_instances), _num_instances,
                 use_global_hash_shuffle ? _total_instances : _num_instances,
                 _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
                         ? cast_set<int>(
                                   _runtime_state->query_options().local_exchange_free_blocks_limit)
-                        : 0);
+                        : 0,
+                data_distribution.distribution_type);
         break;
-    case ExchangeType::BUCKET_HASH_SHUFFLE:
+    case TLocalPartitionType::BUCKET_HASH_SHUFFLE:
         shared_state->exchanger = BucketShuffleExchanger::create_unique(
                 std::max(cur_pipe->num_tasks(), _num_instances), _num_instances, num_buckets,
                 _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
@@ -839,7 +1016,7 @@ Status PipelineFragmentContext::_add_local_exchange_impl(
                                   _runtime_state->query_options().local_exchange_free_blocks_limit)
                         : 0);
         break;
-    case ExchangeType::PASSTHROUGH:
+    case TLocalPartitionType::PASSTHROUGH:
         shared_state->exchanger = PassthroughExchanger::create_unique(
                 cur_pipe->num_tasks(), _num_instances,
                 _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
@@ -847,7 +1024,7 @@ Status PipelineFragmentContext::_add_local_exchange_impl(
                                   _runtime_state->query_options().local_exchange_free_blocks_limit)
                         : 0);
         break;
-    case ExchangeType::BROADCAST:
+    case TLocalPartitionType::BROADCAST:
         shared_state->exchanger = BroadcastExchanger::create_unique(
                 cur_pipe->num_tasks(), _num_instances,
                 _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
@@ -855,7 +1032,7 @@ Status PipelineFragmentContext::_add_local_exchange_impl(
                                   _runtime_state->query_options().local_exchange_free_blocks_limit)
                         : 0);
         break;
-    case ExchangeType::PASS_TO_ONE:
+    case TLocalPartitionType::PASS_TO_ONE:
         if (_runtime_state->enable_share_hash_table_for_broadcast_join()) {
             // If shared hash table is enabled for BJ, hash table will be built by only one task
             shared_state->exchanger = PassToOneExchanger::create_unique(
@@ -873,7 +1050,7 @@ Status PipelineFragmentContext::_add_local_exchange_impl(
                             : 0);
         }
         break;
-    case ExchangeType::ADAPTIVE_PASSTHROUGH:
+    case TLocalPartitionType::ADAPTIVE_PASSTHROUGH:
         shared_state->exchanger = AdaptivePassthroughExchanger::create_unique(
                 std::max(cur_pipe->num_tasks(), _num_instances), _num_instances,
                 _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
@@ -984,9 +1161,9 @@ Status PipelineFragmentContext::_add_local_exchange(
         Pipeline::heavy_operations_on_the_sink(data_distribution.distribution_type)) {
         RETURN_IF_ERROR(_add_local_exchange_impl(
                 cast_set<int>(new_pip->operators().size()), pool, new_pip,
-                add_pipeline(new_pip, pip_idx + 2), DataDistribution(ExchangeType::PASSTHROUGH),
-                do_local_exchange, num_buckets, bucket_seq_to_instance_idx,
-                shuffle_idx_to_instance_idx));
+                add_pipeline(new_pip, pip_idx + 2),
+                DataDistribution(TLocalPartitionType::PASSTHROUGH), do_local_exchange, num_buckets,
+                bucket_seq_to_instance_idx, shuffle_idx_to_instance_idx));
     }
     return Status::OK();
 }
@@ -1027,10 +1204,11 @@ Status PipelineFragmentContext::_plan_local_exchange(
         do_local_exchange = false;
         // Plan local exchange for each operator.
         for (; idx < ops.size();) {
-            if (ops[idx]->required_data_distribution(_runtime_state.get()).need_local_exchange()) {
+            auto _le_req = ops[idx]->required_data_distribution(_runtime_state.get());
+            if (_le_req.need_local_exchange()) {
                 RETURN_IF_ERROR(_add_local_exchange(
                         pip_idx, idx, ops[idx]->node_id(), _runtime_state->obj_pool(), pip,
-                        ops[idx]->required_data_distribution(_runtime_state.get()),
+                        _le_req,
                         &do_local_exchange, num_buckets, bucket_seq_to_instance_idx,
                         shuffle_idx_to_instance_idx));
             }
@@ -1796,6 +1974,89 @@ Status PipelineFragmentContext::_create_operator(ObjectPool* pool, const TPlanNo
         RETURN_IF_ERROR(cur_pipe->add_operator(op, _parallel_instances));
         break;
     }
+    case TPlanNodeType::LOCAL_EXCHANGE_NODE: {
+        op = std::make_shared<LocalExchangeSourceOperatorX>(pool, tnode, next_operator_id(), descs);
+        // The downstream pipeline (containing LocalExchangeSource) must have
+        // _num_instances tasks — matching BE-native _inherit_pipeline_properties
+        // which sets pipe_with_source.set_num_tasks(_num_instances).
+        // Without this, when the parent pipeline was reduced by a serial operator
+        // (e.g., serial Exchange with use_serial_exchange=true, or UNPARTITIONED
+        // Exchange), the downstream inherits the reduced num_tasks via
+        // add_pipeline(parent).  The deferred exchanger creates _num_instances
+        // channels but only fewer source tasks initialize mem_counters — the
+        // sink round-robins to all channels and crashes on uninitialized ones.
+        auto downstream_num_tasks = _num_instances;
+        RETURN_IF_ERROR(cur_pipe->add_operator(op, _parallel_instances));
+        // Restore downstream pipeline's num_tasks (mirroring _inherit_pipeline_properties:
+        // downstream keeps _num_instances, upstream gets the serial/reduced count)
+        cur_pipe->set_num_tasks(downstream_num_tasks);
+
+        const auto downstream_pipeline_id = cur_pipe->id();
+        if (!_dag.contains(downstream_pipeline_id)) {
+            _dag.insert({downstream_pipeline_id, {}});
+        }
+        cur_pipe = add_pipeline(cur_pipe);
+        // If this local exchange was inserted because of a serial scan (is_serial_operator),
+        // the upstream pipeline (cur_pipe) should have num_tasks=1 (only 1 scan task).
+        // We set this now so the exchanger is created with the correct sender count.
+        // Child operators added later (serial scan) will also set num_tasks=1, which is
+        // consistent with this.
+        if (op->is_serial_operator() && _parallel_instances > 0) {
+            cur_pipe->set_num_tasks(_parallel_instances);
+        }
+        _dag[downstream_pipeline_id].push_back(cur_pipe->id());
+        int num_partitions = 0;
+        std::map<int, int> shuffle_id_to_instance_idx;
+        auto partition_type = tnode.local_exchange_node.partition_type;
+        switch (partition_type) {
+        case TLocalPartitionType::BUCKET_HASH_SHUFFLE:
+            num_partitions = _params.num_buckets;
+            shuffle_id_to_instance_idx = _params.bucket_seq_to_instance_idx;
+            break;
+        case TLocalPartitionType::LOCAL_EXECUTION_HASH_SHUFFLE:
+            for (int i = 0; i < _num_instances; i++) {
+                shuffle_id_to_instance_idx[i] = i;
+            }
+            num_partitions = _num_instances;
+            break;
+        case TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE:
+            num_partitions = _total_instances;
+            shuffle_id_to_instance_idx = _params.shuffle_idx_to_instance_idx;
+            break;
+        default:
+            break;
+        }
+        auto local_exchange_id = op->operator_id();
+        auto sink_id = next_sink_operator_id();
+        DataSinkOperatorPtr sink = std::make_shared<LocalExchangeSinkOperatorX>(
+                sink_id, local_exchange_id, tnode, num_partitions, shuffle_id_to_instance_idx);
+        sink_ops.push_back(sink);
+        RETURN_IF_ERROR(cur_pipe->set_sink(sink));
+        RETURN_IF_ERROR(cur_pipe->sink()->init(tnode, _runtime_state.get()));
+
+        // For FE-planned local exchange, we need to:
+        // 1. Initialize the partitioner for hash shuffle types
+        // 2. Defer exchanger creation until after the full plan tree is built
+        //    (child operators like serial ExchangeNode may change cur_pipe->num_tasks())
+        // 3. Register shared state so pipeline tasks can find it
+        RETURN_IF_ERROR(static_cast<LocalExchangeSinkOperatorX*>(cur_pipe->sink())
+                                ->init_partitioner(_runtime_state.get()));
+
+        int free_blocks_limit =
+                _runtime_state->query_options().__isset.local_exchange_free_blocks_limit
+                        ? cast_set<int>(
+                                  _runtime_state->query_options().local_exchange_free_blocks_limit)
+                        : 0;
+        auto shared_state = LocalExchangeSharedState::create_shared(_num_instances);
+        shared_state->create_source_dependencies(_num_instances, local_exchange_id,
+                                                 local_exchange_id, "LOCAL_EXCHANGE_OPERATOR");
+        shared_state->create_sink_dependency(sink_id, local_exchange_id, "LOCAL_EXCHANGE_SINK");
+        _op_id_to_shared_state.insert({local_exchange_id, {shared_state, shared_state->sink_deps}});
+        // Defer exchanger creation: sender count depends on final upstream num_tasks
+        _deferred_exchangers.push_back({shared_state, cur_pipe, partition_type, num_partitions,
+                                        free_blocks_limit, local_exchange_id, sink_id});
+        break;
+    }
     default:
         return Status::InternalError("Unsupported exec type in pipeline: {}",
                                      print_plan_node_type(tnode.node_type));
diff --git a/be/src/exec/pipeline/pipeline_fragment_context.h b/be/src/exec/pipeline/pipeline_fragment_context.h
index c220ea386f6..4950da0a7b0 100644
--- a/be/src/exec/pipeline/pipeline_fragment_context.h
+++ b/be/src/exec/pipeline/pipeline_fragment_context.h
@@ -18,6 +18,7 @@
 #pragma once
 
 #include <brpc/closure_guard.h>
+#include <gen_cpp/Partitions_types.h>
 #include <gen_cpp/Types_types.h>
 #include <gen_cpp/types.pb.h>
 
@@ -49,6 +50,7 @@ class TDataSink;
 class TPipelineFragmentParams;
 
 class Dependency;
+struct LocalExchangeSharedState;
 
 class PipelineFragmentContext : public TaskExecutionContext {
 public:
@@ -320,8 +322,11 @@ private:
 
     std::mutex _state_map_lock;
 
-    int _operator_id = 0;
-    int _sink_operator_id = 0;
+    // Start from -1 so all operator IDs are negative. This avoids collision with
+    // unpaired sinks (OlapTableSink etc.) whose hardcoded dest_id=0 would otherwise
+    // match the first operator's ID when FE-planned LocalExchangeNode is the root.
+    int _operator_id = -1;
+    int _sink_operator_id = -1;
     /**
      * Some states are shared by tasks in different pipeline task (e.g. local exchange , broadcast join).
      *
@@ -342,6 +347,27 @@ private:
     std::map<PipelineId, Pipeline*> _pip_id_to_pipeline;
     std::vector<std::unique_ptr<RuntimeFilterMgr>> _runtime_filter_mgr_map;
 
+    // Deferred exchanger creation info for FE-planned local exchanges.
+    // Exchanger sender count depends on the upstream pipeline's final num_tasks,
+    // which is only known after the full plan tree is built (child operators like
+    // serial ExchangeNode may reduce num_tasks). So we defer exchanger creation
+    // until after _build_pipelines completes.
+    struct DeferredExchangerInfo {
+        std::shared_ptr<LocalExchangeSharedState> shared_state;
+        PipelinePtr upstream_pipe;
+        TLocalPartitionType::type partition_type;
+        int num_partitions;
+        int free_blocks_limit;
+        int local_exchange_id;
+        int sink_id;
+    };
+    std::vector<DeferredExchangerInfo> _deferred_exchangers;
+    Status _create_deferred_local_exchangers();
+    // After _build_pipelines, propagate _num_instances from FE-planned LOCAL_EXCHANGE
+    // pipelines upward through the DAG to ancestor pipelines that inherited reduced
+    // num_tasks from a serial operator.
+    void _propagate_local_exchange_num_tasks();
+
     //Here are two types of runtime states:
     //    - _runtime state is at the Fragment level.
     //    - _task_runtime_states is at the task level, unique to each task.
diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp
index 94658e9e80e..ae461e2c8dc 100644
--- a/be/src/runtime/exec_env_init.cpp
+++ b/be/src/runtime/exec_env_init.cpp
@@ -627,6 +627,17 @@ Status ExecEnv::init_mem_env() {
     } else {
         fd_number = static_cast<uint64_t>(l.rlim_cur);
     }
+#ifdef __APPLE__
+    // On macOS, rlim_cur can be RLIM_INFINITY (INT64_MAX), which causes
+    // fd_number / 100 * percentage to overflow and crash cast_set<uint32_t>.
+    // Linux kernels cap this via fs.nr_open (default 1M), so only macOS needs this.
+    {
+        constexpr uint64_t max_fd = UINT32_MAX >> 2;
+        if (fd_number > max_fd) {
+            fd_number = max_fd;
+        }
+    }
+#endif
 
     int64_t segment_cache_capacity = 0;
     if (config::is_cloud_mode()) {
diff --git a/be/src/runtime/runtime_state.h b/be/src/runtime/runtime_state.h
index 619b842eef7..732a0f2372c 100644
--- a/be/src/runtime/runtime_state.h
+++ b/be/src/runtime/runtime_state.h
@@ -415,8 +415,11 @@ public:
                BeExecVersionManager::check_be_exec_version(_query_options.be_exec_version));
         return _query_options.be_exec_version;
     }
-    bool enable_local_shuffle() const {
-        return _query_options.__isset.enable_local_shuffle && _query_options.enable_local_shuffle;
+    bool plan_local_shuffle() const {
+        // If local shuffle is enabled and not planned by local shuffle planner, we should plan local shuffle in BE.
+        return _query_options.__isset.enable_local_shuffle && _query_options.enable_local_shuffle &&
+               (!_query_options.__isset.enable_local_shuffle_planner ||
+               !_query_options.enable_local_shuffle_planner);
     }
 
     MOCK_FUNCTION bool enable_local_exchange() const {
diff --git a/be/src/udf/python/python_udf_runtime.cpp b/be/src/udf/python/python_udf_runtime.cpp
index 9d687c43f40..3fa94bf417e 100644
--- a/be/src/udf/python/python_udf_runtime.cpp
+++ b/be/src/udf/python/python_udf_runtime.cpp
@@ -21,8 +21,6 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
-#include <boost/process.hpp>
-
 #include "common/logging.h"
 
 namespace doris {
diff --git a/be/test/exec/pipeline/local_exchanger_test.cpp b/be/test/exec/pipeline/local_exchanger_test.cpp
index 3051625a3ee..22dacde4568 100644
--- a/be/test/exec/pipeline/local_exchanger_test.cpp
+++ b/be/test/exec/pipeline/local_exchanger_test.cpp
@@ -89,8 +89,9 @@ TEST_F(LocalExchangerTest, ShuffleExchanger) {
     _local_states.resize(num_sources);
     auto profile = std::make_shared<RuntimeProfile>("");
     auto shared_state = LocalExchangeSharedState::create_shared(num_partitions);
-    shared_state->exchanger = ShuffleExchanger::create_unique(num_sink, num_sources, num_partitions,
-                                                              free_block_limit);
+    shared_state->exchanger =
+            ShuffleExchanger::create_unique(num_sink, num_sources, num_partitions, free_block_limit,
+                                            TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
     auto sink_dep = std::make_shared<Dependency>(0, 0, "LOCAL_EXCHANGE_SINK_DEPENDENCY", true);
     sink_dep->set_shared_state(shared_state.get());
     shared_state->sink_deps.push_back(sink_dep);
@@ -1175,8 +1176,9 @@ TEST_F(LocalExchangerTest, TestShuffleExchangerWrongMap) {
     _local_states.resize(num_sources);
     auto profile = std::make_shared<RuntimeProfile>("");
     auto shared_state = LocalExchangeSharedState::create_shared(num_partitions);
-    shared_state->exchanger = ShuffleExchanger::create_unique(num_sink, num_sources, num_partitions,
-                                                              free_block_limit);
+    shared_state->exchanger =
+            ShuffleExchanger::create_unique(num_sink, num_sources, num_partitions, free_block_limit,
+                                            TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
     auto sink_dep = std::make_shared<Dependency>(0, 0, "LOCAL_EXCHANGE_SINK_DEPENDENCY", true);
     sink_dep->set_shared_state(shared_state.get());
     shared_state->sink_deps.push_back(sink_dep);
diff --git a/be/test/exec/pipeline/pipeline_test.cpp b/be/test/exec/pipeline/pipeline_test.cpp
index d5d0b5028d6..714d668bffc 100644
--- a/be/test/exec/pipeline/pipeline_test.cpp
+++ b/be/test/exec/pipeline/pipeline_test.cpp
@@ -509,7 +509,7 @@ TEST_F(PipelineTest, PLAN_LOCAL_EXCHANGE) {
     DescriptorTbl* desc;
     OperatorPtr op;
     _build_fragment_context();
-    EXPECT_EQ(_runtime_state.front()->enable_local_shuffle(), true);
+    EXPECT_EQ(_runtime_state.front()->plan_local_shuffle(), true);
     auto cur_pipe = _build_pipeline(parallelism);
     {
         auto tnode = TPlanNodeBuilder(_next_node_id(), TPlanNodeType::EXCHANGE_NODE)
@@ -584,11 +584,12 @@ TEST_F(PipelineTest, PLAN_LOCAL_EXCHANGE) {
     }
     {
         cur_pipe->init_data_distribution(_runtime_state.back().get());
-        EXPECT_EQ(cur_pipe->data_distribution().distribution_type, ExchangeType::HASH_SHUFFLE);
+        EXPECT_EQ(cur_pipe->data_distribution().distribution_type,
+                  TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
         EXPECT_EQ(cur_pipe->sink()
                           ->required_data_distribution(_runtime_state.back().get())
                           .distribution_type,
-                  ExchangeType::NOOP);
+                  TLocalPartitionType::NOOP);
         EXPECT_EQ(cur_pipe->need_to_local_exchange(
                           cur_pipe->sink()->required_data_distribution(_runtime_state.back().get()),
                           1),
@@ -597,11 +598,11 @@ TEST_F(PipelineTest, PLAN_LOCAL_EXCHANGE) {
     {
         cur_pipe->operators().front()->set_serial_operator();
         cur_pipe->init_data_distribution(_runtime_state.back().get());
-        EXPECT_EQ(cur_pipe->data_distribution().distribution_type, ExchangeType::NOOP);
+        EXPECT_EQ(cur_pipe->data_distribution().distribution_type, TLocalPartitionType::NOOP);
         EXPECT_EQ(cur_pipe->sink()
                           ->required_data_distribution(_runtime_state.back().get())
                           .distribution_type,
-                  ExchangeType::PASSTHROUGH);
+                  TLocalPartitionType::PASSTHROUGH);
         EXPECT_EQ(cur_pipe->need_to_local_exchange(
                           cur_pipe->sink()->required_data_distribution(_runtime_state.back().get()),
                           1),
@@ -620,7 +621,7 @@ TEST_F(PipelineTest, PLAN_HASH_JOIN) {
     // Build pipeline
     DescriptorTbl* desc;
     _build_fragment_context();
-    EXPECT_EQ(_runtime_state.front()->enable_local_shuffle(), true);
+    EXPECT_EQ(_runtime_state.front()->plan_local_shuffle(), true);
     {
         TTupleDescriptor tuple0 = TTupleDescriptorBuilder().set_id(0).build();
         TSlotDescriptor slot0 =
@@ -903,12 +904,12 @@ TEST_F(PipelineTest, PLAN_HASH_JOIN) {
         if (pip_idx == 1) {
             // Pipeline(ExchangeOperator(id=1, HASH_PARTITIONED) -> HashJoinBuildOperator(id=0))
             EXPECT_EQ(_pipelines[pip_idx]->data_distribution().distribution_type,
-                      ExchangeType::HASH_SHUFFLE);
+                      TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
             EXPECT_EQ(_pipelines[pip_idx]
                               ->sink()
                               ->required_data_distribution(_runtime_state.back().get())
                               .distribution_type,
-                      ExchangeType::HASH_SHUFFLE);
+                      TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
             EXPECT_EQ(_pipelines[pip_idx]->need_to_local_exchange(
                               _pipelines[pip_idx]->sink()->required_data_distribution(
                                       _runtime_state.back().get()),
@@ -919,7 +920,7 @@ TEST_F(PipelineTest, PLAN_HASH_JOIN) {
             _pipelines[pip_idx]->set_data_distribution(
                     _pipelines[pip_idx]->children().front()->data_distribution());
             EXPECT_EQ(_pipelines[pip_idx]->data_distribution().distribution_type,
-                      ExchangeType::HASH_SHUFFLE);
+                      TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
             EXPECT_EQ(_pipelines[pip_idx]->need_to_local_exchange(
                               _pipelines[pip_idx]->sink()->required_data_distribution(
                                       _runtime_state.back().get()),
@@ -930,7 +931,7 @@ TEST_F(PipelineTest, PLAN_HASH_JOIN) {
                               .back()
                               ->required_data_distribution(_runtime_state.back().get())
                               .distribution_type,
-                      ExchangeType::HASH_SHUFFLE);
+                      TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE);
             EXPECT_EQ(_pipelines[pip_idx]->need_to_local_exchange(
                               _pipelines[pip_idx]->operators().back()->required_data_distribution(
                                       _runtime_state.back().get()),
diff --git a/fe/.idea/vcs.xml b/fe/.idea/vcs.xml
index e5158c553f8..c1644214b8a 100644
--- a/fe/.idea/vcs.xml
+++ b/fe/.idea/vcs.xml
@@ -12,6 +12,11 @@
   </component>
   <component name="VcsDirectoryMappings">
     <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.github/actions/action-pr-title" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.github/actions/ccache-action" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.github/actions/get-workflow-origin" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.github/actions/label-when-approved-action" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/../.github/actions/paths-filter" vcs="Git" />
     <mapping directory="$PROJECT_DIR$/../contrib/apache-orc" vcs="Git" />
     <mapping directory="$PROJECT_DIR$/../contrib/clucene" vcs="Git" />
     <mapping directory="$PROJECT_DIR$/../contrib/faiss" vcs="Git" />
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java b/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
index 3ad317792a5..7a32d339f4c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/profile/SummaryProfile.java
@@ -113,6 +113,10 @@ public class SummaryProfile {
     public static final String READ_BYTES_PER_SECOND = "Read Bytes Per Second";
     public static final String REMOTE_READ_BYTES_PER_SECOND = "Remote Read Bytes Per Second";
 
+    // Written last in queryFinished(), after all BE fragment profiles are merged.
+    // Readers can poll for this field to know the profile is fully collected.
+    public static final String IS_PROFILE_COLLECTION_COMPLETED = "Is Profile Collection Completed";
+
     public static final String PARSE_SQL_TIME = "Parse SQL Time";
     public static final String NEREIDS_LOCK_TABLE_TIME = "Nereids Lock Table Time";
     public static final String NEREIDS_ANALYSIS_TIME = "Nereids Analysis Time";
@@ -514,6 +518,10 @@ public class SummaryProfile {
     // This method is used to display the final data status when the overall query ends.
     // This can avoid recalculating some strings and so on every time during the update process.
     public void queryFinished() {
+        // Mark profile collection as complete. This is written last, after all BE fragment
+        // profiles have been merged (called post-waitForFragmentsDone). Pollers can wait for
+        // this field to avoid reading a partial profile.
+        executionSummaryProfile.addInfoString(IS_PROFILE_COLLECTION_COMPLETED, "true");
         if (assignedWeightPerBackend != null) {
             Map<String, Long> m = assignedWeightPerBackend.entrySet().stream()
                     .sorted(Map.Entry.comparingByValue())
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/tvf/source/TVFScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/tvf/source/TVFScanNode.java
index ce22e96c80b..644bc0504ce 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/tvf/source/TVFScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/tvf/source/TVFScanNode.java
@@ -25,6 +25,7 @@ import org.apache.doris.catalog.FunctionGenTable;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.MetaNotFoundException;
+import org.apache.doris.common.Pair;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.LocationPath;
 import org.apache.doris.common.util.Util;
@@ -33,6 +34,10 @@ import org.apache.doris.datasource.FileSplit;
 import org.apache.doris.datasource.FileSplit.FileSplitCreator;
 import org.apache.doris.datasource.FileSplitter;
 import org.apache.doris.datasource.TableFormatType;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
+import org.apache.doris.planner.PlanNode;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.ScanContext;
 import org.apache.doris.qe.SessionVariable;
@@ -212,4 +217,10 @@ public class TVFScanNode extends FileQueryScanNode {
     public int getNumInstances() {
         return scanRangeLocations.size();
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        return Pair.of(this, LocalExchangeType.PASSTHROUGH);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
index 7952d009e51..b0827116e84 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
@@ -75,6 +75,7 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation;
 import org.apache.doris.nereids.trees.plans.physical.PhysicalSqlCache;
 import org.apache.doris.nereids.trees.plans.physical.TopnFilter;
+import org.apache.doris.planner.AddLocalExchange;
 import org.apache.doris.planner.PlanFragment;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.Planner;
@@ -130,6 +131,7 @@ public class NereidsPlanner extends Planner {
     private DescriptorTable descTable;
 
     private FragmentIdMapping<DistributedPlan> distributedPlans;
+    private PlanTranslatorContext planTranslatorContext;
     // The cost of optimized plan
     private double cost = 0;
     private LogicalPlanAdapter logicalPlanAdapter;
@@ -602,7 +604,8 @@ public class NereidsPlanner extends Planner {
             return;
         }
 
-        PlanTranslatorContext planTranslatorContext = new PlanTranslatorContext(cascadesContext);
+        this.planTranslatorContext = new PlanTranslatorContext(cascadesContext);
+        PlanTranslatorContext planTranslatorContext = this.planTranslatorContext;
         PhysicalPlanTranslator physicalPlanTranslator = new PhysicalPlanTranslator(planTranslatorContext,
                 statementContext.getConnectContext().getStatsErrorEstimator());
         SessionVariable sessionVariable = cascadesContext.getConnectContext().getSessionVariable();
@@ -625,7 +628,8 @@ public class NereidsPlanner extends Planner {
         scanNodeList.addAll(planTranslatorContext.getScanNodes());
         physicalRelations.addAll(planTranslatorContext.getPhysicalRelations());
         descTable = planTranslatorContext.getDescTable();
-        fragments = new ArrayList<>(planTranslatorContext.getPlanFragments());
+        List<PlanFragment> planFragments = planTranslatorContext.getPlanFragments();
+        fragments = new ArrayList<>(planFragments);
 
         boolean enableQueryCache = sessionVariable.getEnableQueryCache();
         for (int seq = 0; seq < fragments.size(); seq++) {
@@ -708,6 +712,18 @@ public class NereidsPlanner extends Planner {
 
         splitFragments(physicalPlan);
         doDistribute(canUseNereidsDistributePlanner, explainLevel);
+
+        SessionVariable sessionVariable = cascadesContext.getConnectContext().getSessionVariable();
+        if (sessionVariable.isEnableLocalShufflePlanner() && sessionVariable.isEnableLocalShuffle()) {
+            addLocalExchangeAfterDistribute();
+        }
+    }
+
+    private void addLocalExchangeAfterDistribute() {
+        AddLocalExchange adder = new AddLocalExchange();
+        if (distributedPlans != null && !distributedPlans.isEmpty()) {
+            adder.addLocalExchange(distributedPlans, planTranslatorContext);
+        }
     }
 
     protected void doDistribute(boolean canUseNereidsDistributePlanner, ExplainLevel explainLevel) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index b2ca6cfa2b6..ea9eaf8368a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -350,7 +350,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
             PlanTranslatorContext context) {
         Plan upstream = distribute.child(); // now they're in one fragment but will be split by ExchangeNode.
         PlanFragment upstreamFragment = upstream.accept(this, context);
-        List<List<Expr>> upstreamDistributeExprs = getDistributeExprs(upstream);
+        List<List<Expr>> upstreamDistributeExprs = getChildrenDistributeExprs(upstream);
 
         DistributionSpec targetDistribution = distribute.getDistributionSpec();
 
@@ -398,6 +398,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         // target data partition
         DataPartition targetDataPartition = toDataPartition(targetDistribution, validOutputIds, context);
         exchangeNode.setPartitionType(targetDataPartition.getType());
+        exchangeNode.setDistributeExprLists(getDistributeExpr(distribute));
         exchangeNode.setChildrenDistributeExprLists(upstreamDistributeExprs);
         // its source partition is targetDataPartition. and outputPartition is UNPARTITIONED now, will be set when
         // visit its SinkNode
@@ -793,6 +794,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
             fileScan.getTableSnapshot().ifPresent(fileQueryScanNode::setQueryTableSnapshot);
             fileScan.getScanParams().ifPresent(fileQueryScanNode::setScanParams);
         }
+        scanNode.setDistributeExprLists(getDistributeExpr(fileScan));
         return getPlanFragmentForPhysicalFileScan(fileScan, context, scanNode);
     }
 
@@ -813,6 +815,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         PlanFragment planFragment = createPlanFragment(emptySetNode,
                 DataPartition.UNPARTITIONED, emptyRelation);
         context.addPlanFragment(planFragment);
+        emptySetNode.setDistributeExprLists(getDistributeExpr(emptyRelation));
         updateLegacyPlanIdToPhysicalPlan(planFragment.getPlanRoot(), emptyRelation);
         return planFragment;
     }
@@ -837,6 +840,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
             hudiScanNode.setQueryTableSnapshot(hudiScan.getTableSnapshot().get());
         }
         hudiScanNode.setSelectedPartitions(hudiScan.getSelectedPartitions());
+        hudiScanNode.setDistributeExprLists(getDistributeExpr(hudiScan));
         return getPlanFragmentForPhysicalFileScan(hudiScan, context, hudiScanNode);
     }
 
@@ -858,6 +862,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         DataPartition dataPartition = DataPartition.RANDOM;
         PlanFragment planFragment = createPlanFragment(scanNode, dataPartition, fileScan);
         context.addPlanFragment(planFragment);
+        scanNode.setDistributeExprLists(getDistributeExpr(fileScan));
         updateLegacyPlanIdToPhysicalPlan(planFragment.getPlanRoot(), fileScan);
         return planFragment;
     }
@@ -896,6 +901,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 context.getScanContext());
         olapScanNode.setNereidsId(olapScan.getId());
         context.getNereidsIdToPlanNodeIdMap().put(olapScan.getId(), olapScanNode.getId());
+        olapScanNode.setDistributeExprLists(getDistributeExpr(olapScan));
 
         // translate score topn info
         if (!olapScan.getScoreOrderKeys().isEmpty()) {
@@ -1021,6 +1027,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         PlanFragment planFragment = createPlanFragment(unionNode, DataPartition.UNPARTITIONED, oneRowRelation);
         context.addPlanFragment(planFragment);
         updateLegacyPlanIdToPhysicalPlan(planFragment.getPlanRoot(), oneRowRelation);
+
+        unionNode.setDistributeExprLists(getDistributeExpr(oneRowRelation));
         return planFragment;
     }
 
@@ -1053,6 +1061,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         context.addScanNode(scanNode, schemaScan);
         PlanFragment planFragment = createPlanFragment(scanNode, DataPartition.RANDOM, schemaScan);
         context.addPlanFragment(planFragment);
+        scanNode.setDistributeExprLists(getDistributeExpr(schemaScan));
         updateLegacyPlanIdToPhysicalPlan(planFragment.getPlanRoot(), schemaScan);
         return planFragment;
     }
@@ -1069,6 +1078,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
 
         PlanFragment planFragment = createPlanFragment(scanNode, DataPartition.RANDOM, workTableReference);
         context.addPlanFragment(planFragment);
+        scanNode.setDistributeExprLists(getDistributeExpr(workTableReference));
         updateLegacyPlanIdToPhysicalPlan(planFragment.getPlanRoot(), workTableReference);
         return planFragment;
     }
@@ -1089,6 +1099,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         TableValuedFunctionIf catalogFunction = tvfRelation.getFunction().getCatalogFunction();
         SessionVariable sv = ConnectContext.get().getSessionVariable();
         ScanNode scanNode = catalogFunction.getScanNode(context.nextPlanNodeId(), tupleDescriptor, sv);
+        scanNode.setDistributeExprLists(getDistributeExpr(tvfRelation));
         scanNode.setNereidsId(tvfRelation.getId());
         context.getNereidsIdToPlanNodeIdMap().put(tvfRelation.getId(), scanNode.getId());
         Utils.execWithUncheckedException(scanNode::init);
@@ -1127,7 +1138,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
             PlanTranslatorContext context) {
 
         PlanFragment inputPlanFragment = aggregate.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(aggregate.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(aggregate.child(0));
 
         List<Expression> groupByExpressions = aggregate.getGroupByExpressions();
         List<NamedExpression> outputExpressions = aggregate.getOutputExpressions();
@@ -1191,6 +1202,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         AggregationNode aggregationNode = new AggregationNode(context.nextPlanNodeId(),
                 inputPlanFragment.getPlanRoot(), aggInfo);
 
+        aggregationNode.setDistributeExprLists(getDistributeExpr(aggregate));
         aggregationNode.setChildrenDistributeExprLists(distributeExprLists);
 
         aggregationNode.setNereidsId(aggregate.getId());
@@ -1394,7 +1406,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     public PlanFragment visitPhysicalAssertNumRows(PhysicalAssertNumRows<? extends Plan> assertNumRows,
             PlanTranslatorContext context) {
         PlanFragment currentFragment = assertNumRows.child().accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(assertNumRows.child());
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(assertNumRows.child());
 
         // we need convert all columns to nullable in AssertNumRows node
         // create a tuple for AssertNumRowsNode
@@ -1404,6 +1416,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         TupleDescriptor tupleDescriptor = generateTupleDesc(assertNumRows.getOutput(), null, context);
         AssertNumRowsNode assertNumRowsNode = new AssertNumRowsNode(context.nextPlanNodeId(),
                 currentFragment.getPlanRoot(), assertion, tupleDescriptor);
+        assertNumRowsNode.setDistributeExprLists(getDistributeExpr(assertNumRows));
         assertNumRowsNode.setChildrenDistributeExprLists(distributeExprLists);
         assertNumRowsNode.setNereidsId(assertNumRows.getId());
         context.getNereidsIdToPlanNodeIdMap().put(assertNumRows.getId(), assertNumRowsNode.getId());
@@ -1453,6 +1466,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
             }
         }
         CTEScanNode cteScanNode = new CTEScanNode(context.getScanContext());
+        cteScanNode.setDistributeExprLists(getDistributeExpr(cteConsumer));
         translateRuntimeFilter(cteConsumer, cteScanNode, context);
         context.getCteScanNodeMap().put(multiCastFragment.getFragmentId(), cteScanNode);
 
@@ -1564,6 +1578,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 .collect(Collectors.toCollection(ArrayList::new));
         TableFunctionNode tableFunctionNode = new TableFunctionNode(context.nextPlanNodeId(),
                 currentFragment.getPlanRoot(), tupleDescriptor.getId(), functionCalls, outputSlotIds, conjuncts);
+        tableFunctionNode.setDistributeExprLists(getDistributeExpr(generate));
         tableFunctionNode.setNereidsId(generate.getId());
         context.getNereidsIdToPlanNodeIdMap().put(generate.getId(), tableFunctionNode.getId());
         addPlanRoot(currentFragment, tableFunctionNode, generate);
@@ -1627,7 +1642,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         // NOTICE: We must visit from right to left, to ensure the last fragment is root fragment
         PlanFragment rightFragment = hashJoin.child(1).accept(this, context);
         PlanFragment leftFragment = hashJoin.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(physicalHashJoin.left(), physicalHashJoin.right());
+        List<List<Expr>> distributeExprLists
+                = getChildrenDistributeExprs(physicalHashJoin.left(), physicalHashJoin.right());
 
         if (JoinUtils.shouldNestedLoopJoin(hashJoin)) {
             throw new RuntimeException("Physical hash join could not execute without equal join condition.");
@@ -1678,6 +1694,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 markConjuncts, hashJoin.isMarkJoin());
         hashJoinNode.setNereidsId(hashJoin.getId());
         context.getNereidsIdToPlanNodeIdMap().put(hashJoin.getId(), hashJoinNode.getId());
+        hashJoinNode.setDistributeExprLists(getDistributeExpr(hashJoin));
         hashJoinNode.setChildrenDistributeExprLists(distributeExprLists);
         PlanFragment currentFragment = connectJoinNode(hashJoinNode, leftFragment, rightFragment, context, hashJoin);
 
@@ -1897,7 +1914,8 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         //       PhysicalPlan plan, PlanVisitor visitor, Context context).
         PlanFragment rightFragment = nestedLoopJoin.child(1).accept(this, context);
         PlanFragment leftFragment = nestedLoopJoin.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(nestedLoopJoin.child(0), nestedLoopJoin.child(1));
+        List<List<Expr>> distributeExprLists
+                = getChildrenDistributeExprs(nestedLoopJoin.child(0), nestedLoopJoin.child(1));
         PlanNode leftFragmentPlanRoot = leftFragment.getPlanRoot();
         PlanNode rightFragmentPlanRoot = rightFragment.getPlanRoot();
 
@@ -1918,6 +1936,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 nestedLoopJoin.isMarkJoin());
         nestedLoopJoinNode.setNereidsId(nestedLoopJoin.getId());
         context.getNereidsIdToPlanNodeIdMap().put(nestedLoopJoin.getId(), nestedLoopJoinNode.getId());
+        nestedLoopJoinNode.setDistributeExprLists(getDistributeExpr(nestedLoopJoin));
         nestedLoopJoinNode.setChildrenDistributeExprLists(distributeExprLists);
         if (nestedLoopJoin.getStats() != null) {
             nestedLoopJoinNode.setCardinality((long) nestedLoopJoin.getStats().getRowCount());
@@ -2116,9 +2135,10 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     public PlanFragment visitPhysicalPartitionTopN(PhysicalPartitionTopN<? extends Plan> partitionTopN,
             PlanTranslatorContext context) {
         PlanFragment inputFragment = partitionTopN.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(partitionTopN.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(partitionTopN.child(0));
         PartitionSortNode partitionSortNode = translatePartitionSortNode(
                 partitionTopN, inputFragment.getPlanRoot(), context);
+        partitionSortNode.setDistributeExprLists(getDistributeExpr(partitionTopN));
         partitionSortNode.setChildrenDistributeExprLists(distributeExprLists);
         addPlanRoot(inputFragment, partitionSortNode, partitionTopN);
         // in pipeline engine, we use parallel scan by default, but it broke the rule of data distribution
@@ -2297,12 +2317,13 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         for (Plan plan : recursiveCte.children()) {
             childrenFragments.add(plan.accept(this, context));
         }
-        List<List<Expr>> distributeExprLists = getDistributeExprs(recursiveCte.children().toArray(new Plan[0]));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(recursiveCte.children().toArray(new Plan[0]));
         TupleDescriptor setTuple = generateTupleDesc(recursiveCte.getOutput(), null, context);
 
         RecursiveCteNode recursiveCteNode = new RecursiveCteNode(context.nextPlanNodeId(), setTuple.getId(),
                 recursiveCte.getCteName(), recursiveCte.isUnionAll());
 
+        recursiveCteNode.setDistributeExprLists(getDistributeExpr(recursiveCte));
         recursiveCteNode.setChildrenDistributeExprLists(distributeExprLists);
         recursiveCteNode.setNereidsId(recursiveCte.getId());
         context.getNereidsIdToPlanNodeIdMap().put(recursiveCte.getId(), recursiveCteNode.getId());
@@ -2370,7 +2391,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         for (Plan plan : setOperation.children()) {
             childrenFragments.add(plan.accept(this, context));
         }
-        List<List<Expr>> distributeExprLists = getDistributeExprs(setOperation.children().toArray(new Plan[0]));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(setOperation.children().toArray(new Plan[0]));
         TupleDescriptor setTuple = generateTupleDesc(setOperation.getOutput(), null, context);
 
         SetOperationNode setOperationNode;
@@ -2384,6 +2405,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         } else {
             throw new RuntimeException("not support set operation type " + setOperation);
         }
+        setOperationNode.setDistributeExprLists(getDistributeExpr(setOperation));
         setOperationNode.setChildrenDistributeExprLists(distributeExprLists);
         setOperationNode.setNereidsId(setOperation.getId());
         context.getNereidsIdToPlanNodeIdMap().put(setOperation.getId(), setOperationNode.getId());
@@ -2493,12 +2515,13 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     public PlanFragment visitPhysicalQuickSort(PhysicalQuickSort<? extends Plan> sort,
             PlanTranslatorContext context) {
         PlanFragment inputFragment = sort.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(sort.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(sort.child(0));
 
         // 2. According to the type of sort, generate physical plan
         if (!sort.getSortPhase().isMerge()) {
             // For localSort or Gather->Sort, we just need to add sortNode
             SortNode sortNode = translateSortNode(sort, inputFragment.getPlanRoot(), context);
+            sortNode.setDistributeExprLists(getDistributeExpr(sort));
             sortNode.setChildrenDistributeExprLists(distributeExprLists);
             addPlanRoot(inputFragment, sortNode, sort);
         } else {
@@ -2515,6 +2538,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 inputFragment.getChild(0).getSink().setMerge(true);
             }
             sortNode.setMergeByExchange();
+            sortNode.setDistributeExprLists(getDistributeExpr(sort));
             sortNode.setChildrenDistributeExprLists(distributeExprLists);
         }
         return inputFragment;
@@ -2523,7 +2547,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     @Override
     public PlanFragment visitPhysicalTopN(PhysicalTopN<? extends Plan> topN, PlanTranslatorContext context) {
         PlanFragment inputFragment = topN.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(topN.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(topN.child(0));
         // 2. According to the type of sort, generate physical plan
         if (!topN.getSortPhase().isMerge()) {
             // For localSort or Gather->Sort, we just need to add TopNNode
@@ -2559,6 +2583,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                     }
                 }
             }
+            sortNode.setDistributeExprLists(
+                    CollectionUtils.isEmpty(distributeExprLists) ? null : distributeExprLists.get(0)
+            );
             sortNode.setChildrenDistributeExprLists(distributeExprLists);
             addPlanRoot(inputFragment, sortNode, topN);
         } else {
@@ -2572,6 +2599,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 return inputFragment;
             }
             ExchangeNode exchangeNode = (ExchangeNode) inputFragment.getPlanRoot();
+            exchangeNode.setDistributeExprLists(
+                    CollectionUtils.isEmpty(distributeExprLists) ? null : distributeExprLists.get(0)
+            );
             exchangeNode.setChildrenDistributeExprLists(distributeExprLists);
             exchangeNode.setMergeInfo(((SortNode) exchangeNode.getChild(0)).getSortInfo());
             if (inputFragment.hasChild(0) && inputFragment.getChild(0).getSink() != null) {
@@ -2588,7 +2618,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     @Override
     public PlanFragment visitPhysicalRepeat(PhysicalRepeat<? extends Plan> repeat, PlanTranslatorContext context) {
         PlanFragment inputPlanFragment = repeat.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(repeat.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(repeat.child(0));
 
         List<Expression> flattenGroupingExpressions = repeat.getGroupByExpressions();
         Set<Slot> preRepeatExpressions = Sets.newLinkedHashSet();
@@ -2639,6 +2669,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
                 allSlotId, repeat.computeGroupingFunctionsValues());
         repeatNode.setNereidsId(repeat.getId());
         context.getNereidsIdToPlanNodeIdMap().put(repeat.getId(), repeatNode.getId());
+        repeatNode.setDistributeExprLists(getDistributeExpr(repeat));
         repeatNode.setChildrenDistributeExprLists(distributeExprLists);
         addPlanRoot(inputPlanFragment, repeatNode, repeat);
         updateLegacyPlanIdToPhysicalPlan(inputPlanFragment.getPlanRoot(), repeat);
@@ -2649,7 +2680,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
     public PlanFragment visitPhysicalWindow(PhysicalWindow<? extends Plan> physicalWindow,
             PlanTranslatorContext context) {
         PlanFragment inputPlanFragment = physicalWindow.child(0).accept(this, context);
-        List<List<Expr>> distributeExprLists = getDistributeExprs(physicalWindow.child(0));
+        List<List<Expr>> distributeExprLists = getChildrenDistributeExprs(physicalWindow.child(0));
 
         // 1. translate to old optimizer variable
         // variable in Nereids
@@ -2714,6 +2745,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         );
         analyticEvalNode.setNereidsId(physicalWindow.getId());
         context.getNereidsIdToPlanNodeIdMap().put(physicalWindow.getId(), analyticEvalNode.getId());
+        analyticEvalNode.setDistributeExprLists(getDistributeExpr(physicalWindow));
         analyticEvalNode.setChildrenDistributeExprLists(distributeExprLists);
         PlanNode root = inputPlanFragment.getPlanRoot();
         if (root instanceof SortNode) {
@@ -2751,6 +2783,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         materializeNode.setLazyColumns(materialize.getLazyColumns());
         materializeNode.setLocations(materialize.getLazySlotLocations());
         materializeNode.setColumnIdxsLists(materialize.getLazyBaseColumnIndices());
+        materializeNode.setDistributeExprLists(getDistributeExpr(materialize));
 
         List<Boolean> rowStoreFlags = new ArrayList<>();
         for (Relation relation : materialize.getRelations()) {
@@ -2790,6 +2823,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         TableValuedFunctionIf catalogFunction = tvfRelation.getFunction().getCatalogFunction();
         SessionVariable sv = ConnectContext.get().getSessionVariable();
         ScanNode scanNode = catalogFunction.getScanNode(context.nextPlanNodeId(), tupleDescriptor, sv);
+        scanNode.setDistributeExprLists(getDistributeExpr(tvfRelation));
         scanNode.setNereidsId(tvfRelation.getId());
         context.getNereidsIdToPlanNodeIdMap().put(tvfRelation.getId(), scanNode.getId());
         Utils.execWithUncheckedException(scanNode::init);
@@ -3280,7 +3314,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         return false;
     }
 
-    private List<List<Expr>> getDistributeExprs(Plan ... children) {
+    private List<List<Expr>> getChildrenDistributeExprs(Plan ... children) {
         List<List<Expr>> distributeExprLists = Lists.newArrayList();
         for (Plan child : children) {
             DistributionSpec spec = ((PhysicalPlan) child).getPhysicalProperties().getDistributionSpec();
@@ -3289,6 +3323,13 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
         return distributeExprLists;
     }
 
+    private List<Expr> getDistributeExpr(PhysicalPlan physicalPlan) {
+        return getDistributeExpr(
+                physicalPlan.getOutputExprIds(),
+                physicalPlan.getPhysicalProperties().getDistributionSpec()
+        );
+    }
+
     private List<Expr> getDistributeExpr(List<ExprId> childOutputIds, DistributionSpec spec) {
         if (spec instanceof DistributionSpecHash) {
             DistributionSpecHash distributionSpecHash = (DistributionSpecHash) spec;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
index 4118399b91d..db9c8964cec 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PlanTranslatorContext.java
@@ -109,10 +109,20 @@ public class PlanTranslatorContext {
 
     private final Map<ScanNode, Set<SlotId>> statsUnknownColumnsMap = Maps.newHashMap();
 
+    private final Map<PlanNodeId, Boolean> serialAncestorInPipelineMap = Maps.newHashMap();
+
+    // Whether the current fragment uses LocalShuffleAssignedJob (pooling scan with
+    // ignoreDataDistribution → _parallel_instances=1 in BE). When true, serial operators
+    // indicate real pipeline bottlenecks needing PASSTHROUGH fan-out (heavy_ops).
     private boolean isTopMaterializeNode = true;
 
     private final Set<SlotId> virtualColumnIds = Sets.newHashSet();
 
+    // Used by AddLocalExchange: tracks whether any serial operator exists
+    // between the current node and the pipeline's sink (downstream serial check).
+    // Pipeline-splitting nodes reset this to false; serial non-splitting nodes set it to true.
+    private boolean serialAncestorInCurrentPipeline;
+
     /** PlanTranslatorContext */
     public PlanTranslatorContext(CascadesContext ctx) {
         this.connectContext = ctx.getConnectContext();
@@ -234,6 +244,14 @@ public class PlanTranslatorContext {
         return nodeIdGenerator.getNextId();
     }
 
+    public void setHasSerialAncestorInPipeline(PlanNode node, boolean hasSerialAncestorInPipeline) {
+        serialAncestorInPipelineMap.put(node.getId(), hasSerialAncestorInPipeline);
+    }
+
+    public boolean hasSerialAncestorInPipeline(PlanNode node) {
+        return serialAncestorInPipelineMap.getOrDefault(node.getId(), false);
+    }
+
     public SlotDescriptor addSlotDesc(TupleDescriptor t) {
         return descTable.addSlotDescriptor(t);
     }
@@ -373,4 +391,12 @@ public class PlanTranslatorContext {
     public Set<SlotId> getVirtualColumnIds() {
         return virtualColumnIds;
     }
+
+    public boolean hasSerialAncestorInCurrentPipeline() {
+        return serialAncestorInCurrentPipeline;
+    }
+
+    public void setSerialAncestorInCurrentPipeline(boolean serialAncestorInCurrentPipeline) {
+        this.serialAncestorInCurrentPipeline = serialAncestorInCurrentPipeline;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathInfo.java
index fffc71ace23..8fa31c492f2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/AccessPathInfo.java
@@ -31,6 +31,18 @@ public class AccessPathInfo {
     // (not the char data) is needed — agreed with BE as the special path component name.
     public static final String ACCESS_STRING_OFFSET = "OFFSET";
 
+    // s: map<int, string>
+    // map
+    //   key: int         true
+    //   value: string    true
+    // s.*
+    //
+    //  s: string
+    //     len: int    always true
+    //     body: null  true
+    //
+    // select map_keys(s), map_valeus(s),  length(s), substring(s,
+
     private DataType prunedType;
     // allAccessPaths is used to record all access path include predicate access path and non-predicate access path,
     // and predicateAccessPaths only contains the predicate access path.
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index 09acde2ad6f..2f5dcbb7cfc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -144,6 +144,7 @@ public enum PlanType {
     PHYSICAL_RECURSIVE_CTE,
     PHYSICAL_RECURSIVE_CTE_RECURSIVE_CHILD,
     PHYSICAL_DISTRIBUTE,
+    PHYSICAL_LOCAL_DISTRIBUTE,
     PHYSICAL_EXCEPT,
     PHYSICAL_FILTER,
     PHYSICAL_GENERATE,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/DistributePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/DistributePlanner.java
index 0069ddd37db..f50a32b2913 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/DistributePlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/DistributePlanner.java
@@ -257,7 +257,8 @@ public class DistributePlanner {
         AssignedJob[] instances = new AssignedJob[bucketNum];
         for (AssignedJob instanceJob : unsorted) {
             BucketScanSource bucketScanSource = (BucketScanSource) instanceJob.getScanSource();
-            for (Integer bucketIndex : bucketScanSource.bucketIndexToScanNodeToTablets.keySet()) {
+            Iterable<Integer> bucketIndices = bucketScanSource.bucketIndexToScanNodeToTablets.keySet();
+            for (Integer bucketIndex : bucketIndices) {
                 if (instances[bucketIndex] != null) {
                     throw new IllegalStateException(
                             "Multi instances scan same buckets: " + instances[bucketIndex] + " and " + instanceJob
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/worker/job/UnassignedScanBucketOlapTableJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/worker/job/UnassignedScanBucketOlapTableJob.java
index 6a2315966bc..b6319da5b9b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/worker/job/UnassignedScanBucketOlapTableJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/distribute/worker/job/UnassignedScanBucketOlapTableJob.java
@@ -270,7 +270,7 @@ public class UnassignedScanBucketOlapTableJob extends AbstractUnassignedScanJob
         Map<Integer, Map<ScanNode, ScanRanges>> serialScanRanges = Maps.newLinkedHashMap();
         Map<Integer, Map<ScanNode, ScanRanges>> nonSerialScanRanges = Maps.newLinkedHashMap();
         for (ScanNode scanNode : scanNodes) {
-            if (scanNode.isSerialOperator()) {
+            if (scanNode.isSerialNode()) {
                 collectScanRanges(totalScanSource, scanNode, serialScanRanges);
             } else {
                 collectScanRanges(totalScanSource, scanNode, nonSerialScanRanges);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AddLocalExchange.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AddLocalExchange.java
new file mode 100644
index 00000000000..8b67d8d7734
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AddLocalExchange.java
@@ -0,0 +1,159 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.planner;
+
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.nereids.trees.plans.distribute.DistributedPlan;
+import org.apache.doris.nereids.trees.plans.distribute.FragmentIdMapping;
+import org.apache.doris.nereids.trees.plans.distribute.PipelineDistributedPlan;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
+import org.apache.doris.planner.LocalExchangeNode.RequireHash;
+
+/** AddLocalExchange */
+public class AddLocalExchange {
+    /** addLocalExchange with distributed plans, skipping single-instance fragments.
+     *  BE's _plan_local_exchange checks _num_instances which is the per-BE instance count.
+     *  With _num_instances<=1 all pipelines on that BE have 1 task so local exchange is a no-op.
+     *  We must use the same per-BE semantics: skip when every BE has at most 1 instance.
+     *  Using global instanceCount would insert LE for fragments where 2 BEs each have 1 instance
+     *  (global=2, per-BE=1), causing pipeline task mismatch and deadlock. */
+    public void addLocalExchange(FragmentIdMapping<DistributedPlan> distributedPlans,
+            PlanTranslatorContext context) {
+        String qid = context.getConnectContext() != null
+                ? org.apache.doris.common.util.DebugUtil.printId(context.getConnectContext().queryId()) : "?";
+        for (DistributedPlan plan : distributedPlans.values()) {
+            PipelineDistributedPlan pipePlan = (PipelineDistributedPlan) plan;
+            long maxPerBeInstances = pipePlan.getInstanceJobs().stream()
+                    .collect(java.util.stream.Collectors.groupingBy(
+                            j -> j.getAssignedWorker().id(), java.util.stream.Collectors.counting()))
+                    .values().stream().mapToLong(Long::longValue).max().orElse(0);
+            PlanFragment fragment = pipePlan.getFragmentJob().getFragment();
+            boolean isPooling = pipePlan.getInstanceJobs().stream().anyMatch(
+                    org.apache.doris.nereids.trees.plans.distribute.worker.job
+                            .LocalShuffleAssignedJob.class::isInstance);
+            if (maxPerBeInstances <= 1) {
+                continue;
+            }
+            String rootBefore = fragment.getPlanRoot().getClass().getSimpleName()
+                    + "#" + fragment.getPlanRoot().getId();
+            addLocalExchangeForFragment(fragment, context);
+            String rootAfter = fragment.getPlanRoot().getClass().getSimpleName()
+                    + "#" + fragment.getPlanRoot().getId();
+            org.apache.logging.log4j.LogManager.getLogger(AddLocalExchange.class).info(
+                    "addLocalExchange: qid={} fragment={} maxPerBe={} pooling={} root={}→{} changed={}",
+                    qid, fragment.getFragmentId(), maxPerBeInstances, isPooling,
+                    rootBefore, rootAfter, !rootBefore.equals(rootAfter));
+        }
+    }
+
+    private void addLocalExchangeForFragment(PlanFragment fragment, PlanTranslatorContext context) {
+        DataSink sink = fragment.getSink();
+        LocalExchangeTypeRequire require = sink == null
+                ? LocalExchangeTypeRequire.noRequire() : sink.getLocalExchangeTypeRequire();
+        PlanNode root = fragment.getPlanRoot();
+        context.setHasSerialAncestorInPipeline(root, false);
+        Pair<PlanNode, LocalExchangeType> output = root
+                .enforceAndDeriveLocalExchange(context, null, require);
+        PlanNode newRoot = output.first;
+        // The fragment data sink (DataStreamSink, OlapTableSink) runs in the same pipeline
+        // as the root. If the root will be serial on BE, the sink pipeline has 1 task —
+        // only instance 0 sends data, others hang or miss writes.
+        // Insert PASSTHROUGH fan-out so sink runs with _num_instances tasks.
+        // This matches BE-native's default required_data_distribution():
+        //   _child->is_serial_operator() ? PASSTHROUGH : NOOP
+        if (newRoot.isSerialOperatorOnBe(context.getConnectContext())) {
+            newRoot = new LocalExchangeNode(context.nextPlanNodeId(), newRoot,
+                    LocalExchangeType.PASSTHROUGH, null);
+        }
+        if (newRoot != root) {
+            fragment.setPlanRoot(newRoot);
+        }
+        validateNoSerialWithoutLocalExchange(fragment.getPlanRoot(), context.getConnectContext());
+    }
+
+    /**
+     * In a local-shuffle fragment, the root check above guarantees the root pipeline
+     * has N tasks. Any serial operator reduces its pipeline to 1 task. If this serial
+     * operator feeds into a non-serial parent without LocalExchangeNode in between,
+     * some pipelines have 1 task while others have N → shared_state mismatch, data loss.
+     *
+     * Serial→serial chains are fine (all at 1 task, consistent). Only the transition
+     * from serial to non-serial needs LE to restore parallelism.
+     */
+    private void validateNoSerialWithoutLocalExchange(PlanNode node,
+            org.apache.doris.qe.ConnectContext context) {
+        for (PlanNode child : node.getChildren()) {
+            validateNoSerialWithoutLocalExchange(child, context);
+            if (child.isSerialOperatorOnBe(context)
+                    && !(child instanceof LocalExchangeNode)
+                    && !(node instanceof LocalExchangeNode)
+                    && !(node instanceof ExchangeNode)
+                    && !node.isSerialOperatorOnBe(context)) {
+                org.apache.logging.log4j.LogManager.getLogger(AddLocalExchange.class).warn(
+                        "Serial " + child.getClass().getSimpleName() + "(id=" + child.getId()
+                        + ") feeds into non-serial " + node.getClass().getSimpleName()
+                        + "(id=" + node.getId() + ") without LocalExchangeNode"
+                        + " in fragment " + node.getFragment().getFragmentId()
+                        + ". FE should insert LocalExchangeNode to restore parallelism.");
+            }
+        }
+    }
+
+    public static boolean isColocated(PlanNode plan) {
+        if (plan instanceof AggregationNode) {
+            return ((AggregationNode) plan).isColocate() && isColocated(plan.getChild(0));
+        } else if (plan instanceof OlapScanNode) {
+            return true;
+        } else if (plan instanceof SelectNode) {
+            return isColocated(plan.getChild(0));
+        } else if (plan instanceof HashJoinNode) {
+            return ((HashJoinNode) plan).isColocate()
+                    && (isColocated(plan.getChild(0)) || isColocated(plan.getChild(1)));
+        } else if (plan instanceof SetOperationNode) {
+            if (!((SetOperationNode) plan).isColocate()) {
+                return false;
+            }
+            for (PlanNode child : plan.getChildren()) {
+                if (isColocated(child)) {
+                    return true;
+                }
+            }
+            return false;
+        } else {
+            return false;
+        }
+    }
+
+    public static LocalExchangeType resolveExchangeType(LocalExchangeTypeRequire require,
+            PlanTranslatorContext translatorContext, PlanNode parent, PlanNode child) {
+        // Only generic RequireHash adapts to LOCAL_EXECUTION_HASH_SHUFFLE.
+        // Explicit RequireSpecific (GLOBAL_EXECUTION_HASH_SHUFFLE, BUCKET_HASH_SHUFFLE, etc.)
+        // must never be degraded — if they appear in an invalid context, the plan is wrong.
+        //
+        // Always prefer LOCAL_EXECUTION_HASH_SHUFFLE for FE-planned intra-fragment hash exchanges.
+        // GLOBAL_EXECUTION_HASH_SHUFFLE requires shuffle_idx_to_instance_idx which may be empty
+        // for fragments with non-hash sinks (UNPARTITIONED/MERGE). LOCAL_HASH is always safe
+        // since it partitions by local instance count without needing external shuffle maps.
+        if (require instanceof RequireHash) {
+            return LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE;
+        }
+        return require.preferType();
+    }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
index 0f9d34ae826..562199a2e89 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
@@ -27,7 +27,13 @@ import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.SlotDescriptor;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.analysis.SortInfo;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.planner.normalize.Normalizer;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.SessionVariable;
 import org.apache.doris.thrift.TAggregationNode;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TExpr;
@@ -239,7 +245,7 @@ public class AggregationNode extends PlanNode {
 
     // If `GroupingExprs` is empty and agg need to finalize, the result must be output by single instance
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return aggInfo.getGroupingExprs().isEmpty() && needsFinalize;
     }
 
@@ -247,6 +253,10 @@ public class AggregationNode extends PlanNode {
         isColocate = colocate;
     }
 
+    public boolean isColocate() {
+        return isColocate;
+    }
+
     public void setSortByGroupKey(SortInfo sortByGroupKey) {
         this.sortByGroupKey = sortByGroupKey;
     }
@@ -258,4 +268,97 @@ public class AggregationNode extends PlanNode {
     public void setQueryCacheCandidate(boolean queryCacheCandidate) {
         this.queryCacheCandidate = queryCacheCandidate;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+
+        ConnectContext connectContext = translatorContext.getConnectContext();
+        SessionVariable sessionVariable = connectContext.getSessionVariable();
+
+        LocalExchangeTypeRequire requireChild;
+        if (canUseDistinctStreamingAgg(sessionVariable)) {
+            // DistinctStreamingAggOperatorX in BE
+            if (needsFinalize || (!aggInfo.getGroupingExprs().isEmpty() && !useStreamingPreagg)) {
+                if (AddLocalExchange.isColocated(this)) {
+                    requireChild = LocalExchangeTypeRequire.requireHash();
+                } else {
+                    requireChild = parentRequire.autoRequireHash();
+                }
+            } else if (sessionVariable.enableDistinctStreamingAggForcePassthrough) {
+                requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            } else if (children.get(0).isSerialOperatorOnBe(connectContext)) {
+                // BE base class: _child->is_serial_operator() ? PASSTHROUGH : NOOP
+                requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            } else {
+                requireChild = LocalExchangeTypeRequire.noRequire();
+            }
+        } else if (useStreamingPreagg) {
+            // StreamingAggOperatorX in BE: base class required_data_distribution():
+            //   _child->is_serial_operator() ? PASSTHROUGH : NOOP
+            // Special: directly above HashJoin probe with force-passthrough → PASSTHROUGH.
+            if (children.get(0) instanceof HashJoinNode
+                    && sessionVariable.enableStreamingAggHashJoinForcePassthrough) {
+                requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            } else if (children.get(0).isSerialOperatorOnBe(connectContext)) {
+                // BE: _child->is_serial_operator() ? PASSTHROUGH : NOOP
+                requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            } else {
+                requireChild = LocalExchangeTypeRequire.noRequire();
+            }
+        } else {
+            // AggSinkOperatorX in BE: required_data_distribution() override
+            if (aggInfo.getGroupingExprs().isEmpty()) {
+                if (needsFinalize) {
+                    // Finalize agg, no group key: NOOP (single serial instance collects all)
+                    requireChild = LocalExchangeTypeRequire.noRequire();
+                } else {
+                    // Serialize agg, no group key: BE → _child->is_serial_operator() ? PT : NOOP
+                    if (children.get(0).isSerialOperatorOnBe(connectContext)) {
+                        requireChild = LocalExchangeTypeRequire.requirePassthrough();
+                    } else {
+                        requireChild = LocalExchangeTypeRequire.noRequire();
+                    }
+                }
+            } else if (AddLocalExchange.isColocated(this)) {
+                // Colocate: BUCKET_HASH_SHUFFLE
+                requireChild = LocalExchangeTypeRequire.requireHash();
+            } else {
+                // Non-colocate, has group key: BE → GLOBAL_HASH
+                // FE uses parentRequire as proxy (no full need_to_local_exchange equivalent)
+                if (!needsFinalize
+                        && sessionVariable.getShuffledAggNodeIds().contains(this.getId().asInt())) {
+                    requireChild = LocalExchangeTypeRequire.requireHash();
+                } else if (hasPartitionExprs(parentRequire)) {
+                    requireChild = parentRequire.autoRequireHash();
+                } else {
+                    requireChild = LocalExchangeTypeRequire.noRequire();
+                }
+            }
+        }
+
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, requireChild);
+        children = Lists.newArrayList(enforceResult.first);
+        return Pair.of(this, enforceResult.second);
+    }
+
+    @Override
+    protected List<Expr> getSemanticPartitionExprs() {
+        return aggInfo.getGroupingExprs();
+    }
+
+    private boolean canUseDistinctStreamingAgg(SessionVariable sessionVariable) {
+        return aggInfo.getAggregateExprs().isEmpty() && sortByGroupKey == null
+                && sessionVariable.enableDistinctStreamingAggregation;
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        // Non-streaming AGG is a pipeline breaker: child is in AGG_Sink pipeline,
+        // parent is in AGG_Source pipeline. Reset inherited serial flag from parent
+        // (different pipeline), but enforceRequire still adds this node's own
+        // isSerialNode() so the child sees AGG_Sink's serial status correctly.
+        return !useStreamingPreagg;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java
index 2ede7ac4e52..75d20d1fa4e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AnalyticEvalNode.java
@@ -27,6 +27,10 @@ import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.OrderByElement;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TAnalyticNode;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
@@ -176,7 +180,73 @@ public class AnalyticEvalNode extends PlanNode {
      * all data should be input in this node to ensure the global ordering by colB.
      */
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return partitionExprs.isEmpty();
     }
+
+    @Override
+    protected List<Expr> getSemanticPartitionExprs() {
+        return partitionExprs;
+    }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        LocalExchangeTypeRequire requireChild;
+        LocalExchangeType outputType = null;
+        if (partitionExprs.isEmpty()) {
+            // Serial AnalyticEval (OVER() with no PARTITION BY):
+            // Must NOT have any LocalExchange between AnalyticEval and its child.
+            // On BE, AnalyticSink and AnalyticSource share state (source_deps/sink_deps).
+            // A LocalExchange below would restore the AnalyticSink pipeline to _num_instances
+            // tasks while the serial AnalyticSource pipeline stays at 1 task.
+            //
+            // Use enforceRequire with noRequire to traverse children, then strip any
+            // LocalExchange the child inserted (e.g., Exchange wrapping itself with PASSTHROUGH).
+            Pair<PlanNode, LocalExchangeType> enforceResult
+                    = enforceRequire(translatorContext, children.get(0), 0, LocalExchangeTypeRequire.noRequire());
+            PlanNode newChild = enforceResult.first;
+            if (newChild instanceof LocalExchangeNode) {
+                newChild = newChild.getChild(0);
+            }
+            children = Lists.newArrayList(newChild);
+            // Return NOOP: the serial AnalyticSource pipeline has 1 task, we don't provide
+            // fan-out ourselves. The parent's enforceRequire framework-level serial check
+            // will see our serial status and insert PASSTHROUGH LE above us if needed.
+            return Pair.of(this, LocalExchangeType.NOOP);
+        } else if (orderByElements.isEmpty()) {
+            if (AddLocalExchange.isColocated(this)) {
+                requireChild = LocalExchangeTypeRequire.requireHash();
+                outputType = AddLocalExchange.resolveExchangeType(
+                        LocalExchangeTypeRequire.requireHash(), translatorContext, this,
+                        children.get(0));
+            } else {
+                // Non-colocated analytic with PARTITION BY but no ORDER BY:
+                // The parent SortNode (mergeByExchange) will insert PASSTHROUGH above us,
+                // which is what BE does natively. Don't force a hash exchange here.
+                requireChild = LocalExchangeTypeRequire.noRequire();
+                outputType = LocalExchangeType.NOOP;
+            }
+        } else if (children.get(0).isSerialOperatorOnBe(translatorContext.getConnectContext())) {
+            // BE base class: _child->is_serial_operator() ? PASSTHROUGH : NOOP
+            requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            outputType = LocalExchangeType.PASSTHROUGH;
+        } else {
+            requireChild = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.NOOP;
+        }
+
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, requireChild);
+        children = Lists.newArrayList(enforceResult.first);
+        if (outputType == null) {
+            outputType = enforceResult.second;
+        }
+        return Pair.of(this, outputType);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
index dcf683f0783..5784d2050a4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AssertNumRowsNode.java
@@ -19,11 +19,17 @@ package org.apache.doris.planner;
 
 import org.apache.doris.analysis.AssertNumRowsElement;
 import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TAssertNumRowsNode;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
 
+import com.google.common.collect.Lists;
+
 /**
  * Assert num rows node is used to determine whether the number of rows is less than desired num of rows.
  * The rows are the result of subqueryString.
@@ -78,7 +84,17 @@ public class AssertNumRowsNode extends PlanNode {
     }
 
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return true;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+
+        Pair<PlanNode, LocalExchangeType> enforceResult = enforceRequire(
+                translatorContext, children.get(0), 0, LocalExchangeTypeRequire.requirePassthrough());
+        children = Lists.newArrayList(enforceResult.first);
+        return Pair.of(this, LocalExchangeType.PASSTHROUGH);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/CTEScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/CTEScanNode.java
index 13ac382bf16..92bf1974b39 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/CTEScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/CTEScanNode.java
@@ -19,7 +19,11 @@ package org.apache.doris.planner;
 
 import org.apache.doris.analysis.TupleDescriptor;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
 import org.apache.doris.common.UserException;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TScanRangeLocations;
 
@@ -55,4 +59,10 @@ public class CTEScanNode extends ScanNode {
         // NO real action to be taken, just a wrapper
         return null;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/DataSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/DataSink.java
index 07da3d4f9ba..f8c27eae5c4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/DataSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/DataSink.java
@@ -20,6 +20,7 @@
 
 package org.apache.doris.planner;
 
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TDataSink;
 import org.apache.doris.thrift.TExplainLevel;
 
@@ -65,4 +66,8 @@ public abstract class DataSink {
     public void setMerge(boolean merge) {
         isMerge = merge;
     }
+
+    public LocalExchangeTypeRequire getLocalExchangeTypeRequire() {
+        return LocalExchangeTypeRequire.noRequire();
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/DataStreamSink.java b/fe/fe-core/src/main/java/org/apache/doris/planner/DataStreamSink.java
index 00d84cf0fbb..e6998ee72ae 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/DataStreamSink.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/DataStreamSink.java
@@ -239,4 +239,5 @@ public class DataStreamSink extends DataSink {
         result.setStreamSink(tStreamSink);
         return result;
     }
+
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java
index d89bfc0b4ee..3a731d28a90 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/EmptySetNode.java
@@ -18,6 +18,10 @@
 package org.apache.doris.planner;
 
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
 
@@ -48,4 +52,10 @@ public class EmptySetNode extends PlanNode {
     public int getNumInstances() {
         return 1;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java
index 7274f731c5a..76315210e5d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ExchangeNode.java
@@ -23,6 +23,10 @@ package org.apache.doris.planner;
 import org.apache.doris.analysis.SortInfo;
 import org.apache.doris.analysis.TupleDescriptor;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.thrift.TExchangeNode;
 import org.apache.doris.thrift.TExplainLevel;
@@ -98,10 +102,7 @@ public class ExchangeNode extends PlanNode {
 
     @Override
     protected void toThrift(TPlanNode msg) {
-        // If this fragment has another scan node, this exchange node is serial or not should be decided by the scan
-        // node.
-        msg.setIsSerialOperator((isSerialOperator() || fragment.hasSerialScanNode())
-                && fragment.useSerialSource(ConnectContext.get()));
+        msg.setIsSerialOperator(isSerialOperatorOnBe(ConnectContext.get()));
         msg.node_type = TPlanNodeType.EXCHANGE_NODE;
         msg.exchange_node = new TExchangeNode();
         for (TupleId tid : tupleIds) {
@@ -152,18 +153,38 @@ public class ExchangeNode extends PlanNode {
      * So FRAGMENT 0 should not use serial source.
      */
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return (ConnectContext.get() != null && ConnectContext.get().getSessionVariable().isUseSerialExchange()
                 || partitionType == TPartitionType.UNPARTITIONED) && mergeInfo == null;
     }
 
+    @Override
+    public boolean isSerialOperatorOnBe(ConnectContext context) {
+        return fragment != null
+                && (isSerialNode() || fragment.hasSerialScanNode())
+                && fragment.useSerialSource(context);
+    }
+
     @Override
     public boolean hasSerialChildren() {
-        return isSerialOperator();
+        return isSerialNode();
     }
 
     @Override
     public boolean hasSerialScanChildren() {
         return false;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        // Report actual distribution. Serial handling is done by the framework
+        // (enforceRequire step 2.5 overrides serial child output to NOOP).
+        if (partitionType == TPartitionType.HASH_PARTITIONED) {
+            return Pair.of(this, LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE);
+        } else if (partitionType == TPartitionType.BUCKET_SHFFULE_HASH_PARTITIONED) {
+            return Pair.of(this, LocalExchangeType.BUCKET_HASH_SHUFFLE);
+        }
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
index a98422bb2e0..87c3094a361 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java
@@ -28,7 +28,11 @@ import org.apache.doris.analysis.JoinOperator;
 import org.apache.doris.analysis.SlotId;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
 import org.apache.doris.nereids.trees.expressions.ExprId;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TEqJoinCondition;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.THashJoinNode;
@@ -124,6 +128,10 @@ public class HashJoinNode extends JoinNodeBase {
         colocateReason = reason;
     }
 
+    public boolean isColocate() {
+        return isColocate;
+    }
+
     public Map<ExprId, SlotId> getHashOutputExprSlotIdMap() {
         return hashOutputExprSlotIdMap;
     }
@@ -285,4 +293,71 @@ public class HashJoinNode extends JoinNodeBase {
     public List<Expr> getMarkJoinConjuncts() {
         return markJoinConjuncts;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+
+        LocalExchangeTypeRequire probeSideRequire;
+        LocalExchangeTypeRequire buildSideRequire;
+        LocalExchangeType outputType = null;
+
+        if (joinOp == JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN) {
+            buildSideRequire = probeSideRequire = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.NOOP;
+        } else if (distrMode == DistributionMode.BROADCAST) {
+            // BE: _child->is_serial_operator() ? PASSTHROUGH/PASS_TO_ONE : NOOP
+            boolean probeChildSerial = children.get(0).isSerialOperatorOnBe(
+                    translatorContext.getConnectContext());
+            boolean buildChildSerial = children.get(1).isSerialOperatorOnBe(
+                    translatorContext.getConnectContext());
+            probeSideRequire = probeChildSerial
+                    ? LocalExchangeTypeRequire.requirePassthrough()
+                    : LocalExchangeTypeRequire.noRequire();
+            buildSideRequire = buildChildSerial
+                    ? LocalExchangeTypeRequire.requirePassToOne()
+                    : LocalExchangeTypeRequire.noRequire();
+            // For serial probe: output is PASSTHROUGH (data from single instance).
+            // For non-serial probe: propagate probe side's actual distribution.
+            outputType = probeChildSerial ? LocalExchangeType.PASSTHROUGH : null;
+        } else if (isColocate() || isBucketShuffle()) {
+            probeSideRequire = LocalExchangeTypeRequire.requireBucketHash();
+            // For BUCKET_SHUFFLE with serial build child: use requireBucketHash() (not
+            // requirePassToOne()). Unlike BROADCAST joins, BUCKET_SHUFFLE has no shared
+            // hash table mechanism — PASS_TO_ONE routes all data to task 0 while tasks 1..N-1
+            // build empty hash tables, losing rows. BUCKET_HASH_SHUFFLE correctly distributes
+            // build data by bucket to match the probe side's bucket distribution.
+            // The serial exchange returns NOOP, so enforceRequire() will insert a
+            // BUCKET_HASH_SHUFFLE local exchange (with PASSTHROUGH fan-out for heavy-ops
+            // bottleneck avoidance).
+            buildSideRequire = LocalExchangeTypeRequire.requireBucketHash();
+            outputType = AddLocalExchange.resolveExchangeType(
+                    LocalExchangeTypeRequire.requireBucketHash(), translatorContext, this,
+                    children.get(0));
+        } else {
+            // Use requireHash() (not requireGlobalExecutionHash()) so that resolveExchangeType()
+            // can downgrade to LOCAL_EXECUTION_HASH_SHUFFLE via shouldUseLocalExecutionHash().
+            // This matches BE-native behavior where use_serial_exchange=true sets _use_serial_source=true,
+            // causing _add_local_exchange_impl to use LOCAL (not GLOBAL) hash shuffle.
+            // With use_serial_exchange=false, the upstream ExchangeNode already outputs
+            // GLOBAL_EXECUTION_HASH_SHUFFLE which satisfies requireHash() — no new exchange inserted.
+            buildSideRequire = probeSideRequire = LocalExchangeTypeRequire.requireHash();
+            outputType = null; // derived from probeResult.second below
+        }
+
+        Pair<PlanNode, LocalExchangeType> probeResult = enforceRequire(
+                translatorContext, children.get(0), 0, probeSideRequire);
+        Pair<PlanNode, LocalExchangeType> buildResult = enforceRequire(
+                translatorContext, children.get(1), 1, buildSideRequire);
+        this.children = Lists.newArrayList(probeResult.first, buildResult.first);
+        if (outputType == null) {
+            outputType = probeResult.second;
+        }
+        return Pair.of(this, outputType);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return childIndex == 1;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/LocalExchangeNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/LocalExchangeNode.java
new file mode 100644
index 00000000000..3674f0f6db8
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/LocalExchangeNode.java
@@ -0,0 +1,316 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+// This file is copied from
+// https://github.com/apache/impala/blob/branch-2.9.0/fe/src/main/java/org/apache/impala/ExchangeNode.java
+// and modified by Doris
+
+package org.apache.doris.planner;
+
+import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.ExprToThriftVisitor;
+import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.thrift.TExplainLevel;
+import org.apache.doris.thrift.TExpr;
+import org.apache.doris.thrift.TLocalExchangeNode;
+import org.apache.doris.thrift.TLocalPartitionType;
+import org.apache.doris.thrift.TPlanNode;
+import org.apache.doris.thrift.TPlanNodeType;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** LocalExchangeNode */
+public class LocalExchangeNode extends PlanNode {
+    public static final String EXCHANGE_NODE = "LOCAL-EXCHANGE";
+
+    private LocalExchangeType exchangeType;
+
+    /**
+     * use for Nereids only.
+     */
+    public LocalExchangeNode(PlanNodeId id, PlanNode inputNode, LocalExchangeType exchangeType) {
+        this(id, inputNode, exchangeType, null);
+    }
+
+    public LocalExchangeNode(PlanNodeId id, PlanNode inputNode, LocalExchangeType exchangeType,
+            List<Expr> distributeExprs) {
+        super(id, inputNode, EXCHANGE_NODE);
+        this.offset = 0;
+        this.limit = -1;
+        this.conjuncts = Collections.emptyList();
+        this.children.add(inputNode);
+        this.exchangeType = exchangeType;
+        this.fragment = inputNode.getFragment();
+
+        List<Expr> hashExprs = distributeExprs;
+        boolean isHashShuffle = (exchangeType == LocalExchangeType.BUCKET_HASH_SHUFFLE
+                || exchangeType == LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE
+                || exchangeType == LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE);
+        if (isHashShuffle && hashExprs != null && !hashExprs.isEmpty()) {
+            setDistributeExprLists(hashExprs);
+        }
+        TupleDescriptor outputTupleDesc = inputNode.getOutputTupleDesc();
+        updateTupleIds(outputTupleDesc);
+    }
+
+    public void updateTupleIds(TupleDescriptor outputTupleDesc) {
+        if (outputTupleDesc != null) {
+            clearTupleIds();
+            tupleIds.add(outputTupleDesc.getId());
+        } else {
+            clearTupleIds();
+            tupleIds.addAll(getChild(0).getOutputTupleIds());
+        }
+    }
+
+    @Override
+    protected void toThrift(TPlanNode msg) {
+        // FE-planned LocalExchangeNode itself must stay non-serial. In the BE-planned path,
+        // the serial semantics belong to the upstream scan/exchange pipeline rather than the
+        // downstream LocalExchangeSource pipeline. Marking LocalExchangeNode as serial would
+        // incorrectly reduce the downstream pipeline's task count to 1.
+        msg.setIsSerialOperator(false);
+
+        msg.node_type = TPlanNodeType.LOCAL_EXCHANGE_NODE;
+        msg.local_exchange_node = new TLocalExchangeNode(exchangeType.toThrift());
+
+        if (exchangeType.isHashShuffle()) {
+            List<TExpr> thriftDistributeExprLists = new ArrayList<>();
+            for (Expr expr : distributeExprLists()) {
+                thriftDistributeExprLists.add(ExprToThriftVisitor.treeToThrift(expr));
+            }
+            msg.local_exchange_node.setDistributeExprLists(thriftDistributeExprLists);
+        }
+    }
+
+    private List<Expr> distributeExprLists() {
+        if (distributeExprLists == null) {
+            return Collections.emptyList();
+        }
+        return distributeExprLists;
+    }
+
+    @Override
+    public String getNodeExplainString(String prefix, TExplainLevel detailLevel) {
+        return prefix + "type: " + exchangeType.name() + "\n";
+    }
+
+    public LocalExchangeType getExchangeType() {
+        return exchangeType;
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
+
+    /** LocalExchangeTypeRequire */
+    public interface LocalExchangeTypeRequire {
+        boolean satisfy(LocalExchangeType provide);
+
+        LocalExchangeType preferType();
+
+        default LocalExchangeTypeRequire autoRequireHash() {
+            return RequireHash.INSTANCE;
+        }
+
+        static NoRequire noRequire() {
+            return NoRequire.INSTANCE;
+        }
+
+        static RequireHash requireHash() {
+            return RequireHash.INSTANCE;
+        }
+
+        static RequireSpecific requirePassthrough() {
+            return requireSpecific(LocalExchangeType.PASSTHROUGH);
+        }
+
+        static RequireSpecific requirePassToOne() {
+            return requireSpecific(LocalExchangeType.PASS_TO_ONE);
+        }
+
+        static RequireSpecific requireBroadcast() {
+            return requireSpecific(LocalExchangeType.BROADCAST);
+        }
+
+        static RequireSpecific requireAdaptivePassthrough() {
+            return requireSpecific(LocalExchangeType.ADAPTIVE_PASSTHROUGH);
+        }
+
+        static RequireSpecific requireBucketHash() {
+            return requireSpecific(LocalExchangeType.BUCKET_HASH_SHUFFLE);
+        }
+
+        static RequireSpecific requireGlobalExecutionHash() {
+            return requireSpecific(LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE);
+        }
+
+        static RequireSpecific requireSpecific(LocalExchangeType require) {
+            return new RequireSpecific(require);
+        }
+
+        default LocalExchangeType noopTo(LocalExchangeType defaultType) {
+            LocalExchangeType preferType = preferType();
+            return (preferType == LocalExchangeType.NOOP) ? defaultType : preferType;
+        }
+    }
+
+    /** NoRequire */
+    public static class NoRequire implements LocalExchangeTypeRequire {
+        public static final NoRequire INSTANCE = new NoRequire();
+
+        @Override
+        public boolean satisfy(LocalExchangeType provide) {
+            return true;
+        }
+
+        @Override
+        public LocalExchangeType preferType() {
+            return LocalExchangeType.NOOP;
+        }
+    }
+
+    /** RequireHash */
+    public static class RequireHash implements LocalExchangeTypeRequire {
+        public static final RequireHash INSTANCE = new RequireHash();
+
+        @Override
+        public boolean satisfy(LocalExchangeType provide) {
+            switch (provide) {
+                case GLOBAL_EXECUTION_HASH_SHUFFLE:
+                case LOCAL_EXECUTION_HASH_SHUFFLE:
+                case BUCKET_HASH_SHUFFLE:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        @Override
+        public LocalExchangeType preferType() {
+            return LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE;
+        }
+
+        @Override
+        public LocalExchangeTypeRequire autoRequireHash() {
+            return this;
+        }
+    }
+
+    public static class RequireSpecific implements LocalExchangeTypeRequire {
+        LocalExchangeType requireType;
+
+        public RequireSpecific(LocalExchangeType requireType) {
+            this.requireType = requireType;
+        }
+
+        @Override
+        public boolean satisfy(LocalExchangeType provide) {
+            if (requireType == provide) {
+                return true;
+            }
+            // ADAPTIVE_PASSTHROUGH is a superset of PASSTHROUGH — both fan out data
+            // from fewer to more tasks. BE's need_to_local_exchange treats them as
+            // compatible, so ADAPTIVE_PASSTHROUGH satisfies a PASSTHROUGH requirement.
+            if (requireType == LocalExchangeType.PASSTHROUGH
+                    && provide == LocalExchangeType.ADAPTIVE_PASSTHROUGH) {
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public LocalExchangeType preferType() {
+            return requireType;
+        }
+
+        @Override
+        public LocalExchangeTypeRequire autoRequireHash() {
+            if (requireType == LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE
+                    || requireType == LocalExchangeType.BUCKET_HASH_SHUFFLE) {
+                return this;
+            }
+            return RequireHash.INSTANCE;
+        }
+    }
+
+    public enum LocalExchangeType {
+        NOOP,
+        GLOBAL_EXECUTION_HASH_SHUFFLE,
+        LOCAL_EXECUTION_HASH_SHUFFLE,
+        BUCKET_HASH_SHUFFLE,
+        PASSTHROUGH,
+        ADAPTIVE_PASSTHROUGH,
+        BROADCAST,
+        PASS_TO_ONE,
+        LOCAL_MERGE_SORT;
+
+        public boolean isHashShuffle() {
+            switch (this) {
+                case GLOBAL_EXECUTION_HASH_SHUFFLE:
+                case LOCAL_EXECUTION_HASH_SHUFFLE:
+                case BUCKET_HASH_SHUFFLE:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        // Mirrors BE Pipeline::heavy_operations_on_the_sink():
+        // HASH_SHUFFLE, BUCKET_HASH_SHUFFLE, and ADAPTIVE_PASSTHROUGH perform
+        // heavy computation on the sink side. When the upstream pipeline has only
+        // 1 task (serial/pooling scan), a PASSTHROUGH fan-out must be inserted
+        // before these exchanges to avoid a single-task bottleneck.
+        public boolean isHeavyOperation() {
+            switch (this) {
+                case GLOBAL_EXECUTION_HASH_SHUFFLE:
+                case LOCAL_EXECUTION_HASH_SHUFFLE:
+                case BUCKET_HASH_SHUFFLE:
+                case ADAPTIVE_PASSTHROUGH:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        public TLocalPartitionType toThrift() {
+            switch (this) {
+                case GLOBAL_EXECUTION_HASH_SHUFFLE:
+                    return TLocalPartitionType.GLOBAL_EXECUTION_HASH_SHUFFLE;
+                case LOCAL_EXECUTION_HASH_SHUFFLE:
+                    return TLocalPartitionType.LOCAL_EXECUTION_HASH_SHUFFLE;
+                case BUCKET_HASH_SHUFFLE:
+                    return TLocalPartitionType.BUCKET_HASH_SHUFFLE;
+                case PASSTHROUGH:
+                    return TLocalPartitionType.PASSTHROUGH;
+                case ADAPTIVE_PASSTHROUGH:
+                    return TLocalPartitionType.ADAPTIVE_PASSTHROUGH;
+                case BROADCAST:
+                    return TLocalPartitionType.BROADCAST;
+                case PASS_TO_ONE:
+                    return TLocalPartitionType.PASS_TO_ONE;
+                case LOCAL_MERGE_SORT:
+                    return TLocalPartitionType.LOCAL_MERGE_SORT;
+                default: {
+                    throw new IllegalStateException("Unsupported LocalExchangeType: " + this);
+                }
+            }
+        }
+    }
+}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/MaterializationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/MaterializationNode.java
index 3a21ae34868..40c75b90b13 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/MaterializationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/MaterializationNode.java
@@ -22,6 +22,10 @@ import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.TupleDescriptor;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.ColumnToThrift;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.resource.computegroup.ComputeGroup;
 import org.apache.doris.system.Backend;
@@ -227,7 +231,17 @@ public class MaterializationNode extends PlanNode {
     }
 
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return true;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        Pair<PlanNode, LocalExchangeType> enforceResult = enforceRequire(
+                translatorContext, children.get(0), 0, LocalExchangeTypeRequire.requirePassthrough());
+        children = new ArrayList<>();
+        children.add(enforceResult.first);
+        return Pair.of(this, LocalExchangeType.PASSTHROUGH);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
index daf65dc74d5..99c52013b5c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
@@ -23,11 +23,17 @@ import org.apache.doris.analysis.JoinOperator;
 import org.apache.doris.analysis.SlotId;
 import org.apache.doris.analysis.TupleDescriptor;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TNestedLoopJoinNode;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
 
+import com.google.common.collect.Lists;
+
 import java.util.List;
 
 /**
@@ -164,8 +170,64 @@ public class NestedLoopJoinNode extends JoinNodeBase {
      * Probe-side must have full data so join is a serial operator.
      */
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return joinOp == JoinOperator.RIGHT_OUTER_JOIN || joinOp == JoinOperator.RIGHT_ANTI_JOIN
                 || joinOp == JoinOperator.RIGHT_SEMI_JOIN || joinOp == JoinOperator.FULL_OUTER_JOIN;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+
+        // Pooling mode: the fragment uses serial source (pooling scan or serial exchange).
+        // NLJ build side needs BROADCAST in pooling mode so all probe tasks see full build data.
+        boolean childUsePoolingScan = fragment.useSerialSource(translatorContext.getConnectContext());
+
+        LocalExchangeTypeRequire probeSideRequire;
+        LocalExchangeTypeRequire buildSideRequire;
+        LocalExchangeType outputType;
+        if (joinOp == JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN) {
+            probeSideRequire = buildSideRequire = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.NOOP;
+        } else if (isSerialNode()) {
+            // RIGHT_OUTER/RIGHT_SEMI/RIGHT_ANTI/FULL_OUTER: probe side must be serial (1 task).
+            // Build side: noRequire() — inserting BROADCAST would inflate build pipeline's
+            // num_tasks while probe stays at 1, crashing in set_ready_to_read().
+            probeSideRequire = LocalExchangeTypeRequire.noRequire();
+            buildSideRequire = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.NOOP;
+        } else if (childUsePoolingScan) {
+            probeSideRequire = LocalExchangeTypeRequire.requireAdaptivePassthrough();
+            buildSideRequire = LocalExchangeTypeRequire.requireBroadcast();
+            outputType = LocalExchangeType.ADAPTIVE_PASSTHROUGH;
+        } else {
+            probeSideRequire = LocalExchangeTypeRequire.requireAdaptivePassthrough();
+            buildSideRequire = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.ADAPTIVE_PASSTHROUGH;
+        }
+
+        // Both sides use enforceRequire — it handles serial flag propagation, satisfy
+        // check (skip LE when child already outputs the required type, e.g., chained NLJs),
+        // serial ancestor skip, and serial child fallback (auto-upgrade noRequire to
+        // requirePassthrough when child is serial but this node is not).
+        PlanNode probeSide = enforceRequire(
+                translatorContext, children.get(0), 0, probeSideRequire).first;
+        PlanNode buildSide = enforceRequire(
+                translatorContext, children.get(1), 1, buildSideRequire).first;
+        this.children = Lists.newArrayList(probeSide, buildSide);
+        return Pair.of(this, outputType);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        // Build side (child 1) is a separate pipeline in BE.  Normally,
+        // the serial-ancestor flag should be reset across pipeline boundaries.
+        // BUT when NLJ itself is serial (RIGHT_OUTER/ANTI/SEMI/FULL_OUTER),
+        // the probe pipeline has num_tasks=1.  If we reset the flag, the
+        // build-side Exchange may insert PASSTHROUGH (restoring num_tasks to
+        // _num_instances), creating more build tasks than probe tasks.  The
+        // extra build tasks have a NLJ shared state with empty source_deps,
+        // crashing in set_ready_to_read().
+        return childIndex == 1 && !isSerialNode();
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 6ab25dcce02..6531b2634d4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -59,6 +59,8 @@ import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.DebugUtil;
 import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
 import org.apache.doris.nereids.trees.plans.ScoreRangeInfo;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.planner.normalize.Normalizer;
 import org.apache.doris.planner.normalize.PartitionRangePredicateNormalizer;
 import org.apache.doris.qe.ConnectContext;
@@ -1060,6 +1062,9 @@ public class OlapScanNode extends ScanNode {
         if (isPointQuery()) {
             output.append(prefix).append("SHORT-CIRCUIT\n");
         }
+        if (fragment.useSerialSource(ConnectContext.get())) {
+            output.append(prefix).append("POOLING-SCAN\n");
+        }
 
         printNestedColumns(output, prefix, getTupleDesc());
 
@@ -1430,4 +1435,17 @@ public class OlapScanNode extends ScanNode {
         }
         return new OlapTableStreamUpdate(prev, next);
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent,
+            LocalExchangeTypeRequire parentRequire) {
+        boolean useSerialSource = fragment != null
+                && fragment.useSerialSource(translatorContext.getConnectContext());
+        if (useSerialSource) {
+            return Pair.of(this, LocalExchangeType.NOOP);
+        }
+        // Non-pooling OlapScan has bucket distribution — each instance scans specific buckets
+        return Pair.of(this, LocalExchangeType.BUCKET_HASH_SHUFFLE);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PartitionSortNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PartitionSortNode.java
index ed587df3816..a68d5567ebf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PartitionSortNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PartitionSortNode.java
@@ -22,8 +22,12 @@ import org.apache.doris.analysis.ExprToSqlVisitor;
 import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.SortInfo;
 import org.apache.doris.analysis.ToSqlParams;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
 import org.apache.doris.nereids.trees.plans.PartitionTopnPhase;
 import org.apache.doris.nereids.trees.plans.WindowFuncType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPartTopNPhase;
 import org.apache.doris.thrift.TPartitionSortNode;
@@ -169,4 +173,31 @@ public class PartitionSortNode extends PlanNode {
         partitionSortNode.setPtopnPhase(pTopNPhase);
         msg.partition_sort_node = partitionSortNode;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        LocalExchangeTypeRequire requireChild;
+        LocalExchangeType outputType;
+        if (phase == PartitionTopnPhase.TWO_PHASE_GLOBAL_PTOPN) {
+            // Use requireHash() so resolveExchangeType() can downgrade to LOCAL_EXECUTION_HASH_SHUFFLE,
+            // matching BE-native behavior where _use_serial_source=true causes LOCAL (not GLOBAL) hash.
+            // Output type is derived from the child's actual output (may be LOCAL or GLOBAL depending
+            // on whether a new exchange was inserted or the existing upstream exchange already satisfied).
+            requireChild = LocalExchangeTypeRequire.requireHash();
+            outputType = null;
+        } else {
+            requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            outputType = LocalExchangeType.PASSTHROUGH;
+        }
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, requireChild);
+        this.children = Lists.newArrayList(enforceResult.first);
+        return Pair.of(this, outputType != null ? outputType : enforceResult.second);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
index a46e2240f4c..98621ccc4f6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java
@@ -514,7 +514,7 @@ public class PlanFragment extends TreeNode<PlanFragment> {
                 // parallelism of non-serial operators.
                 // For bucket shuffle / colocate join fragment, always use serial source if the bucket scan nodes are
                 // serial.
-                && (hasSerialScanNode() || (sink instanceof DataStreamSink && !planRoot.isSerialOperator()
+                && (hasSerialScanNode() || (sink instanceof DataStreamSink && !planRoot.isSerialNode()
                 && planRoot.hasSerialChildren()));
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
index 6e56919e4ff..3a2438a85dd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java
@@ -37,6 +37,9 @@ import org.apache.doris.common.Pair;
 import org.apache.doris.common.TreeNode;
 import org.apache.doris.common.UserException;
 import org.apache.doris.datasource.iceberg.source.IcebergScanNode;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.planner.normalize.ExprNormalizeVisitor;
 import org.apache.doris.planner.normalize.Normalizer;
 import org.apache.doris.qe.ConnectContext;
@@ -142,7 +145,8 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
 
     protected int nereidsId = -1;
 
-    private List<List<Expr>> childrenDistributeExprLists = new ArrayList<>();
+    protected List<List<Expr>> childrenDistributeExprLists = new ArrayList<>();
+    protected List<Expr> distributeExprLists = new ArrayList<>();
 
     protected PlanNode(PlanNodeId id, List<TupleId> tupleIds, String planNodeName) {
         this.id = id;
@@ -467,7 +471,7 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
         TPlanNode msg = new TPlanNode();
         msg.node_id = id.asInt();
         msg.setNereidsId(nereidsId);
-        msg.setIsSerialOperator(isSerialOperator() && fragment.useSerialSource(ConnectContext.get()));
+        msg.setIsSerialOperator(isSerialOperatorOnBe(ConnectContext.get()));
         msg.num_children = children.size();
         msg.limit = limit;
         for (TupleId tid : tupleIds) {
@@ -825,13 +829,20 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
     }
 
     // Operators need to be executed serially. (e.g. finalized agg without key)
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return false;
     }
 
+    // Whether this node will have is_serial_operator=true on BE.
+    // Must match the condition in toThrift()/treeToThriftHelper().
+    // Subclasses (ExchangeNode) override to add hasSerialScanNode().
+    public boolean isSerialOperatorOnBe(ConnectContext context) {
+        return fragment != null && isSerialNode() && fragment.useSerialSource(context);
+    }
+
     public boolean hasSerialChildren() {
         if (children.isEmpty()) {
-            return isSerialOperator();
+            return isSerialNode();
         }
         return children.stream().allMatch(PlanNode::hasSerialChildren);
     }
@@ -933,4 +944,166 @@ public abstract class PlanNode extends TreeNode<PlanNode> {
         }
         return StringUtils.join(mergeDisplayAccessPaths, ", ");
     }
+
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        ArrayList<PlanNode> newChildren = Lists.newArrayList();
+        for (int i = 0; i < children.size(); i++) {
+            Pair<PlanNode, LocalExchangeType> childOutput
+                    = enforceRequire(translatorContext, children.get(i), i, LocalExchangeTypeRequire.noRequire());
+            newChildren.add(childOutput.first);
+        }
+        this.children = newChildren;
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
+
+    /**
+     * Unified framework method: propagate serial flag → recurse child → satisfy check → Layer 1 skip → insert LE.
+     * Replaces the old enforceChild/enforceChildExchange/forceEnforceChildExchange trio.
+     *
+     * Layer 1 (shouldSkipLE): mirrors BE's need_to_local_exchange — skip when this node or
+     * an ancestor in the same pipeline is serial (operators[idx..end] has serial → skip).
+     * Layer 2 (require/output): each Node declares require and output in enforceAndDeriveLocalExchange.
+     */
+    protected Pair<PlanNode, LocalExchangeType> enforceRequire(
+            PlanTranslatorContext translatorContext, PlanNode child, int childIndex,
+            LocalExchangeTypeRequire require) {
+        // 1. Propagate serial-ancestor flag to child.
+        // For pipeline-splitting operators (shouldReset=true, e.g. non-streaming AGG):
+        //   Drop inherited serial flag from parent (parent is in a different pipeline),
+        //   but keep this node's own serial status (child is in the same pipeline as this
+        //   node's sink, e.g. Exchange is in AGG_Sink pipeline).
+        // For non-splitting operators (shouldReset=false, e.g. streaming AGG):
+        //   Inherit parent's serial flag + this node's own.
+        boolean inheritedSerial = shouldResetSerialFlagForChild(childIndex)
+                ? false : translatorContext.hasSerialAncestorInPipeline(this);
+        boolean childHasSerialAncestor = inheritedSerial || isSerialNode();
+        translatorContext.setHasSerialAncestorInPipeline(child, childHasSerialAncestor);
+
+        // 2. Recurse child (Layer 2: child declares its own require/output)
+        Pair<PlanNode, LocalExchangeType> childOutput =
+                child.enforceAndDeriveLocalExchange(translatorContext, this, require);
+
+        // 2.5. Serial child override: if child is serial on BE, force output to NOOP.
+        //      This ensures the framework handles LE insertion uniformly — child nodes
+        //      don't need to check serial status themselves.  The serial child's actual
+        //      distribution is irrelevant because it runs with 1 task; downstream needs
+        //      LE to restore parallelism (step 3) or skip LE entirely (step 4b).
+        if (childOutput.first.isSerialOperatorOnBe(translatorContext.getConnectContext())) {
+            childOutput = Pair.of(childOutput.first, LocalExchangeType.NOOP);
+        }
+
+        // 3. Framework-level serial child check (mirrors BE base class required_data_distribution):
+        //    If child will be serial on BE but this node is not serial, the pipeline has a
+        //    1-task serial child feeding an N-task non-serial parent. Without LE, pipeline
+        //    splits (AGG/JOIN) create paired pipelines with mismatched num_tasks → crash.
+        //    Upgrade noRequire to requirePassthrough so LE is inserted to restore parallelism.
+        if (require instanceof LocalExchangeNode.NoRequire
+                && childOutput.first.isSerialOperatorOnBe(translatorContext.getConnectContext())
+                && !isSerialOperatorOnBe(translatorContext.getConnectContext())) {
+            require = LocalExchangeTypeRequire.requirePassthrough();
+        }
+
+        // 4. Satisfy check: child output meets requirement → done
+        if (require.satisfy(childOutput.second)) {
+            return childOutput;
+        }
+
+        // 4. Layer 1: skip LE when serial operator or ancestor in same pipeline
+        // Equivalent to BE's need_to_local_exchange: any_of(operators[idx..end], is_serial) → skip
+        if (translatorContext.hasSerialAncestorInPipeline(this) || isSerialNode()) {
+            return childOutput;
+        }
+
+        // 5. Resolve exchange type and create LE node
+        LocalExchangeType preferType = AddLocalExchange.resolveExchangeType(
+                require, translatorContext, this, childOutput.first);
+        List<Expr> distributeExprs = getChildDistributeExprList(childIndex);
+        PlanNode leNode = createLocalExchange(translatorContext, childOutput.first, preferType, distributeExprs);
+        return Pair.of(leNode, preferType);
+    }
+
+    /**
+     * Create a LocalExchangeNode wrapping child with the given exchange type.
+     * No child-type skip — matches BE's _add_local_exchange which inserts LE for any child
+     * type without checking instanceof.
+     *
+     * Handles heavy-ops bottleneck avoidance (mirrors BE pipeline_fragment_context.cpp):
+     * when upstream has 1 task (serial source) and exchange is heavy (hash/bucket/adaptive),
+     * insert a PASSTHROUGH fan-out first to avoid single-task bottleneck on the heavy
+     * exchange sink. Only applies to local-shuffle (pooling scan) fragments.
+     */
+    protected PlanNode createLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode child, LocalExchangeType exchangeType, List<Expr> distributeExprs) {
+        if (fragment != null && fragment.useSerialSource(translatorContext.getConnectContext())
+                && exchangeType.isHeavyOperation() && child.isSerialNode()) {
+            PlanNode ptNode = new LocalExchangeNode(translatorContext.nextPlanNodeId(),
+                    child, LocalExchangeType.PASSTHROUGH, null);
+            return new LocalExchangeNode(translatorContext.nextPlanNodeId(), ptNode,
+                    exchangeType, distributeExprs);
+        }
+        return new LocalExchangeNode(translatorContext.nextPlanNodeId(), child,
+                exchangeType, distributeExprs);
+    }
+
+    /**
+     * Whether the child at {@code childIndex} starts a new pipeline context, causing
+     * its serial-ancestor flag to be reset to {@code false} rather than inherited from this node.
+     * Override to return {@code true} for pipeline-splitting nodes (LocalExchangeNode) and nodes
+     * whose children run in an independent pipeline segment (SortNode above analytic, etc.).
+     */
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return false;
+    }
+
+    protected List<Expr> getChildDistributeExprList(int childIndex) {
+        if ((childrenDistributeExprLists == null || childrenDistributeExprLists.size() <= childIndex)) {
+            return null;
+        } else {
+            return childrenDistributeExprLists.get(childIndex);
+        }
+    }
+
+    /**
+     * Returns the operator's own semantically-defined partition expressions
+     * (e.g. GROUP BY exprs for aggregation, PARTITION BY exprs for analytic).
+     * Corresponds to BE's fallback path: tnode.agg_node.grouping_exprs /
+     * tnode.analytic_node.partition_exprs when _followed_by_shuffled_operator=false.
+     * Override in subclasses that have intrinsic partition keys.
+     */
+    protected List<Expr> getSemanticPartitionExprs() {
+        return null;
+    }
+
+    /**
+     * Returns true if there are effective (non-empty) partition expressions,
+     * mirroring BE's _partition_exprs logic:
+     *   _followed_by_shuffled_operator=true  → distribute_expr_lists[0] (child distribute key)
+     *   _followed_by_shuffled_operator=false → semantic partition exprs (grouping / partition by)
+     * parentRequire.preferType().isHashShuffle() corresponds to _followed_by_shuffled_operator=true.
+     */
+    protected boolean hasPartitionExprs(LocalExchangeTypeRequire parentRequire) {
+        if (parentRequire.preferType().isHashShuffle()) {
+            List<Expr> childExprs = getChildDistributeExprList(0);
+            return childExprs != null && !childExprs.isEmpty();
+        }
+        List<Expr> semanticExprs = getSemanticPartitionExprs();
+        return semanticExprs != null && !semanticExprs.isEmpty();
+    }
+
+    public List<List<Expr>> getChildrenDistributeExprLists() {
+        return childrenDistributeExprLists;
+    }
+
+    public List<Expr> getDistributeExprLists() {
+        return distributeExprLists;
+    }
+
+    public void setDistributeExprLists(List<Expr> distributeExprLists) {
+        if (distributeExprLists == null) {
+            this.distributeExprLists = Collections.emptyList();
+        } else {
+            this.distributeExprLists = distributeExprLists;
+        }
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteNode.java
index 838facd27b3..3a7bdd63745 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteNode.java
@@ -21,6 +21,10 @@ import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.ExprToSqlVisitor;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
@@ -29,6 +33,7 @@ import org.apache.doris.thrift.TRecCTENode;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.Lists;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class RecursiveCteNode extends PlanNode {
@@ -86,4 +91,23 @@ public class RecursiveCteNode extends PlanNode {
                 .add("tid", tupleIds.get(0).asInt())
                 .add("isUnionAll", isUnionAll).toString();
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        ArrayList<PlanNode> newChildren = Lists.newArrayList();
+        for (int i = 0; i < children.size(); i++) {
+            PlanNode child = children.get(i);
+            Pair<PlanNode, LocalExchangeType> childOutput = enforceRequire(
+                    translatorContext, child, i, LocalExchangeTypeRequire.noRequire());
+            newChildren.add(childOutput.first);
+        }
+        this.children = newChildren;
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteScanNode.java
index c0ed988010c..9f98f7b2c27 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/RecursiveCteScanNode.java
@@ -21,6 +21,10 @@ import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.ExprToSqlVisitor;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
@@ -67,7 +71,13 @@ public class RecursiveCteScanNode extends PlanNode {
     }
 
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return true;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java
index e28094cfe89..bf1be174f97 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/RepeatNode.java
@@ -19,6 +19,10 @@ package org.apache.doris.planner;
 
 import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.GroupingInfo;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
@@ -86,11 +90,21 @@ public class RepeatNode extends PlanNode {
 
     // Determined by its child.
     @Override
-    public boolean isSerialOperator() {
-        return children.get(0).isSerialOperator();
+    public boolean isSerialNode() {
+        return children.get(0).isSerialNode();
     }
 
     public GroupingInfo getGroupingInfo() {
         return groupingInfo;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, parentRequire);
+        children = new java.util.ArrayList<>();
+        children.add(enforceResult.first);
+        return Pair.of(this, enforceResult.second);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/RuntimeFilter.java b/fe/fe-core/src/main/java/org/apache/doris/planner/RuntimeFilter.java
index f4ea16c9360..e1860e5bcd7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/RuntimeFilter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/RuntimeFilter.java
@@ -263,7 +263,7 @@ public final class RuntimeFilter {
         for (RuntimeFilterTarget target : targets) {
             tFilter.putToPlanIdToTargetExpr(target.node.getId().asInt(), ExprToThriftVisitor.treeToThrift(target.expr));
             hasSerialTargets = hasSerialTargets
-                    || (target.node.isSerialOperator() && target.node.fragment.useSerialSource(ConnectContext.get()));
+                    || target.node.isSerialOperatorOnBe(ConnectContext.get());
         }
 
         boolean enableSyncFilterSize = ConnectContext.get() != null
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
index 02a40761db9..e69d3101548 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
@@ -42,11 +42,15 @@ import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.TableIf;
 import org.apache.doris.cloud.catalog.CloudPartition;
 import org.apache.doris.common.Config;
+import org.apache.doris.common.Pair;
 import org.apache.doris.common.UserException;
 import org.apache.doris.datasource.FederationBackendPolicy;
 import org.apache.doris.datasource.SplitAssignment;
 import org.apache.doris.datasource.SplitGenerator;
 import org.apache.doris.datasource.SplitSource;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.rpc.RpcException;
 import org.apache.doris.system.Backend;
@@ -733,7 +737,7 @@ public abstract class ScanNode extends PlanNode implements SplitGenerator {
     }
 
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         ConnectContext context = ConnectContext.get();
         if (context == null) {
             return numScanBackends() <= 0;
@@ -747,7 +751,15 @@ public abstract class ScanNode extends PlanNode implements SplitGenerator {
 
     @Override
     public boolean hasSerialScanChildren() {
-        return isSerialOperator();
+        return isSerialNode();
+    }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        // Base ScanNode returns NOOP — only OlapScanNode overrides with BUCKET_HASH_SHUFFLE
+        // for non-pooling scans that have bucket distribution.
+        return Pair.of(this, LocalExchangeType.NOOP);
     }
 
     public void setDesc(TupleDescriptor desc) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
index 2ef0b364be1..92b6975afcf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SelectNode.java
@@ -20,6 +20,10 @@
 
 package org.apache.doris.planner;
 
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
@@ -57,7 +61,17 @@ public class SelectNode extends PlanNode {
 
     // Determined by its child.
     @Override
-    public boolean isSerialOperator() {
-        return children.get(0).isSerialOperator();
+    public boolean isSerialNode() {
+        return children.get(0).isSerialNode();
+    }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, parentRequire);
+        this.children = new ArrayList<>();
+        this.children.add(enforceResult.first);
+        return Pair.of(this, enforceResult.second);
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
index aecb6e43c88..a7d89278f0c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SetOperationNode.java
@@ -22,6 +22,10 @@ import org.apache.doris.analysis.ExprToSqlVisitor;
 import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExceptNode;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TExpr;
@@ -37,6 +41,7 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -193,4 +198,48 @@ public abstract class SetOperationNode extends PlanNode {
     public boolean isBucketShuffle() {
         return distributionMode.equals(DistributionMode.BUCKET_SHUFFLE);
     }
+
+    public boolean isColocate() {
+        return isColocate;
+    }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        LocalExchangeTypeRequire requireChild;
+        LocalExchangeType outputType;
+        PlanNode firstChild = children.isEmpty() ? null : children.get(0);
+        if (this instanceof UnionNode) {
+            // Propagate parent's hash requirement to children when parent requires hash distribution.
+            // Matches BE's UnionSinkOperatorX which returns GLOBAL_HASH(_distribute_exprs) whenever
+            // _followed_by_shuffled_operator=true, regardless of whether _distribute_exprs is empty.
+            boolean canPropagateHash = parentRequire.preferType().isHashShuffle();
+            requireChild = canPropagateHash ? parentRequire : LocalExchangeTypeRequire.noRequire();
+            outputType = canPropagateHash
+                    ? AddLocalExchange.resolveExchangeType(requireChild, translatorContext, this, firstChild)
+                    : LocalExchangeType.NOOP;
+        } else {
+            // Intersect / Except
+            if (AddLocalExchange.isColocated(this)) {
+                requireChild = LocalExchangeTypeRequire.requireBucketHash();
+                outputType = LocalExchangeType.BUCKET_HASH_SHUFFLE;
+            } else {
+                requireChild = parentRequire.autoRequireHash();
+                outputType = AddLocalExchange.resolveExchangeType(
+                        requireChild, translatorContext, this, firstChild);
+            }
+        }
+
+        ArrayList<PlanNode> newChildren = Lists.newArrayList();
+        for (int i = 0; i < children.size(); i++) {
+            newChildren.add(enforceRequire(translatorContext, children.get(i), i, requireChild).first);
+        }
+        this.children = newChildren;
+        return Pair.of(this, outputType);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java
index c94c1764d61..6c984dbed4d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SortNode.java
@@ -25,6 +25,9 @@ import org.apache.doris.analysis.ExprToSqlVisitor;
 import org.apache.doris.analysis.SortInfo;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
@@ -217,7 +220,7 @@ public class SortNode extends PlanNode {
 
     // If it's analytic sort or not merged by a followed exchange node, it must output the global ordered data.
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return !isAnalyticSort && !mergeByexchange;
     }
 
@@ -245,4 +248,46 @@ public class SortNode extends PlanNode {
             List<Pair<Integer, Integer>> topnFilterTargets) {
         this.topnFilterTargets = topnFilterTargets;
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(PlanTranslatorContext translatorContext,
+            PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+
+        LocalExchangeTypeRequire requireChild;
+        LocalExchangeType outputType = null;
+        if (isAnalyticSort) {
+            // BE: SortSink._is_analytic_sort=true → required_data_distribution() = HASH.
+            // This sort serves a parent AnalyticEvalNode (window function) and requires
+            // data partitioned by the analytic's partition exprs.
+            if (AddLocalExchange.isColocated(this)) {
+                requireChild = LocalExchangeTypeRequire.requireHash();
+                outputType = AddLocalExchange.resolveExchangeType(
+                        LocalExchangeTypeRequire.requireHash(), translatorContext, this,
+                        children.get(0));
+            } else {
+                requireChild = parentRequire.autoRequireHash();
+            }
+        } else if (mergeByexchange) {
+            // BE: SortSink._merge_by_exchange=true → required_data_distribution() = PASSTHROUGH.
+            requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            outputType = LocalExchangeType.PASSTHROUGH;
+        } else {
+            // BE: else → NOOP
+            requireChild = LocalExchangeTypeRequire.noRequire();
+            outputType = LocalExchangeType.NOOP;
+        }
+
+        Pair<PlanNode, LocalExchangeType> enforceResult
+                = enforceRequire(translatorContext, children.get(0), 0, requireChild);
+        this.children = Lists.newArrayList(enforceResult.first);
+        if (outputType == null) {
+            outputType = enforceResult.second;
+        }
+        return Pair.of(this, outputType);
+    }
+
+    @Override
+    protected boolean shouldResetSerialFlagForChild(int childIndex) {
+        return true;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java
index 3630bfd72a9..c363b30c318 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/TableFunctionNode.java
@@ -23,6 +23,10 @@ import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.SlotId;
 import org.apache.doris.analysis.ToSqlParams;
 import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TPlanNode;
 import org.apache.doris.thrift.TPlanNodeType;
@@ -120,4 +124,24 @@ public class TableFunctionNode extends PlanNode {
             msg.table_function_node.addToOutputSlotIds(slotId.asInt());
         }
     }
+
+    @Override
+    public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+            PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+        // Mirrors BE TableFunctionOperatorX::required_data_distribution() which always
+        // returns PASSTHROUGH, regardless of child's serial status.
+        //
+        // Conceptual model: TableFunction requires PASSTHROUGH input but outputs
+        // "unknown distribution" (NOOP). This means downstream operators (e.g. Sort)
+        // must independently evaluate their own requirements against NOOP, naturally
+        // triggering exchange insertion when they require PASSTHROUGH.
+        //
+        // In BE, need_to_local_exchange() Step 4 treats non-hash exchanges (PASSTHROUGH)
+        // as always needing insertion, so "PASSTHROUGH doesn't satisfy PASSTHROUGH" —
+        // which is equivalent to our FE model of require=PASSTHROUGH, output=NOOP.
+        Pair<PlanNode, LocalExchangeType> enforceResult = enforceRequire(
+                translatorContext, children.get(0), 0, LocalExchangeTypeRequire.requirePassthrough());
+        children = Lists.newArrayList(enforceResult.first);
+        return Pair.of(this, LocalExchangeType.NOOP);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java
index 36e50b8f501..0b05cafd9cb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/UnionNode.java
@@ -37,7 +37,7 @@ public class UnionNode extends SetOperationNode {
     // If it is a union without children which means it will output some constant values, we should use a serial union
     // to output non-duplicated data.
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialNode() {
         return children.isEmpty();
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
index 5181a77b042..49ca93b7d7a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
@@ -352,7 +352,6 @@ public class Coordinator implements CoordInterface {
         } else {
             distributedPlans = ((NereidsPlanner) planner).getDistributedPlans();
         }
-
         setFromUserProperty(context);
 
         this.queryGlobals.setNowString(TimeUtils.getDatetimeFormatWithTimeZone().format(LocalDateTime.now()));
@@ -428,6 +427,8 @@ public class Coordinator implements CoordInterface {
         this.queryOptions.setFeProcessUuid(ExecuteEnv.getInstance().getProcessUUID());
         this.queryOptions.setMysqlRowBinaryFormat(
                     context.getCommand() == MysqlCommand.COM_STMT_EXECUTE);
+        // Old Coordinator never plans local exchange in FE. Force BE to plan its own.
+        this.queryOptions.setEnableLocalShufflePlanner(false);
     }
 
     public ConnectContext getConnectContext() {
@@ -2884,7 +2885,7 @@ public class Coordinator implements CoordInterface {
                             Optional<ScanNode> node = scanNodes.stream().filter(
                                     scanNode -> scanNode.getId().asInt() == scanId).findFirst();
                             Preconditions.checkArgument(node.isPresent());
-                            FInstanceExecParam instanceParamToScan = node.get().isSerialOperator()
+                            FInstanceExecParam instanceParamToScan = node.get().isSerialNode()
                                     ? firstInstanceParam : instanceParam;
                             if (!instanceParamToScan.perNodeScanRanges.containsKey(nodeScanRange.getKey())) {
                                 range.put(nodeScanRange.getKey(), Lists.newArrayList());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/NereidsCoordinator.java b/fe/fe-core/src/main/java/org/apache/doris/qe/NereidsCoordinator.java
index f8c7509f102..19c2eaec3ad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/NereidsCoordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/NereidsCoordinator.java
@@ -101,6 +101,7 @@ public class NereidsCoordinator extends Coordinator {
             setForInsert(-1L);
         }
 
+        syncLocalShufflePlannerOption();
         Preconditions.checkState(!planner.getFragments().isEmpty()
                 && coordinatorContext.instanceNum.get() > 0, "Fragment and Instance can not be empty˚");
     }
@@ -115,6 +116,7 @@ public class NereidsCoordinator extends Coordinator {
 
         // we don't need to check the dataSink, Because setting jobId means this must be a load operation
         setForInsert(jobId);
+        syncLocalShufflePlannerOption();
         Preconditions.checkState(!planner.getFragments().isEmpty()
                 && coordinatorContext.instanceNum.get() > 0, "Fragment and Instance can not be empty˚");
     }
@@ -132,11 +134,20 @@ public class NereidsCoordinator extends Coordinator {
         // same reason in `setForInsert`
         this.coordinatorContext.queryOptions.setDisableFileCache(true);
         this.needEnqueue = false;
+        syncLocalShufflePlannerOption();
 
         Preconditions.checkState(!fragments.isEmpty()
                 && coordinatorContext.instanceNum.get() > 0, "Fragment and Instance can not be empty˚");
     }
 
+    private void syncLocalShufflePlannerOption() {
+        coordinatorContext.queryOptions.setEnableLocalShufflePlanner(
+                coordinatorContext.distributedPlans != null
+                && !coordinatorContext.distributedPlans.isEmpty()
+                && coordinatorContext.connectContext != null
+                && coordinatorContext.connectContext.getSessionVariable().isEnableLocalShufflePlanner());
+    }
+
     @Override
     public void exec() throws Exception {
         enqueue(coordinatorContext.connectContext);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 3884d42b80c..fa0ec1e6531 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -337,6 +337,8 @@ public class SessionVariable implements Serializable, Writable {
 
     public static final String ENABLE_LOCAL_SHUFFLE = "enable_local_shuffle";
 
+    public static final String ENABLE_LOCAL_SHUFFLE_PLANNER = "enable_local_shuffle_planner";
+
     public static final String FORCE_TO_LOCAL_SHUFFLE = "force_to_local_shuffle";
 
     public static final String ENABLE_LOCAL_MERGE_SORT = "enable_local_merge_sort";
@@ -1597,6 +1599,12 @@ public class SessionVariable implements Serializable, Writable {
                     "Whether to enable local shuffle on pipelineX engine."}, needForward = true)
     private boolean enableLocalShuffle = true;
 
+    @VarAttrDef.VarAttr(
+            name = ENABLE_LOCAL_SHUFFLE_PLANNER, fuzzy = false, varType = VariableAnnotation.EXPERIMENTAL,
+            description = {"是否在FE规划Local Shuffle",
+                    "Whether to plan local shuffle in frontend"}, needForward = true)
+    private boolean enableLocalShufflePlanner = true;
+
     @VarAttrDef.VarAttr(
                 name = FORCE_TO_LOCAL_SHUFFLE, fuzzy = false, varType = VariableAnnotation.EXPERIMENTAL,
                 description = {"是否在 pipelineX 引擎上强制开启 local shuffle 优化",
@@ -4741,6 +4749,18 @@ public class SessionVariable implements Serializable, Writable {
         this.enableLocalShuffle = enableLocalShuffle;
     }
 
+    public boolean isEnableLocalShuffle() {
+        return enableLocalShuffle;
+    }
+
+    public boolean isEnableLocalShufflePlanner() {
+        return enableLocalShufflePlanner;
+    }
+
+    public void setEnableLocalShufflePlanner(boolean enableLocalShufflePlanner) {
+        this.enableLocalShufflePlanner = enableLocalShufflePlanner;
+    }
+
     public boolean enablePushDownNoGroupAgg() {
         return enablePushDownNoGroupAgg;
     }
@@ -5645,6 +5665,8 @@ public class SessionVariable implements Serializable, Writable {
         // Set Iceberg write target file size
         tResult.setIcebergWriteTargetFileSizeBytes(icebergWriteTargetFileSizeBytes);
 
+        tResult.setEnableLocalShufflePlanner(enableLocalShufflePlanner);
+
         return tResult;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 11d633a5644..92163eacc27 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -1110,8 +1110,10 @@ public class StmtExecutor {
         // 1. CreateTableCommand(mainly for create as select).
         // 2. LoadCommand.
         // 3. InsertOverwriteTableCommand.
+        // 4. MergeIntoCommand (merge into ... using ...).
         if ((plan instanceof Command) && !(plan instanceof LoadCommand)
-                && !(plan instanceof CreateTableCommand) && !(plan instanceof InsertOverwriteTableCommand)) {
+                && !(plan instanceof CreateTableCommand) && !(plan instanceof InsertOverwriteTableCommand)
+                && !(plan instanceof org.apache.doris.nereids.trees.plans.commands.merge.MergeIntoCommand)) {
             // Commands like SHOW QUERY PROFILE will not have profile.
             return false;
         } else {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/runtime/ThriftPlansBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/qe/runtime/ThriftPlansBuilder.java
index 4f8499970c9..7686dc98c24 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/runtime/ThriftPlansBuilder.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/runtime/ThriftPlansBuilder.java
@@ -95,7 +95,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.function.BiConsumer;
 import java.util.function.Supplier;
 
 public class ThriftPlansBuilder {
@@ -280,7 +279,8 @@ public class ThriftPlansBuilder {
         return workerCounter;
     }
 
-    private static Map<Integer, Integer> computeExchangeSenderNum(PipelineDistributedPlan distributedPlan) {
+    private static Map<Integer, Integer> computeExchangeSenderNum(
+            PipelineDistributedPlan distributedPlan) {
         Map<Integer, Integer> senderNum = Maps.newLinkedHashMap();
         for (Entry<ExchangeNode, DistributedPlan> kv : distributedPlan.getInputs().entries()) {
             ExchangeNode exchangeNode = kv.getKey();
@@ -427,6 +427,25 @@ public class ThriftPlansBuilder {
             TPlanFragment planThrift = fragment.toThrift();
             planThrift.query_cache_param = fragment.queryCacheParam;
             params.setFragment(planThrift);
+            if (planThrift.isSetPlan()) {
+                long leCount = planThrift.getPlan().getNodes().stream()
+                        .filter(n -> n.getNodeType()
+                                == org.apache.doris.thrift.TPlanNodeType.LOCAL_EXCHANGE_NODE)
+                        .count();
+                boolean hasPooling = fragmentPlan.getInstanceJobs().stream().anyMatch(
+                        org.apache.doris.nereids.trees.plans.distribute.worker.job
+                                .LocalShuffleAssignedJob.class::isInstance);
+                if (hasPooling) {
+                    org.apache.logging.log4j.LogManager.getLogger(ThriftPlansBuilder.class).info(
+                            "ThriftPlan qid={} fragment={} leNodes={} pooling=true"
+                            + " parallelInstances={} instances={}",
+                            org.apache.doris.common.util.DebugUtil.printId(
+                                    coordinatorContext.queryId),
+                            fragment.getFragmentId(), leCount,
+                            params.isSetParallelInstances() ? params.getParallelInstances() : -1,
+                            fragmentPlan.getInstanceJobs().size());
+                }
+            }
             params.setLocalParams(Lists.newArrayList());
             params.setWorkloadGroups(coordinatorContext.getWorkloadGroups());
 
@@ -583,39 +602,55 @@ public class ThriftPlansBuilder {
         }
 
         Map<Integer, Integer> destIdToInstanceId = Maps.newLinkedHashMap();
-        filterInstancesWhichReceiveDataFromRemote(
-                receivePlan, worker,
-                (instanceJob, destId) -> destIdToInstanceId.put(destId, instanceToIndex.get(instanceJob))
-        );
-        return destIdToInstanceId;
-    }
-
-    private static void filterInstancesWhichReceiveDataFromRemote(
-            PipelineDistributedPlan receivePlan, DistributedPlanWorker filterWorker,
-            BiConsumer<AssignedJob, Integer> computeFn) {
-
-        // current only support all input plans have same destination with same order,
-        // so we can get first input plan to compute shuffle index to instance id
-        Set<Entry<ExchangeNode, DistributedPlan>> exchangeToChildPlanSet = receivePlan.getInputs().entries();
-        if (exchangeToChildPlanSet.isEmpty()) {
-            return;
+        // dest id is defined by sender-side destination order rather than receiver fragment instance order.
+        // When FE inserts local shuffle or serial source, one worker may have multiple local receiver instances,
+        // but only the first one actually receives remote data. In that case receiverPlan.getInstanceJobs()
+        // no longer matches sender destinations, and using receiver instance order will produce an invalid
+        // shuffle_idx_to_instance_idx mapping for BE.
+        //
+        // When a fragment has multiple ExchangeNode inputs (e.g., NLJ with probe + BROADCAST build sides),
+        // always pick the one with the most destinations on this worker. A BROADCAST input has 1 dest per BE
+        // while the main data-carrying input (HASH-partitioned probe) has N dests per BE; using the BROADCAST
+        // one would produce a 1-entry map for GLOBAL_HASH LOCAL_EXCHANGE, causing rows to be lost.
+        Entry<ExchangeNode, DistributedPlan> exchangeToChildPlan = null;
+        int maxDestsOnWorker = -1;
+        for (Entry<ExchangeNode, DistributedPlan> entry : receivePlan.getInputs().entries()) {
+            ExchangeNode exchNode = entry.getKey();
+            PipelineDistributedPlan childPlan = (PipelineDistributedPlan) entry.getValue();
+            for (Entry<DataSink, List<AssignedJob>> kv : childPlan.getDestinations().entrySet()) {
+                if (kv.getKey().getExchNodeId().asInt() != exchNode.getId().asInt()) {
+                    continue;
+                }
+                int destsOnWorker = (int) kv.getValue().stream()
+                        .filter(j -> j.getAssignedWorker().id() == worker.id())
+                        .count();
+                if (destsOnWorker > maxDestsOnWorker) {
+                    maxDestsOnWorker = destsOnWorker;
+                    exchangeToChildPlan = entry;
+                }
+                break;
+            }
+        }
+        if (exchangeToChildPlan == null) {
+            return destIdToInstanceId;
         }
-        Entry<ExchangeNode, DistributedPlan> exchangeToChildPlan = exchangeToChildPlanSet.iterator().next();
         ExchangeNode linkNode = exchangeToChildPlan.getKey();
         PipelineDistributedPlan firstInputPlan = (PipelineDistributedPlan) exchangeToChildPlan.getValue();
-        Map<DataSink, List<AssignedJob>> sinkToDestInstances = firstInputPlan.getDestinations();
-        for (Entry<DataSink, List<AssignedJob>> kv : sinkToDestInstances.entrySet()) {
+        for (Entry<DataSink, List<AssignedJob>> kv : firstInputPlan.getDestinations().entrySet()) {
             DataSink senderSink = kv.getKey();
-            if (senderSink.getExchNodeId().asInt() == linkNode.getId().asInt()) {
-                for (int destId = 0; destId < kv.getValue().size(); destId++) {
-                    AssignedJob assignedJob = kv.getValue().get(destId);
-                    if (assignedJob.getAssignedWorker().id() == filterWorker.id()) {
-                        computeFn.accept(assignedJob, destId);
-                    }
+            if (senderSink.getExchNodeId().asInt() != linkNode.getId().asInt()) {
+                continue;
+            }
+            List<AssignedJob> destinationJobs = kv.getValue();
+            for (int destId = 0; destId < destinationJobs.size(); destId++) {
+                AssignedJob destinationJob = destinationJobs.get(destId);
+                if (destinationJob.getAssignedWorker().id() == worker.id()) {
+                    destIdToInstanceId.put(destId, instanceToIndex.get(destinationJob));
                 }
-                break;
             }
+            break;
         }
+        return destIdToInstanceId;
     }
 
     private static Set<Integer> setParamsForRecursiveCteNode(List<PipelineDistributedPlan> distributedPlans,
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
index 0695b05ef70..f813988dd91 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
@@ -51,6 +51,10 @@ import org.apache.doris.nereids.util.PlanChecker;
 import org.apache.doris.utframe.TestWithFeService;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import mockit.Mock;
+import mockit.MockUp;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
@@ -136,6 +140,12 @@ public class AnalyzeWhereSubqueryTest extends TestWithFeService implements MemoP
         }
     }
 
+    @Test
+    public void testSimpleCaseWithExistsSubqueryCanAnalyze() {
+        String sql = "select case exists(select k1 from t7) when true then 2 when false then 4 else 5 end a3 from t6";
+        Assertions.assertDoesNotThrow(() -> PlanChecker.from(connectContext).analyze(sql));
+    }
+
     @Test
     public void testWhereSql2AfterAnalyzed() {
         // after analyze
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
new file mode 100644
index 00000000000..3bfaadee8be
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
@@ -0,0 +1,662 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.planner;
+
+import org.apache.doris.analysis.AssertNumRowsElement;
+import org.apache.doris.analysis.BinaryPredicate;
+import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.GroupingInfo;
+import org.apache.doris.analysis.JoinOperator;
+import org.apache.doris.analysis.OrderByElement;
+import org.apache.doris.analysis.SlotDescriptor;
+import org.apache.doris.analysis.SortInfo;
+import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.Pair;
+import org.apache.doris.common.UserException;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.nereids.trees.plans.PartitionTopnPhase;
+import org.apache.doris.nereids.trees.plans.WindowFuncType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeTypeRequire;
+import org.apache.doris.thrift.TExplainLevel;
+import org.apache.doris.thrift.TPartitionType;
+import org.apache.doris.thrift.TPlanNode;
+import org.apache.doris.thrift.TScanRangeLocations;
+
+import com.google.common.collect.Lists;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class LocalShuffleNodeCoverageTest {
+    private static final AtomicInteger NEXT_ID = new AtomicInteger(1);
+
+    @Test
+    public void testSelectNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+
+        TrackingPlanNode childNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        SelectNode selectWithNoopChild = new SelectNode(nextPlanNodeId(), childNoop);
+        Pair<PlanNode, LocalExchangeType> output = selectWithNoopChild.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+
+        // resolveExchangeType with RequireHash always returns LOCAL_EXECUTION_HASH_SHUFFLE
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, output.second);
+        Assertions.assertEquals(LocalExchangeNode.RequireHash.class, childNoop.lastRequire.getClass());
+        assertChildLocalExchangeType(selectWithNoopChild, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+
+        TrackingPlanNode childBucket = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.BUCKET_HASH_SHUFFLE);
+        SelectNode selectWithBucketChild = new SelectNode(nextPlanNodeId(), childBucket);
+        Pair<PlanNode, LocalExchangeType> bucketOutput = selectWithBucketChild.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.BUCKET_HASH_SHUFFLE, bucketOutput.second);
+        Assertions.assertSame(childBucket, selectWithBucketChild.getChild(0));
+    }
+
+    @Test
+    public void testRepeatNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        GroupingInfo groupingInfo = Mockito.mock(GroupingInfo.class);
+        TupleDescriptor outputTuple = new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement()));
+        Mockito.when(groupingInfo.getOutputTupleDesc()).thenReturn(outputTuple);
+        Mockito.when(groupingInfo.getPreRepeatExprs()).thenReturn(Collections.emptyList());
+
+        TrackingPlanNode childNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        RepeatNode repeatNode = new RepeatNode(nextPlanNodeId(), childNoop, groupingInfo,
+                Collections.singletonList(Collections.emptySet()), Collections.emptySet(),
+                Collections.singletonList(Collections.emptyList()));
+        Pair<PlanNode, LocalExchangeType> output = repeatNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        // resolveExchangeType with RequireHash always returns LOCAL_EXECUTION_HASH_SHUFFLE
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, output.second);
+        assertChildLocalExchangeType(repeatNode, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+    }
+
+    @Test
+    public void testTableFunctionNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        TrackingPlanNode childNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TableFunctionNode tableFunctionNode = new TableFunctionNode(nextPlanNodeId(), childNoop,
+                new TupleId(NEXT_ID.getAndIncrement()), new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
+
+        // TableFunctionNode always requires PASSTHROUGH from child and outputs NOOP.
+        // This mirrors BE's TableFunctionOperatorX::required_data_distribution() override.
+        // Parent's requireHash is ignored — TableFunction's own PASSTHROUGH requirement takes precedence.
+        Pair<PlanNode, LocalExchangeType> output = tableFunctionNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, output.second);
+        assertChildLocalExchangeType(tableFunctionNode, 0, LocalExchangeType.PASSTHROUGH);
+    }
+
+    @Test
+    public void testPartitionSortNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        SortInfo sortInfo = Mockito.mock(SortInfo.class);
+        TupleDescriptor sortTuple = new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement()));
+        Mockito.when(sortInfo.getOrderingExprs()).thenReturn(Collections.emptyList());
+        Mockito.when(sortInfo.getIsAscOrder()).thenReturn(Collections.emptyList());
+        Mockito.when(sortInfo.getSortTupleDescriptor()).thenReturn(sortTuple);
+
+        TrackingPlanNode childNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        PartitionSortNode globalTopnNode = new PartitionSortNode(nextPlanNodeId(), childNoop,
+                WindowFuncType.ROW_NUMBER, Collections.emptyList(), sortInfo, false, 1,
+                PartitionTopnPhase.TWO_PHASE_GLOBAL_PTOPN);
+        Pair<PlanNode, LocalExchangeType> globalOutput = globalTopnNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        // enforceRequire resolves RequireHash to LOCAL_EXECUTION_HASH_SHUFFLE (FE-planned always uses LOCAL)
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, globalOutput.second);
+        assertChildLocalExchangeType(globalTopnNode, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+
+        TrackingPlanNode childNoop2 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        PartitionSortNode passthroughNode = new PartitionSortNode(nextPlanNodeId(), childNoop2,
+                WindowFuncType.ROW_NUMBER, Collections.emptyList(), sortInfo, false, 1,
+                PartitionTopnPhase.TWO_PHASE_LOCAL_PTOPN);
+        Pair<PlanNode, LocalExchangeType> passthroughOutput = passthroughNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, passthroughOutput.second);
+        assertChildLocalExchangeType(passthroughNode, 0, LocalExchangeType.PASSTHROUGH);
+    }
+
+    @Test
+    public void testMaterializationNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        TrackingPlanNode childNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TupleDescriptor tupleDescriptor = new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement()));
+        TestMaterializationNode node = new TestMaterializationNode(nextPlanNodeId(), tupleDescriptor, childNoop);
+
+        // MaterializationNode.isSerialNode() returns true → enforceChild skips exchange.
+        // Output is still PASSTHROUGH (hardcoded in MaterializationNode).
+        Pair<PlanNode, LocalExchangeType> output = node.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, output.second);
+        // Child is NOT wrapped in LocalExchangeNode because serial operator skips exchange.
+        Assertions.assertSame(childNoop, node.getChild(0));
+    }
+
+    @Test
+    public void testCteAndRecursiveNodesAndEmptySet() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+
+        CTEScanNode cteScanNode = new CTEScanNode(new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())),
+                ScanContext.EMPTY);
+        Pair<PlanNode, LocalExchangeType> cteOutput = cteScanNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, cteOutput.second);
+
+        RecursiveCteScanNode recursiveScanNode = new RecursiveCteScanNode("r", nextPlanNodeId(),
+                new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        Pair<PlanNode, LocalExchangeType> recursiveScanOutput = recursiveScanNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, recursiveScanOutput.second);
+
+        EmptySetNode emptySetNode = new EmptySetNode(nextPlanNodeId(),
+                new ArrayList<>(Collections.singletonList(new TupleId(NEXT_ID.getAndIncrement()))));
+        Pair<PlanNode, LocalExchangeType> emptyOutput = emptySetNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, emptyOutput.second);
+
+        TrackingPlanNode recursiveChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        RecursiveCteNode recursiveNode = new RecursiveCteNode(nextPlanNodeId(), new TupleId(NEXT_ID.getAndIncrement()),
+                "r", true);
+        recursiveNode.addChild(recursiveChild);
+        Pair<PlanNode, LocalExchangeType> recursiveOutput = recursiveNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, recursiveOutput.second);
+        Assertions.assertEquals(LocalExchangeNode.NoRequire.class, recursiveChild.lastRequire.getClass());
+    }
+
+    @Test
+    public void testHashJoinNodeBranches() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        List<Expr> eqConjuncts = Collections.singletonList(Mockito.mock(BinaryPredicate.class));
+
+        TrackingPlanNode probe = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode build = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        HashJoinNode broadcastJoin = new HashJoinNode(nextPlanNodeId(), probe, build, JoinOperator.INNER_JOIN,
+                eqConjuncts, Collections.emptyList(), null, null, false);
+        broadcastJoin.setDistributionMode(DistributionMode.BROADCAST);
+        Pair<PlanNode, LocalExchangeType> broadcastOutput = broadcastJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, broadcastOutput.second);
+        Assertions.assertSame(probe, broadcastJoin.getChild(0));
+        Assertions.assertSame(build, broadcastJoin.getChild(1));
+
+        TrackingPlanNode probe2 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode build2 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        HashJoinNode bucketJoin = new HashJoinNode(nextPlanNodeId(), probe2, build2, JoinOperator.INNER_JOIN,
+                eqConjuncts, Collections.emptyList(), null, null, false);
+        bucketJoin.setDistributionMode(DistributionMode.BUCKET_SHUFFLE);
+        Pair<PlanNode, LocalExchangeType> bucketOutput = bucketJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.BUCKET_HASH_SHUFFLE, bucketOutput.second);
+        assertChildLocalExchangeType(bucketJoin, 0, LocalExchangeType.BUCKET_HASH_SHUFFLE);
+        assertChildLocalExchangeType(bucketJoin, 1, LocalExchangeType.BUCKET_HASH_SHUFFLE);
+
+        TrackingScanNode probeScan = new TrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode buildPlan = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        HashJoinNode hashJoin = new HashJoinNode(nextPlanNodeId(), probeScan, buildPlan, JoinOperator.INNER_JOIN,
+                eqConjuncts, Collections.emptyList(), null, null, false);
+        hashJoin.setDistributionMode(DistributionMode.PARTITIONED);
+        Pair<PlanNode, LocalExchangeType> hashOutput = hashJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        // enforceRequire resolves RequireHash to LOCAL_EXECUTION_HASH_SHUFFLE (FE-planned always uses LOCAL)
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, hashOutput.second);
+        assertChildLocalExchangeType(hashJoin, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+        assertChildLocalExchangeType(hashJoin, 1, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+
+        TrackingPlanNode probe3 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode build3 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        HashJoinNode nullAwareJoin = new HashJoinNode(nextPlanNodeId(), probe3, build3,
+                JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN, eqConjuncts, Collections.emptyList(), null, null, false);
+        Pair<PlanNode, LocalExchangeType> nullAwareOutput = nullAwareJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, nullAwareOutput.second);
+        Assertions.assertSame(probe3, nullAwareJoin.getChild(0));
+        Assertions.assertSame(build3, nullAwareJoin.getChild(1));
+
+        SerialTrackingPlanNode serialProbe = new SerialTrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        serialProbe.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(serialProbe.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        TrackingPlanNode nonSerialBuild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        nonSerialBuild.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(nonSerialBuild.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        HashJoinNode serialProbeBroadcast = new HashJoinNode(nextPlanNodeId(), serialProbe, nonSerialBuild,
+                JoinOperator.INNER_JOIN, eqConjuncts, Collections.emptyList(), null, null, false);
+        serialProbeBroadcast.setDistributionMode(DistributionMode.BROADCAST);
+        // BROADCAST serial check uses fragment.useSerialSource() on the HashJoinNode itself
+        serialProbeBroadcast.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(serialProbeBroadcast.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        Pair<PlanNode, LocalExchangeType> serialProbeOutput = serialProbeBroadcast.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, serialProbeOutput.second);
+        assertChildLocalExchangeType(serialProbeBroadcast, 0, LocalExchangeType.PASSTHROUGH);
+        Assertions.assertSame(nonSerialBuild, serialProbeBroadcast.getChild(1));
+
+        TrackingPlanNode nonSerialProbe = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        nonSerialProbe.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(nonSerialProbe.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        SerialTrackingPlanNode serialBuild = new SerialTrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        serialBuild.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(serialBuild.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        HashJoinNode serialBuildBroadcast = new HashJoinNode(nextPlanNodeId(), nonSerialProbe, serialBuild,
+                JoinOperator.INNER_JOIN, eqConjuncts, Collections.emptyList(), null, null, false);
+        serialBuildBroadcast.setDistributionMode(DistributionMode.BROADCAST);
+        serialBuildBroadcast.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(serialBuildBroadcast.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        Pair<PlanNode, LocalExchangeType> serialBuildOutput = serialBuildBroadcast.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, serialBuildOutput.second);
+        Assertions.assertSame(nonSerialProbe, serialBuildBroadcast.getChild(0));
+        assertChildLocalExchangeType(serialBuildBroadcast, 1, LocalExchangeType.PASS_TO_ONE);
+    }
+
+    @Test
+    public void testLocalExchangeNodeIsNotSerializedAsSerialOperator() {
+        SerialTrackingScanNode serialScan = new SerialTrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        LocalExchangeNode localExchangeNode = new LocalExchangeNode(nextPlanNodeId(), serialScan,
+                LocalExchangeType.PASSTHROUGH);
+        localExchangeNode.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(localExchangeNode.fragment.hasSerialScanNode()).thenReturn(true);
+        Mockito.when(localExchangeNode.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+
+        TPlanNode thriftNode = new TPlanNode();
+        localExchangeNode.toThrift(thriftNode);
+
+        Assertions.assertFalse(thriftNode.isIsSerialOperator(),
+                "local exchange source pipeline should not be marked serial in thrift");
+    }
+
+    @Test
+    public void testNestedLoopJoinNodeBranches() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        List<TupleId> tupleIds = Lists.newArrayList(new TupleId(NEXT_ID.getAndIncrement()));
+
+        TrackingPlanNode probe = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode build = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        NestedLoopJoinNode defaultJoin = new NestedLoopJoinNode(nextPlanNodeId(), probe, build, tupleIds,
+                JoinOperator.INNER_JOIN, false);
+        defaultJoin.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(defaultJoin.fragment.useSerialSource(Mockito.any())).thenReturn(false);
+        Pair<PlanNode, LocalExchangeType> defaultOutput = defaultJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.ADAPTIVE_PASSTHROUGH, defaultOutput.second);
+        assertChildLocalExchangeType(defaultJoin, 0, LocalExchangeType.ADAPTIVE_PASSTHROUGH);
+        Assertions.assertSame(build, defaultJoin.getChild(1));
+
+        TrackingScanNode probeScan = new TrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode buildNoop = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        NestedLoopJoinNode serialSourceJoin = new NestedLoopJoinNode(nextPlanNodeId(), probeScan, buildNoop,
+                Lists.newArrayList(new TupleId(NEXT_ID.getAndIncrement())), JoinOperator.INNER_JOIN, false);
+        serialSourceJoin.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(serialSourceJoin.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        Pair<PlanNode, LocalExchangeType> serialOutput = serialSourceJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.ADAPTIVE_PASSTHROUGH, serialOutput.second);
+        assertChildLocalExchangeType(serialSourceJoin, 0, LocalExchangeType.ADAPTIVE_PASSTHROUGH);
+        assertChildLocalExchangeType(serialSourceJoin, 1, LocalExchangeType.BROADCAST);
+
+        // RIGHT_OUTER/FULL_OUTER: probe side must use NOOP (serial processing for unmatched rows).
+        // BE: NestedLoopJoinProbeOperatorX returns NOOP for these join types.
+        TrackingPlanNode probeRight = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode buildRight = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        NestedLoopJoinNode rightOuterJoin = new NestedLoopJoinNode(nextPlanNodeId(), probeRight, buildRight,
+                Lists.newArrayList(new TupleId(NEXT_ID.getAndIncrement())),
+                JoinOperator.RIGHT_OUTER_JOIN, false);
+        rightOuterJoin.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(rightOuterJoin.fragment.useSerialSource(Mockito.any())).thenReturn(false);
+        Pair<PlanNode, LocalExchangeType> rightOuterOutput = rightOuterJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, rightOuterOutput.second);
+        Assertions.assertSame(probeRight, rightOuterJoin.getChild(0));
+
+        TrackingPlanNode probe2 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode build2 = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        NestedLoopJoinNode nullAwareJoin = new NestedLoopJoinNode(nextPlanNodeId(), probe2, build2,
+                Lists.newArrayList(new TupleId(NEXT_ID.getAndIncrement())),
+                JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN, false);
+        nullAwareJoin.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(nullAwareJoin.fragment.useSerialSource(Mockito.any())).thenReturn(false);
+        Pair<PlanNode, LocalExchangeType> nullAwareOutput = nullAwareJoin.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, nullAwareOutput.second);
+    }
+
+    @Test
+    public void testSetOperationAndAssertNumRowsNode() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+
+        UnionNode unionNode = new UnionNode(nextPlanNodeId(), new TupleId(NEXT_ID.getAndIncrement()));
+        TrackingPlanNode unionChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        unionNode.addChild(unionChild);
+        // UnionNode propagates parent hash require to children when parent requires hash.
+        // resolveExchangeType with RequireHash → LOCAL_EXECUTION_HASH_SHUFFLE
+        Pair<PlanNode, LocalExchangeType> unionOutput = unionNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, unionOutput.second);
+        Assertions.assertEquals(LocalExchangeNode.RequireHash.class, unionChild.lastRequire.getClass());
+
+        IntersectNode intersectNode = new IntersectNode(nextPlanNodeId(), new TupleId(NEXT_ID.getAndIncrement()));
+        intersectNode.setColocate(false);
+        TrackingScanNode left = new TrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        TrackingPlanNode right = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        intersectNode.addChild(left);
+        intersectNode.addChild(right);
+        Pair<PlanNode, LocalExchangeType> intersectOutput = intersectNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, intersectOutput.second);
+        assertChildLocalExchangeType(intersectNode, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+        assertChildLocalExchangeType(intersectNode, 1, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+
+        // Colocated ExceptNode with OlapScan children: OlapScan already provides BUCKET_HASH_SHUFFLE,
+        // so requireBucketHash() is satisfied and no LocalExchangeNode is inserted.
+        ExceptNode exceptNode = new ExceptNode(nextPlanNodeId(), new TupleId(NEXT_ID.getAndIncrement()));
+        exceptNode.setColocate(true);
+        FakeOlapScanNode exceptLeft = new FakeOlapScanNode(nextPlanNodeId());
+        FakeOlapScanNode exceptRight = new FakeOlapScanNode(nextPlanNodeId());
+        exceptNode.addChild(exceptLeft);
+        exceptNode.addChild(exceptRight);
+        Pair<PlanNode, LocalExchangeType> exceptOutput = exceptNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.BUCKET_HASH_SHUFFLE, exceptOutput.second);
+        // OlapScan already satisfies requireBucketHash(), so children are passed through unchanged.
+        Assertions.assertSame(exceptLeft, exceptNode.getChild(0));
+        Assertions.assertSame(exceptRight, exceptNode.getChild(1));
+
+        TrackingPlanNode assertChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        AssertNumRowsElement assertElement = Mockito.mock(AssertNumRowsElement.class);
+        Mockito.when(assertElement.getDesiredNumOfRows()).thenReturn(1L);
+        Mockito.when(assertElement.getSubqueryString()).thenReturn("subquery");
+        Mockito.when(assertElement.getAssertion()).thenReturn(AssertNumRowsElement.Assertion.EQ);
+        AssertNumRowsNode assertNode = new AssertNumRowsNode(nextPlanNodeId(), assertChild,
+                assertElement, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        // AssertNumRowsNode.isSerialNode()=true → enforceChild skips exchange.
+        Pair<PlanNode, LocalExchangeType> assertOutput = assertNode.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, assertOutput.second);
+        Assertions.assertSame(assertChild, assertNode.getChild(0));
+    }
+
+    @Test
+    public void testSortNodeBranches() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+        SortInfo sortInfo = mockSortInfo();
+
+        TrackingPlanNode mergeChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        SortNode mergeSort = new SortNode(nextPlanNodeId(), mergeChild, sortInfo, false);
+        mergeSort.setMergeByExchange();
+        Pair<PlanNode, LocalExchangeType> mergeOutput = mergeSort.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, mergeOutput.second);
+        assertChildLocalExchangeType(mergeSort, 0, LocalExchangeType.PASSTHROUGH);
+
+        // Non-merge, non-analytic SortNode: isSerialNode()=true → enforceChild skips exchange.
+        // Output is still PASSTHROUGH (hardcoded for useSerialSource + ScanNode child).
+        SerialTrackingScanNode serialScan = new SerialTrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        SortNode scanSort = new SortNode(nextPlanNodeId(), serialScan, sortInfo, false);
+        scanSort.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(scanSort.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        Pair<PlanNode, LocalExchangeType> scanOutput = scanSort.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        // Non-merge, non-analytic SortNode: isSerialNode()=true, requireChild=noRequire,
+        // outputType=NOOP. enforceRequire shouldSkipLE skips because Sort itself is serial.
+        Assertions.assertEquals(LocalExchangeType.NOOP, scanOutput.second);
+        // SortNode is serial → enforceRequire skips exchange → child unchanged.
+        Assertions.assertSame(serialScan, scanSort.getChild(0));
+
+        // Analytic sort (mergeByexchange=false): sort before analytic with partition + orderBy.
+        // AnalyticEvalNode returns NOOP (non-serial, has partition+order), SortNode enforceChild
+        // inserts LOCAL_EXECUTION_HASH_SHUFFLE (RequireHash → resolveExchangeType → LOCAL).
+        AnalyticEvalNode analyticChild = new AnalyticEvalNode(nextPlanNodeId(),
+                new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP),
+                Collections.emptyList(), Collections.singletonList(Mockito.mock(Expr.class)),
+                Collections.singletonList(new OrderByElement(Mockito.mock(Expr.class), true, true)),
+                null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        analyticChild.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(analyticChild.fragment.useSerialSource(Mockito.any())).thenReturn(false);
+        SortNode analyticSort = new SortNode(nextPlanNodeId(), analyticChild, sortInfo, false);
+        analyticSort.setIsAnalyticSort(true);  // Must set for isSerialNode() to return false
+        Pair<PlanNode, LocalExchangeType> analyticOutput = analyticSort.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, analyticOutput.second);
+        assertChildLocalExchangeType(analyticSort, 0, LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE);
+
+        // Outer merge-sort above analytic (mergeByexchange=true): BE SortSink._merge_by_exchange=true → PASSTHROUGH.
+        // Should NOT insert GLOBAL_HASH even though child is AnalyticEvalNode.
+        AnalyticEvalNode analyticChild2 = new AnalyticEvalNode(nextPlanNodeId(),
+                new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP),
+                Collections.emptyList(), Collections.emptyList(), Collections.emptyList(),
+                null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        analyticChild2.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(analyticChild2.fragment.useSerialSource(Mockito.any())).thenReturn(false);
+        SortNode mergeAnalyticSort = new SortNode(nextPlanNodeId(), analyticChild2, sortInfo, false);
+        mergeAnalyticSort.setMergeByExchange();
+        Pair<PlanNode, LocalExchangeType> mergeAnalyticOutput = mergeAnalyticSort.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, mergeAnalyticOutput.second);
+    }
+
+    @Test
+    public void testAnalyticEvalNodeBranches() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+
+        TrackingPlanNode noPartitionChild = new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        AnalyticEvalNode noPartition = new AnalyticEvalNode(nextPlanNodeId(), noPartitionChild,
+                Collections.emptyList(), Collections.emptyList(), Collections.emptyList(),
+                null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        // No partition → isSerialNode()=true → enforceChild skips exchange.
+        // Output is still PASSTHROUGH (hardcoded for empty partitions).
+        Pair<PlanNode, LocalExchangeType> noPartitionOutput = noPartition.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, noPartitionOutput.second);
+        Assertions.assertSame(noPartitionChild, noPartition.getChild(0));
+
+        // Analytic with partition but no orderBy, non-colocated → noRequire/NOOP.
+        // (Non-colocated analytic relies on parent SortNode to handle distribution.)
+        TrackingScanNode hashChild = new TrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        AnalyticEvalNode hashAnalytic = new AnalyticEvalNode(nextPlanNodeId(), hashChild,
+                Collections.emptyList(), Collections.singletonList(Mockito.mock(Expr.class)),
+                Collections.emptyList(), null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        Pair<PlanNode, LocalExchangeType> hashOutput = hashAnalytic.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, hashOutput.second);
+        // No exchange inserted — child remains unchanged.
+        Assertions.assertSame(hashChild, hashAnalytic.getChild(0));
+
+        SerialTrackingScanNode serialScan = new SerialTrackingScanNode(nextPlanNodeId(), LocalExchangeType.NOOP);
+        AnalyticEvalNode orderedAnalytic = new AnalyticEvalNode(nextPlanNodeId(), serialScan,
+                Collections.emptyList(), Collections.singletonList(Mockito.mock(Expr.class)),
+                Collections.singletonList(new OrderByElement(Mockito.mock(Expr.class), true, true)),
+                null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
+        orderedAnalytic.fragment = Mockito.mock(PlanFragment.class);
+        Mockito.when(orderedAnalytic.fragment.useSerialSource(Mockito.any())).thenReturn(true);
+        Pair<PlanNode, LocalExchangeType> orderedOutput = orderedAnalytic.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, orderedOutput.second);
+        assertChildLocalExchangeType(orderedAnalytic, 0, LocalExchangeType.PASSTHROUGH);
+    }
+
+    @Test
+    public void testExchangeNodeBranches() {
+        PlanTranslatorContext ctx = new PlanTranslatorContext();
+
+        ExchangeNode hashExchange = new ExchangeNode(nextPlanNodeId(),
+                new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP));
+        hashExchange.setPartitionType(TPartitionType.HASH_PARTITIONED);
+        Pair<PlanNode, LocalExchangeType> hashOutput = hashExchange.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE, hashOutput.second);
+
+        ExchangeNode bucketExchange = new ExchangeNode(nextPlanNodeId(),
+                new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP));
+        bucketExchange.setPartitionType(TPartitionType.BUCKET_SHFFULE_HASH_PARTITIONED);
+        Pair<PlanNode, LocalExchangeType> bucketOutput = bucketExchange.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.noRequire());
+        Assertions.assertEquals(LocalExchangeType.BUCKET_HASH_SHUFFLE, bucketOutput.second);
+
+        ExchangeNode noopExchange = new ExchangeNode(nextPlanNodeId(),
+                new TrackingPlanNode(nextPlanNodeId(), LocalExchangeType.NOOP));
+        noopExchange.setPartitionType(TPartitionType.UNPARTITIONED);
+        Pair<PlanNode, LocalExchangeType> noopOutput = noopExchange.enforceAndDeriveLocalExchange(
+                ctx, null, LocalExchangeTypeRequire.requireHash());
+        Assertions.assertEquals(LocalExchangeType.NOOP, noopOutput.second);
+    }
+
+    private static PlanNodeId nextPlanNodeId() {
+        return new PlanNodeId(NEXT_ID.getAndIncrement());
+    }
+
+    private static void assertChildLocalExchangeType(PlanNode node, int index, LocalExchangeType expectedType) {
+        Assertions.assertTrue(node.getChild(index) instanceof LocalExchangeNode,
+                "expected child " + index + " to be LocalExchangeNode");
+        LocalExchangeNode exchangeNode = (LocalExchangeNode) node.getChild(index);
+        Assertions.assertEquals(expectedType, exchangeNode.getExchangeType());
+    }
+
+    private static SortInfo mockSortInfo() {
+        SortInfo sortInfo = Mockito.mock(SortInfo.class);
+        TupleDescriptor sortTuple = new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement()));
+        Mockito.when(sortInfo.getOrderingExprs()).thenReturn(Collections.emptyList());
+        Mockito.when(sortInfo.getIsAscOrder()).thenReturn(Collections.emptyList());
+        Mockito.when(sortInfo.getSortTupleDescriptor()).thenReturn(sortTuple);
+        return sortInfo;
+    }
+
+    private static class TrackingPlanNode extends PlanNode {
+        private final LocalExchangeType providedType;
+        private LocalExchangeTypeRequire lastRequire;
+
+        TrackingPlanNode(PlanNodeId id, LocalExchangeType providedType) {
+            super(id, Lists.newArrayList(new TupleId(id.asInt() + 10000)), "TRACKING");
+            this.providedType = providedType;
+        }
+
+        @Override
+        public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+                PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+            this.lastRequire = parentRequire;
+            return Pair.of(this, providedType);
+        }
+
+        @Override
+        protected void toThrift(TPlanNode msg) {
+        }
+
+        @Override
+        public String getNodeExplainString(String prefix, TExplainLevel detailLevel) {
+            return "";
+        }
+    }
+
+    private static class SerialTrackingPlanNode extends TrackingPlanNode {
+        SerialTrackingPlanNode(PlanNodeId id, LocalExchangeType providedType) {
+            super(id, providedType);
+        }
+
+        @Override
+        public boolean isSerialNode() {
+            return true;
+        }
+    }
+
+    private static class TrackingScanNode extends ScanNode {
+        private final LocalExchangeType providedType;
+        private LocalExchangeTypeRequire lastRequire;
+
+        TrackingScanNode(PlanNodeId id, LocalExchangeType providedType) {
+            super(id, new TupleDescriptor(new TupleId(id.asInt() + 20000)), "TRACKING_SCAN", ScanContext.EMPTY);
+            this.providedType = providedType;
+        }
+
+        @Override
+        public Pair<PlanNode, LocalExchangeType> enforceAndDeriveLocalExchange(
+                PlanTranslatorContext translatorContext, PlanNode parent, LocalExchangeTypeRequire parentRequire) {
+            this.lastRequire = parentRequire;
+            return Pair.of(this, providedType);
+        }
+
+        @Override
+        protected void createScanRangeLocations() throws UserException {
+        }
+
+        @Override
+        public List<TScanRangeLocations> getScanRangeLocations(long maxScanRangeLength) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        protected void toThrift(TPlanNode msg) {
+        }
+
+        @Override
+        public String getNodeExplainString(String prefix, TExplainLevel detailLevel) {
+            return "";
+        }
+    }
+
+    private static class SerialTrackingScanNode extends TrackingScanNode {
+        SerialTrackingScanNode(PlanNodeId id, LocalExchangeType providedType) {
+            super(id, providedType);
+        }
+
+        @Override
+        public boolean isSerialNode() {
+            return true;
+        }
+    }
+
+    private static class FakeOlapScanNode extends OlapScanNode {
+        FakeOlapScanNode(PlanNodeId id) {
+            super(id, mockTupleDescriptor(id), "FAKE_OLAP_SCAN", ScanContext.EMPTY);
+        }
+
+        @Override
+        protected void createScanRangeLocations() throws UserException {
+        }
+
+        @Override
+        public List<TScanRangeLocations> getScanRangeLocations(long maxScanRangeLength) {
+            return Collections.emptyList();
+        }
+
+        private static TupleDescriptor mockTupleDescriptor(PlanNodeId id) {
+            TupleDescriptor desc = Mockito.mock(TupleDescriptor.class);
+            org.apache.doris.catalog.OlapTable table = Mockito.mock(org.apache.doris.catalog.OlapTable.class);
+            Mockito.when(desc.getId()).thenReturn(new TupleId(id.asInt() + 30000));
+            Mockito.when(desc.getTable()).thenReturn(table);
+            Mockito.when(desc.getSlots()).thenReturn(new ArrayList<SlotDescriptor>());
+            Mockito.when(table.getDistributionColumnNames()).thenReturn(Collections.emptySet());
+            return desc;
+        }
+    }
+
+    private static class TestMaterializationNode extends MaterializationNode {
+        TestMaterializationNode(PlanNodeId id, TupleDescriptor desc, PlanNode child) {
+            super(id, desc, child);
+        }
+
+        @Override
+        public void initNodeInfo() {
+        }
+    }
+}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/LocalExchangePlannerTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/LocalExchangePlannerTest.java
new file mode 100644
index 00000000000..3d9f522facc
--- /dev/null
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/LocalExchangePlannerTest.java
@@ -0,0 +1,372 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.qe;
+
+import org.apache.doris.analysis.TupleDescriptor;
+import org.apache.doris.analysis.TupleId;
+import org.apache.doris.common.UserException;
+import org.apache.doris.nereids.NereidsPlanner;
+import org.apache.doris.nereids.glue.translator.PlanTranslatorContext;
+import org.apache.doris.planner.AddLocalExchange;
+import org.apache.doris.planner.LocalExchangeNode;
+import org.apache.doris.planner.LocalExchangeNode.LocalExchangeType;
+import org.apache.doris.planner.PlanFragment;
+import org.apache.doris.planner.PlanNode;
+import org.apache.doris.planner.PlanNodeId;
+import org.apache.doris.planner.ScanContext;
+import org.apache.doris.planner.ScanNode;
+import org.apache.doris.thrift.TExplainLevel;
+import org.apache.doris.thrift.TPlanNode;
+import org.apache.doris.thrift.TScanRangeLocations;
+import org.apache.doris.utframe.TestWithFeService;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+public class LocalExchangePlannerTest extends TestWithFeService {
+    @Override
+    protected int backendNum() {
+        return 3;
+    }
+
+    @Override
+    protected void runBeforeAll() throws Exception {
+        createDatabase("test");
+        useDatabase("test");
+        createTable("CREATE TABLE test.t1 (k1 INT, k2 INT, v1 INT) "
+                + "DISTRIBUTED BY HASH(k1) BUCKETS 6 "
+                + "PROPERTIES ('replication_num'='1')");
+        createTable("CREATE TABLE test.t2 (k1 INT, k2 INT, v2 INT) "
+                + "DISTRIBUTED BY HASH(k1) BUCKETS 6 "
+                + "PROPERTIES ('replication_num'='1')");
+    }
+
+    @Test
+    public void testAggFromScanUsesLocalExecutionHashShuffle() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(true);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        // With the Bug 7 fix, OlapScanNode returns NOOP (no self-wrapping),
+        // so the parent AggregationNode's requireHash() resolves to
+        // LOCAL_EXECUTION_HASH_SHUFFLE (scan child → local hash).
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, k2, count(*) from test.t1 group by k1, k2");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+        String explain = collectFragmentExplain(planner.getFragments());
+
+        Assertions.assertTrue(types.contains(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE),
+                "expected LOCAL_EXECUTION_HASH_SHUFFLE in plan, actual: " + types);
+        Assertions.assertTrue(explain.contains("LOCAL_EXECUTION_HASH_SHUFFLE"),
+                "expected LOCAL_EXECUTION_HASH_SHUFFLE in explain output, actual explain: " + explain);
+    }
+
+    @Test
+    public void testNonSerialScanKeepsBucketHashDistribution() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(false);
+        connectContext.getSessionVariable().setPipelineTaskNum("1");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, count(*) from test.t1 group by k1 order by k1");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        String explain = collectFragmentExplain(planner.getFragments());
+
+        Assertions.assertFalse(explain.contains("LOCAL_EXECUTION_HASH_SHUFFLE"),
+                "non-serial scan should keep BUCKET_HASH_SHUFFLE output and avoid local hash exchange, explain: "
+                        + explain);
+    }
+
+    @Test
+    public void testJoinPlanContainsHashShuffle() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(true);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select a.k1, count(*) "
+                        + "from test.t1 a join test.t2 b on a.k1 = b.k1 group by a.k1");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        // With pooling scan and local shuffle planner, hash exchanges should be present
+        boolean hasHashShuffle = types.stream().anyMatch(t -> t.isHashShuffle());
+        Assertions.assertTrue(hasHashShuffle || types.contains(LocalExchangeType.PASSTHROUGH),
+                "expected hash shuffle or passthrough in plan, actual: " + types);
+    }
+
+    @Test
+    public void testNoopLocalExchangeNotInjected() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql("explain distributed plan select * from test.t1 limit 1");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        Assertions.assertFalse(types.contains(LocalExchangeType.NOOP),
+                "NOOP local exchange should not be materialized as a node");
+    }
+
+    @Test
+    public void testHashShuffleHasDistributeExprs() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(true);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        // Use a simple agg query that reliably produces hash local exchange
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, k2, count(*) from test.t1 group by k1, k2");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        List<LocalExchangeNode> localExchanges = collectLocalExchangeNodes(planner.getFragments());
+
+        boolean hasHashShuffleWithExpr = localExchanges.stream().anyMatch(node ->
+                node.getExchangeType().isHashShuffle()
+                && node.getDistributeExprLists() != null
+                && !node.getDistributeExprLists().isEmpty());
+        String exchangeInfo = localExchanges.stream()
+                .map(n -> n.getExchangeType() + "(exprs=" + n.getDistributeExprLists() + ")")
+                .collect(java.util.stream.Collectors.joining(", "));
+        Assertions.assertTrue(hasHashShuffleWithExpr,
+                "expected at least one hash local exchange with distribute exprs, found: " + exchangeInfo);
+    }
+
+    @Test
+    public void testRequireHashSatisfyAllHashShuffleTypes() {
+        LocalExchangeNode.LocalExchangeTypeRequire requireHash = LocalExchangeNode.LocalExchangeTypeRequire.requireHash();
+        Assertions.assertTrue(requireHash.satisfy(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE));
+        Assertions.assertTrue(requireHash.satisfy(LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE));
+        Assertions.assertTrue(requireHash.satisfy(LocalExchangeType.BUCKET_HASH_SHUFFLE));
+        Assertions.assertFalse(requireHash.satisfy(LocalExchangeType.PASSTHROUGH));
+    }
+
+    @Test
+    public void testSetOperationUnderAggHasHashShuffle() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(false);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, count(*) from ("
+                        + "select k1 from test.t1 union all select k1 from test.t2"
+                        + ") u group by k1");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        // With non-pooling scan and colocated bucket distribution, local exchanges may
+        // not be inserted. Verify plan at least doesn't crash and contains valid exchange types.
+        boolean hasLocalExchange = !types.isEmpty();
+        // If local exchanges are present, they should include hash shuffle types
+        if (hasLocalExchange) {
+            boolean hasHashShuffle = types.stream().anyMatch(t -> t.isHashShuffle());
+            Assertions.assertTrue(hasHashShuffle,
+                    "expected hash shuffle in set-operation plan when exchanges present, actual: " + types);
+        }
+    }
+
+    @Test
+    public void testAnalyticPlanContainsPassthroughAndLocalHashShuffle() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(true);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, k2, row_number() over(partition by k1 order by k2) "
+                        + "from test.t1 order by k1, k2");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        // Analytic plan: mergeByExchange sort inserts PASSTHROUGH.
+        // With pooling scan (ignore_storage_data_distribution=true), hash or passthrough exchanges expected.
+        Assertions.assertTrue(types.contains(LocalExchangeType.PASSTHROUGH),
+                "expected PASSTHROUGH in analytic plan, actual: " + types);
+    }
+
+    @Test
+    public void testGroupingSetsPlanContainsHashShuffle() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(false);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select k1, k2, sum(v1) from test.t1 "
+                        + "group by grouping sets((k1), (k1, k2))");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        Assertions.assertFalse(types.contains(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE),
+                "grouping-sets plan should not force local execution hash shuffle when scan keeps bucket"
+                        + " distribution, actual: " + types);
+    }
+
+    @Test
+    public void testLocalAndGlobalExecutionHashShufflePreferType() {
+        PlanTranslatorContext translatorContext = new PlanTranslatorContext();
+        LocalExchangeNode.LocalExchangeTypeRequire requireHash = LocalExchangeNode.LocalExchangeTypeRequire.requireHash();
+        LocalExchangeNode.LocalExchangeTypeRequire requireBucketHash
+                = LocalExchangeNode.LocalExchangeTypeRequire.requireBucketHash();
+        LocalExchangeNode.LocalExchangeTypeRequire requireGlobalHash
+                = LocalExchangeNode.LocalExchangeTypeRequire.requireGlobalExecutionHash();
+
+        LocalExchangeType localType = AddLocalExchange.resolveExchangeType(
+                requireHash, translatorContext, null, new MockScanNode(new PlanNodeId(1001)));
+        LocalExchangeType globalType = AddLocalExchange.resolveExchangeType(
+                requireHash, translatorContext, null, new MockPlanNode(new PlanNodeId(1002)));
+        // Explicit GLOBAL_EXECUTION_HASH_SHUFFLE must NOT be degraded, even on a scan path.
+        // If it appears on a scan path, the plan is wrong — not something resolveExchangeType should fix.
+        LocalExchangeType explicitGlobalOnScanType = AddLocalExchange.resolveExchangeType(
+                requireGlobalHash, translatorContext, null, new MockScanNode(new PlanNodeId(1003)));
+
+        // shouldUseLocalExecutionHash always returns true → RequireHash always resolves to LOCAL
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, localType);
+        Assertions.assertEquals(LocalExchangeType.LOCAL_EXECUTION_HASH_SHUFFLE, globalType);
+        // Explicit GLOBAL (RequireSpecific) must NOT be degraded.
+        Assertions.assertEquals(LocalExchangeType.GLOBAL_EXECUTION_HASH_SHUFFLE, explicitGlobalOnScanType);
+        Assertions.assertEquals(LocalExchangeType.BUCKET_HASH_SHUFFLE, requireBucketHash.preferType());
+    }
+
+    @Test
+    public void testMixedPlanWithPoolingScan() throws Exception {
+        connectContext.getSessionVariable().setEnableLocalShufflePlanner(true);
+        connectContext.getSessionVariable().setEnableLocalShuffle(true);
+        connectContext.getSessionVariable().setEnableNereidsDistributePlanner(true);
+        connectContext.getSessionVariable().setIgnoreStorageDataDistribution(true);
+        connectContext.getSessionVariable().setPipelineTaskNum("4");
+        connectContext.getSessionVariable().setForceToLocalShuffle(false);
+
+        StmtExecutor executor = executeNereidsSql(
+                "explain distributed plan select u.k1, count(*) from ("
+                        + "select k1, k2 from test.t1 group by grouping sets((k1), (k1, k2))"
+                        + ") u join test.t2 b on u.k1 = b.k1 group by u.k1");
+        NereidsPlanner planner = (NereidsPlanner) executor.planner();
+        EnumSet<LocalExchangeType> types = collectLocalExchangeTypes(planner.getFragments());
+
+        // With pooling scan, local exchanges should be present
+        Assertions.assertFalse(types.isEmpty(),
+                "expected local exchanges in mixed plan with pooling scan, actual: " + types);
+    }
+
+    private EnumSet<LocalExchangeType> collectLocalExchangeTypes(List<PlanFragment> fragments) {
+        EnumSet<LocalExchangeType> types = EnumSet.noneOf(LocalExchangeType.class);
+        for (PlanFragment fragment : fragments) {
+            collect(fragment.getPlanRoot(), types);
+        }
+        return types;
+    }
+
+    private List<LocalExchangeNode> collectLocalExchangeNodes(List<PlanFragment> fragments) {
+        List<LocalExchangeNode> nodes = new ArrayList<>();
+        for (PlanFragment fragment : fragments) {
+            collectLocalExchangeNode(fragment.getPlanRoot(), nodes);
+        }
+        return nodes;
+    }
+
+    private String collectFragmentExplain(List<PlanFragment> fragments) {
+        StringBuilder explain = new StringBuilder();
+        for (PlanFragment fragment : fragments) {
+            explain.append(fragment.getExplainString(TExplainLevel.NORMAL));
+        }
+        return explain.toString();
+    }
+
+    private void collect(PlanNode node, EnumSet<LocalExchangeType> types) {
+        if (node instanceof LocalExchangeNode) {
+            types.add(((LocalExchangeNode) node).getExchangeType());
+        }
+        for (PlanNode child : node.getChildren()) {
+            collect(child, types);
+        }
+    }
+
+    private void collectLocalExchangeNode(PlanNode node, List<LocalExchangeNode> nodes) {
+        if (node instanceof LocalExchangeNode) {
+            nodes.add((LocalExchangeNode) node);
+        }
+        for (PlanNode child : node.getChildren()) {
+            collectLocalExchangeNode(child, nodes);
+        }
+    }
+
+    private static class MockPlanNode extends PlanNode {
+        MockPlanNode(PlanNodeId id) {
+            super(id, "MOCK-PLAN");
+        }
+
+        @Override
+        protected void toThrift(TPlanNode msg) {
+        }
+
+        @Override
+        public String getNodeExplainString(String prefix, TExplainLevel detailLevel) {
+            return "";
+        }
+    }
+
+    private static class MockScanNode extends ScanNode {
+        MockScanNode(PlanNodeId id) {
+            super(id, new TupleDescriptor(new TupleId(id.asInt())), "MOCK-SCAN", ScanContext.EMPTY);
+        }
+
+        @Override
+        protected void createScanRangeLocations() throws UserException {
+        }
+
+        @Override
+        public List<TScanRangeLocations> getScanRangeLocations(long maxScanRangeLength) {
+            return java.util.Collections.emptyList();
+        }
+
+        @Override
+        protected void toThrift(TPlanNode msg) {
+        }
+
+        @Override
+        public String getNodeExplainString(String prefix, TExplainLevel detailLevel) {
+            return "";
+        }
+    }
+}
diff --git a/gensrc/thrift/PaloInternalService.thrift b/gensrc/thrift/PaloInternalService.thrift
index b8d2c2655cf..d9139d9ac28 100644
--- a/gensrc/thrift/PaloInternalService.thrift
+++ b/gensrc/thrift/PaloInternalService.thrift
@@ -471,7 +471,6 @@ struct TQueryOptions {
   // session variable `spill_repartition_max_depth` in FE. Default is 8.
   209: optional i32 spill_repartition_max_depth = 8
 
-
   210: optional double max_scan_mem_ratio = 0.3;
   211: optional bool enable_adaptive_scan = false;
 
@@ -492,6 +491,9 @@ struct TQueryOptions {
   // Push LIMIT into SegmentIterator when safe.
   219: optional bool enable_segment_limit_pushdown = true
 
+  // enable plan local exchange node in fe
+  220: optional bool enable_local_shuffle_planner;
+
   // For cloud, to control if the content would be written into file cache
   // In write path, to control if the content would be written into file cache.
   // In read path, read from file cache or remote storage when execute query.
diff --git a/gensrc/thrift/Partitions.thrift b/gensrc/thrift/Partitions.thrift
index de6ba8127af..bf23f418eaf 100644
--- a/gensrc/thrift/Partitions.thrift
+++ b/gensrc/thrift/Partitions.thrift
@@ -55,6 +55,40 @@ enum TPartitionType {
   MERGE_PARTITIONED = 9
 }
 
+enum TLocalPartitionType {
+  NOOP = 0,
+  // used to resume the global hash distribution because other distribution break the global hash distribution,
+  // such as PASSTHROUGH. and then JoinNode can shuffle data by the same hash distribution.
+  //
+  // for example:                                   look here, need resume to GLOBAL_EXECUTION_HASH_SHUFFLE
+  //                                                                            ↓
+  //   Node -> LocalExchangeNode(PASSTHROUGH) → JoinNode →  LocalExchangeNode(GLOBAL_EXECUTION_HASH_SHUFFLE) → JoinNode
+  //                  ExchangeNode(BROADCAST) ↗                                                                  ↑
+  //                                                                         ExchangeNode(GLOBAL_EXECUTION_HASH_SHUFFLE)
+  GLOBAL_EXECUTION_HASH_SHUFFLE = 1,
+  // used to rebalance data for rebalance data and add parallelism
+  //
+  // for example:          look here, need use LOCAL_EXECUTION_HASH_SHUFFLE to rebalance data
+  //                                         ↓
+  //  Scan(hash(id)) -> LocalExchangeNode(LOCAL_EXECUTION_HASH_SHUFFLE(id, name)) → AggregationNode(group by(id,name))
+  //
+  // the LOCAL_EXECUTION_HASH_SHUFFLE is necessary because the hash distribution of scan node is based on id,
+  // but the hash distribution of aggregation node is based on id and name, so we need to rebalance data by both
+  // id and name to make sure the data with same id and name can be sent to the same instance of aggregation node.
+  // and we can not use GLOBAL_EXECUTION_HASH_SHUFFLE(id, name) here, because
+  // `TPipelineFragmentParams.shuffle_idx_to_instance_idx` is used to mapping partial global instance index to local
+  // instance index, and discard the other backend's instance index, the data not belong to the local instance will be
+  // discarded, which cause data loss.
+  LOCAL_EXECUTION_HASH_SHUFFLE = 2,
+  BUCKET_HASH_SHUFFLE = 3,
+  // round-robin partition, used to rebalance data for rebalance data and add parallelism
+  PASSTHROUGH = 4,
+  ADAPTIVE_PASSTHROUGH = 5,
+  BROADCAST = 6,
+  PASS_TO_ONE = 7,
+  LOCAL_MERGE_SORT = 8
+}
+
 enum TDistributionType {
   UNPARTITIONED = 0,
 
@@ -119,3 +153,5 @@ struct TDataPartition {
   3: optional list<TRangePartition> partition_infos
   4: optional TMergePartitionInfo merge_partition_info
 }
+
+
diff --git a/gensrc/thrift/PlanNodes.thrift b/gensrc/thrift/PlanNodes.thrift
index 843087ff45a..a28729a3a0c 100644
--- a/gensrc/thrift/PlanNodes.thrift
+++ b/gensrc/thrift/PlanNodes.thrift
@@ -63,7 +63,8 @@ enum TPlanNodeType {
   MATERIALIZATION_NODE = 34,
   REC_CTE_NODE = 35,
   REC_CTE_SCAN_NODE = 36,
-  BUCKETED_AGGREGATION_NODE = 37
+  BUCKETED_AGGREGATION_NODE = 37,
+  LOCAL_EXCHANGE_NODE = 38
 }
 
 struct TKeyRange {
@@ -1361,6 +1362,24 @@ struct TExchangeNode {
   4: optional Partitions.TPartitionType partition_type
 }
 
+struct TLocalExchangeNode {
+  1: required Partitions.TLocalPartitionType partition_type
+  // when partition_type in (GLOBAL_EXECUTION_HASH_SHUFFLE, LOCAL_EXECUTION_HASH_SHUFFLE, BUCKET_HASH_SHUFFLE),
+  // the distribute_expr_lists is not null, and the legacy `TPlanNode.distribute_expr_lists` is deprecated
+  //
+  // the hash computation:
+  // 1. for BUCKET_HASH_SHUFFLE, use distribution_exprs to compute hash value and mod by
+  //    `TPipelineFragmentParams.num_buckets`, and mapping bucket index to local instance id by
+  //    `TPipelineFragmentParams.bucket_seq_to_instance_idx`
+  // 2. for LOCAL_EXECUTION_HASH_SHUFFLE, use distribution_exprs to compute hash value and mod by
+  //    `TPipelineFragmentParams.local_params.size`, and backend will mapping instance index to local instance
+  //    by `i -> i`, for example: 1 -> 1, 2 -> 2, ...
+  // 3. for GLOBAL_EXECUTION_HASH_SHUFFLE, use distribution_exprs to compute hash value and mod by
+  //    `TPipelineFragmentParams.total_instances`, and mapping global instance index to local instance by
+  //    `TPipelineFragmentParams.shuffle_idx_to_instance_idx`
+  2: optional list<Exprs.TExpr> distribute_expr_lists
+}
+
 struct TOlapRewriteNode {
     1: required list<Exprs.TExpr> columns
     2: required list<Types.TColumnType> column_types
@@ -1578,6 +1597,7 @@ struct TPlanNode {
   51: optional bool is_serial_operator
   52: optional TRecCTEScanNode rec_cte_scan_node
   53: optional TBucketedAggregationNode bucketed_agg_node
+  54: optional TLocalExchangeNode local_exchange_node
 
   // projections is final projections, which means projecting into results and materializing them into the output block.
   101: optional list<Exprs.TExpr> projections
diff --git a/regression-test/data/query_p0/join/test_multilevel_join_agg_local_shuffle.out b/regression-test/data/query_p0/join/test_multilevel_join_agg_local_shuffle.out
new file mode 100644
index 00000000000..8ccf2921dfa
--- /dev/null
+++ b/regression-test/data/query_p0/join/test_multilevel_join_agg_local_shuffle.out
@@ -0,0 +1,2865 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !bucket_shuffle_broadcast_agg_stage_1_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+----------------------PhysicalProject
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_shuffle_broadcast_agg_stage_1_result_on --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_agg_stage_1_result_off --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_agg_stage_2_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+----------------------PhysicalProject
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_shuffle_broadcast_agg_stage_2_result_on --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_agg_stage_2_result_off --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_agg_stage_3_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+----------------------PhysicalProject
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_shuffle_broadcast_agg_stage_3_result_on --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_agg_stage_3_result_off --
+1	52	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_1_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d2.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !shuffle_broadcast_broadcast_agg_stage_1_result_on --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_1_result_off --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_2_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d2.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !shuffle_broadcast_broadcast_agg_stage_2_result_on --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_2_result_off --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_3_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d2.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = d1.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !shuffle_broadcast_broadcast_agg_stage_3_result_on --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !shuffle_broadcast_broadcast_agg_stage_3_result_off --
+1	10	62	10
+2	5	54	20
+3	5	38	30
+4	6	49	40
+
+-- !bucket_broadcast_shuffle_agg_stage_1_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalDistribute[DistributionSpecHash]
+------------------------hashAgg[LOCAL]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_broadcast_shuffle_agg_stage_1_result_on --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_broadcast_shuffle_agg_stage_1_result_off --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_broadcast_shuffle_agg_stage_2_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalDistribute[DistributionSpecHash]
+------------------------hashAgg[LOCAL]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_broadcast_shuffle_agg_stage_2_result_on --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_broadcast_shuffle_agg_stage_2_result_off --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_broadcast_shuffle_agg_stage_3_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = c1.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalProject
+------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((ab.k1 = d.k1)) otherCondition=()
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+------------------PhysicalProject
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalDistribute[DistributionSpecHash]
+------------------------hashAgg[LOCAL]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_broadcast_shuffle_agg_stage_3_result_on --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_broadcast_shuffle_agg_stage_3_result_off --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !alternating_bucket_bucket_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+-- !alternating_bucket_bucket_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_bucket_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_bucket_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_bucket_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_bucket_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_bucket_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_bucket_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_bucket_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_shuffle_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_shuffle_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_shuffle_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_shuffle_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_broadcast_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_broadcast_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_bucket_broadcast_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_bucket_broadcast_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_bucket_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_bucket_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_bucket_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_bucket_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_shuffle_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_shuffle_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_shuffle_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_shuffle_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_broadcast_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_broadcast_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_shuffle_broadcast_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_shuffle_broadcast_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_bucket_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_bucket_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_bucket_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_bucket_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_shuffle_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_shuffle_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_shuffle_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_shuffle_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_broadcast_bucket_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_bucket_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_shuffle_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1 [shuffle]_2
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_broadcast_shuffle_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_shuffle_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((s2.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((expr_cast(k1 as BIGINT) = c.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN broadcast] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !alternating_broadcast_broadcast_broadcast_result_on --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !alternating_broadcast_broadcast_broadcast_result_off --
+1	63	16	11
+2	16	24	22
+3	16	35	33
+4	19	46	44
+
+-- !window_union_all_bucket_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalUnion
+------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_union_all_bucket_row_number_result_on --
+1	52	4	40
+2	21	3	60
+3	16	2	60
+4	20	2	80
+
+-- !window_union_all_bucket_row_number_result_off --
+1	52	4	40
+2	21	3	60
+3	16	2	60
+4	20	2	80
+
+-- !window_union_all_bucket_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalUnion
+------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_union_all_bucket_window_sum_result_on --
+1	10	13	40
+2	6	7	60
+3	3	8	60
+4	3	10	80
+
+-- !window_union_all_bucket_window_sum_result_off --
+1	10	13	40
+2	6	7	60
+3	3	8	60
+4	3	10	80
+
+-- !window_union_all_shuffle_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalUnion
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_all_shuffle_row_number_result_on --
+1	208	8	44
+2	21	3	21
+3	16	2	16
+4	20	2	18
+
+-- !window_union_all_shuffle_row_number_result_off --
+1	208	8	44
+2	21	3	21
+3	16	2	16
+4	20	2	18
+
+-- !window_union_all_shuffle_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalUnion
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_all_shuffle_window_sum_result_on --
+1	36	26	44
+2	6	7	21
+3	3	8	16
+4	3	10	18
+
+-- !window_union_all_shuffle_window_sum_result_off --
+1	36	26	44
+2	6	7	21
+3	3	8	16
+4	3	10	18
+
+-- !window_union_all_broadcast_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalUnion
+--------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_all_broadcast_row_number_result_on --
+1	52	4	40
+2	21	3	60
+3	16	2	60
+4	20	2	80
+
+-- !window_union_all_broadcast_row_number_result_off --
+1	52	4	40
+2	21	3	60
+3	16	2	60
+4	20	2	80
+
+-- !window_union_all_broadcast_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalUnion
+--------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_all_broadcast_window_sum_result_on --
+1	10	13	40
+2	6	7	60
+3	3	8	60
+4	3	10	80
+
+-- !window_union_all_broadcast_window_sum_result_off --
+1	10	13	40
+2	6	7	60
+3	3	8	60
+4	3	10	80
+
+-- !window_except_bucket_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalExcept
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_except_bucket_row_number_result_on --
+1	10	2	20
+2	10	2	40
+3	5	1	30
+4	6	1	40
+
+-- !window_except_bucket_row_number_result_off --
+1	10	2	20
+2	10	2	40
+3	5	1	30
+4	6	1	40
+
+-- !window_except_bucket_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalExcept
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_except_bucket_window_sum_result_on --
+1	3	5	20
+2	3	5	40
+3	1	5	30
+4	1	6	40
+
+-- !window_except_bucket_window_sum_result_off --
+1	3	5	20
+2	3	5	40
+3	1	5	30
+4	1	6	40
+
+-- !window_except_shuffle_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalExcept
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_except_shuffle_row_number_result_on --
+1	40	4	22
+2	10	2	14
+3	5	1	8
+4	6	1	9
+
+-- !window_except_shuffle_row_number_result_off --
+1	40	4	22
+2	10	2	14
+3	5	1	8
+4	6	1	9
+
+-- !window_except_shuffle_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalExcept
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_except_shuffle_window_sum_result_on --
+1	10	10	22
+2	3	5	14
+3	1	5	8
+4	1	6	9
+
+-- !window_except_shuffle_window_sum_result_off --
+1	10	10	22
+2	3	5	14
+3	1	5	8
+4	1	6	9
+
+-- !window_except_broadcast_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalExcept
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_except_broadcast_row_number_result_on --
+1	10	2	20
+2	10	2	40
+3	5	1	30
+4	6	1	40
+
+-- !window_except_broadcast_row_number_result_off --
+1	10	2	20
+2	10	2	40
+3	5	1	30
+4	6	1	40
+
+-- !window_except_broadcast_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalExcept
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_except_broadcast_window_sum_result_on --
+1	3	5	20
+2	3	5	40
+3	1	5	30
+4	1	6	40
+
+-- !window_except_broadcast_window_sum_result_off --
+1	3	5	20
+2	3	5	40
+3	1	5	30
+4	1	6	40
+
+-- !window_intersect_bucket_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalIntersect
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_intersect_bucket_row_number_result_on --
+
+-- !window_intersect_bucket_row_number_result_off --
+
+-- !window_intersect_bucket_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffle] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+----------------------PhysicalIntersect
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+-- !window_intersect_bucket_window_sum_result_on --
+
+-- !window_intersect_bucket_window_sum_result_off --
+
+-- !window_intersect_shuffle_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalIntersect
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_intersect_shuffle_row_number_result_on --
+
+-- !window_intersect_shuffle_row_number_result_off --
+
+-- !window_intersect_shuffle_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = rhs.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalIntersect
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_intersect_shuffle_window_sum_result_on --
+
+-- !window_intersect_shuffle_window_sum_result_off --
+
+-- !window_intersect_broadcast_row_number_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalIntersect
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_intersect_broadcast_row_number_result_on --
+
+-- !window_intersect_broadcast_row_number_result_off --
+
+-- !window_intersect_broadcast_window_sum_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((mid_q.k1 = rhs.k1)) otherCondition=()
+------------------------PhysicalIntersect
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(rhs)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_intersect_broadcast_window_sum_result_on --
+
+-- !window_intersect_broadcast_window_sum_result_off --
+
+-- !bucket_broadcast_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !bucket_broadcast_agg_result_on --
+1	26	10
+2	9	20
+3	8	30
+4	10	40
+
+-- !bucket_broadcast_agg_result_off --
+1	26	10
+2	9	20
+3	8	30
+4	10	40
+
+-- !partitioned_broadcast_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !partitioned_broadcast_agg_result_on --
+1	32	10
+2	19	20
+3	13	30
+4	15	40
+
+-- !partitioned_broadcast_agg_result_off --
+1	32	10
+2	19	20
+3	13	30
+4	15	40
+
+-- !bucket_partitioned_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------hashAgg[GLOBAL]
+------------PhysicalDistribute[DistributionSpecHash]
+--------------hashAgg[LOCAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------PhysicalProject
+----------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !bucket_partitioned_agg_result_on --
+1	52	44
+2	9	14
+3	8	8
+4	10	9
+
+-- !bucket_partitioned_agg_result_off --
+1	52	44
+2	9	14
+3	8	8
+4	10	9
+
+-- !all_three_multilevel_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((y.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !all_three_multilevel_agg_result_on --
+1	96	10
+2	23	20
+3	16	30
+4	19	40
+
+-- !all_three_multilevel_agg_result_off --
+1	96	10
+2	23	20
+3	16	30
+4	19	40
+
+-- !agg_join_agg_mix_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((l.k1 = d.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = r.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------hashAgg[LOCAL]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !agg_join_agg_mix_result_on --
+1	10	11	10
+2	5	7	20
+3	5	8	30
+4	6	9	40
+
+-- !agg_join_agg_mix_result_off --
+1	10	11	10
+2	5	7	20
+3	5	8	30
+4	6	9	40
+
+-- !double_broadcast_after_bucket_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d2.k1)) otherCondition=()
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d1.k1)) otherCondition=()
+------------------hashAgg[GLOBAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !double_broadcast_after_bucket_result_on --
+1	26	20
+2	9	40
+3	8	60
+4	10	80
+
+-- !double_broadcast_after_bucket_result_off --
+1	26	20
+2	9	40
+3	8	60
+4	10	80
+
+-- !partitioned_join_between_two_aggs_then_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN broadcast] hashCondition=((m.k1 = d.k1)) otherCondition=()
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = r.k1)) otherCondition=()
+----------------------PhysicalProject
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalProject
+----------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------hashAgg[LOCAL]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !partitioned_join_between_two_aggs_then_broadcast_result_on --
+1	16	10
+2	12	20
+3	13	30
+4	15	40
+
+-- !partitioned_join_between_two_aggs_then_broadcast_result_off --
+1	16	10
+2	12	20
+3	13	30
+4	15	40
+
+-- !bucket_shuffle_broadcast_two_stage_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((y.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !bucket_shuffle_broadcast_two_stage_agg_result_on --
+1	52	44	10
+2	9	14	20
+3	8	8	30
+4	10	9	40
+
+-- !bucket_shuffle_broadcast_two_stage_agg_result_off --
+1	52	44	10
+2	9	14	20
+3	8	8	30
+4	10	9	40
+
+-- !left_join_null_preserving_with_multilevel_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[LEFT_OUTER_JOIN bucketShuffle] hashCondition=((a.k1 = t.k1)) otherCondition=()
+--------------PhysicalProject
+----------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !left_join_null_preserving_with_multilevel_agg_result_on --
+1	5	44
+2	5	14
+3	5	8
+4	6	9
+
+-- !left_join_null_preserving_with_multilevel_agg_result_off --
+1	5	44
+2	5	14
+3	5	8
+4	6	9
+
+-- !seven_layer_bucket_shuffle_broadcast_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------hashAgg[GLOBAL]
+------------PhysicalProject
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((m.k1 = d2.k1)) otherCondition=()
+----------------hashAgg[GLOBAL]
+------------------PhysicalProject
+--------------------hashJoin[INNER_JOIN broadcast] hashCondition=((l.k1 = d1.k1)) otherCondition=()
+----------------------hashAgg[GLOBAL]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------hashAgg[LOCAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = y.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------hashAgg[GLOBAL]
+------------------------------------PhysicalProject
+--------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------------------PhysicalProject
+------------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------------------PhysicalProject
+------------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------------------------hashAgg[GLOBAL]
+----------------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------------hashAgg[LOCAL]
+--------------------------------------PhysicalProject
+----------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+----------------------PhysicalProject
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+----------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !seven_layer_bucket_shuffle_broadcast_result_on --
+1	37	10
+2	16	20
+3	16	30
+4	19	40
+
+-- !seven_layer_bucket_shuffle_broadcast_result_off --
+1	37	10
+2	16	20
+3	16	30
+4	19	40
+
+-- !eight_layer_mixed_join_agg_chain_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((n.k1 = d2.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((m.k1 = d1.k1)) otherCondition=()
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalDistribute[DistributionSpecHash]
+------------------------hashAgg[LOCAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !eight_layer_mixed_join_agg_chain_result_on --
+1	52	44	20
+2	9	14	40
+3	8	8	60
+4	10	9	80
+
+-- !eight_layer_mixed_join_agg_chain_result_off --
+1	52	44	20
+2	9	14	40
+3	8	8	60
+4	10	9	80
+
+-- !seven_layer_left_join_mix_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalDistribute[DistributionSpecHash]
+------------------hashAgg[LOCAL]
+--------------------PhysicalProject
+----------------------hashJoin[LEFT_OUTER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = r.k1)) otherCondition=()
+------------------------PhysicalProject
+--------------------------hashAgg[GLOBAL]
+----------------------------PhysicalProject
+------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------hashAgg[GLOBAL]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------hashAgg[LOCAL]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !seven_layer_left_join_mix_result_on --
+1	10	11	10
+2	5	7	20
+3	5	8	30
+4	6	9	40
+
+-- !seven_layer_left_join_mix_result_off --
+1	10	11	10
+2	5	7	20
+3	5	8	30
+4	6	9	40
+
+-- !broadcast_shuffle_broadcast_nested_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((y.k1 = d2.k1)) otherCondition=()
+--------------hashAgg[GLOBAL]
+----------------PhysicalProject
+------------------hashJoin[INNER_JOIN broadcast] hashCondition=((x.k1 = d1.k1)) otherCondition=()
+--------------------hashAgg[GLOBAL]
+----------------------PhysicalDistribute[DistributionSpecHash]
+------------------------hashAgg[LOCAL]
+--------------------------PhysicalProject
+----------------------------hashJoin[INNER_JOIN shuffleBucket] hashCondition=((expr_cast(k1 as BIGINT) = r.k1)) otherCondition=()
+------------------------------PhysicalProject
+--------------------------------hashAgg[GLOBAL]
+----------------------------------PhysicalProject
+------------------------------------hashJoin[INNER_JOIN bucketShuffle] hashCondition=((a.k1 = b.k1)) otherCondition=()
+--------------------------------------PhysicalProject
+----------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+--------------------------------------PhysicalProject
+----------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+------------------------------hashAgg[GLOBAL]
+--------------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------------hashAgg[LOCAL]
+------------------------------------PhysicalProject
+--------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+--------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d1)]
+--------------PhysicalProject
+----------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d2)]
+
+Hint log:
+Used: [shuffle]_1 [broadcast]_2
+UnUsed:
+SyntaxError:
+
+-- !broadcast_shuffle_broadcast_nested_agg_result_on --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !broadcast_shuffle_broadcast_nested_agg_result_off --
+1	26	11	10
+2	9	7	20
+3	8	8	30
+4	10	9	40
+
+-- !window_union_join_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------hashJoin[INNER_JOIN broadcast] hashCondition=((w.k1 = d.k1)) otherCondition=()
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalUnion
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a(a)]
+----------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b(b)]
+--------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_join_agg_result_on --
+1	13	14
+2	7	23
+3	8	32
+4	10	42
+
+-- !window_union_join_agg_result_off --
+1	13	14
+2	7	23
+3	8	32
+4	10	42
+
+-- !window_except_join_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalQuickSort[LOCAL_SORT]
+----------------PhysicalWindow
+------------------PhysicalQuickSort[LOCAL_SORT]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN broadcast] hashCondition=((e.k1 = d.k1)) otherCondition=()
+------------------------PhysicalExcept
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalProject
+------------------------------filter((test_multilevel_join_agg_local_shuffle_c.k4 = 1004))
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_except_join_agg_result_on --
+1	1	10
+2	1	20
+3	1	30
+
+-- !window_except_join_agg_result_off --
+1	1	10
+2	1	20
+3	1	30
+
+-- !window_intersect_shuffle_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalProject
+------------PhysicalWindow
+--------------PhysicalWindow
+----------------PhysicalQuickSort[LOCAL_SORT]
+------------------PhysicalDistribute[DistributionSpecHash]
+--------------------PhysicalProject
+----------------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------------PhysicalProject
+--------------------------PhysicalIntersect
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecHash]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalProject
+--------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_intersect_shuffle_agg_result_on --
+1	22	2
+2	7	1
+3	8	1
+4	9	1
+
+-- !window_intersect_shuffle_agg_result_off --
+1	22	2
+2	7	1
+3	8	1
+4	9	1
+
+-- !window_union_except_broadcast_agg_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------hashAgg[GLOBAL]
+------------PhysicalProject
+--------------hashJoin[INNER_JOIN broadcast] hashCondition=((s.k1 = d.k1)) otherCondition=()
+----------------PhysicalWindow
+------------------PhysicalQuickSort[LOCAL_SORT]
+--------------------PhysicalDistribute[DistributionSpecHash]
+----------------------PhysicalExcept
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalUnion
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+----------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+------------------------------PhysicalProject
+--------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+------------------------PhysicalDistribute[DistributionSpecHash]
+--------------------------PhysicalProject
+----------------------------filter((test_multilevel_join_agg_local_shuffle_d.k1 = 4))
+------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d]
+----------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_d(d)]
+
+Hint log:
+Used: [broadcast]_1
+UnUsed:
+SyntaxError:
+
+-- !window_union_except_broadcast_agg_result_on --
+1	13	4	10
+2	7	3	20
+3	8	2	30
+4	10	2	40
+
+-- !window_union_except_broadcast_agg_result_off --
+1	13	4	10
+2	7	3	20
+3	8	2	30
+4	10	2	40
+
+-- !window_setop_join_agg_chain_shape_on --
+PhysicalResultSink
+--PhysicalQuickSort[MERGE_SORT]
+----PhysicalDistribute[DistributionSpecGather]
+------PhysicalQuickSort[LOCAL_SORT]
+--------hashAgg[GLOBAL]
+----------PhysicalDistribute[DistributionSpecHash]
+------------hashAgg[LOCAL]
+--------------PhysicalProject
+----------------hashJoin[INNER_JOIN shuffle] hashCondition=((expr_cast(k1 as BIGINT) = expr_(cast(k4 as BIGINT) - 1000))) otherCondition=()
+------------------PhysicalProject
+--------------------PhysicalWindow
+----------------------PhysicalWindow
+------------------------PhysicalQuickSort[LOCAL_SORT]
+--------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------PhysicalUnion
+------------------------------PhysicalDistribute[DistributionSpecExecutionAny]
+--------------------------------PhysicalProject
+----------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_a]
+------------------------------PhysicalIntersect
+--------------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------------PhysicalProject
+------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_b]
+--------------------------------PhysicalDistribute[DistributionSpecHash]
+----------------------------------PhysicalProject
+------------------------------------filter((test_multilevel_join_agg_local_shuffle_c.k4 >= 1001))
+--------------------------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c]
+------------------PhysicalProject
+--------------------PhysicalOlapScan[test_multilevel_join_agg_local_shuffle_c(c)]
+
+Hint log:
+Used: [shuffle]_1
+UnUsed:
+SyntaxError:
+
+-- !window_setop_join_agg_chain_result_on --
+1	20	2	22
+2	10	2	14
+3	5	1	8
+4	6	1	9
+
+-- !window_setop_join_agg_chain_result_off --
+1	20	2	22
+2	10	2	14
+3	5	1	8
+4	6	1	9
+
diff --git a/regression-test/plugins/plugin_profile_plan_tree.groovy b/regression-test/plugins/plugin_profile_plan_tree.groovy
new file mode 100644
index 00000000000..ee86810ca79
--- /dev/null
+++ b/regression-test/plugins/plugin_profile_plan_tree.groovy
@@ -0,0 +1,274 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.apache.doris.regression.suite.Suite
+
+/**
+ * Parses the MergedProfile section of a Doris query profile and returns
+ * the pipeline operator tree in an explain-like format.
+ *
+ * Profile text structure (MergedProfile section):
+ *   MergedProfile:
+ *        Fragments:
+ *          Fragment N:                        ← indent level A
+ *            Pipeline N(instance_num=M):      ← indent level B  (B = A + 2)
+ *               - WaitWorkerTime: ...         ← pipeline stats (skip)
+ *              OPERATOR_NAME(...):            ← indent level C  (C = B + 2)
+ *                - PlanInfo                   ← plan info marker
+ *                   - key: value              ← plan info item
+ *                CommonCounters:              ← counter section start (stop reading plan info)
+ *                   - ...
+ *
+ * Usage in a test suite:
+ *   // From raw profile text:
+ *   def tree = profile_plan_tree(profileText)
+ *   logger.info(tree)
+ *
+ *   // From a query_id (fetches profile via HTTP):
+ *   def tree = profile_plan_tree_from_id(queryId)
+ *   logger.info(tree)
+ */
+
+// ---------------------------------------------------------------------------
+// profile_plan_tree(profileText) → formatted String
+// ---------------------------------------------------------------------------
+Suite.metaClass.profile_plan_tree = { String profileText ->
+
+    // ── Locate MergedProfile section ──────────────────────────────────────
+    def mergedStart = profileText.indexOf("MergedProfile:")
+    if (mergedStart == -1) {
+        return "(no MergedProfile section found in profile)"
+    }
+    def mergedSection = profileText.substring(mergedStart)
+
+    // ── Line-by-line state machine ─────────────────────────────────────────
+    // We detect indent levels dynamically: the first Fragment line sets the
+    // baseline; Pipeline and Operator levels follow by relative indentation.
+    int fragmentIndent  = -1   // indent of "Fragment N:" lines
+    int pipelineIndent  = -1   // indent of "Pipeline N(...):" lines
+    int operatorIndent  = -1   // indent of "OPERATOR_NAME(...):" lines
+    int planInfoIndent  = -1   // indent of "- PlanInfo" lines
+    int planItemIndent  = -1   // indent of "- key: value" plan info items
+    int counterIndent   = -1   // indent of "CommonCounters:" / "CustomCounters:"
+
+    // Parsed tree: list of fragments, each with pipelines, each with operators
+    def fragments = []         // [{name, pipelines:[{name,instanceNum,ops:[{name,planInfo:[]}]}]}]
+
+    def curFragName    = null
+    def curPipeName    = null
+    def curOpName      = null
+    def curPlanInfo    = []    // accumulated plan-info lines for current operator
+    def inPlanInfo     = false
+    def curPipeOps     = []    // operators in current pipeline
+    def curFragPipes   = []    // pipelines in current fragment
+
+    def flushOp = {
+        if (curOpName != null) {
+            curPipeOps << [name: curOpName, planInfo: new ArrayList(curPlanInfo)]
+            curOpName  = null
+            curPlanInfo.clear()
+            inPlanInfo = false
+        }
+    }
+
+    def flushPipeline = {
+        flushOp()
+        if (curPipeName != null) {
+            curFragPipes << [name: curPipeName, ops: new ArrayList(curPipeOps)]
+            curPipeName = null
+            curPipeOps.clear()
+        }
+    }
+
+    def flushFragment = {
+        flushPipeline()
+        if (curFragName != null) {
+            fragments << [name: curFragName, pipelines: new ArrayList(curFragPipes)]
+            curFragName  = null
+            curFragPipes.clear()
+        }
+    }
+
+    for (def rawLine : mergedSection.split("\n")) {
+        // Count leading spaces
+        int spaces = 0
+        for (char c : rawLine.toCharArray()) {
+            if (c == ' ') spaces++
+            else break
+        }
+        def content = rawLine.trim()
+        if (content.isEmpty()) continue
+
+        // ── Fragment ───────────────────────────────────────────────────────
+        if (content =~ /^Fragment \d+:$/) {
+            if (fragmentIndent == -1) fragmentIndent = spaces
+            if (spaces == fragmentIndent) {
+                flushFragment()
+                curFragName = content[0..-2]   // strip trailing ':'
+                // Reset derived indent markers when a new fragment begins
+                pipelineIndent = -1
+                operatorIndent = -1
+                planInfoIndent = -1
+                planItemIndent = -1
+                counterIndent  = -1
+                continue
+            }
+        }
+
+        // Only process further if we are inside a Fragment
+        if (curFragName == null) continue
+
+        // ── Pipeline ───────────────────────────────────────────────────────
+        if (content =~ /^Pipeline \d+\(instance_num=\d+\):$/) {
+            if (pipelineIndent == -1) pipelineIndent = spaces
+            if (spaces == pipelineIndent) {
+                flushPipeline()
+                def m = content =~ /^Pipeline (\d+)\(instance_num=(\d+)\):$/
+                if (m.find()) {
+                    curPipeName = "Pipeline ${m.group(1)} (instances=${m.group(2)})"
+                } else {
+                    curPipeName = content[0..-2]
+                }
+                // Reset operator-level indent markers per pipeline
+                operatorIndent = -1
+                planInfoIndent = -1
+                planItemIndent = -1
+                counterIndent  = -1
+                continue
+            }
+        }
+
+        // Only process further if we are inside a Pipeline
+        if (curPipeName == null) continue
+
+        // ── CommonCounters / CustomCounters ────────────────────────────────
+        // These appear inside an operator block and signal end of PlanInfo.
+        if (content == "CommonCounters:" || content == "CustomCounters:") {
+            if (counterIndent == -1) counterIndent = spaces
+            if (spaces == counterIndent) {
+                inPlanInfo = false
+                continue
+            }
+        }
+
+        // ── PlanInfo marker ────────────────────────────────────────────────
+        if (content == "- PlanInfo") {
+            if (planInfoIndent == -1) planInfoIndent = spaces
+            if (spaces == planInfoIndent) {
+                inPlanInfo = true
+                continue
+            }
+        }
+
+        // ── PlanInfo item ──────────────────────────────────────────────────
+        if (inPlanInfo && content.startsWith("- ")) {
+            if (planItemIndent == -1) planItemIndent = spaces
+            if (spaces == planItemIndent) {
+                curPlanInfo << content.substring(2)   // strip leading "- "
+                continue
+            }
+        }
+
+        // ── Operator line ──────────────────────────────────────────────────
+        // Operator names start with an uppercase letter, contain only
+        // A-Z, 0-9, _, (, ) characters, and end with ':'.
+        // Skip counter section headers (CommonCounters / CustomCounters already handled above).
+        if (content.endsWith(":") && content =~ /^[A-Z][A-Z0-9_]/) {
+            // Ignore pure counter/info headers that are not operators
+            if (content == "CommonCounters:" || content == "CustomCounters:" ||
+                content == "PlanInfo:") {
+                continue
+            }
+            if (operatorIndent == -1) operatorIndent = spaces
+            if (spaces == operatorIndent) {
+                flushOp()
+                curOpName   = content[0..-2]   // strip trailing ':'
+                inPlanInfo  = false
+                planInfoIndent = -1
+                planItemIndent = -1
+                counterIndent  = -1
+                continue
+            }
+        }
+    }
+
+    flushFragment()
+
+    // ── Format output ──────────────────────────────────────────────────────
+    // Similar to explain plan:
+    //   Fragment N:
+    //     Pipeline M (instances=K):
+    //       OPERATOR_NAME (...)
+    //         | plan-info-key: value
+    //         | ...
+    if (fragments.isEmpty()) {
+        return "(MergedProfile found but no fragments could be parsed)"
+    }
+
+    def sb = new StringBuilder()
+    for (def frag : fragments) {
+        sb.append("${frag.name}:\n")
+        for (def pipe : frag.pipelines) {
+            sb.append("  ${pipe.name}:\n")
+            for (def op : pipe.ops) {
+                sb.append("    ${op.name}\n")
+                for (def pi : op.planInfo) {
+                    sb.append("      | ${pi}\n")
+                }
+            }
+        }
+    }
+
+    return sb.toString()
+}
+
+// ---------------------------------------------------------------------------
+// profile_plan_tree_from_id(queryId) → formatted String
+//   Fetches profile via HTTP then calls profile_plan_tree.
+// ---------------------------------------------------------------------------
+Suite.metaClass.profile_plan_tree_from_id = { String queryId ->
+    Suite suite = delegate as Suite
+    def dst  = 'http://' + suite.context.config.feHttpAddress
+    def conn = new URL("${dst}/api/profile/text?query_id=${queryId}").openConnection()
+    conn.setRequestMethod("GET")
+    def user     = suite.context.config.feHttpUser     ?: "root"
+    def pass     = suite.context.config.feHttpPassword ?: ""
+    def encoding = Base64.getEncoder().encodeToString("${user}:${pass}".getBytes("UTF-8"))
+    conn.setRequestProperty("Authorization", "Basic ${encoding}")
+    conn.setConnectTimeout(5000)
+    conn.setReadTimeout(15000)
+    def profileText = conn.getInputStream().getText()
+    def tree = suite.profile_plan_tree(profileText)
+    return tree.split('\n').findAll { !it.startsWith('      | ') }.join('\n')
+}
+
+// ---------------------------------------------------------------------------
+// profile_plan_tree_from_sql(testSql) → formatted String
+//   Executes the SQL with profiling enabled and SQL cache disabled,
+//   waits for the profile to be collected, then returns the operator tree.
+// ---------------------------------------------------------------------------
+Suite.metaClass.profile_plan_tree_from_sql = { String testSql ->
+    Suite suite = delegate as Suite
+    suite.sql "set enable_profile=true;"
+    suite.sql "set enable_sql_cache=false;"
+    suite.sql testSql
+    def qid = suite.sql("select last_query_id()")[0][0] as String
+    Thread.sleep(1500)
+    return suite.profile_plan_tree_from_id(qid)
+}
+
+logger.info("Added 'profile_plan_tree', 'profile_plan_tree_from_id' and 'profile_plan_tree_from_sql' to Suite")
diff --git a/regression-test/suites/nereids_p0/local_shuffle/print_known_diff_trees.groovy b/regression-test/suites/nereids_p0/local_shuffle/print_known_diff_trees.groovy
new file mode 100644
index 00000000000..7ce3fd2352e
--- /dev/null
+++ b/regression-test/suites/nereids_p0/local_shuffle/print_known_diff_trees.groovy
@@ -0,0 +1,80 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("print_known_diff_trees", "p0") {
+    sql "use regression_test_nereids_p0_local_shuffle"
+
+    sql "set enable_pipeline_engine=true;"
+    sql "set enable_local_shuffle_planner=false;"
+    sql "set disable_join_reorder=true;"
+    sql "set disable_colocate_plan=true;"
+    sql "set ignore_storage_data_distribution=false;"
+    sql "set parallel_pipeline_task_num=4;"
+    sql "set auto_broadcast_join_threshold=-1;"
+    sql "set broadcast_row_count_limit=0;"
+
+    def printBETree = { String tag, String testSql ->
+        def tree = profile_plan_tree_from_sql(testSql)
+        logger.info("=== [${tag}] BE operator tree ===\nSQL: ${testSql.trim()}\n${tree}")
+    }
+
+    printBETree("analytic_no_partition",
+        "SELECT k1, sum(v1) OVER() AS s FROM ls_t1 ORDER BY k1, s")
+
+    printBETree("distinct_non_bucket_key",
+        "SELECT DISTINCT k2 FROM ls_t1 ORDER BY k2")
+
+    printBETree("set_intersect_three_way",
+        """SELECT k1 FROM ls_t1
+           INTERSECT
+           SELECT k1 FROM ls_t2
+           INTERSECT
+           SELECT k1 FROM ls_t3
+           ORDER BY k1""")
+
+    printBETree("union_all_followed_by_agg",
+        """SELECT k1, count(*) AS cnt
+           FROM (
+               SELECT k1, v1 AS v FROM ls_t1
+               UNION ALL
+               SELECT k1, v2 AS v FROM ls_t2
+           ) u
+           GROUP BY k1
+           ORDER BY k1""")
+
+    printBETree("table_function",
+        """SELECT k1, e1 FROM ls_t1
+           LATERAL VIEW explode_numbers(v1) tmp AS e1
+           ORDER BY k1, e1 LIMIT 20""")
+
+    printBETree("agg_after_shuffle_join_non_bucket_key",
+        """SELECT a.k2, count(*) AS cnt
+           FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           GROUP BY a.k2
+           ORDER BY a.k2""")
+
+    printBETree("agg_after_broadcast_join",
+        """SELECT a.k1, count(*) AS cnt
+           FROM ls_t1 a JOIN [broadcast] ls_t2 b ON a.k1 = b.k1
+           GROUP BY a.k1
+           ORDER BY a.k1""")
+
+    printBETree("agg_finalize_serial_pooling_bucket",
+            "SELECT /*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,ignore_storage_data_distribution=true,parallel_pipeline_task_num=4,auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0)*/k1, count(*) AS cnt FROM ls_serial GROUP BY k1 ORDER BY k1",
+            )
+
+}
diff --git a/regression-test/suites/nereids_p0/local_shuffle/test_local_shuffle_fe_be_consistency.groovy b/regression-test/suites/nereids_p0/local_shuffle/test_local_shuffle_fe_be_consistency.groovy
new file mode 100644
index 00000000000..37bfb7df938
--- /dev/null
+++ b/regression-test/suites/nereids_p0/local_shuffle/test_local_shuffle_fe_be_consistency.groovy
@@ -0,0 +1,940 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+/**
+ * Verify FE-planned local exchange (enable_local_shuffle=true) matches
+ * BE-native local exchange (enable_local_shuffle=false) for every operator type.
+ *
+ * Profile operator names produced by BE (from get_exchange_type_name()):
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(GLOBAL_HASH_SHUFFLE)   ← GLOBAL_EXECUTION_HASH_SHUFFLE
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(LOCAL_HASH_SHUFFLE)    ← LOCAL_EXECUTION_HASH_SHUFFLE
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(BUCKET_HASH_SHUFFLE)
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(PASSTHROUGH)
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(ADAPTIVE_PASSTHROUGH)
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(BROADCAST)
+ *   LOCAL_EXCHANGE_SINK_OPERATOR(PASS_TO_ONE)
+ *   LOCAL_EXCHANGE_OPERATOR(...)                        ← source side (same type, not counted)
+ *
+ * Methodology:
+ *   1. Run SQL with enable_local_shuffle=false (BE native) → capture profile via HTTP
+ *   2. Run SQL with enable_local_shuffle=true  (FE planned) → capture profile via HTTP
+ *   3. Count LOCAL_EXCHANGE_SINK_OPERATOR entries per type in each profile
+ *   4. Log comparison results (MATCH or MISMATCH)
+ *   5. Assert query results are identical (check_sql_equal)
+ *
+ * Known FE/BE design differences (not bugs, logged as INFO):
+ *   - NLJ probe: FE always requires ADAPTIVE_PASSTHROUGH; BE requires NOOP for
+ *     RIGHT_OUTER/RIGHT_SEMI/RIGHT_ANTI/FULL_OUTER (FE adds extra exchange for those types)
+ */
+suite("test_local_shuffle_fe_be_consistency") {
+
+    // ============================================================
+    //  Helper: fetch profile text via HTTP (root, no password)
+    // ============================================================
+    def getProfile = { String queryId ->
+        def dst = 'http://' + context.config.feHttpAddress
+        def conn = new URL(dst + "/api/profile/text?query_id=${queryId}").openConnection()
+        conn.setRequestMethod("GET")
+        def user = context.config.feHttpUser ?: "root"
+        def pass = context.config.feHttpPassword ?: ""
+        def encoding = Base64.getEncoder().encodeToString("${user}:${pass}".getBytes("UTF-8"))
+        conn.setRequestProperty("Authorization", "Basic ${encoding}")
+        conn.setConnectTimeout(5000)
+        conn.setReadTimeout(10000)
+        return conn.getInputStream().getText()
+    }
+
+    // ============================================================
+    //  Helper: extract LOCAL_EXCHANGE_SINK_OPERATOR types + counts
+    //  Returns a sorted map like [PASSTHROUGH:2, GLOBAL_HASH_SHUFFLE:1]
+    // ============================================================
+    def extractSinkExchangeCounts = { String profileText ->
+        def counts = [:]
+        profileText.eachLine { line ->
+            // matches: LOCAL_EXCHANGE_SINK_OPERATOR(PASSTHROUGH) or with leading spaces/dashes
+            def m = line =~ /LOCAL_EXCHANGE_SINK_OPERATOR\(([^)]+)\)/
+            if (m.find()) {
+                def type = m.group(1).trim()
+                counts[type] = (counts[type] ?: 0) + 1
+            }
+        }
+        return counts.sort()
+    }
+
+    // ============================================================
+    //  Helper: run SQL, get query_id, fetch profile, extract LE counts
+    //  enableFePlanner=true  → enable_local_shuffle_planner=true  (FE plans exchanges)
+    //  enableFePlanner=false → enable_local_shuffle_planner=false (BE plans natively)
+    // ============================================================
+    // Poll until the profile contains "Is Profile Collection Completed: true".
+    // This field is written by SummaryProfile.queryFinished() after waitForFragmentsDone(),
+    // guaranteeing all BE operator metrics have been merged into the profile.
+    def waitForProfile = { String queryId ->
+        // Poll until the profile is fully collected.  The "Is Profile Collection
+        // Completed: true" marker is written after all BE fragments have reported,
+        // so once it appears the LOCAL_EXCHANGE_SINK counts are final.
+        def maxAttempts = 60
+        def sleepMs = 200
+        for (int i = 0; i < maxAttempts; i++) {
+            Thread.sleep(sleepMs)
+            try {
+                def text = getProfile(queryId)
+                if (text.contains("Is Profile Collection Completed: true")) {
+                    return text
+                }
+            } catch (Exception ignored) {}
+        }
+        return getProfile(queryId)
+    }
+
+    // Execute SQL and return query_id (no profile wait — fast)
+    def runAndGetQueryId = { String testSql, boolean enableFePlanner ->
+        sql "set enable_profile=true"
+        sql "set enable_local_shuffle_planner=${enableFePlanner}"
+        sql "set enable_sql_cache=false"
+        sql "${testSql}"
+        def queryIdResult = sql "select last_query_id()"
+        return queryIdResult[0][0].toString()
+    }
+
+    // ============================================================
+    //  Two-phase approach for speed:
+    //  Phase 1: Execute all queries (BE + FE) sequentially, collect query IDs
+    //  Phase 2: Fetch all profiles in parallel (profiles collected in background)
+    //  This overlaps profile collection with query execution, avoiding serial waits.
+    // ============================================================
+    def mismatches = Collections.synchronizedList([])
+    def pendingChecks = Collections.synchronizedList([])
+
+    def setVarBase = "disable_join_reorder=true,disable_colocate_plan=true,ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0"
+
+    def checkConsistencyWithSql = { String tag, String testSql, boolean knownDiff = false ->
+        // Phase 1: execute queries and collect query IDs (fast, no profile wait)
+        String beQueryId = null
+        String feQueryId = null
+        boolean beFailed = false
+        boolean feFailed = false
+        String beError = null
+        String feError = null
+
+        try {
+            beQueryId = runAndGetQueryId(testSql, false)
+        } catch (Throwable t) {
+            beFailed = true
+            beError = t.message
+        }
+        try {
+            feQueryId = runAndGetQueryId(testSql, true)
+        } catch (Throwable t) {
+            feFailed = true
+            feError = t.message
+        }
+
+        // Build SET_VAR versions for check_sql_equal
+        def sqlOn  = testSql.replaceFirst(/(?i)\/\*\+SET_VAR\(([^)]*)\)\s*\*\//, "/*+SET_VAR(enable_local_shuffle_planner=true,\$1)*/")
+        def sqlOff = testSql.replaceFirst(/(?i)\/\*\+SET_VAR\(([^)]*)\)\s*\*\//, "/*+SET_VAR(enable_local_shuffle_planner=false,\$1)*/")
+        if (!testSql.contains("/*+SET_VAR")) {
+            sqlOn  = testSql.replaceFirst(/(?i)^\s*(SELECT)\s+/, "SELECT /*+SET_VAR(enable_local_shuffle_planner=true,${setVarBase})*/ ")
+            sqlOff = testSql.replaceFirst(/(?i)^\s*(SELECT)\s+/, "SELECT /*+SET_VAR(enable_local_shuffle_planner=false,${setVarBase})*/ ")
+        }
+
+        // Save for phase 2 (deferred profile fetch + comparison)
+        pendingChecks << [tag: tag, beQueryId: beQueryId, feQueryId: feQueryId,
+                          beFailed: beFailed, feFailed: feFailed,
+                          beError: beError, feError: feError,
+                          knownDiff: knownDiff, sqlOn: sqlOn, sqlOff: sqlOff]
+    }
+
+    // Phase 2: fetch profiles and compare (called after all queries are submitted)
+    def resolveAllChecks = {
+        for (def check : pendingChecks) {
+            def tag = check.tag
+            if (check.beFailed) {
+                def errMsg = "[${tag}] BE run FAILED: ${check.beError}"
+                logger.warn(errMsg)
+                if (!check.knownDiff) { mismatches << errMsg }
+                continue
+            }
+            if (check.feFailed) {
+                def errMsg = "[${tag}] FE run FAILED: ${check.feError}"
+                logger.warn(errMsg)
+                if (!check.knownDiff) { mismatches << errMsg }
+                continue
+            }
+
+            // Fetch profiles (likely already collected by now)
+            def beProfile = waitForProfile(check.beQueryId)
+            def feProfile = waitForProfile(check.feQueryId)
+            def beCounts = extractSinkExchangeCounts(beProfile)
+            def feCounts = extractSinkExchangeCounts(feProfile)
+
+            boolean match = (beCounts == feCounts)
+            if (match) {
+                logger.info("[${tag}] MATCH: ${beCounts}")
+            } else {
+                def msg = "[${tag}] ${check.knownDiff ? 'KNOWN-DIFF' : 'MISMATCH'}: BE=${beCounts}, FE=${feCounts}"
+                if (check.knownDiff) {
+                    logger.info(msg)
+                } else {
+                    logger.warn(msg)
+                    mismatches << msg
+                }
+            }
+
+            // Verify result correctness
+            try {
+                check_sql_equal(check.sqlOn, check.sqlOff)
+            } catch (Throwable t) {
+                def errMsg = "[${tag}] check_sql_equal FAILED: ${t.message}"
+                logger.warn(errMsg)
+                mismatches << errMsg
+            }
+        }
+    }
+
+    // ============================================================
+    //  Common settings
+    // ============================================================
+    sql "SET enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+    sql "SET runtime_filter_mode=off"
+    sql "SET parallel_pipeline_task_num=4"
+    sql "SET enable_profile=true"
+    sql "SET enable_sql_cache=false"
+    // Keep local shuffle feature globally enabled; only toggle the planner flag
+    sql "SET enable_local_shuffle=true"
+    // Disable ignore_storage_data_distribution to get predictable plans from scans
+    sql "SET ignore_storage_data_distribution=false"
+
+    // ============================================================
+    //  Table setup
+    //  ls_t1: HASH(k1) 8 buckets
+    //  ls_t2: HASH(k1) 8 buckets  (same distribution → colocate-eligible)
+    //  ls_t3: HASH(k4) 5 buckets  (different distribution)
+    //  ls_serial: HASH(k1) 2 buckets (for serial-scan tests: 2 < parallel_pipeline_task_num=4)
+    // ============================================================
+    sql "DROP TABLE IF EXISTS ls_t1"
+    sql "DROP TABLE IF EXISTS ls_t2"
+    sql "DROP TABLE IF EXISTS ls_t3"
+    sql "DROP TABLE IF EXISTS ls_serial"
+
+    sql """
+        CREATE TABLE ls_t1 (
+            k1 INT NOT NULL,
+            k2 INT,
+            v1 INT
+        ) ENGINE=OLAP
+        DUPLICATE KEY(k1, k2)
+        DISTRIBUTED BY HASH(k1) BUCKETS 8
+        PROPERTIES ("replication_num" = "1")
+    """
+
+    sql """
+        CREATE TABLE ls_t2 (
+            k1 INT NOT NULL,
+            k3 INT,
+            v2 INT
+        ) ENGINE=OLAP
+        DUPLICATE KEY(k1, k3)
+        DISTRIBUTED BY HASH(k1) BUCKETS 8
+        PROPERTIES ("replication_num" = "1")
+    """
+
+    sql """
+        CREATE TABLE ls_t3 (
+            k1 INT NOT NULL,
+            k4 INT,
+            v3 INT
+        ) ENGINE=OLAP
+        DUPLICATE KEY(k1, k4)
+        DISTRIBUTED BY HASH(k4) BUCKETS 5
+        PROPERTIES ("replication_num" = "1")
+    """
+
+    sql """
+        INSERT INTO ls_t1 VALUES
+            (1, 10, 2), (1, 11, 3), (2, 20, 4), (2, 21, 1),
+            (3, 30, 5), (4, 40, 6), (5, 50, 7), (6, 60, 8),
+            (7, 70, 9), (8, 80, 10), (9, 90, 11), (10, 100, 12)
+    """
+
+    sql """
+        INSERT INTO ls_t2 VALUES
+            (1, 100, 7), (1, 101, 1), (2, 200, 2), (3, 300, 3),
+            (4, 400, 4), (5, 500, 5), (6, 600, 6), (7, 700, 7)
+    """
+
+    sql """
+        INSERT INTO ls_t3 VALUES
+            (1, 1001, 5), (1, 1001, 6), (2, 1002, 7),
+            (3, 1003, 8), (4, 1004, 9), (5, 1005, 10)
+    """
+
+    sql """
+        CREATE TABLE ls_serial (
+            k1 INT NOT NULL,
+            k2 INT,
+            v1 INT
+        ) ENGINE=OLAP
+        DUPLICATE KEY(k1, k2)
+        DISTRIBUTED BY HASH(k1) BUCKETS 2
+        PROPERTIES ("replication_num" = "1")
+    """
+    sql """
+        INSERT INTO ls_serial VALUES
+            (1, 10, 2), (2, 20, 4), (3, 30, 5), (4, 40, 6)
+    """
+
+    // SET_VAR prefix used in most test SQLs (disables plan reorder/colocate for deterministic plans)
+    def sv = "/*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0)*/"
+    // Same as sv but forces serial source path (default in many environments)
+    def svSerialSource = "/*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,ignore_storage_data_distribution=true,parallel_pipeline_task_num=4,auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0)*/"
+
+    // ================================================================
+    // Section 1: AggSink / StreamingAgg scenarios
+    // BE operator: AggSinkOperatorX / StreamingAggOperatorX
+    // ================================================================
+
+    // 1-1: AggSink finalize, no group key
+    //      Finalize phase: FE uses noRequire() (needsFinalize && groupingExprs.isEmpty()) → NOOP
+    //      Streaming pre-agg phase: FE uses requirePassthrough() (else branch, groupingExprs.isEmpty())
+    //      BE: does not add exchanges for no-group-key agg (NOOP)
+    //      Known diff: FE inserts PASSTHROUGH for streaming pre-agg; BE skips exchanges entirely
+    checkConsistencyWithSql("agg_finalize_no_group_key",
+        "SELECT ${sv} count(*) FROM ls_t1")
+
+    // 1-2: AggSink 1-phase, bucket key (k1) → no mismatch (distribution matches)
+    //      BE: BUCKET_HASH_SHUFFLE for sink, scan already provides BUCKET_HASH_SHUFFLE
+    //      → need_to_local_exchange returns false (both hash types match)
+    checkConsistencyWithSql("agg_1phase_bucket_key",
+        "SELECT ${sv} k1, count(*) AS cnt FROM ls_t1 GROUP BY k1 ORDER BY k1")
+
+    // 1-2b: Same SQL under serial-source mode (ignore_storage_data_distribution=true)
+    //       This explicitly validates FE/BE consistency under serial-source planning path.
+    checkConsistencyWithSql("agg_1phase_bucket_key_serial_source",
+        "SELECT ${svSerialSource} k1, count(*) AS cnt FROM ls_t1 GROUP BY k1 ORDER BY k1")
+
+    // 1-2c: Finalize agg, serial/pooling scan, bucket key (k1), ls_serial (2 buckets).
+    //       Pooling scan + bucket-key colocate agg: BE inserts PASSTHROUGH fan-out (heavy_ops
+    //       bottleneck avoidance before LOCAL_HASH_SHUFFLE) + LOCAL_HASH_SHUFFLE.
+    //       FE mirrors with heavy_ops check in enforceChild.
+    checkConsistencyWithSql("agg_finalize_serial_pooling_bucket",
+        "SELECT ${svSerialSource} k1, count(*) AS cnt FROM ls_serial GROUP BY k1 ORDER BY k1")
+
+    // 1-2c2: Same finalize agg with bucket key, but non-pooling (ignore_storage_data_distribution=false).
+    //        No serial source → no heavy_ops PASSTHROUGH fan-out needed.
+    //        Known mismatch on clusters where ls_serial (2 BUCKETS) tablets land on different BEs:
+    //        FE sees global instanceCount=2 → inserts LE; each BE sees local _num_instances=1 → skips.
+    //        This is a pre-existing FE/BE instanceCount discrepancy, not a planner bug.
+    checkConsistencyWithSql("agg_finalize_non_pooling_bucket",
+        "SELECT ${sv} k1, count(*) AS cnt FROM ls_serial GROUP BY k1 ORDER BY k1")
+
+    // 1-2d: Agg, serial/pooling scan, non-bucket key (k2), ls_serial.
+    checkConsistencyWithSql("agg_finalize_serial_pooling_non_bucket",
+        "SELECT ${svSerialSource} k2, count(*) AS cnt FROM ls_serial GROUP BY k2 ORDER BY k2")
+
+    // 1-3: AggSink 1-phase, non-bucket key (k2)
+    //      BE: GLOBAL_EXECUTION_HASH_SHUFFLE vs BUCKET_HASH_SHUFFLE from scan
+    //      → inserts GLOBAL_HASH_SHUFFLE (or LOCAL_HASH_SHUFFLE for local execution)
+    checkConsistencyWithSql("agg_1phase_non_bucket_key",
+        "SELECT ${sv} k2, count(*) AS cnt FROM ls_t1 GROUP BY k2 ORDER BY k2")
+
+    // 1-4: AggSink 1-phase, multi-column non-bucket key (k1,k2)
+    //      Even though k1 is the bucket key, (k1,k2) is not → GLOBAL_HASH_SHUFFLE
+    checkConsistencyWithSql("agg_1phase_multi_key_non_bucket",
+        "SELECT ${sv} k1, k2, count(*) AS cnt FROM ls_t1 GROUP BY k1, k2 ORDER BY k1, k2")
+
+    // 1-5: Two-phase agg (pre-agg + finalize), non-bucket key
+    //      Tests that both streaming agg pre-phase and finalize phases are handled correctly
+    checkConsistencyWithSql("agg_two_phase_non_bucket",
+        "SELECT ${sv} k2, sum(v1) AS s FROM ls_t1 GROUP BY k2 ORDER BY k2")
+
+    // ================================================================
+    // Section 2: DistinctStreamingAgg scenarios
+    // BE operator: DistinctStreamingAggOperatorX
+    // ================================================================
+
+    // 2-1: DISTINCT on bucket key → no extra exchange needed (distribution matches)
+    checkConsistencyWithSql("distinct_bucket_key",
+        "SELECT ${sv} DISTINCT k1 FROM ls_t1 ORDER BY k1")
+
+    // 2-2: DISTINCT on non-bucket key
+    checkConsistencyWithSql("distinct_non_bucket_key",
+        "SELECT ${sv} DISTINCT k2 FROM ls_t1 ORDER BY k2")
+
+    // 2-3: DISTINCT on multiple non-bucket keys
+    checkConsistencyWithSql("distinct_multi_non_bucket",
+        "SELECT ${sv} DISTINCT k1, k2 FROM ls_t1 ORDER BY k1, k2")
+
+    // ================================================================
+    // Section 3: AnalyticSink / SortSink (analytic) scenarios
+    // BE operators: AnalyticSinkOperatorX, SortSinkOperatorX
+    // ================================================================
+
+    // 3-1: Analytic window, no PARTITION BY → serial path, no exchange needed
+    checkConsistencyWithSql("analytic_no_partition",
+        "SELECT ${sv} k1, sum(v1) OVER() AS s FROM ls_t1 ORDER BY k1, s")
+
+    // 3-2: Analytic window, PARTITION BY non-bucket key → GLOBAL_HASH_SHUFFLE
+    //      Also triggers SortSink (analytic sort) → GLOBAL_HASH_SHUFFLE
+    checkConsistencyWithSql("analytic_partition_non_bucket",
+        "SELECT ${sv} k1, k2, row_number() OVER(PARTITION BY k2 ORDER BY k1) AS rn FROM ls_t1 ORDER BY k2, k1, rn")
+
+    // 3-3: Analytic window, PARTITION BY bucket key → BUCKET_HASH_SHUFFLE (or no extra exchange)
+    //      SortSink(analytic): if colocate+bucket → BUCKET_HASH_SHUFFLE
+    checkConsistencyWithSql("analytic_partition_bucket_key",
+        "SELECT ${sv} k1, sum(v1) OVER(PARTITION BY k1) AS s FROM ls_t1 ORDER BY k1, s")
+
+    // 3-4: ORDER BY sort (SortSink._merge_by_exchange=true) → PASSTHROUGH
+    checkConsistencyWithSql("sort_order_by",
+        "SELECT ${sv} * FROM ls_t1 ORDER BY k1, k2 LIMIT 10")
+
+    // ================================================================
+    // Section 4: PartitionSortSink scenarios
+    // BE operator: PartitionSortSinkOperatorX
+    // ================================================================
+
+    // 4-1: PartitionSort TWO_PHASE_GLOBAL (triggered by QUALIFY / ROW_NUMBER with LIMIT)
+    //      → GLOBAL_EXECUTION_HASH_SHUFFLE
+    checkConsistencyWithSql("partition_sort_two_phase_global",
+        """SELECT ${sv} k1, k2, v1
+           FROM (
+               SELECT k1, k2, v1,
+                      ROW_NUMBER() OVER(PARTITION BY k2 ORDER BY v1 DESC) AS rn
+               FROM ls_t1
+           ) t
+           WHERE rn <= 2
+           ORDER BY k1, k2""")
+
+    // 4-2: PartitionSort single phase (TWO_PHASE_LOCAL or ONE_PHASE) → PASSTHROUGH
+    //      Note: This depends on the optimizer's choice; TopN on non-partitioned window
+    checkConsistencyWithSql("partition_sort_single_phase",
+        """SELECT ${sv} k1, k2, v1
+           FROM (
+               SELECT k1, k2, v1,
+                      ROW_NUMBER() OVER(PARTITION BY k2 ORDER BY v1 DESC) AS rn
+               FROM ls_t1
+           ) t
+           WHERE rn = 1
+           ORDER BY k1, k2""")
+
+    // ================================================================
+    // Section 5: HashJoinProbe / HashJoinBuildSink scenarios
+    // BE operators: HashJoinProbeOperatorX, HashJoinBuildSinkOperatorX
+    // ================================================================
+
+    // 5-1: Broadcast join — probe NOOP (or PASSTHROUGH if serial), build PASS_TO_ONE (if serial)
+    checkConsistencyWithSql("hash_join_broadcast",
+        """SELECT ${sv} a.k1, a.v1, b.v2
+           FROM ls_t1 a JOIN [broadcast] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1, a.k2""")
+
+    // 5-2: Shuffle (PARTITIONED) join → probe GLOBAL_HASH_SHUFFLE, build GLOBAL_HASH_SHUFFLE
+    checkConsistencyWithSql("hash_join_shuffle",
+        """SELECT ${sv} a.k1, a.v1, b.v2
+           FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1, a.k2""")
+
+    // 5-3: LEFT OUTER shuffle join
+    //      Known diff: In single-BE environments, BE's pipeline-level need_to_local_exchange()
+    //      may skip exchanges when num_tasks_of_parent<=1, while FE still inserts PASSTHROUGH
+    //      because it lacks pipeline-level task count information.
+    checkConsistencyWithSql("hash_join_left_outer_shuffle",
+        """SELECT ${sv} a.k1, a.v1, b.v2
+           FROM ls_t1 a LEFT OUTER JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1, a.k2""")
+
+    // 5-4: RIGHT OUTER shuffle join
+    checkConsistencyWithSql("hash_join_right_outer_shuffle",
+        """SELECT ${sv} a.k1, a.v1, b.v2
+           FROM ls_t1 a RIGHT OUTER JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1, b.k3""")
+
+    // 5-5: FULL OUTER shuffle join
+    checkConsistencyWithSql("hash_join_full_outer_shuffle",
+        """SELECT ${sv} a.k1, a.v1, b.v2
+           FROM ls_t1 a FULL OUTER JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1, b.k3""")
+
+    // 5-6: LEFT SEMI shuffle join
+    checkConsistencyWithSql("hash_join_left_semi_shuffle",
+        """SELECT ${sv} a.k1, a.v1
+           FROM ls_t1 a LEFT SEMI JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1""")
+
+    // 5-7: LEFT ANTI shuffle join
+    //      Known diff: Same as LEFT OUTER — BE pipeline-level num_tasks_of_parent<=1 check
+    //      skips exchanges in single-BE environments; FE cannot replicate this.
+    checkConsistencyWithSql("hash_join_left_anti_shuffle",
+        """SELECT ${sv} a.k1, a.v1
+           FROM ls_t1 a LEFT ANTI JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1""")
+
+    // 5-8: NULL_AWARE_LEFT_ANTI_JOIN (NOT IN subquery with nullable) → NOOP
+    //      BE: both probe and build NOOP
+    checkConsistencyWithSql("hash_join_null_aware_left_anti",
+        """SELECT ${sv} k1, v1 FROM ls_t1
+           WHERE k1 NOT IN (SELECT k1 FROM ls_t2)
+           ORDER BY k1""")
+
+    // ================================================================
+    // Section 6: NestedLoopJoin scenarios
+    // BE operators: NestedLoopJoinProbeOperatorX, NestedLoopJoinBuildSinkOperatorX
+    // ================================================================
+
+    // 6-1: NLJ INNER (cross/theta join) → probe ADAPTIVE_PASSTHROUGH, build BROADCAST (serial)
+    //      FE: requireAdaptivePassthrough for probe; BE: ADAPTIVE_PASSTHROUGH for probe
+    checkConsistencyWithSql("nlj_inner_theta",
+        """SELECT ${sv} a.k1, b.k1 AS bk1
+           FROM ls_t1 a, ls_t2 b WHERE a.k1 > b.k1
+           ORDER BY a.k1, bk1 LIMIT 20""")
+
+    // 6-2: NLJ LEFT OUTER
+    checkConsistencyWithSql("nlj_left_outer",
+        """SELECT ${sv} a.k1, b.k1 AS bk1
+           FROM ls_t1 a LEFT OUTER JOIN ls_t2 b ON a.k1 > b.k1
+           ORDER BY a.k1, bk1 LIMIT 20""")
+
+    // 6-3: NLJ RIGHT OUTER → BE probe: NOOP; FE: ADAPTIVE_PASSTHROUGH (known difference)
+    //      FE uses requireAdaptivePassthrough unconditionally for non-NULL_AWARE NLJ
+    //      BE uses NOOP for RIGHT_OUTER/RIGHT_SEMI/RIGHT_ANTI/FULL_OUTER
+    checkConsistencyWithSql("nlj_right_outer", """
+        SELECT ${sv} a.k1, b.k1 AS bk1
+        FROM ls_t1 a RIGHT OUTER JOIN ls_t2 b ON a.k1 < b.k1
+        ORDER BY a.k1, bk1 LIMIT 20
+    """)
+
+    // 6-4: NLJ FULL OUTER → same known difference as RIGHT_OUTER
+    checkConsistencyWithSql("nlj_full_outer", """
+        SELECT ${sv} a.k1, b.k1 AS bk1
+        FROM ls_t1 a FULL OUTER JOIN ls_t2 b ON a.k1 > b.k1
+        ORDER BY a.k1, bk1 LIMIT 20
+    """)
+
+    // ================================================================
+    // Section 7: Set operations (INTERSECT / EXCEPT)
+    // BE operators: SetSinkOperatorX, SetProbeSinkOperatorX, SetSourceOperatorX
+    // ================================================================
+
+    // 7-1: INTERSECT → GLOBAL_HASH_SHUFFLE for both set sink and set probe sink
+    checkConsistencyWithSql("set_intersect",
+        """SELECT ${sv} k1 FROM ls_t1
+           INTERSECT
+           SELECT k1 FROM ls_t2
+           ORDER BY k1""")
+
+    // 7-2: EXCEPT → GLOBAL_HASH_SHUFFLE
+    checkConsistencyWithSql("set_except",
+        """SELECT ${sv} k1 FROM ls_t1
+           EXCEPT
+           SELECT k1 FROM ls_t2
+           ORDER BY k1""")
+
+    // 7-3: Three-way INTERSECT
+    //      FE and BE are consistent:
+    //      - ls_t1/ls_t2 (colocated on k1): DISTINCT_STREAMING_AGG with needsFinalize=true
+    //        → BE returns NOOP/HASH (already satisfied), FE requireHash (already satisfied) → no exchange
+    //      - ls_t3 (non-colocated, partition on k4): DISTINCT_STREAMING_AGG with needsFinalize=false
+    //        → BE returns PASSTHROUGH (enable_distinct_streaming_agg_force_passthrough=true),
+    //           FE enableDistinctStreamingAggForcePassthrough=true → requirePassthrough → insert PASSTHROUGH
+    checkConsistencyWithSql("set_intersect_three_way",
+        """SELECT ${sv} k1 FROM ls_t1
+           INTERSECT
+           SELECT k1 FROM ls_t2
+           INTERSECT
+           SELECT k1 FROM ls_t3
+           ORDER BY k1""")
+
+    // ================================================================
+    // Section 8: UNION scenarios
+    // BE operators: UnionSinkOperatorX, UnionSourceOperatorX
+    // ================================================================
+
+    // 8-1: UNION ALL (no downstream shuffled op → base default)
+    checkConsistencyWithSql("union_all_simple",
+        """SELECT ${sv} k1, v1 FROM ls_t1
+           UNION ALL
+           SELECT k1, v2 FROM ls_t2
+           ORDER BY k1, v1""")
+
+    // 8-2: UNION ALL feeding into GROUP BY (union followed by shuffled agg)
+    checkConsistencyWithSql("union_all_followed_by_agg",
+        """SELECT ${sv} k1, count(*) AS cnt
+           FROM (
+               SELECT k1, v1 AS v FROM ls_t1
+               UNION ALL
+               SELECT k1, v2 AS v FROM ls_t2
+           ) u
+           GROUP BY k1
+           ORDER BY k1""")
+
+    // 8-3: UNION followed by analytic window
+    checkConsistencyWithSql("union_all_followed_by_window",
+        """SELECT ${sv} k1, SUM(v) OVER(PARTITION BY k1) AS sv
+           FROM (
+               SELECT k1, v1 AS v FROM ls_t1
+               UNION ALL
+               SELECT k1, v2 AS v FROM ls_t2
+           ) u
+           ORDER BY k1, sv""")
+
+    // ================================================================
+    // Section 9: TableFunction and AssertNumRows
+    // BE operators: TableFunctionOperatorX, AssertNumRowsOperatorX
+    // ================================================================
+
+    // 9-1: TableFunction (non-pooling) → PASSTHROUGH×2
+    //      BE TableFunctionOperatorX overrides required_data_distribution() to always return
+    //      PASSTHROUGH; need_to_local_exchange Step 4 always inserts non-hash exchanges.
+    //      So: OlapScan → PT → TableFunc → PT → Sort. Total: 2 PASSTHROUGH.
+    //      FE mirrors: TableFunctionNode requires PASSTHROUGH from child (outputs NOOP),
+    //      SortNode independently inserts PASSTHROUGH for mergeByExchange.
+    checkConsistencyWithSql("table_function",
+        """SELECT ${sv} k1, e1 FROM ls_t1
+           LATERAL VIEW explode_numbers(v1) tmp AS e1
+           ORDER BY k1, e1 LIMIT 20""")
+
+    // 9-1b: TableFunction (pooling scan) → PASSTHROUGH×2
+    //       Same as 9-1: TableFunctionOperatorX always requires PASSTHROUGH regardless of child.
+    //       Pooling scan (serial) → PT fan-out → TableFunc → PT → Sort. Total: 2 PASSTHROUGH.
+    //       FE mirrors: TableFunctionNode requires PASSTHROUGH (outputs NOOP),
+    //       SortNode independently inserts PASSTHROUGH for mergeByExchange.
+    checkConsistencyWithSql("table_function_pooling",
+        """SELECT ${svSerialSource} k1, e1 FROM ls_t1
+           LATERAL VIEW explode_numbers(v1) tmp AS e1
+           ORDER BY k1, e1 LIMIT 20""")
+
+    // 9-2: AssertNumRows (scalar subquery) → PASSTHROUGH
+    //      Known diff: In single-BE environments, FE and BE may disagree on instance counts
+    //      for fragments containing AssertNumRows, leading to different exchange decisions.
+    checkConsistencyWithSql("assert_num_rows",
+        """SELECT ${sv} k1, (SELECT count(*) FROM ls_t2 WHERE ls_t2.k1 = ls_t1.k1) AS cnt
+           FROM ls_t1
+           ORDER BY k1""")
+
+    // ================================================================
+    // Section 10: Mixed / multi-level scenarios
+    // ================================================================
+
+    // 10-1: Agg after shuffle join (k1 is bucket key → no extra exchange after join)
+    checkConsistencyWithSql("agg_after_shuffle_join_bucket_key",
+        """SELECT ${sv} a.k1, count(*) AS cnt
+           FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           GROUP BY a.k1
+           ORDER BY a.k1""")
+
+    // 10-2: Agg after shuffle join on non-bucket column
+    //      GROUP BY k2 ≠ join key k1. BE's StreamingAggOperatorX sees child is_hash_join_probe()
+    //      and returns PASSTHROUGH (enable_streaming_agg_hash_join_force_passthrough=true by default),
+    //      splitting the pipeline at the streaming pre-agg/join boundary.
+    //      FE replicates this: AggregationNode detects useStreamingPreagg && child is HashJoinNode
+    //      → requirePassthrough. Both FE and BE produce 18 PASSTHROUGH exchanges.
+    checkConsistencyWithSql("agg_after_shuffle_join_non_bucket_key",
+        """SELECT ${sv} a.k2, count(*) AS cnt
+           FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           GROUP BY a.k2
+           ORDER BY a.k2""")
+
+    // 10-3: Agg after broadcast join
+    //      ScanNode returns BUCKET_HASH_SHUFFLE (mirroring BE's ScanOperator). HashJoinNode
+    //      (broadcast, non-serial probe) propagates probe side's distribution as its own
+    //      output type (instead of hardcoding NOOP). AggNode sees BUCKET_HASH_SHUFFLE,
+    //      RequireHash.satisfy(BUCKET_HASH_SHUFFLE)=true → no redundant hash exchange.
+    //      Mirrors BE's !(hash && hash) check in need_to_local_exchange.
+    checkConsistencyWithSql("agg_after_broadcast_join",
+        """SELECT ${sv} a.k1, count(*) AS cnt
+           FROM ls_t1 a JOIN [broadcast] ls_t2 b ON a.k1 = b.k1
+           GROUP BY a.k1
+           ORDER BY a.k1""")
+
+    // 10-4: Window after UNION
+    //      Known diff: In single-BE environments, FE instance-count-based skipping and
+    //      BE pipeline-level num_tasks checks can diverge for union+window fragments.
+    checkConsistencyWithSql("window_after_union",
+        """SELECT ${sv} k1, SUM(v) OVER(PARTITION BY k1) AS sv
+           FROM (
+               SELECT k1, v1 AS v FROM ls_t1
+               UNION ALL
+               SELECT k1, v2 AS v FROM ls_t2
+           ) u
+           ORDER BY k1, sv""")
+
+    // 10-5: Multi-level join + agg + window
+    checkConsistencyWithSql("join_agg_window_multilevel",
+        """SELECT ${sv} t.k1, t.cnt,
+                  row_number() OVER(ORDER BY t.cnt DESC, t.k1 ASC) AS rn
+           FROM (
+               SELECT a.k1, count(*) AS cnt
+               FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+               GROUP BY a.k1
+           ) t
+           ORDER BY t.k1""")
+
+    // 10-6: Two shuffle joins chained
+    checkConsistencyWithSql("two_shuffle_joins",
+        """SELECT ${sv} a.k1, b.k3, c.k4
+           FROM ls_t1 a
+           JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           JOIN [shuffle] ls_t3 c ON a.k1 = c.k1
+           ORDER BY a.k1, b.k3 LIMIT 20""")
+
+    // 10-7: Complex: join → agg → agg (double-layer aggregation after join)
+    //      Known diff: Multi-level agg fragments may have single instances in single-BE
+    //      environments, causing FE/BE exchange decision divergence.
+    checkConsistencyWithSql("complex_join_double_agg",
+        """SELECT ${sv} z.k1, SUM(z.metric) AS total
+           FROM (
+               SELECT y.k1, SUM(y.metric) AS metric
+               FROM (
+                   SELECT a.k1, SUM(a.v1 + b.v2) AS metric
+                   FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+                   GROUP BY a.k1
+               ) y
+               GROUP BY y.k1
+           ) z
+           GROUP BY z.k1
+           ORDER BY z.k1""")
+
+    // 10-8: Agg then INTERSECT
+    checkConsistencyWithSql("agg_then_intersect",
+        """SELECT ${sv} k1
+           FROM (SELECT k1, count(*) AS cnt FROM ls_t1 GROUP BY k1 HAVING cnt > 0) a
+           INTERSECT
+           SELECT k1
+           FROM (SELECT k1, count(*) AS cnt FROM ls_t2 GROUP BY k1 HAVING cnt > 0) b
+           ORDER BY k1""")
+
+    // 10-9: Shuffle join then DISTINCT
+    checkConsistencyWithSql("shuffle_join_then_distinct",
+        """SELECT ${sv} DISTINCT a.k1
+           FROM ls_t1 a JOIN [shuffle] ls_t2 b ON a.k1 = b.k1
+           ORDER BY a.k1""")
+
+    // ================================================================
+    // Section 11: AggSink LOCAL_HASH_SHUFFLE scenarios
+    // Scenarios where BE's need_to_local_exchange() inserts GLOBAL/BUCKET
+    // hash exchange because the source distribution is not hash-compatible.
+    //
+    // Key rule in pipeline.cpp need_to_local_exchange():
+    //   If source is BUCKET_HASH and sink requires GLOBAL_HASH → both are hash
+    //   → need_to_local_exchange returns false → NO local exchange.
+    //   But if source is PASSTHROUGH/NOOP → not both hash → insert GLOBAL_HASH.
+    // ================================================================
+
+    // 11-1: force_to_local_shuffle=true + non-bucket finalize agg
+    //       With force_to_local_shuffle, OlapScanNode.isSerialOperator()=true even with 8 tablets.
+    //       Optimizer puts agg in a separate finalize fragment receiving hash-partitioned data,
+    //       so no LOCAL_HASH_SHUFFLE is generated — only PASSTHROUGH for the NLJ/scan boundary.
+    checkConsistencyWithSql("agg_finalize_force_local_shuffle_non_bucket",
+        """SELECT /*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,
+                             ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,
+                             force_to_local_shuffle=true,enable_local_shuffle=true)*/ k2, count(*) AS cnt
+           FROM ls_t1 GROUP BY k2 ORDER BY k2""")
+
+    // 11-2: force_to_local_shuffle=true + bucket-key finalize agg
+    //       GROUP BY k1 (bucket key of ls_t1): colocate agg stays in same fragment as scan.
+    //       FE: AggNode is colocate → requireHash. BE: AggSink returns BUCKET_HASH.
+    //       Result MATCH: [PASSTHROUGH:9], consistent with other bucket-key colocate cases.
+    checkConsistencyWithSql("agg_finalize_force_local_shuffle_bucket_key",
+        """SELECT /*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,
+                             ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,
+                             force_to_local_shuffle=true,enable_local_shuffle=true)*/ k1, count(*) AS cnt
+           FROM ls_t1 GROUP BY k1 ORDER BY k1""")
+
+    // 11-3: NLJ (theta join) → finalize agg on non-bucket key
+    //       GROUP BY k2 (non-bucket): optimizer puts agg in a separate finalize fragment
+    //       receiving data via a hash-partitioned inter-fragment exchange on k2.
+    //       Within each fragment, the distributions are compatible → no LOCAL_HASH_SHUFFLE.
+    //       Result MATCH: [ADAPTIVE_PASSTHROUGH:5, PASSTHROUGH:5]
+    checkConsistencyWithSql("agg_after_nlj_non_bucket",
+        """SELECT /*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,
+                             ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,
+                             auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0)*/ a.k2, count(*) AS cnt
+           FROM ls_t1 a, ls_t2 b WHERE a.k1 > b.k1
+           GROUP BY a.k2 ORDER BY a.k2""")
+
+    // 11-4: NLJ (theta join) → finalize agg on bucket key (LOCAL_HASH_SHUFFLE test)
+    //       GROUP BY k1 (bucket key): colocate agg stays in same pipeline as NLJ probe.
+    //       The NLJ probe requires ADAPTIVE_PASSTHROUGH → local exchange inserted.
+    //       After that exchange, the next pipeline has LocalExchangeSource (PASSTHROUGH distribution)
+    //       feeding into AggSink (BUCKET_HASH_SHUFFLE for colocate k1 agg).
+    //       PASSTHROUGH source ≠ BUCKET_HASH target, not both-hash → need_to_local_exchange=true
+    //       → BE inserts LOCAL_HASH_SHUFFLE (BUCKET type).
+    //       FE: AggNode isColocated=true → requireHash → inserts LocalExchangeNode.
+    //       Result MATCH: [ADAPTIVE_PASSTHROUGH:9, LOCAL_HASH_SHUFFLE:9, PASSTHROUGH:9]
+    //       This is a primary test for regular AggSink generating LOCAL_HASH_SHUFFLE.
+    checkConsistencyWithSql("agg_after_nlj_bucket_key",
+        """SELECT /*+SET_VAR(disable_join_reorder=true,disable_colocate_plan=true,
+                             ignore_storage_data_distribution=false,parallel_pipeline_task_num=4,
+                             auto_broadcast_join_threshold=-1,broadcast_row_count_limit=0)*/ a.k1, count(*) AS cnt
+           FROM ls_t1 a, ls_t2 b WHERE a.k1 > b.k1
+           GROUP BY a.k1 ORDER BY a.k1""")
+
+    // ================================================================
+    // Section 12: Nested NLJ with pooling scan
+    // Tests that FE correctly inserts local exchange on ALL NLJ build sides,
+    // even when the NLJ's direct children are not ScanNodes (e.g., nested NLJ
+    // or ExchangeNode). Without the fix, the serial Exchange on NLJ(outer)'s
+    // build side would reduce num_tasks to 1, causing "must set shared state,
+    // in CROSS_JOIN_OPERATOR" for instances 1+.
+    // ================================================================
+
+    // 12-1: Nested NLJ with pooling scan — the regression case from RQG.
+    //       Two LEFT JOINs with non-equi conditions → two nested NLJ operators.
+    //       The outer NLJ's build side is an Exchange (UNPARTITIONED, serial).
+    //       FE must insert a BROADCAST local exchange there to fan out to all instances.
+    //       Without the fix in NestedLoopJoinNode (removing instanceof ScanNode check),
+    //       FE wouldn't insert the local exchange → "must set shared state" error.
+    //       BE-native also fails on this query with "_num_remaining_senders: -N",
+    //       so we only verify FE mode produces correct results (skip profile comparison).
+    //       knownDiff=true to tolerate the BE failure in profile comparison.
+    checkConsistencyWithSql("nested_nlj_pooling_scan",
+        """SELECT ${svSerialSource} count(a.k1) AS cnt, a.v1
+           FROM ls_serial a
+           LEFT JOIN ls_serial b ON b.k2 >= b.k2
+           LEFT JOIN ls_serial c ON b.k1 >= b.k1
+           WHERE a.k1 IS NOT NULL
+           GROUP BY a.v1
+           ORDER BY cnt, a.v1""", true)
+
+    // 12-2: Same nested NLJ but non-pooling (ignore_storage_data_distribution=false).
+    //       FE uses manual force-enforce to always insert ADAPTIVE_PASSTHROUGH
+    //       on NLJ probe side, matching BE's need_to_local_exchange Step 4 behavior.
+    //       Known mismatch on clusters where ls_serial (2 BUCKETS) tablets span multiple BEs:
+    //       same FE/BE instanceCount discrepancy as agg_finalize_non_pooling_bucket.
+    checkConsistencyWithSql("nested_nlj_non_pooling",
+        """SELECT ${sv} count(a.k1) AS cnt, a.v1
+           FROM ls_serial a
+           LEFT JOIN ls_serial b ON b.k2 >= b.k2
+           LEFT JOIN ls_serial c ON b.k1 >= b.k1
+           WHERE a.k1 IS NOT NULL
+           GROUP BY a.v1
+           ORDER BY cnt, a.v1""")
+
+    // ================================================================
+    // Section 13: Pooling scan + operators requiring shared state
+    // Regression cases from RQG build 183677 — serial Exchange on build
+    // side of various operators (Agg, Sort, Union/Repeat) reduced pipeline
+    // num_tasks, causing "must set shared state" errors.
+    // Fixed by restoring the num_tasks raise in _create_deferred_local_exchangers
+    // for non-scan serial operators.
+    // ================================================================
+
+    // 13-1: NLJ + AGG with pooling scan.
+    //       NLJ creates pipeline boundary; serial Exchange on build side
+    //       needs raise to _num_instances for AGG shared state injection.
+    //       knownDiff=true: pooling scan + NLJ has FE/BE exchange count
+    //       differences (same root cause as nested_nlj_pooling_scan).
+    checkConsistencyWithSql("agg_after_nlj_pooling_scan",
+        """SELECT ${svSerialSource} a.v1, MAX(a.k1) AS mx
+           FROM ls_serial a LEFT JOIN ls_serial b ON b.k2 < b.k2
+           WHERE a.k1 IS NOT NULL
+           GROUP BY a.v1
+           ORDER BY a.v1, mx""", true)
+
+    // 13-2: GROUPING SETS with pooling scan — generates REPEAT (union-like)
+    //       operator internally.  Serial Exchange reduces num_tasks, causing
+    //       "must set shared state, in UNION_OPERATOR / SORT_OPERATOR".
+    //       Known issue: deadlocks on clusters where ls_serial (2 BUCKETS) tablets span
+    //       multiple BEs — FE inserts LE (global instanceCount=2) but each BE has
+    //       _num_instances=1 causing pipeline task mismatch. Pre-existing FE/BE discrepancy.
+    checkConsistencyWithSql("grouping_sets_pooling_scan",
+        """SELECT ${svSerialSource} k1, k2, SUM(v1) AS sv
+           FROM ls_serial
+           GROUP BY GROUPING SETS ((k1, k2), (k1), ())
+           ORDER BY k1, k2, sv""")
+
+    // 13-3: Window function + GROUPING SETS with pooling scan.
+    //       Combines analytic (Sort shared state) and GROUPING SETS (Repeat/Union)
+    //       — both need correct num_tasks for shared state injection.
+    //       Same instanceCount discrepancy as grouping_sets_pooling_scan.
+    checkConsistencyWithSql("window_grouping_sets_pooling_scan",
+        """SELECT ${svSerialSource} k1, SUM(v1),
+                  ROW_NUMBER() OVER (ORDER BY k1) AS rn
+           FROM ls_serial
+           GROUP BY GROUPING SETS ((k1), ())
+           ORDER BY k1, rn""")
+
+    // ============================================================
+    //  14. RQG bug cases — serial NLJ + pooling scan (Bug 13 from rqg_bugs)
+    //  Serial NLJ (RIGHT_OUTER) with pooling scan. Previously crashed because
+    //  FE inserted BROADCAST on build side inflating num_tasks while probe stayed
+    //  serial. Fixed: serial NLJ sets buildSideRequire=noRequire().
+    // ============================================================
+    checkConsistencyWithSql("rqg_serial_nlj_right_outer_pooling",
+        """SELECT /*+SET_VAR(use_serial_exchange=true, parallel_pipeline_task_num=0,
+                             ignore_storage_data_distribution=true,
+                             enable_share_hash_table_for_broadcast_join=false,
+                             disable_streaming_preaggregations=true,
+                             disable_join_reorder=true)*/
+              b.k1 AS field1
+          FROM ls_serial a
+          RIGHT OUTER JOIN ls_serial b ON a.v1 > b.v1
+          GROUP BY field1
+          ORDER BY field1 ASC""")
+
+    // GLOBAL_HASH_SHUFFLE fix (Bug 10 from rqg_bugs) — self-join + NLJ with serial exchange
+    checkConsistencyWithSql("rqg_global_hash_shuffle_self_join_nlj",
+        """SELECT /*+SET_VAR(use_serial_exchange=true, parallel_pipeline_task_num=4,
+                             ignore_storage_data_distribution=true,
+                             disable_join_reorder=true, disable_colocate_plan=true)*/
+              a.k1 AS field1, a.v1 AS field2
+          FROM ls_t1 a
+          LEFT JOIN ls_t1 b ON a.k1 = b.k2
+          LEFT JOIN ls_t1 c ON a.k1 > b.k2
+          WHERE a.v1 > 5
+          GROUP BY field1, field2
+          ORDER BY field1, field2""")
+
+    // FULL OUTER JOIN + GROUP BY with serial exchange (Bug 11 from rqg_bugs)
+    checkConsistencyWithSql("rqg_global_hash_full_outer_join",
+        """SELECT /*+SET_VAR(use_serial_exchange=true, parallel_pipeline_task_num=4,
+                             ignore_storage_data_distribution=true)*/
+              a.k1, b.k1, count(1)
+          FROM ls_t1 a
+          FULL OUTER JOIN ls_t2 b ON a.k1 = b.k1
+          WHERE b.k1 = 2
+          GROUP BY a.k1, b.k1
+          ORDER BY 1, 2, 3""")
+
+    // Same pattern but simpler: NLJ with subquery + pooling, no GROUPING SETS
+    checkConsistencyWithSql("nlj_subquery_pooling",
+        """SELECT ${svSerialSource} k1, (SELECT COUNT(*) FROM ls_t2)
+           FROM ls_t1
+           ORDER BY k1""")
+
+    // ================================================================
+    //  Phase 2: Fetch all profiles and compare results
+    //  By now, all queries have been executed and profiles are being
+    //  collected in the background.  Fetching them here overlaps the
+    //  collection time with query execution, significantly reducing
+    //  total test duration.
+    // ================================================================
... 2570 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


(doris) 02/05: [fix](build) Fix compilation issues after rebasing on apache/master

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

924060929 pushed a commit to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 35c69241bb7f40ac1250a16be261a94a47a0dde0
Author: 924060929 <la...@selectdb.com>
AuthorDate: Tue May 12 17:49:30 2026 +0800

    [fix](build) Fix compilation issues after rebasing on apache/master
    
    - multi_version.h: use atomic_load/atomic_store for shared_ptr (LLVM 20 libc++ compat)
    - memory.cpp: fix std::max type mismatch (long vs int64_t on macOS)
    - bucketed_aggregation_sink_operator.h: fix ExchangeType::NOOP → TLocalPartitionType::NOOP
    - BucketedAggregationNode.java: rename isSerialOperator → isSerialOperatorOnBe
    - AnalyzeWhereSubqueryTest.java: remove unused imports
    - LocalShuffleNodeCoverageTest.java: fix CTEScanNode ctor + AnalyticEval NOOP expectations
---
 be/src/common/multi_version.h                                | 11 +++++++----
 be/src/exec/common/memory.cpp                                |  2 +-
 be/src/exec/operator/bucketed_aggregation_sink_operator.h    |  2 +-
 .../org/apache/doris/planner/BucketedAggregationNode.java    |  3 ++-
 .../nereids/rules/analysis/AnalyzeWhereSubqueryTest.java     |  3 ---
 .../apache/doris/planner/LocalShuffleNodeCoverageTest.java   | 12 +++++-------
 6 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/be/src/common/multi_version.h b/be/src/common/multi_version.h
index 441f8dedae3..aadd2ef3237 100644
--- a/be/src/common/multi_version.h
+++ b/be/src/common/multi_version.h
@@ -20,7 +20,6 @@
 
 #pragma once
 
-#include <atomic>
 #include <memory>
 
 /** Allow to store and read-only usage of an object in several threads,
@@ -50,14 +49,18 @@ public:
 
     explicit MultiVersion(std::unique_ptr<const T>&& value) : current_version(std::move(value)) {}
 
+    // Use the pre-C++20 atomic free functions for shared_ptr instead of
+    // std::atomic<shared_ptr>, which requires a trivially_copyable specialization
+    // not available in all libc++ versions (e.g., LLVM 20).
+
     /// Obtain current version for read-only usage. Returns shared_ptr, that manages lifetime of version.
-    Version get() const { return current_version.load(); }
+    Version get() const { return std::atomic_load(&current_version); }
 
     /// Update an object with new version.
     void set(std::unique_ptr<const T>&& value) {
-        current_version.store(Version {std::move(value)});
+        std::atomic_store(&current_version, Version {std::move(value)});
     }
 
 private:
-    std::atomic<Version> current_version;
+    Version current_version;
 };
diff --git a/be/src/exec/common/memory.cpp b/be/src/exec/common/memory.cpp
index 4ca4af037b3..ef5887e1ca7 100644
--- a/be/src/exec/common/memory.cpp
+++ b/be/src/exec/common/memory.cpp
@@ -51,7 +51,7 @@ int MemLimiter::available_scanner_count(int ins_idx) const {
     int64_t estimated_block_mem_bytes_value = get_estimated_block_mem_bytes();
     DCHECK_GT(estimated_block_mem_bytes_value, 0);
 
-    int64_t max_count = std::max(1L, mem_limit_value / estimated_block_mem_bytes_value);
+    int64_t max_count = std::max(int64_t(1), mem_limit_value / estimated_block_mem_bytes_value);
     int64_t avail_count = max_count;
     int64_t per_count = avail_count / parallelism;
     if (serial_operator) {
diff --git a/be/src/exec/operator/bucketed_aggregation_sink_operator.h b/be/src/exec/operator/bucketed_aggregation_sink_operator.h
index 34b8103155e..03161dd79d4 100644
--- a/be/src/exec/operator/bucketed_aggregation_sink_operator.h
+++ b/be/src/exec/operator/bucketed_aggregation_sink_operator.h
@@ -114,7 +114,7 @@ public:
 
     // No local exchange needed — each instance builds its own hash tables independently.
     DataDistribution required_data_distribution(RuntimeState* state) const override {
-        return DataDistribution(ExchangeType::NOOP);
+        return DataDistribution(TLocalPartitionType::NOOP);
     }
 
     size_t get_reserve_mem_size(RuntimeState* state, bool eos) override;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/BucketedAggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/BucketedAggregationNode.java
index 96dbd579388..f49c316cf24 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/BucketedAggregationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/BucketedAggregationNode.java
@@ -20,6 +20,7 @@ package org.apache.doris.planner;
 import org.apache.doris.analysis.AggregateInfo;
 import org.apache.doris.analysis.ExprToThriftVisitor;
 import org.apache.doris.analysis.FunctionCallExpr;
+import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.thrift.TBucketedAggregationNode;
 import org.apache.doris.thrift.TExplainLevel;
 import org.apache.doris.thrift.TExpr;
@@ -97,7 +98,7 @@ public class BucketedAggregationNode extends PlanNode {
     }
 
     @Override
-    public boolean isSerialOperator() {
+    public boolean isSerialOperatorOnBe(ConnectContext context) {
         // Bucketed agg handles group-by keys only (no without-key in initial version),
         // so it's never a serial operator.
         return false;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
index f813988dd91..4e51d196113 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/AnalyzeWhereSubqueryTest.java
@@ -51,9 +51,6 @@ import org.apache.doris.nereids.util.PlanChecker;
 import org.apache.doris.utframe.TestWithFeService;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import mockit.Mock;
-import mockit.MockUp;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
index 3bfaadee8be..9f3fea43869 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/LocalShuffleNodeCoverageTest.java
@@ -158,8 +158,7 @@ public class LocalShuffleNodeCoverageTest {
     public void testCteAndRecursiveNodesAndEmptySet() {
         PlanTranslatorContext ctx = new PlanTranslatorContext();
 
-        CTEScanNode cteScanNode = new CTEScanNode(new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())),
-                ScanContext.EMPTY);
+        CTEScanNode cteScanNode = new CTEScanNode(ScanContext.EMPTY);
         Pair<PlanNode, LocalExchangeType> cteOutput = cteScanNode.enforceAndDeriveLocalExchange(
                 ctx, null, LocalExchangeTypeRequire.requireHash());
         Assertions.assertEquals(LocalExchangeType.NOOP, cteOutput.second);
@@ -464,11 +463,10 @@ public class LocalShuffleNodeCoverageTest {
         AnalyticEvalNode noPartition = new AnalyticEvalNode(nextPlanNodeId(), noPartitionChild,
                 Collections.emptyList(), Collections.emptyList(), Collections.emptyList(),
                 null, new TupleDescriptor(new TupleId(NEXT_ID.getAndIncrement())));
-        // No partition → isSerialNode()=true → enforceChild skips exchange.
-        // Output is still PASSTHROUGH (hardcoded for empty partitions).
+        // No partition → isSerialNode()=true → returns NOOP (serial nodes let framework handle).
         Pair<PlanNode, LocalExchangeType> noPartitionOutput = noPartition.enforceAndDeriveLocalExchange(
                 ctx, null, LocalExchangeTypeRequire.requireHash());
-        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, noPartitionOutput.second);
+        Assertions.assertEquals(LocalExchangeType.NOOP, noPartitionOutput.second);
         Assertions.assertSame(noPartitionChild, noPartition.getChild(0));
 
         // Analytic with partition but no orderBy, non-colocated → noRequire/NOOP.
@@ -492,8 +490,8 @@ public class LocalShuffleNodeCoverageTest {
         Mockito.when(orderedAnalytic.fragment.useSerialSource(Mockito.any())).thenReturn(true);
         Pair<PlanNode, LocalExchangeType> orderedOutput = orderedAnalytic.enforceAndDeriveLocalExchange(
                 ctx, null, LocalExchangeTypeRequire.noRequire());
-        Assertions.assertEquals(LocalExchangeType.PASSTHROUGH, orderedOutput.second);
-        assertChildLocalExchangeType(orderedAnalytic, 0, LocalExchangeType.PASSTHROUGH);
+        // Serial AnalyticEval returns NOOP — lets framework serial check handle fan-out
+        Assertions.assertEquals(LocalExchangeType.NOOP, orderedOutput.second);
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


(doris) 04/05: [fix](local shuffle) Align AggregationNode with enable_local_exchange_before_agg

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

924060929 pushed a commit to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git

commit f675ebd4604102dc6e61c0d3136f0b600624f250
Author: 924060929 <la...@selectdb.com>
AuthorDate: Tue May 12 19:33:39 2026 +0800

    [fix](local shuffle) Align AggregationNode with enable_local_exchange_before_agg
    
    Adapt FE AggregationNode.enforceAndDeriveLocalExchange to match
    apache/doris#62438: when enable_local_exchange_before_agg=true (default)
    and !needsFinalize, all 3 BE agg operators request HASH_SHUFFLE.
    
    - Extract common !needsFinalize && !enableLeBeforeAgg early return
    - StreamingAgg: force_passthrough_after_join takes highest priority
    - DistinctStreamingAgg: add missing needsFinalize + emptyGroupKeys → NOOP
    - AggSink: non-finalize with enableLeBeforeAgg → requireHash;
      finalize preserves hasPartitionExprs heuristic
    
    Reduces FE/BE consistency mismatches from 8 to 4 (3 known NLJ + 1
    union_all_followed_by_agg over-insertion).
---
 .../org/apache/doris/planner/AggregationNode.java  | 91 +++++++++++-----------
 1 file changed, 47 insertions(+), 44 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
index 562199a2e89..ca364960ead 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/AggregationNode.java
@@ -275,65 +275,61 @@ public class AggregationNode extends PlanNode {
 
         ConnectContext connectContext = translatorContext.getConnectContext();
         SessionVariable sessionVariable = connectContext.getSessionVariable();
+        // PR #62438: when false, non-finalize agg falls back to BE base class.
+        boolean enableLeBeforeAgg = sessionVariable.enableLocalExchangeBeforeAgg;
+        boolean hasKeys = !aggInfo.getGroupingExprs().isEmpty();
 
+        // Each branch mirrors the corresponding BE operator's required_data_distribution()
+        // check order 1:1. The helper baseClassRequire() expands BE's base class behavior.
         LocalExchangeTypeRequire requireChild;
         if (canUseDistinctStreamingAgg(sessionVariable)) {
-            // DistinctStreamingAggOperatorX in BE
-            if (needsFinalize || (!aggInfo.getGroupingExprs().isEmpty() && !useStreamingPreagg)) {
-                if (AddLocalExchange.isColocated(this)) {
-                    requireChild = LocalExchangeTypeRequire.requireHash();
-                } else {
-                    requireChild = parentRequire.autoRequireHash();
-                }
+            // DistinctStreamingAggOperatorX
+            if (needsFinalize && !hasKeys) {
+                requireChild = LocalExchangeTypeRequire.noRequire();
+            } else if (!needsFinalize && !enableLeBeforeAgg) {
+                requireChild = baseClassRequire(connectContext);
+            } else if (needsFinalize || (hasKeys && !useStreamingPreagg)) {
+                requireChild = AddLocalExchange.isColocated(this)
+                        ? LocalExchangeTypeRequire.requireHash()
+                        : parentRequire.autoRequireHash();
             } else if (sessionVariable.enableDistinctStreamingAggForcePassthrough) {
                 requireChild = LocalExchangeTypeRequire.requirePassthrough();
-            } else if (children.get(0).isSerialOperatorOnBe(connectContext)) {
-                // BE base class: _child->is_serial_operator() ? PASSTHROUGH : NOOP
-                requireChild = LocalExchangeTypeRequire.requirePassthrough();
             } else {
-                requireChild = LocalExchangeTypeRequire.noRequire();
+                requireChild = baseClassRequire(connectContext);
             }
         } else if (useStreamingPreagg) {
-            // StreamingAggOperatorX in BE: base class required_data_distribution():
-            //   _child->is_serial_operator() ? PASSTHROUGH : NOOP
-            // Special: directly above HashJoin probe with force-passthrough → PASSTHROUGH.
+            // StreamingAggOperatorX
             if (children.get(0) instanceof HashJoinNode
                     && sessionVariable.enableStreamingAggHashJoinForcePassthrough) {
                 requireChild = LocalExchangeTypeRequire.requirePassthrough();
-            } else if (children.get(0).isSerialOperatorOnBe(connectContext)) {
-                // BE: _child->is_serial_operator() ? PASSTHROUGH : NOOP
-                requireChild = LocalExchangeTypeRequire.requirePassthrough();
+            } else if (!needsFinalize && !enableLeBeforeAgg) {
+                requireChild = baseClassRequire(connectContext);
+            } else if (!hasKeys) {
+                requireChild = needsFinalize
+                        ? LocalExchangeTypeRequire.noRequire()
+                        : baseClassRequire(connectContext);
             } else {
-                requireChild = LocalExchangeTypeRequire.noRequire();
+                requireChild = LocalExchangeTypeRequire.requireHash();
             }
         } else {
-            // AggSinkOperatorX in BE: required_data_distribution() override
-            if (aggInfo.getGroupingExprs().isEmpty()) {
-                if (needsFinalize) {
-                    // Finalize agg, no group key: NOOP (single serial instance collects all)
-                    requireChild = LocalExchangeTypeRequire.noRequire();
-                } else {
-                    // Serialize agg, no group key: BE → _child->is_serial_operator() ? PT : NOOP
-                    if (children.get(0).isSerialOperatorOnBe(connectContext)) {
-                        requireChild = LocalExchangeTypeRequire.requirePassthrough();
-                    } else {
-                        requireChild = LocalExchangeTypeRequire.noRequire();
-                    }
-                }
-            } else if (AddLocalExchange.isColocated(this)) {
-                // Colocate: BUCKET_HASH_SHUFFLE
-                requireChild = LocalExchangeTypeRequire.requireHash();
+            // AggSinkOperatorX
+            if (!hasKeys) {
+                requireChild = needsFinalize
+                        ? LocalExchangeTypeRequire.noRequire()
+                        : baseClassRequire(connectContext);
+            } else if (!needsFinalize && !enableLeBeforeAgg) {
+                requireChild = baseClassRequire(connectContext);
+            } else if (!needsFinalize || AddLocalExchange.isColocated(this)) {
+                // BE: non-finalize (PR #62438) or colocate → HASH
+                requireChild = parentRequire.autoRequireHash();
+            } else if (hasPartitionExprs(parentRequire)) {
+                // FE-only heuristic: finalize non-colocate with parent hash requirement
+                // → inherit parent's specific hash type.
+                requireChild = parentRequire.autoRequireHash();
             } else {
-                // Non-colocate, has group key: BE → GLOBAL_HASH
-                // FE uses parentRequire as proxy (no full need_to_local_exchange equivalent)
-                if (!needsFinalize
-                        && sessionVariable.getShuffledAggNodeIds().contains(this.getId().asInt())) {
-                    requireChild = LocalExchangeTypeRequire.requireHash();
-                } else if (hasPartitionExprs(parentRequire)) {
-                    requireChild = parentRequire.autoRequireHash();
-                } else {
-                    requireChild = LocalExchangeTypeRequire.noRequire();
-                }
+                // FE-only heuristic: finalize non-colocate without parent hash → skip
+                // LE (child Exchange already provides hash distribution).
+                requireChild = LocalExchangeTypeRequire.noRequire();
             }
         }
 
@@ -343,6 +339,13 @@ public class AggregationNode extends PlanNode {
         return Pair.of(this, enforceResult.second);
     }
 
+    /** BE base class required_data_distribution: serial child → PASSTHROUGH, else → NOOP. */
+    private LocalExchangeTypeRequire baseClassRequire(ConnectContext connectContext) {
+        return children.get(0).isSerialOperatorOnBe(connectContext)
+                ? LocalExchangeTypeRequire.requirePassthrough()
+                : LocalExchangeTypeRequire.noRequire();
+    }
+
     @Override
     protected List<Expr> getSemanticPartitionExprs() {
         return aggInfo.getGroupingExprs();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org


(doris) 03/05: [test](local shuffle) Add regression test for enable_local_exchange_before_agg

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

924060929 pushed a commit to branch fe_local_shuffle
in repository https://gitbox.apache.org/repos/asf/doris.git

commit b55f12ffab0bdf5cb358c9324709b17ebc6b10b1
Author: 924060929 <la...@selectdb.com>
AuthorDate: Tue May 12 18:59:27 2026 +0800

    [test](local shuffle) Add regression test for enable_local_exchange_before_agg
    
    Covers apache/doris#62438. Tests 10 agg query patterns with both
    enable_local_exchange_before_agg=true (FE vs BE planned LE) and
    enable_local_exchange_before_agg=false (verify no crash/hang).
---
 .../test_enable_local_exchange_before_agg.groovy   | 117 +++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/regression-test/suites/nereids_p0/local_shuffle/test_enable_local_exchange_before_agg.groovy b/regression-test/suites/nereids_p0/local_shuffle/test_enable_local_exchange_before_agg.groovy
new file mode 100644
index 00000000000..9871de7484c
--- /dev/null
+++ b/regression-test/suites/nereids_p0/local_shuffle/test_enable_local_exchange_before_agg.groovy
@@ -0,0 +1,117 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+/**
+ * Regression test for enable_local_exchange_before_agg (apache/doris#62438).
+ *
+ * When enable_local_exchange_before_agg=true (default), BE inserts HASH local exchange
+ * before pre-agg operators. When enable_local_shuffle_planner=true, FE does the same.
+ * This test verifies correctness under both combinations.
+ */
+suite("test_enable_local_exchange_before_agg", "p0") {
+
+    sql "DROP TABLE IF EXISTS le_agg_t1"
+    sql """
+        CREATE TABLE le_agg_t1 (
+            k1 INT NOT NULL,
+            k2 VARCHAR(32),
+            v1 INT,
+            v2 BIGINT
+        ) ENGINE=OLAP
+        DUPLICATE KEY(k1)
+        DISTRIBUTED BY HASH(k1) BUCKETS 8
+        PROPERTIES ("replication_num" = "1")
+    """
+
+    sql """INSERT INTO le_agg_t1 VALUES
+        (1, 'a', 10, 100), (1, 'a', 20, 200), (1, 'b', 30, 300),
+        (2, 'a', 40, 400), (2, 'b', 50, 500), (2, 'b', 60, 600),
+        (3, 'c', 70, 700), (3, 'c', 80, 800), (3, 'd', 90, 900),
+        (4, 'a', 100, 1000), (4, 'd', 110, 1100), (4, 'd', 120, 1200),
+        (5, 'e', 130, 1300), (5, 'e', 140, 1400), (5, 'f', 150, 1500)
+    """
+
+    def PH = "PLACEHOLDER"
+
+    def beHints = """/*+SET_VAR(
+        parallel_pipeline_task_num=4,
+        enable_local_shuffle=true,
+        ignore_storage_data_distribution=true,
+        enable_local_shuffle_planner=false,
+        enable_local_exchange_before_agg=true
+    )*/"""
+
+    def feHints = """/*+SET_VAR(
+        parallel_pipeline_task_num=4,
+        enable_local_shuffle=true,
+        ignore_storage_data_distribution=true,
+        enable_local_shuffle_planner=true,
+        enable_local_exchange_before_agg=true
+    )*/"""
+
+    def noLeBeforeAggHints = """/*+SET_VAR(
+        parallel_pipeline_task_num=4,
+        enable_local_shuffle=true,
+        ignore_storage_data_distribution=true,
+        enable_local_shuffle_planner=true,
+        enable_local_exchange_before_agg=false
+    )*/"""
+
+    def queries = [
+        "simple_agg_bucket_key":
+            "SELECT ${PH} k1, SUM(v1), COUNT(*) FROM le_agg_t1 GROUP BY k1 ORDER BY k1",
+        "simple_agg_non_bucket_key":
+            "SELECT ${PH} k2, SUM(v1), MAX(v2) FROM le_agg_t1 GROUP BY k2 ORDER BY k2",
+        "multi_key_agg":
+            "SELECT ${PH} k1, k2, SUM(v1) FROM le_agg_t1 GROUP BY k1, k2 ORDER BY k1, k2",
+        "distinct_non_bucket":
+            "SELECT ${PH} DISTINCT k2 FROM le_agg_t1 ORDER BY k2",
+        "count_distinct":
+            "SELECT ${PH} k1, COUNT(DISTINCT k2), SUM(v1) FROM le_agg_t1 GROUP BY k1 ORDER BY k1",
+        "agg_having":
+            "SELECT ${PH} k2, SUM(v1) AS s FROM le_agg_t1 GROUP BY k2 HAVING SUM(v1) > 100 ORDER BY k2",
+        "agg_after_join":
+            "SELECT ${PH} a.k2, SUM(a.v1) FROM le_agg_t1 a JOIN le_agg_t1 b ON a.k1 = b.k1 GROUP BY a.k2 ORDER BY a.k2",
+        "grouping_sets":
+            "SELECT ${PH} k1, k2, SUM(v1) FROM le_agg_t1 GROUP BY GROUPING SETS ((k1), (k2), (k1, k2)) ORDER BY k1, k2",
+        "window_over_agg":
+            "SELECT ${PH} k1, s, SUM(s) OVER (ORDER BY k1) AS running FROM (SELECT k1, SUM(v1) AS s FROM le_agg_t1 GROUP BY k1) t ORDER BY k1",
+        "multi_distinct":
+            "SELECT ${PH} COUNT(DISTINCT k1), COUNT(DISTINCT k2) FROM le_agg_t1",
+    ]
+
+    // Part 1: FE-planned (enable_local_exchange_before_agg=true) vs BE-planned baseline
+    logger.info("=== Part 1: FE vs BE with enable_local_exchange_before_agg=true ===")
+    queries.each { name, template ->
+        def beResult = sql(template.replace(PH, beHints))
+        def feResult = sql(template.replace(PH, feHints))
+        assertEquals(beResult, feResult, "[${name}] FE-planned differs from BE-planned")
+        logger.info("[${name}] PASSED")
+    }
+
+    // Part 2: enable_local_exchange_before_agg=false — verify no crash/hang and correct results
+    logger.info("=== Part 2: enable_local_exchange_before_agg=false ===")
+    queries.each { name, template ->
+        def beResult = sql(template.replace(PH, beHints))
+        def noLeResult = sql(template.replace(PH, noLeBeforeAggHints))
+        assertEquals(beResult, noLeResult, "[${name}] enable_local_exchange_before_agg=false differs from baseline")
+        logger.info("[${name}] enable_local_exchange_before_agg=false PASSED")
+    }
+
+    sql "DROP TABLE IF EXISTS le_agg_t1"
+    logger.info("=== All enable_local_exchange_before_agg tests completed ===")
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org