Skip to content

[feature](runtime filter) Support single-column runtime filter bucket pruning - #65837

Merged
morrySnow merged 20 commits into
apache:masterfrom
HappenLee:feature/runtime-filter-bucket-pruning
Aug 26, 2026
Merged

[feature](runtime filter) Support single-column runtime filter bucket pruning#65837
morrySnow merged 20 commits into
apache:masterfrom
HappenLee:feature/runtime-filter-bucket-pruning

Conversation

@HappenLee

@HappenLee HappenLee commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary: Runtime filters could prune table partitions but still created and scheduled scanners for every hash-distributed bucket. Add FE eligibility metadata for direct targets on a single HASH distribution column and use exact IN values in BE to compute Doris CRC bucket indexes. Initial and late filters skip nonmatching tablet scanners. Composite distribution and non-invertible Bloom filters conservatively fall back.

Release note

Support runtime-filter bucket pruning for exact filters on single-column HASH-distributed OLAP scans. It can be disabled with enable_runtime_filter_bucket_prune.

Check List (For Author)

  • Test: Unit Test and Regression test
    • FE unit test: RuntimeFilterBucketPruneClassifierTest (10 tests)
    • BE unit test: RuntimeFilterBucketPrunerTest (6 tests)
    • Regression test: query_p0/runtime_filter/rf_bucket_pruning
    • Build: ./build.sh --fe and ./build.sh --be -j 48
    • Static analysis: run-clang-tidy.sh on modified C++ translation units
  • Behavior changed: Yes. Eligible runtime filters skip nonmatching hash buckets.
  • Does this need documentation: No

@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

@github-actions

Copy link
Copy Markdown
Contributor

Codex automated review failed and did not complete.

Error: You've hit your usage limit. Visit https://chatgpt.com/codex/settings/usage to purchase more credits or try again at Jul 25th, 2026 6:03 AM.
Workflow run: https://github.com/apache/doris/actions/runs/29809112468

Please inspect the workflow logs and rerun the review after the underlying issue is resolved.

@morrySnow morrySnow left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR! The implementation is well-structured and integrates cleanly with the existing runtime-filter infrastructure. Below is a summary of my overall findings; detailed inline comments follow.

Overview: This PR adds the ability for exact IN runtime filters on single-column HASH-distributed OLAP tables to skip scanning tablets whose bucket index doesn't match any filter value. The FE classifier determines eligibility, and the BE pruner materializes filter values into hashes and computes which buckets to skip. The feature is gated behind enable_runtime_filter_bucket_prune (default true).

Strengths:

  • Clean separation between FE eligibility classification and BE pruning logic
  • Good test coverage (FE unit tests, BE unit tests, regression test)
  • Proper concurrency handling with shared_mutex
  • Conservatively falls back when prerequisites aren't met (Bloom, composite hash, etc.)
  • Efficient: caches selected buckets by bucket_num to avoid recomputation

Key issues to address:

  1. Asymmetric column comparison in sameColumn() — uses different name methods for target vs distribution columns, which could miss pruning opportunities
  2. NULL handling in materialize_hashes — inserting a default value for NULL adds a spurious hash that prevents optimal pruning
  3. A few minor style/convention items noted inline

@morrySnow morrySnow left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline comments on specific code locations (see the overall review for summary).

Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp Outdated
Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp Outdated
@HappenLee
HappenLee force-pushed the feature/runtime-filter-bucket-pruning branch from 0ff4ba8 to 1a8eff7 Compare August 12, 2026 02:42
HappenLee added a commit to HappenLee/incubator-doris that referenced this pull request Aug 12, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime filter bucket pruning compared distribution columns with an asymmetric name fallback and could accept columns with conflicting unique IDs. Compare set unique IDs first and use symmetric base-column names only when IDs are unavailable. Clarify fixed-width and null-aware hashing contracts, and cover both behaviors with focused tests.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - FE RuntimeFilterBucketPruneClassifierTest (8 tests)
    - BE RuntimeFilterBucketPrunerTest (6 tests)
- Behavior changed: Yes (bucket pruning is disabled when target and distribution unique IDs conflict; query results are unchanged)
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: complete after two convergence rounds. Requesting changes for the correctness issue described inline.

Critical checkpoints:

  • Goal and proof: The change aims to use exact single-column runtime filters to skip HASH-distribution buckets. The supplied FE, BE, and regression coverage exercises the ordinary base-table path, NULL behavior, composite-distribution rejection, varying bucket counts, and the disable gate, but it does not cover selected rollups whose index-local column IDs collide. That reachable path can prune the bucket containing a matching row, so the implementation does not yet meet the data-correctness goal.
  • Scope and clarity: The change is otherwise focused on bucket pruning and its FE/BE metadata plumbing.
  • Concurrency and lifecycle: I traced initial and late runtime-filter publication, local/global merging, scanner scheduling/closure, and the relevant locks. Publication is serialized, pruning is monotone, and I found no additional concurrency, lifecycle, or lock-order issue.
  • Configuration and compatibility: The forwarded session variable and optional Thrift fields degrade to no pruning when metadata is absent, including rolling-upgrade directions. No additional compatibility issue was found.
  • Parallel paths and conditions: Grouped targets, selected partitions, per-partition bucket counts, scheduler/colocate/bucket-shuffle range propagation, exact-set versus Bloom behavior, and disabled/partial metadata paths were checked. No additional issue was substantiated.
  • Tests and results: The checked-in expectations are consistent with the covered paths. Please add a same-ID/different-base-column selected-rollup test for the blocking case. I did not run builds or tests because this review runner's instructions prohibit them.
  • Performance and observability: Exact-set materialization is bounded by the configured IN-filter limit, and the added pruning counter provides useful visibility. No material additional issue was found.
  • Transactions, persistence, and writes: Not applicable; this is execution-time scan pruning and does not change stored data, transaction state, or edit-log formats.
  • User focus: No additional focus was provided, so the full PR was reviewed.

