This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 085ac84bbd9 [test](nereids) stabilize flaky
prune_bucket_with_bucket_shuffle_join (#64530)
085ac84bbd9 is described below
commit 085ac84bbd93acfc95d92fd0703303655de12532
Author: 924060929 <[email protected]>
AuthorDate: Tue Jun 16 13:33:14 2026 +0800
[test](nereids) stabilize flaky prune_bucket_with_bucket_shuffle_join
(#64530)
## Proposed changes
Stabilize the flaky regression test
`prune_bucket_with_bucket_shuffle_join`.
### Problem
With `enable_nereids_distribute_planner=true`, the `RIGHT OUTER JOIN` in
this case has a
non-deterministic distribution: it can be planned as either
`BUCKET_SHUFFLE` or `PARTITIONED`.
Both plans are correct — `BUCKET_SHUFFLE` just has one fewer exchange.
The choice is **sticky within a JDBC connection**: every `explain` on
the same connection
returns the same distribution. The regression framework reuses one
connection per suite
(`SuiteContext.getConnection()` caches it in a `ThreadLocal`), so the
existing
`retry(120, 1000)` retries on the same sticky connection and can never
flip
`PARTITIONED` → `BUCKET_SHUFFLE`. Once a run lands on `PARTITIONED`, the
`assertTrue(result.contains("RIGHT OUTER JOIN(BUCKET_SHUFFLE)"))`
assertion fails for all
120 retries → flaky failure.
### Fix
After enabling the distribute planner, explain once and check whether
the plan actually
chose `BUCKET_SHUFFLE`:
- if yes → run the existing bucket-shuffle-specific checks (single
exchange, tablet
pruning, result check);
- if no → return early.
This is a test-only change; it does not touch FE/BE planner behavior.
Both distributions
already produce correct results.
## Further comments
The underlying non-determinism (benign tie-break vs. whether the planner
should
deterministically prefer `BUCKET_SHUFFLE`) is a separate planner
question and is left
as-is here; this PR only removes the flakiness from the regression case.
---
.../prune_bucket_with_bucket_shuffle_join.groovy | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git
a/regression-test/suites/nereids_syntax_p0/distribute/prune_bucket_with_bucket_shuffle_join.groovy
b/regression-test/suites/nereids_syntax_p0/distribute/prune_bucket_with_bucket_shuffle_join.groovy
index 7006b8c226e..8ea8f35f914 100644
---
a/regression-test/suites/nereids_syntax_p0/distribute/prune_bucket_with_bucket_shuffle_join.groovy
+++
b/regression-test/suites/nereids_syntax_p0/distribute/prune_bucket_with_bucket_shuffle_join.groovy
@@ -82,6 +82,23 @@ suite("prune_bucket_with_bucket_shuffle_join") {
set disable_join_reorder=true;
"""
+ // With enable_nereids_distribute_planner=true the RIGHT OUTER JOIN
distribution is
+ // non-deterministic between BUCKET_SHUFFLE and PARTITIONED. The choice is
sticky within
+ // a connection (so retrying in the same connection can not change it),
and both plans are
+ // correct -- BUCKET_SHUFFLE just saves one exchange. Only run the
bucket-shuffle-specific
+ // checks when the planner actually chose BUCKET_SHUFFLE, otherwise return
directly.
+ String bucketShuffleExplain = null
+ explain {
+ sql sqlStr
+ check { result ->
+ log.info("Explain result:\n${result}")
+ bucketShuffleExplain = result
+ }
+ }
+ if (!bucketShuffleExplain.contains("RIGHT OUTER JOIN(BUCKET_SHUFFLE)")) {
+ return
+ }
+
extractFragment(sqlStr, "RIGHT OUTER JOIN(BUCKET_SHUFFLE)") { exchangeNum
->
assertTrue(exchangeNum == 1)
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]