HappenLee added a commit to HappenLee/incubator-doris that referenced this pull request Aug 12, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime filter bucket pruning treated column unique IDs as table-wide identities, but Doris assigns them independently per materialized index. A selected rollup column could therefore share an ID with a different base distribution column and incorrectly enable bucket pruning, causing matching rows to be skipped. Match columns by logical base-column name across index namespaces and require exact type equality. Add focused rollup ID-collision and type-mismatch coverage.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - FE RuntimeFilterBucketPruneClassifierTest (10 tests)
- Behavior changed: Yes (unsafe bucket pruning is disabled for cross-index column ID collisions and type mismatches)
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: complete after three convergence rounds. Requesting changes for the three P2 performance issues described inline.

The functional goal is sound: exact IN runtime filters on a direct single-column HASH target can conservatively prune whole tablets, while composite distributions, non-exact representations, over-limit sets, and disabled sessions fall back. FE classifier tests, BE unit tests, and the regression cover the basic eligible/fallback, INT/NULL, heterogeneous-bucket, result, counter, composite, and session-off contracts. The change is otherwise focused, but it introduces avoidable work in the FE point-query path and both BE late-update and common scanner paths.

Concurrency and lifecycle: initial pruning precedes scanner creation; late filters are serialized by _conjuncts_lock; the monotonic pruned-tablet set is protected by _prune_mutex; and scanner checks cannot turn an in-flight block into row loss. No inverse lock order, deadlock, partial publication, close/use-after-free, circular ownership, or static-initialization issue was found. The remaining lock concerns are performance defects: repeated old-filter work stays under _conjuncts_lock, and permanently ineligible scans repeatedly take _prune_mutex in shared mode.

Configuration, compatibility, and propagation: the session variable is forwarded per query and needs no mid-query refresh. Current FE writes paired range metadata and eligible target IDs under the same gate; old-FE/new-BE and new-FE/old-BE executions conservatively fall back through appended optional Thrift fields. Ordinary and distributed Nereids coordinator paths preserve the annotated scan-range objects. No function-symbol or storage-format incompatibility was found.

Parallel and special paths: selected rollups, per-partition bucket counts, sampled/specified/distribution-pruned ranges, broadcast/global/local-exchange/local-aligned filters, parallel scanner fan-out, query cache, and exact-to-Bloom fallback were traced and found correctness-safe. Conditions fail conservatively, new Status results are checked, temporary hash state is memory-accounted, and BucketsPrunedByRuntimeFilter provides activation observability. Transaction, EditLog, failover, visible-version, delete-bitmap, and data-write concerns are not applicable to this query-local read optimization.

Tests and results: the submitted tests establish the feature-level contract and the checked-in output is consistent and deterministic. A production-routing type matrix and late/local/multi-driver integration cases would strengthen coverage, but code inspection found no concrete defect at those boundaries, so they are not separate blocking findings. No builds or tests were run in this review-only environment.

Performance findings:

  1. Prepared short-circuit point lookups rebuild and retain two all-tablet bucket maps despite having no runtime-filter producer.
  2. Staggered late filters reprocess all previously appended exact filters under the conjunct lock, producing triangular work.
  3. Every scheduled OLAP scan block takes two bucket-pruner shared locks even when the scan can never use bucket pruning.

User focus: no additional focus was supplied; the full PR scope and all applicable critical checkpoints were reviewed.

Comment thread fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java Outdated
Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp
Comment thread be/src/exec/scan/olap_scanner.cpp
HappenLee added a commit to HappenLee/incubator-doris that referenced this pull request Aug 12, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime-filter partition and bucket pruning exposed separate scanner APIs, reprocessed all accumulated filters while holding the conjunct lock, retained duplicate all-tablet metadata for ordinary scans, and built that metadata for point queries. With F staggered filters, late-arrival pruning performed F(F+1)/2 filter passes. Unify the scheduler-facing API as is_pruned_by_runtime_filter(), process only the newly appended immutable filter slice outside the conjunct lock so the work is F passes, compact bucket number and sequence into one map, exclude point queries from that map, and bypass the bucket-pruner lock for ineligible scans.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - BE RuntimeFilterBucketPrunerTest and RuntimeFilterPartitionPrunerTest (17 tests)
    - FE RuntimeFilterBucketPruneClassifierTest (10 tests)
    - BE and FE Release compilation
    - BE clang-format and format check
- Behavior changed: No
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

@HappenLee

Copy link
Copy Markdown
Contributor Author

Performance validation

Tested commit b716b37c76e with the local $run_path/doris deployment and the TPCH SF100 database.

A/B setup

  • Query: equality join with an IN runtime filter on the probe table's hash-distribution key.
  • Probe table: 16 range partitions × 96 hash buckets = 1,536 probe tablets, with data distributed across every tablet.
  • Build table: one matching key.
  • 10 interleaved disabled/enabled pairs after warm-up.
  • SQL/result cache disabled; one fragment instance; global IN runtime filter.
  • Partition runtime-filter pruning disabled to isolate bucket/tablet pruning.
  • Cost-based runtime-filter removal disabled so both sides retain the same runtime filter.
  • The only A/B change was enable_runtime_filter_bucket_prune.
Metric Disabled Enabled Improvement
Client wall-time median 141.5 ms 75.0 ms 47.0% lower / 1.89× faster
Doris profile latency median 117 ms 51 ms 56.4% lower / 2.29× faster
Probe tablets pruned 0 / 1,536 1,520 / 1,536 99.0%
Total scanners (probe + build) 1,537 17 98.9% fewer

The result was identical in both modes (120), and both profiles read 33 rows. The enabled profile reduced the probe side from 1,536 scanners to 16 scanners.

TPCH SF100 sanity check

I also ran the runtime-filter join against the existing SF100 lineitem table (600,037,902 rows, 96 hash buckets). Both modes returned the same result (6), while the enabled mode pruned 95 of the 96 lineitem buckets.

This validates that the optimization preserves correctness and materially reduces tablet/scanner setup overhead when runtime-filter selectivity identifies a small subset of hash buckets.

@HappenLee

Copy link
Copy Markdown
Contributor Author

run buildall

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed after two full-scope convergence rounds. One blocking concurrency issue is reported inline.

Checkpoint conclusions:

  • Goal and proof: the PR implements conservative exact-IN bucket pruning for eligible single-column HASH scans. Focused FE/BE unit tests and enabled, disabled, and composite-distribution regression coverage exercise the intended behavior.
  • Scope and clarity: the changes are focused on eligibility, optional metadata, local-state pruning, scheduler checks, counters, and tests.
  • Concurrency and lifecycle: scanner-worker entry points, helper/conjunct locks, projected-boundary caching, pruned-set publication, scheduling, and teardown were traced. The per-pruner locks and publication paths are otherwise sound, but releasing _conjuncts_lock exposes the accepted clone/open-versus-projection/execute race. No lock-order cycle was found.
  • Configuration and compatibility: the new switch is query-scoped and forwarded consistently. Appended optional Thrift fields make old-FE/new-BE and new-FE/old-BE combinations conservatively skip bucket pruning when metadata is absent.
  • Parallel and special paths: initial and late filters, split scanners, point queries, cloud/shared-nothing execution, sampling/specified tablets, grouped targets, and varying per-partition bucket counts were checked; they either preserve provenance or fall back conservatively.
  • Correctness and performance: admitted HybridSet values use the same type-specific CRC family as tablet routing, while Bloom/oversized/casted/composite cases are fenced. Newly arrived filters are processed once and ineligible scans bypass bucket locking.
  • Tests and observability: changed tests/results are deterministic and the new counters expose partition/tablet/bucket effects. A deterministic clone-versus-projection concurrency regression is still needed with the fix.
  • Persistence, transactions, and writes: none are modified; the write path was inspected only to validate bucket-hash equivalence.

This was a review-only environment, so I did not run builds or tests. There was no additional user-provided review focus.

Overall: changes requested until the shared-expression concurrency race is removed.

Comment thread be/src/exec/operator/scan_operator.cpp Outdated
HappenLee added a commit to HappenLee/incubator-doris that referenced this pull request Aug 12, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Late runtime-filter conjuncts became visible to scanner cloning before partition projection completed. VExprContext::clone() opens the shared expression root while projection executes it, so releasing the conjunct lock before pruning allowed concurrent mutation and reads of expression node state. Keep the conjunct lock through pruning while continuing to process only the newly appended filter slice, preserving linear work across staggered arrivals.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - BE ScannerLateArrivalRfTest, RuntimeFilterPartitionPrunerTest, and RuntimeFilterBucketPrunerTest (18 tests)
    - BE clang-format and format check
    - BE clang-tidy on modified C++ files
- Behavior changed: No
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: complete after two full-scope convergence rounds. Requesting changes for the P2 performance issue described inline.

Checkpoint conclusions:

  • Goal and correctness: The PR conservatively uses exact IN runtime filters to skip tablets for direct single-column HASH targets. I independently checked load-time versus pruning CRCs for the admitted physical types and NULLs, exact-to-Bloom fallback, grouped and ungrouped target identity, selected rollups, per-partition bucket counts, and empty sets. No surviving row-loss or query-correctness issue was found.
  • Scope and clarity: The patch is focused on FE eligibility and range metadata, optional protocol fields, BE local-state pruning, scheduler checks, counters, and tests.
  • Concurrency and lifecycle: Initial and late publication, expression cloning/projection, helper and pruner locks, scheduler checks, early EOS, errors, and teardown were traced. The current head keeps projection serialized with cloning, the pruned sets are monotonic, and no deadlock, race, stale unsafe publication, or lifetime issue survived.
  • Configuration and compatibility: The query-scoped switch is forwarded consistently. Appended optional Thrift fields make old-FE/new-BE and new-FE/old-BE combinations fall back conservatively when metadata is absent.
  • Parallel and special paths: Ordinary, colocate, bucket-shuffle, Nereids, sampled/specified, query-cache HIT/INCREMENTAL, point-query, disabled, composite, casted, Bloom, and varying-bucket-count paths were checked and preserve provenance or disable the optimization.
  • Errors and observability: New status paths are checked or conservatively continue scanning, malformed partial range metadata fails loudly, and BucketsPrunedByRuntimeFilter exposes activation.
  • Tests and results: The FE and BE unit tests plus regression cover basic eligibility/fallback, result correctness, NULL, empty/non-exact sets, different bucket counts, composite distribution, disablement, and the profile counter. Late multi-scanner and non-INT end-to-end cases remain coverage gaps, but no distinct defect was found at those boundaries. I did not run builds or tests because this review runner prohibits them.
  • Performance: The remaining issue is repeated exact-set materialization and CRC computation across pipeline local states, described inline. Earlier within-state accumulated-filter and ineligible-lock issues are fixed at the current head.
  • Transactions, persistence, writes, and security: Not applicable; this is query-local read pruning and does not change stored data, transaction state, edit logs, authorization, or a security boundary.
  • User focus: No additional review focus was provided, so the full PR was reviewed.

Overall: one P2 performance issue remains; no additional blocking correctness issue was substantiated.

Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp Outdated

@morrySnow morrySnow left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the runtime-filter bucket pruning feature end-to-end. I verified the hash semantics (pruner's update_crcs_with_value reproduces the write-path distribution hash RawValue::zlib_crc32 used in VOlapTablePartitionParam::find_tablets, including the zlib_crc_hash_null null handling), the FE classification guards (cast-wrapped targets rejected), and the producer-side disabled-filter handling (no conjunct appended when the IN set is cleared). Found the issues below as inline comments.

Comment thread fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java Outdated
Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp
Comment thread be/src/exec/runtime_filter/runtime_filter_bucket_pruner.cpp Outdated
Comment thread be/test/exec/runtime_filter/runtime_filter_bucket_pruner_test.cpp
Comment thread be/src/exec/operator/olap_scan_operator.cpp
@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28974 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit b716b37c76e70a15b1eca0622839c360d60001ca, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17613	4049	4040	4040
q2	2009	328	203	203
q3	10949	1387	821	821
q4	4735	479	340	340
q5	8419	866	550	550
q6	353	176	140	140
q7	821	834	646	646
q8	10623	1598	1561	1561
q9	5542	4020	4005	4005
q10	6671	1633	1379	1379
q11	516	341	318	318
q12	788	590	470	470
q13	18108	3176	2778	2778
q14	266	259	243	243
q15	q16	738	723	664	664
q17	919	898	1008	898
q18	6684	5630	5544	5544
q19	1136	1263	1016	1016
q20	837	688	602	602
q21	5771	2651	2460	2460
q22	426	353	296	296
Total cold run time: 103924 ms
Total hot run time: 28974 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4380	4314	4227	4227
q2	278	326	204	204
q3	4514	4995	4379	4379
q4	2142	2249	1390	1390
q5	4237	4098	4188	4098
q6	228	176	131	131
q7	1699	1946	1673	1673
q8	2351	2116	1989	1989
q9	7206	7190	7194	7190
q10	4341	4238	3897	3897
q11	564	436	406	406
q12	739	723	528	528
q13	3205	3572	2954	2954
q14	308	303	299	299
q15	q16	682	719	650	650
q17	1349	1329	1314	1314
q18	12204	11029	11841	11029
q19	1139	1168	1196	1168
q20	2261	2241	1959	1959
q21	5631	4882	4702	4702
q22	506	479	432	432
Total cold run time: 59964 ms
Total hot run time: 54619 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 158391 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit b716b37c76e70a15b1eca0622839c360d60001ca, data reload: false

query5	4323	582	474	474
query6	442	221	199	199
query7	4859	605	329	329
query8	322	158	146	146
query9	8776	4026	4068	4026
query10	495	347	306	306
query11	5850	2195	2054	2054
query12	149	100	100	100
query13	1240	600	412	412
query14	6068	4320	4096	4096
query14_1	3840	3846	3815	3815
query15	205	195	176	176
query16	986	488	468	468
query17	932	647	530	530
query18	2431	454	329	329
query19	204	184	141	141
query20	102	98	101	98
query21	231	160	139	139
query22	13032	13046	12780	12780
query23	15750	15002	14650	14650
query23_1	14679	14670	14658	14658
query24	7495	1691	1251	1251
query24_1	1253	1230	1259	1230
query25	521	459	354	354
query26	1335	356	205	205
query27	2584	600	376	376
query28	4534	2030	1964	1964
query29	1039	591	476	476
query30	347	253	222	222
query31	1185	1137	1063	1063
query32	112	59	60	59
query33	512	301	235	235
query34	1184	1131	627	627
query35	749	749	636	636
query36	780	794	708	708
query37	160	105	93	93
query38	1840	1762	1663	1663
query39	829	830	799	799
query39_1	781	776	810	776
query40	247	166	144	144
query41	64	63	68	63
query42	93	95	94	94
query43	317	323	274	274
query44	1425	773	773	773
query45	188	172	170	170
query46	1025	1175	698	698
query47	1537	1528	1423	1423
query48	416	388	296	296
query49	596	419	287	287
query50	1057	433	333	333
query51	10666	10502	10417	10417
query52	88	89	78	78
query53	265	280	207	207
query54	286	224	226	224
query55	77	76	69	69
query56	323	314	318	314
query57	1033	1002	954	954
query58	264	262	261	261
query59	1521	1631	1417	1417
query60	326	274	253	253
query61	149	151	145	145
query62	400	321	286	286
query63	245	201	199	199
query64	2866	1012	849	849
query65	3868	3814	3795	3795
query66	1797	464	356	356
query67	19977	20009	19929	19929
query68	3246	1574	951	951
query69	403	314	286	286
query70	895	811	778	778
query71	389	357	329	329
query72	3269	2852	2567	2567
query73	876	775	429	429
query74	4686	4511	4330	4330
query75	2394	2324	2006	2006
query76	2326	1152	757	757
query77	343	390	278	278
query78	11018	11069	10533	10533
query79	1397	1082	721	721
query80	1293	558	519	519
query81	527	327	279	279
query82	658	171	137	137
query83	374	321	297	297
query84	325	166	130	130
query85	936	618	512	512
query86	400	231	229	229
query87	1993	1963	1814	1814
query88	3800	2798	2782	2782
query89	414	315	283	283
query90	1888	217	192	192
query91	207	197	160	160
query92	66	59	54	54
query93	1648	1495	964	964
query94	707	356	310	310
query95	802	593	472	472
query96	1152	791	349	349
query97	2477	2500	2329	2329
query98	198	186	184	184
query99	751	747	632	632
Total cold run time: 245373 ms
Total hot run time: 158391 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 25.11 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit b716b37c76e70a15b1eca0622839c360d60001ca, data reload: false

query1	0.01	0.01	0.01
query2	0.14	0.09	0.09
query3	0.35	0.24	0.24
query4	1.60	0.25	0.24
query5	0.33	0.32	0.31
query6	1.16	0.67	0.66
query7	0.04	0.01	0.00
query8	0.10	0.07	0.06
query9	0.50	0.38	0.38
query10	0.57	0.57	0.56
query11	0.31	0.18	0.17
query12	0.31	0.19	0.18
query13	0.52	0.53	0.53
query14	0.93	0.93	0.92
query15	0.68	0.59	0.59
query16	0.39	0.38	0.39
query17	0.98	1.00	1.01
query18	0.28	0.28	0.29
query19	1.96	1.85	1.82
query20	0.02	0.01	0.02
query21	15.40	0.38	0.32
query22	4.77	0.14	0.13
query23	15.86	0.50	0.31
query24	2.44	0.61	0.44
query25	0.16	0.11	0.10
query26	0.73	0.28	0.21
query27	0.11	0.10	0.10
query28	3.43	0.72	0.40
query29	12.45	4.25	3.24
query30	0.37	0.26	0.27
query31	2.77	0.57	0.33
query32	3.25	0.62	0.48
query33	2.97	2.89	3.00
query34	15.71	3.87	3.23
query35	3.17	3.17	3.15
query36	0.64	0.52	0.51
query37	0.12	0.10	0.09
query38	0.08	0.07	0.07
query39	0.08	0.07	0.06
query40	0.20	0.17	0.16
query41	0.12	0.09	0.08
query42	0.08	0.06	0.05
query43	0.08	0.07	0.07
Total cold run time: 96.17 s
Total hot run time: 25.11 s

HappenLee added a commit to HappenLee/incubator-doris that referenced this pull request Aug 12, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Every scan local state materialized and hashed the same finalized exact runtime-filter set independently, point-query scans could be classified for bucket pruning without the metadata required during serialization, and bucket tests derived expectations through the same hashing API as production pruning. Cache immutable bucket hashes once per finalized wrapper and target nullability, reject point-query targets during classification, and validate routing hashes through the write path plus an end-to-end nullable null-aware join.

### Release note

None

### Check List (For Author)

- Test: Unit Test and Regression test
    - BE RuntimeFilterBucketPrunerTest (7 tests)
    - FE RuntimeFilterBucketPruneClassifierTest (11 tests)
    - Regression test query_p0/runtime_filter/rf_bucket_pruning, generated and verified against $run_path/doris
    - Release build: ./build.sh --be --fe -j 48
    - BE clang-format, format check, and clang-tidy on modified C++ files
- Behavior changed: No
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

/review

### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime-filter bucket pruning repeated metadata attachment and retained redundant per-tablet state, while late filters could arrive during scanner preparation and still allow reader initialization. Enforce finalized hash-cache usage, document the intentional temporary column materialization, attach FE bucket metadata once, retain compact selected-bucket state, and recheck late filters before scanner open. Also make the concurrent scanner test cleanup unconditional.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - BE: RuntimeFilterBucketPrunerTest and ScannerLateArrivalRfTest (12 tests)
    - FE: ThriftPlansBuilderTest (4 tests)
    - BE clang-format/check-format and clang-tidy
- Behavior changed: No
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Parallel scanners dropped bucket identity, multiple ready filters overcounted pruned tablets, and scanners pruned after prepare retained reader resources until query teardown. Preserve bucket metadata in the parallel scanner factory, count each newly pruned tablet once, and release prepared-but-unopened scanner resources immediately.

### Release note

Fix runtime-filter bucket pruning for parallel scanners and release resources for scanners pruned before open.

### Check List (For Author)

- Test: Unit Test
    - BE unit tests: RuntimeFilterBucketPrunerTest.* and ScannerLateArrivalRfTest.* (15 tests)
    - Format: build-support/check-format.sh
    - Static analysis: build-support/run-clang-tidy.sh on modified C++ files
- Behavior changed: Yes. Late runtime filters can prune parallel scanners and prepared scanners release resources before open.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Bucket pruning could leave constructor-owned OLAP reader inputs attached when bounded concurrency delays a scanner until after a late filter arrives. The FE classifier could also accept a computed MV column when its alias and type collided with the base distribution column, and the parallel scanner builder duplicated bucket identity in a node-based map for every range. Release unopened scanner resources before or after prepare, require direct base SlotRef identity for MV columns, and read bucket identity from aligned owned scan ranges without a duplicate map.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - FE: RuntimeFilterBucketPruneClassifierTest (12 tests)
    - BE: RuntimeFilterBucketPrunerTest and ScannerLateArrivalRfTest (17 tests)
    - Formatting: build-support/check-format.sh
    - Static analysis: build-support/run-clang-tidy.sh on modified C++ files
- Behavior changed: Yes. Unsafe computed MV bucket pruning is disabled and unopened pruned scanners release resources promptly.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime-filter partition and bucket pruning eligibility was generated during legacy translation and re-gated in multiple Thrift paths, while bucket range metadata was attached from a coordinator-wide pre-pass. This split ownership across planning stages, repeated session checks, and made missing optional bucket metadata abort planning. Generate both pruning decisions once when Nereids creates the filter at its final target scan, carry immutable target metadata through translation, attach bucket fields idempotently from OlapScanNode.toThrift(), and conservatively disable bucket pruning for the scan when range metadata is incomplete.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - FE: RuntimeFilterPruneClassifierTest, RuntimeFilterTranslatorBucketPruneTest, PhysicalPlanTranslatorTest#testRfPartitionPruneSnapshotSurvivesEnablementChange, OlapScanNodeTest, ThriftPlansBuilderTest
    - FE build: ./build.sh --fe -j 48
- Behavior changed: Yes. Pruning eligibility and session gating are generated once in Nereids; incomplete optional bucket metadata disables only this optimization instead of failing planning.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime-filter bucket pruning treated a target column without a define expression as a base column. When a non-base index is selected and the target column provenance cannot be proven, a computed materialized-view column could therefore be classified as the HASH distribution column and cause incorrect tablet pruning. Reject only non-base-index targets without a direct base-column definition, while preserving base-index targets and direct SlotRef rollup targets.

### Release note

Prevent runtime-filter bucket pruning when a selected non-base index target has unknown base-column provenance.

### Check List (For Author)

- Test: Unit Test
    - RuntimeFilterPruneClassifierTest
- Behavior changed: Yes. Bucket pruning now falls back when a non-base-index target has no direct base-column definition.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Runtime-filter partition pruning treated matching Column unique IDs as proof that a target was a partition column. Column unique IDs are allocated independently for base and rollup indexes, so unrelated rollup and partition columns can collide and produce invalid pruning metadata. Resolve a selected-index target to a proven direct base column, compare its name and type with the serialized partition column, and conservatively reject missing, computed, or renamed rollup definitions.

### Release note

Prevent runtime-filter partition pruning from using unrelated rollup columns with colliding column IDs.

### Check List (For Author)

- Test: Unit Test
    - RuntimeFilterPruneClassifierTest
- Behavior changed: Yes. Partition pruning now requires a target with proven base-column provenance and a directly serializable partition-column identity.
- Does this need documentation: No
@HappenLee
HappenLee force-pushed the feature/runtime-filter-bucket-pruning branch from a9cff25 to 5968e72 Compare August 24, 2026 03:32
@HappenLee

Copy link
Copy Markdown
Contributor Author

run buildall

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary: OlapScanner no longer owns _slot_id_to_virtual_column_expr after the scan-state refactor, but release_unopened_resources still referenced the removed member. This caused BE compilation to fail. Remove the stale cleanup call while retaining cleanup of scanner-owned virtual column expressions.

### Release note

None

### Check List (For Author)

- Test: Manual static check

    - clang-format-16 --dry-run --Werror and git diff --check

- Behavior changed: No

- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 16999 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 8c648b1a55a2534cb63c79a728fe76e477d49309, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17629	3102	3084	3084
q2	1888	235	150	150
q3	10466	901	524	524
q4	4677	261	212	212
q5	7659	598	391	391
q6	142	118	94	94
q7	532	516	391	391
q8	9247	919	909	909
q9	3490	2459	2449	2449
q10	6503	904	736	736
q11	389	202	183	183
q12	616	273	203	203
q13	18110	1553	1185	1185
q14	169	160	150	150
q15	q16	432	407	376	376
q17	838	822	731	731
q18	3086	2334	2291	2291
q19	1111	879	775	775
q20	364	279	202	202
q21	4864	1729	1887	1729
q22	329	271	234	234
Total cold run time: 92541 ms
Total hot run time: 16999 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3398	3388	3401	3388
q2	211	216	161	161
q3	2215	2442	2190	2190
q4	1214	1194	921	921
q5	2239	2151	2163	2151
q6	182	130	92	92
q7	1058	982	855	855
q8	1653	1462	1473	1462
q9	3226	3230	3194	3194
q10	1857	1813	1651	1651
q11	362	283	259	259
q12	466	449	345	345
q13	1544	1571	1170	1170
q14	179	201	159	159
q15	q16	398	400	365	365
q17	1072	1056	1053	1053
q18	5013	4459	4853	4459
q19	902	876	867	867
q20	985	930	795	795
q21	3796	3275	3359	3275
q22	414	378	331	331
Total cold run time: 32384 ms
Total hot run time: 29143 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 83525 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 8c648b1a55a2534cb63c79a728fe76e477d49309, data reload: false

query5	4254	424	317	317
query6	374	137	128	128
query7	4974	431	226	226
query8	279	127	119	119
query9	8674	2990	2997	2990
query10	392	220	187	187
query11	5360	1065	915	915
query12	110	71	73	71
query13	1192	445	295	295
query14	6114	2248	2116	2116
query14_1	2003	2031	1992	1992
query15	174	119	110	110
query16	906	364	358	358
query17	776	436	362	362
query18	2312	334	224	224
query19	160	143	111	111
query20	74	71	69	69
query21	196	102	85	85
query22	5521	5456	5418	5418
query23	6774	6342	6057	6057
query23_1	6198	6132	5994	5994
query24	7336	1117	778	778
query24_1	763	763	808	763
query25	446	320	270	270
query26	1234	223	131	131
query27	2795	429	262	262
query28	4681	1501	1498	1498
query29	952	444	373	373
query30	249	157	131	131
query31	838	406	340	340
query32	103	53	50	50
query33	463	235	178	178
query34	980	856	500	500
query35	426	403	346	346
query36	577	572	530	530
query37	125	86	74	74
query38	1011	854	826	826
query39	531	528	485	485
query39_1	474	491	473	473
query40	202	95	89	89
query41	59	59	58	58
query42	76	74	74	74
query43	249	249	223	223
query44	1024	565	556	556
query45	110	111	104	104
query46	772	812	535	535
query47	776	775	724	724
query48	324	313	241	241
query49	555	252	204	204
query50	768	259	200	200
query51	8375	8272	8267	8267
query52	68	66	58	58
query53	191	208	147	147
query54	334	226	162	162
query55	78	65	56	56
query56	207	167	182	167
query57	703	696	656	656
query58	204	163	148	148
query59	1233	1242	1113	1113
query60	256	205	182	182
query61	122	133	134	133
query62	348	208	181	181
query63	177	156	151	151
query64	2835	753	612	612
query65	1662	1583	1685	1583
query66	1761	266	200	200
query67	10093	10201	10187	10187
query68	3006	1222	744	744
query69	351	214	194	194
query70	685	591	626	591
query71	252	173	166	166
query72	2397	1820	1669	1669
query73	636	563	348	348
query74	2008	1237	1149	1149
query75	1189	1119	976	976
query76	2382	740	563	563
query77	260	250	218	218
query78	3872	3672	3268	3268
query79	1260	835	580	580
query80	1163	336	277	277
query81	466	160	137	137
query82	573	124	99	99
query83	297	213	196	196
query84	294	110	93	93
query85	804	371	302	302
query86	372	179	177	177
query87	1034	991	902	902
query88	2812	2093	2100	2093
query89	276	202	177	177
query90	1953	137	132	132
query91	133	127	108	108
query92	53	49	47	47
query93	1159	1070	683	683
query94	630	264	227	227
query95	515	245	312	245
query96	795	575	286	286
query97	1068	1042	1049	1042
query98	144	135	141	135
query99	418	346	320	320
Total cold run time: 177077 ms
Total hot run time: 83525 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 16.63 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 8c648b1a55a2534cb63c79a728fe76e477d49309, data reload: false

query1	0.01	0.01	0.00
query2	0.12	0.07	0.06
query3	0.33	0.21	0.20
query4	1.60	0.19	0.18
query5	0.26	0.24	0.24
query6	1.16	0.39	0.39
query7	0.03	0.00	0.00
query8	0.07	0.05	0.05
query9	0.39	0.28	0.28
query10	0.39	0.39	0.39
query11	0.27	0.16	0.16
query12	0.28	0.15	0.16
query13	0.37	0.38	0.38
query14	0.46	0.46	0.45
query15	0.51	0.40	0.39
query16	0.28	0.28	0.28
query17	0.67	0.68	0.70
query18	0.26	0.25	0.24
query19	1.23	1.10	1.09
query20	0.02	0.01	0.01
query21	15.39	0.29	0.26
query22	4.90	0.10	0.10
query23	15.90	0.40	0.24
query24	2.57	0.45	0.36
query25	0.12	0.09	0.08
query26	0.72	0.21	0.17
query27	0.08	0.07	0.07
query28	3.55	0.62	0.35
query29	12.43	3.34	2.67
query30	0.32	0.24	0.22
query31	2.76	0.42	0.22
query32	3.41	0.36	0.28
query33	1.50	1.40	1.39
query34	15.41	2.49	1.98
query35	1.90	1.88	1.87
query36	0.49	0.39	0.36
query37	0.09	0.07	0.06
query38	0.06	0.05	0.04
query39	0.05	0.04	0.04
query40	0.13	0.10	0.10
query41	0.11	0.07	0.06
query42	0.07	0.04	0.04
query43	0.06	0.05	0.05
Total cold run time: 90.73 s
Total hot run time: 16.63 s

### What problem does this PR solve?

Issue Number: None

Related PR: apache#65837

Problem Summary: Recent scan projection and bucket metadata refactors changed the ScannerContext constructor, row descriptor accessor, and OlapScanNode bucket metadata field. The bucket pruning tests still used the old APIs after rebasing, which caused BE test compilation failures and an FE reflection failure. Align the tests with the current production APIs and packed bucket metadata representation.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - BE ASAN UT build compiled scanner_late_arrival_rf_test.cpp successfully; final local link was blocked by an unrelated duplicate getrandom symbol in the local toolchain compatibility library
    - FE UT checkstyle and test-source compilation passed; local execution was blocked by the JDK Byte Buddy self-attach restriction
- Behavior changed: No
- Does this need documentation: No
@HappenLee

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor

Cloud UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 77.02% (2018/2620)
Line Coverage 65.00% (36874/56733)
Region Coverage 52.28% (34363/65723)
Branch Coverage 55.24% (10941/19806)

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 16815 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit ffbded491d751b6bc7b39fba1551376601abb35f, data reload: false

------ Round 1 ----------------------------------
============================================
q1	16790	3088	3103	3088
q2	1907	232	145	145
q3	10164	907	514	514
q4	4659	256	208	208
q5	7731	573	397	397
q6	150	121	95	95
q7	537	509	396	396
q8	9334	930	885	885
q9	3472	2442	2491	2442
q10	6502	875	708	708
q11	406	196	184	184
q12	617	264	201	201
q13	18123	1573	1196	1196
q14	158	150	138	138
q15	q16	456	405	370	370
q17	836	783	705	705
q18	3215	2311	2265	2265
q19	1471	857	862	857
q20	381	295	198	198
q21	5368	1591	1949	1591
q22	347	271	232	232
Total cold run time: 92624 ms
Total hot run time: 16815 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3455	3356	3354	3354
q2	212	222	156	156
q3	2218	2335	2255	2255
q4	1210	1197	900	900
q5	2192	2147	2132	2132
q6	177	124	86	86
q7	1056	961	870	870
q8	1641	1438	1452	1438
q9	3198	3176	3162	3162
q10	1884	1828	1653	1653
q11	365	276	254	254
q12	467	434	339	339
q13	1491	1540	1189	1189
q14	173	188	161	161
q15	q16	394	401	358	358
q17	1060	1042	1035	1035
q18	5003	4446	4771	4446
q19	850	856	871	856
q20	984	996	813	813
q21	3510	3315	3269	3269
q22	418	354	337	337
Total cold run time: 31958 ms
Total hot run time: 29063 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 82959 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit ffbded491d751b6bc7b39fba1551376601abb35f, data reload: false

query5	4293	413	346	346
query6	395	139	124	124
query7	4925	419	234	234
query8	305	129	124	124
query9	8684	2902	2916	2902
query10	380	229	182	182
query11	5406	1054	923	923
query12	123	74	75	74
query13	1190	455	342	342
query14	6083	2233	2116	2116
query14_1	2016	1982	1988	1982
query15	181	123	116	116
query16	959	410	328	328
query17	806	455	369	369
query18	2352	325	230	230
query19	159	131	105	105
query20	88	67	69	67
query21	197	100	84	84
query22	5406	5474	5413	5413
query23	6817	6399	6044	6044
query23_1	6269	6030	6022	6022
query24	7099	1106	780	780
query24_1	767	773	778	773
query25	426	283	242	242
query26	1240	226	135	135
query27	2795	427	256	256
query28	4581	1519	1500	1500
query29	934	437	360	360
query30	251	157	133	133
query31	863	415	334	334
query32	100	50	48	48
query33	477	221	181	181
query34	1482	854	495	495
query35	410	403	350	350
query36	582	568	536	536
query37	121	84	73	73
query38	1048	878	857	857
query39	505	493	497	493
query39_1	465	463	486	463
query40	205	88	75	75
query41	54	51	53	51
query42	80	73	71	71
query43	250	252	217	217
query44	1054	570	567	567
query45	126	112	103	103
query46	811	838	509	509
query47	763	764	725	725
query48	309	300	234	234
query49	553	250	198	198
query50	801	268	202	202
query51	8234	8091	8197	8091
query52	71	72	62	62
query53	202	220	183	183
query54	275	179	163	163
query55	86	62	59	59
query56	197	170	168	168
query57	726	660	636	636
query58	219	166	169	166
query59	1279	1241	1131	1131
query60	231	179	172	172
query61	116	112	132	112
query62	409	220	230	220
query63	168	141	142	141
query64	2754	726	667	667
query65	1709	1571	1646	1571
query66	1819	256	200	200
query67	10073	9705	9798	9705
query68	3067	1285	736	736
query69	347	226	193	193
query70	655	600	612	600
query71	253	178	168	168
query72	2322	1719	1573	1573
query73	654	577	344	344
query74	2002	1230	1157	1157
query75	1181	1126	976	976
query76	2180	748	552	552
query77	262	261	216	216
query78	4051	3849	3382	3382
query79	2434	875	584	584
query80	1618	329	273	273
query81	504	155	139	139
query82	693	129	95	95
query83	287	208	191	191
query84	295	115	90	90
query85	816	361	302	302
query86	403	182	171	171
query87	1038	987	914	914
query88	2796	2128	2127	2127
query89	283	198	178	178
query90	1995	133	137	133
query91	134	117	102	102
query92	63	49	46	46
query93	1514	1167	745	745
query94	677	245	227	227
query95	533	254	234	234
query96	751	554	270	270
query97	1077	1060	1044	1044
query98	154	137	131	131
query99	422	360	322	322
Total cold run time: 179631 ms
Total hot run time: 82959 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 16.43 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit ffbded491d751b6bc7b39fba1551376601abb35f, data reload: false

query1	0.01	0.00	0.00
query2	0.11	0.06	0.07
query3	0.33	0.20	0.19
query4	1.60	0.20	0.20
query5	0.25	0.24	0.24
query6	1.15	0.38	0.41
query7	0.04	0.00	0.00
query8	0.07	0.06	0.06
query9	0.42	0.27	0.27
query10	0.38	0.40	0.39
query11	0.28	0.15	0.15
query12	0.31	0.16	0.16
query13	0.37	0.38	0.36
query14	0.45	0.46	0.45
query15	0.49	0.41	0.41
query16	0.28	0.28	0.28
query17	0.65	0.68	0.63
query18	0.24	0.24	0.24
query19	1.26	1.12	1.06
query20	0.01	0.02	0.01
query21	15.40	0.30	0.25
query22	4.94	0.11	0.11
query23	15.92	0.39	0.24
query24	2.60	0.46	0.34
query25	0.13	0.08	0.08
query26	0.78	0.21	0.18
query27	0.08	0.07	0.06
query28	3.37	0.66	0.37
query29	12.41	3.36	2.67
query30	0.36	0.21	0.21
query31	2.75	0.42	0.23
query32	3.41	0.36	0.28
query33	1.36	1.39	1.47
query34	15.38	2.34	1.91
query35	1.87	1.84	1.83
query36	0.54	0.36	0.35
query37	0.08	0.07	0.06
query38	0.07	0.05	0.04
query39	0.06	0.05	0.05
query40	0.14	0.10	0.13
query41	0.11	0.07	0.05
query42	0.06	0.05	0.04
query43	0.06	0.05	0.05
Total cold run time: 90.58 s
Total hot run time: 16.43 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 71.43% (20/28) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 62.55% (29190/46668)
Line Coverage 47.55% (305428/642348)
Region Coverage 43.19% (246551/570900)
Branch Coverage 44.75% (114752/256436)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (28/28) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 75.98% (34343/45201)
Line Coverage 60.92% (386854/635003)
Region Coverage 57.07% (324586/568736)
Branch Coverage 57.91% (148088/255711)

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 61.64% (225/365) 🎉
Increment coverage report
Complete coverage report

@morrySnow
morrySnow merged commit b99abe5 into apache:master Aug 26, 2026
30 of 31 checks passed
@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Aug 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR approved by at least one committer and no changes requested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/4.1.x dev/4.1.x-conflict

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants