Skip to content

[fix](scanner)(nereids) Harden FileScannerV2 and fix external COUNT pushdown semantics#65548

Open
Gabriel39 wants to merge 17 commits into
apache:masterfrom
Gabriel39:codex/fix-file-scanner-v2-review-issues
Open

[fix](scanner)(nereids) Harden FileScannerV2 and fix external COUNT pushdown semantics#65548
Gabriel39 wants to merge 17 commits into
apache:masterfrom
Gabriel39:codex/fix-file-scanner-v2-review-issues

Conversation

@Gabriel39

@Gabriel39 Gabriel39 commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: None

Related PR: None

This PR fixes two correctness areas in external file scans.

1. Preserve external COUNT(*) / COUNT(column) semantics

External COUNT(*) retained an arbitrary scan slot after column pruning. BE then inferred aggregate semantics from that post-pruning scan shape and could treat the retained nullable placeholder as the argument of COUNT(column). This produced wrong results, including 9015 instead of 10000 rows for special ORC data and 116 instead of 219 rows for Hive basic types.

The fix transports semantic COUNT arguments from Nereids through TPlanNode.push_down_count_slot_ids to both file-scanner implementations and their table/hybrid readers. The thrift field has an explicit compatibility contract:

  • absent: an old FE plan with unknown COUNT semantics; use the conservative normal-scan path;
  • present and empty: explicit COUNT(*) / row-count semantics;
  • present and non-empty: explicit COUNT(column) arguments, which may use metadata only when every mapping is proven safe.

Nereids no longer applies storage COUNT pushdown to cast arguments whose null/error behavior would be lost. FE split planning also restricts Iceberg/Paimon metadata-count split reduction and Hive/TVF no-split shortcuts to explicit row-count semantics, so a COUNT(column) fallback retains all data splits and normal scan parallelism. BE V1, V2, Hudi, Paimon, and table-reader paths preserve the same argument state, reject unsafe metadata shortcuts, and keep adaptive batching enabled for real-row fallbacks.

2. Harden FileScannerV2 schema and reader edge cases

FileScannerV2 treated valid empty splits as failures, could count stopped EOF or malformed Native input as an empty file, localized evolved nested predicates without fully preserving type/nullability contracts, and rejected whole Parquet schemas when only unprojected leaves used unsupported logical types. Parquet page-cache range metadata also lost warm non-exact reuse while lacking a bound.

The fix distinguishes stopped reads, valid empty input, and malformed/truncated input; keeps unsafe nested predicates above TableReader; validates only semantically required Parquet projections while preserving strict checks for real predicate and COUNT(column) inputs; uses safe row-position/default carriers for placeholder-only paths; and shares bounded per-file page-range indexes without adding a process-wide lock to the ReadAt hot path.

Release note

Fix wrong external COUNT(*) / COUNT(column) results and unsafe metadata pushdown across Nereids, thrift, FE split planning, and BE file readers. Also harden FileScannerV2 handling of empty or interrupted input, evolved nested predicates, unsupported unprojected Parquet logical types, COUNT placeholders, hybrid readers, and bounded cross-reader page-cache range reuse.

Check List (For Author)

  • Test: Regression test / Unit Test
    • BE ASAN unit coverage for V1/V2 COUNT semantics, table-level metadata gates, schema-evolution fallbacks, COUNT placeholders, adaptive batching, and Hudi/Paimon/Iceberg hybrid paths
    • FE unit coverage for Nereids COUNT argument capture and Hive/Iceberg/Paimon/TVF split-planning behavior
    • ColumnMapper*.* BE ASAN suite (111 tests passed)
    • Existing external regression cases test_special_orc_formats and test_hive_basic_type reproduce the fixed COUNT(*) wrong results
    • test_file_scanner_v2_review_fixes regression suite covers empty input, evolved nested types, unsupported Parquet placeholders, and COUNT fallback behavior
  • Behavior changed: Yes (COUNT semantics are transported explicitly; unsafe or ambiguous metadata COUNT plans fall back to normal scanning; valid empty splits are skipped; stopped or malformed input is not counted as empty; unsupported unprojected Parquet leaves no longer fail unrelated scans)
  • 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?

@Gabriel39
Gabriel39 marked this pull request as ready for review July 13, 2026 11:34
@Gabriel39
Gabriel39 requested a review from yiguolei as a code owner July 13, 2026 11:34
@Gabriel39

Copy link
Copy Markdown
Contributor Author

/review

@Gabriel39

Copy link
Copy Markdown
Contributor Author

run buildall

@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 20th, 2026 12:23 AM.
Workflow run: https://github.com/apache/doris/actions/runs/29246737159

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

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17701	4116	4065	4065
q2	2057	330	206	206
q3	10268	1491	846	846
q4	4684	474	345	345
q5	7599	856	588	588
q6	178	175	135	135
q7	785	859	641	641
q8	9348	1823	1725	1725
q9	5696	4500	4466	4466
q10	6721	1824	1559	1559
q11	508	345	312	312
q12	714	558	416	416
q13	18096	3335	2775	2775
q14	265	260	244	244
q15	q16	793	778	711	711
q17	998	907	1043	907
q18	6966	6002	5579	5579
q19	1309	1208	1084	1084
q20	755	676	596	596
q21	6282	2849	2746	2746
q22	450	376	316	316
Total cold run time: 102173 ms
Total hot run time: 30262 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5120	4803	4763	4763
q2	304	360	221	221
q3	4989	5413	4697	4697
q4	2059	2166	1380	1380
q5	4728	4913	4663	4663
q6	227	179	129	129
q7	1913	1826	1541	1541
q8	2394	2109	2136	2109
q9	7713	7549	7220	7220
q10	4676	4630	4170	4170
q11	521	388	353	353
q12	731	744	531	531
q13	3014	3393	2773	2773
q14	268	273	253	253
q15	q16	678	691	601	601
q17	1269	1250	1250	1250
q18	7453	6938	6977	6938
q19	1111	1063	1102	1063
q20	2212	2224	1926	1926
q21	5238	4508	4418	4418
q22	530	457	416	416
Total cold run time: 57148 ms
Total hot run time: 51415 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 180840 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 57aa8de164269b487a79b6ca6ba0e1d1a393fefe, data reload: false

query5	4356	634	486	486
query6	446	215	203	203
query7	4849	623	331	331
query8	344	197	174	174
query9	8784	4065	4088	4065
query10	510	335	334	334
query11	5977	2355	2133	2133
query12	168	104	102	102
query13	1252	602	408	408
query14	6220	5228	4946	4946
query14_1	4261	4268	4278	4268
query15	208	203	181	181
query16	1020	485	466	466
query17	1087	740	574	574
query18	2422	462	340	340
query19	207	187	148	148
query20	111	111	115	111
query21	244	160	129	129
query22	13523	13609	13462	13462
query23	17470	16568	16136	16136
query23_1	16307	16293	16273	16273
query24	7575	1804	1331	1331
query24_1	1309	1324	1298	1298
query25	571	473	392	392
query26	1335	345	222	222
query27	2585	627	394	394
query28	4461	2036	2028	2028
query29	1087	646	509	509
query30	337	264	227	227
query31	1131	1094	991	991
query32	122	63	61	61
query33	519	330	257	257
query34	1164	1144	644	644
query35	769	792	673	673
query36	1432	1435	1269	1269
query37	151	106	99	99
query38	1875	1688	1647	1647
query39	918	932	871	871
query39_1	879	887	878	878
query40	248	168	145	145
query41	76	71	70	70
query42	97	98	93	93
query43	318	325	280	280
query44	1437	772	768	768
query45	202	190	180	180
query46	1056	1199	764	764
query47	2455	2432	2283	2283
query48	400	402	316	316
query49	614	439	328	328
query50	1088	429	341	341
query51	10789	10938	10884	10884
query52	89	94	79	79
query53	277	287	213	213
query54	294	248	246	246
query55	82	72	68	68
query56	314	324	302	302
query57	1462	1425	1335	1335
query58	304	274	248	248
query59	1571	1622	1477	1477
query60	334	304	268	268
query61	201	151	150	150
query62	713	653	592	592
query63	236	203	198	198
query64	2854	1066	844	844
query65	4855	4756	4776	4756
query66	1814	513	382	382
query67	29601	29403	29397	29397
query68	2992	1559	1020	1020
query69	405	306	263	263
query70	1064	970	937	937
query71	352	324	299	299
query72	3138	2827	2400	2400
query73	788	825	443	443
query74	5142	4995	4796	4796
query75	2603	2608	2229	2229
query76	2324	1183	792	792
query77	357	379	283	283
query78	12388	12502	11656	11656
query79	1392	1162	762	762
query80	1293	579	474	474
query81	522	318	286	286
query82	630	161	124	124
query83	362	322	294	294
query84	294	164	131	131
query85	971	596	512	512
query86	421	310	253	253
query87	1820	1830	1768	1768
query88	3661	2793	2747	2747
query89	454	407	352	352
query90	1932	201	187	187
query91	202	195	164	164
query92	62	63	59	59
query93	1596	1528	918	918
query94	722	358	329	329
query95	789	596	474	474
query96	1030	860	346	346
query97	2698	2713	2580	2580
query98	227	223	197	197
query99	1162	1177	1021	1021
Total cold run time: 265983 ms
Total hot run time: 180840 ms

@hello-stephen

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

query1	0.00	0.00	0.00
query2	0.10	0.05	0.05
query3	0.26	0.14	0.13
query4	1.61	0.14	0.14
query5	0.25	0.25	0.22
query6	1.26	1.08	1.04
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.37	0.31	0.31
query10	0.55	0.54	0.56
query11	0.19	0.14	0.14
query12	0.18	0.14	0.14
query13	0.47	0.47	0.49
query14	1.01	1.00	1.02
query15	0.60	0.59	0.60
query16	0.31	0.32	0.31
query17	1.12	1.10	1.13
query18	0.23	0.21	0.21
query19	2.02	2.03	1.96
query20	0.02	0.01	0.01
query21	15.46	0.23	0.14
query22	4.87	0.06	0.06
query23	16.12	0.31	0.13
query24	3.02	0.44	0.32
query25	0.12	0.04	0.03
query26	0.73	0.22	0.16
query27	0.04	0.04	0.04
query28	3.57	0.89	0.56
query29	12.49	4.08	3.18
query30	0.27	0.15	0.16
query31	2.77	0.61	0.31
query32	3.21	0.59	0.48
query33	3.15	3.29	3.17
query34	15.63	4.23	3.53
query35	3.51	3.52	3.53
query36	0.54	0.43	0.44
query37	0.08	0.06	0.07
query38	0.06	0.04	0.04
query39	0.03	0.03	0.03
query40	0.18	0.16	0.15
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.04	0.03	0.04
Total cold run time: 96.67 s
Total hot run time: 24.99 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 67.69% (44/65) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.01% (23635/41458)
Line Coverage 40.68% (231256/568436)
Region Coverage 36.58% (182762/499619)
Branch Coverage 37.69% (81680/216740)

@Gabriel39

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 20th, 2026 12:23 AM.
Workflow run: https://github.com/apache/doris/actions/runs/29255600260

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

@Gabriel39

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.

I found four issues that should be fixed before merging.

Checkpoint summary: the PR is focused on FileScannerV2/format-v2 edge cases and has useful unit/regression coverage, but the current implementation still has correctness issues around stop-vs-empty EOF handling and unsupported Parquet logical types. The page-cache range refactor also introduces two performance/lifecycle regressions: non-exact warm-cache reuse is lost across readers, and the new reader-local index is unbounded. I did not run BE/regression tests in this review-only runner; the checkout is a single shallow commit with the base/parent SHA unavailable, so validation was static against the bundled authoritative PR diff and GitHub PR metadata. User focus: no additional focus points were provided.

Comment thread be/src/exec/scan/file_scanner_v2.cpp Outdated
Comment thread be/src/format_v2/parquet/parquet_column_schema.cpp
Comment thread be/src/format_v2/parquet/parquet_file_context.cpp Outdated
Comment thread be/src/format_v2/parquet/parquet_file_context.cpp
@Gabriel39

Copy link
Copy Markdown
Contributor Author

/review

@Gabriel39

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.

I found two remaining correctness issues after the current fixes: primitive COUNT(column) aggregate pushdown can still bypass the unsupported Parquet logical-type validation, and the generic EOF skip can still downgrade a malformed Native file into an empty split. I rechecked the scanner EOF, unsupported Parquet type, nested column-mapper, and page-cache range-directory surfaces against the existing review threads and did not find additional distinct findings.

Validation was static only; I did not run builds or tests because this review invocation is read-only per the bundled prompt.

Comment thread be/src/format_v2/parquet/parquet_reader.cpp
Comment thread be/src/exec/scan/file_scanner_v2.cpp
@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 83.13% (138/166) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.10% (23692/41495)
Line Coverage 40.80% (232166/569029)
Region Coverage 36.65% (183337/500274)
Branch Coverage 37.79% (82071/217148)

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17656	4100	4127	4100
q2	2027	336	203	203
q3	10274	1467	843	843
q4	4684	479	338	338
q5	7557	860	570	570
q6	188	170	140	140
q7	774	838	617	617
q8	9333	1621	1546	1546
q9	5651	4483	4403	4403
q10	6857	1822	1539	1539
q11	500	345	324	324
q12	696	560	436	436
q13	18085	3401	2728	2728
q14	279	263	239	239
q15	q16	791	783	711	711
q17	1024	926	1039	926
q18	7246	5876	5598	5598
q19	1287	1207	1020	1020
q20	751	667	514	514
q21	5913	2684	2562	2562
q22	435	368	302	302
Total cold run time: 102008 ms
Total hot run time: 29659 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4617	4305	4322	4305
q2	295	317	222	222
q3	4647	5030	4422	4422
q4	2080	2168	1369	1369
q5	4522	4385	4369	4369
q6	227	176	131	131
q7	1915	2099	1724	1724
q8	2627	2283	2257	2257
q9	8267	8290	7892	7892
q10	4765	4732	4287	4287
q11	604	437	369	369
q12	767	773	557	557
q13	3308	3543	2988	2988
q14	310	301	278	278
q15	q16	726	746	661	661
q17	1390	1420	1362	1362
q18	8020	7518	7306	7306
q19	1128	1158	1074	1074
q20	2198	2220	1936	1936
q21	5385	4706	4518	4518
q22	521	461	392	392
Total cold run time: 58319 ms
Total hot run time: 52419 ms

@Gabriel39

Copy link
Copy Markdown
Contributor Author

run buildall

@Gabriel39

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.

I found one remaining correctness issue in the COUNT aggregate request construction. The rest of the reviewed areas look covered by the current fixes or by existing review threads.

Checkpoint conclusions: the PR goal is clear and mostly addressed; the change is focused around FileScannerV2/format-v2 review fixes; I did not find new concurrency or lifecycle problems in the scanner stop/empty split or page-cache range-directory paths; no new config or persistence compatibility changes are introduced; existing parallel paths were checked for scanner EOF, Parquet/ORC aggregate semantics, and page-cache behavior; test coverage was reviewed statically but not run in this review-only environment; observability changes are limited to the empty-file counter and look consistent. User focus: no additional user-provided focus beyond the full PR 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.

Correcting the inline anchor for the COUNT aggregate request construction issue; see inline.

Comment thread be/src/format_v2/table_reader.h Outdated
@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17696	4106	4103	4103
q2	2037	340	205	205
q3	10254	1438	841	841
q4	4689	496	343	343
q5	7518	865	591	591
q6	183	175	139	139
q7	782	824	631	631
q8	9375	1584	1659	1584
q9	5587	4396	4348	4348
q10	6768	1811	1499	1499
q11	507	344	315	315
q12	713	571	421	421
q13	18183	3321	2764	2764
q14	282	268	236	236
q15	q16	790	793	723	723
q17	958	1006	991	991
q18	7571	5742	5443	5443
q19	1325	1258	1056	1056
q20	758	666	562	562
q21	6404	2882	2777	2777
q22	471	392	321	321
Total cold run time: 102851 ms
Total hot run time: 29893 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5150	4750	5218	4750
q2	301	335	222	222
q3	4956	5291	4719	4719
q4	2109	2191	1373	1373
q5	4944	4716	4665	4665
q6	231	182	128	128
q7	1978	1738	1548	1548
q8	2400	2119	2150	2119
q9	7617	7154	7184	7154
q10	4634	4560	4130	4130
q11	534	388	354	354
q12	737	758	531	531
q13	3033	3357	2797	2797
q14	274	282	252	252
q15	q16	683	693	610	610
q17	1283	1248	1238	1238
q18	7406	6868	7006	6868
q19	1077	1068	1052	1052
q20	2226	2221	1951	1951
q21	5267	4598	4447	4447
q22	523	452	429	429
Total cold run time: 57363 ms
Total hot run time: 51337 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 178193 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 cc9750751fcd638dd86b621a01fc8855fb5cec69, data reload: false

query5	4323	642	491	491
query6	485	220	198	198
query7	4855	621	344	344
query8	361	187	174	174
query9	8757	4037	4033	4033
query10	478	393	319	319
query11	5946	2330	2132	2132
query12	164	108	106	106
query13	1321	608	416	416
query14	6259	5256	4885	4885
query14_1	4268	4270	4229	4229
query15	216	205	179	179
query16	1013	475	476	475
query17	954	727	599	599
query18	2485	480	351	351
query19	228	193	154	154
query20	113	108	111	108
query21	238	155	135	135
query22	13579	13501	13262	13262
query23	17553	16550	16073	16073
query23_1	16226	16210	16308	16210
query24	7539	1784	1286	1286
query24_1	1324	1270	1279	1270
query25	574	470	399	399
query26	1339	336	208	208
query27	2639	570	359	359
query28	4433	2018	2003	2003
query29	1103	634	501	501
query30	338	262	234	234
query31	1123	1097	970	970
query32	131	63	64	63
query33	536	356	294	294
query34	1184	1100	640	640
query35	764	801	654	654
query36	1198	1196	1040	1040
query37	152	110	95	95
query38	1885	1698	1597	1597
query39	878	898	836	836
query39_1	827	840	852	840
query40	260	157	142	142
query41	66	64	63	63
query42	92	91	91	91
query43	321	324	280	280
query44	1392	772	777	772
query45	188	185	180	180
query46	1072	1170	763	763
query47	2152	2142	2054	2054
query48	383	388	289	289
query49	592	408	333	333
query50	996	393	323	323
query51	10996	10692	10941	10692
query52	86	87	76	76
query53	261	279	203	203
query54	284	239	215	215
query55	73	72	65	65
query56	304	279	273	273
query57	1328	1290	1232	1232
query58	305	267	264	264
query59	1579	1668	1463	1463
query60	310	275	254	254
query61	151	152	150	150
query62	545	498	436	436
query63	241	197	197	197
query64	2894	1063	838	838
query65	4697	4614	4652	4614
query66	1836	504	380	380
query67	29388	29303	29095	29095
query68	3078	1527	928	928
query69	400	300	347	300
query70	1107	1022	958	958
query71	364	313	292	292
query72	3092	2692	2479	2479
query73	845	756	426	426
query74	5038	4926	4719	4719
query75	2511	2541	2119	2119
query76	2365	1170	801	801
query77	354	367	282	282
query78	11970	11806	11311	11311
query79	1448	1138	732	732
query80	1305	540	449	449
query81	526	311	273	273
query82	1069	155	120	120
query83	395	318	292	292
query84	325	157	135	135
query85	985	602	508	508
query86	451	300	288	288
query87	1826	1825	1757	1757
query88	3706	2820	2817	2817
query89	434	384	326	326
query90	1921	190	195	190
query91	212	192	173	173
query92	66	65	57	57
query93	1592	1504	1041	1041
query94	845	374	326	326
query95	769	578	469	469
query96	1030	799	381	381
query97	2647	2651	2489	2489
query98	216	206	201	201
query99	1082	1113	969	969
Total cold run time: 264932 ms
Total hot run time: 178193 ms

@hello-stephen

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

query1	0.01	0.01	0.00
query2	0.10	0.05	0.05
query3	0.28	0.14	0.14
query4	1.61	0.14	0.15
query5	0.27	0.22	0.22
query6	1.25	1.07	1.10
query7	0.04	0.00	0.00
query8	0.06	0.04	0.03
query9	0.38	0.33	0.31
query10	0.56	0.55	0.58
query11	0.20	0.14	0.15
query12	0.18	0.15	0.16
query13	0.49	0.48	0.47
query14	1.04	1.02	1.01
query15	0.61	0.58	0.59
query16	0.34	0.34	0.33
query17	1.08	1.12	1.08
query18	0.23	0.23	0.22
query19	2.01	1.93	1.92
query20	0.01	0.02	0.01
query21	15.46	0.22	0.13
query22	4.91	0.06	0.05
query23	16.10	0.30	0.12
query24	2.89	0.40	0.32
query25	0.12	0.04	0.05
query26	0.75	0.20	0.14
query27	0.06	0.04	0.04
query28	3.51	0.92	0.53
query29	12.51	4.09	3.23
query30	0.27	0.15	0.17
query31	2.78	0.59	0.31
query32	3.22	0.59	0.49
query33	3.21	3.15	3.21
query34	15.52	4.23	3.54
query35	3.58	3.56	3.55
query36	0.56	0.44	0.42
query37	0.10	0.06	0.07
query38	0.05	0.04	0.04
query39	0.04	0.03	0.03
query40	0.17	0.16	0.16
query41	0.10	0.03	0.02
query42	0.04	0.04	0.03
query43	0.05	0.04	0.04
Total cold run time: 96.75 s
Total hot run time: 25.01 s

Gabriel39 added a commit to Gabriel39/incubator-doris that referenced this pull request Jul 14, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: File aggregate pushdown inferred COUNT(column) from a single post-pruning scan mapping. COUNT(*) also retains an arbitrary placeholder slot, so a nullable placeholder made Parquet and ORC readers count non-null values instead of rows. Carry the semantic COUNT arguments from Nereids through the scan thrift contract, keep true COUNT(*) column-free, and fall back when an explicit COUNT argument cannot be mapped directly. Also default split-level conjunct overrides to nullopt so existing standalone readers compile and preserve their initial predicate snapshot.

### Release note

Fix COUNT(*) results for Parquet and ORC file scans when the retained placeholder column contains NULL values.

### Check List (For Author)

- Test: Unit Test
    - 7 targeted Backend ASAN unit tests
    - Added Frontend rule coverage for COUNT(*) and COUNT(column); execution was blocked by unrelated untracked cloud storage sources missing vendor SDKs in the validation workspace
- Behavior changed: Yes (file aggregate pushdown now distinguishes COUNT(*) from COUNT(column) explicitly)
- Does this need documentation: No
Gabriel39 added 12 commits July 17, 2026 22:57
Issue Number: None

Related PR: apache#65548

Problem Summary: Metadata COUNT pushdown could bypass schema-evolution casts and nullability validation for non-trivial column mappings. It also treated an omitted semantic-argument field from an old FE as explicit COUNT(*). Preserve thrift field presence through the scan path and only use footer COUNT(col) for a trivial direct mapping; otherwise use the normal materialization path.

Fix external-file COUNT correctness and validation for schema-evolved columns during metadata pushdown.

- Test: BE unit tests and regression test
    - ./run-be-ut.sh --run --filter="TableReaderTest.PushDownCount*"
    - ./run-regression-test.sh --run -d external_table_p0/tvf -s test_file_scanner_v2_review_fixes
- Behavior changed: Yes; unsafe or ambiguous metadata COUNT plans now fall back to the normal scan path.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: External-file COUNT pushdown could discard CAST semantics, let table-level row counts answer COUNT(col), and let the legacy scanner reinterpret ambiguous or column-count plans as COUNT(*). Native files with a partial length prefix could also be mistaken for clean EOF. Restrict metadata COUNT to explicit COUNT(*) semantics at each planner and reader boundary, preserve CAST evaluation on normal file scans, and report truncated Native prefixes and bodies as corruption before allocation.

### Release note

Fix external-file COUNT correctness across cast expressions, rolling-upgrade plans, and table-level metadata, and reject truncated Native blocks.

### Check List (For Author)

- Test: BE unit tests
    - ./run-be-ut.sh --run --filter="FileScannerTest.V1CountPushdownRequiresExplicitCountStarArguments:NativeV2ReaderTest.RejectsPartialBlockLengthAsCorruption:TableReaderTest.TableLevelCountRequiresExplicitCountStarArguments" -j 4
- Behavior changed: Yes; unsafe COUNT metadata pushdown now falls back to normal scanning, and truncated Native input returns a corruption error.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: The Iceberg table-level COUNT unit test omitted the semantic COUNT argument field. After metadata COUNT was restricted to explicit COUNT(*) plans, the test fell back to position-delete scanning with intentionally omitted reader context and aborted on a missing split cache. Mark the test plan with an explicit empty COUNT argument list so it continues to exercise the assigned table-level row count path.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - ./run-be-ut.sh --run --filter="IcebergV2ReaderTest.IcebergTableLevelCountUsesAssignedRowCountWithPositionDelete" -j 32
- Behavior changed: No; test-only correction.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: File-local predicate rewriting always cast an evolved nested struct leaf from its physical file type back to the table type. Although correct, this performed a conversion for every row even when the predicate literal could be represented exactly in the file type. Prefer rewriting binary and IN literals to the physical file leaf type when the file-to-table mapping is lossless and every literal round-trips exactly; otherwise retain the table literal and cast the file leaf. Clarify the separate COUNT(*) and COUNT(column) metadata semantics for both legacy and V2 file scanners.

### Release note

Improve evolved nested struct predicate evaluation while preserving exact fallback semantics; clarify file COUNT pushdown behavior.

### Check List (For Author)

- Test: Unit Test
    - ColumnMapperCastTest.* (23 tests passed)
    - FileScanner and TableReader COUNT pushdown tests (3 tests passed)
- Behavior changed: Yes; safe nested predicates compare in the file type, while unsafe conversions fall back to table-type evaluation.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: File-local nested predicate rewriting ignored nullable-file to required-table schema contracts, allowing NULL rows to be filtered before TableReader could reject them. Iceberg equality-delete also used an arbitrary physical column as a row-count carrier when all keys were missing, so an unsupported unprojected Parquet leaf could fail an otherwise valid projection. Keep such nested predicates above TableReader and use virtual row position as the equality-delete carrier.

### Release note

Fix schema-evolved nested predicate validation and Iceberg equality-delete scans with unsupported unprojected Parquet columns.

### Check List (For Author)

- Test: Unit Test
    - ./run-be-ut.sh --run --filter="ColumnMapperCastTest.NestedElementAt*:IcebergV2ReaderTest.IcebergEqualityDelete*" -j 96 (19 tests passed)
- Behavior changed: Yes. Unsafe nested predicates remain table-level, and missing-key equality deletes use virtual row position for batch sizing.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: Iceberg and Paimon table-level COUNT planning used only the aggregate opcode, so COUNT(column) could discard most real data splits and attach a metadata row count. Backend correctly rejects that shortcut for explicit COUNT arguments and falls back to reading the column, but then scans only the retained representatives and undercounts multi-split tables. Restrict FE metadata COUNT split reduction to the explicit COUNT(*) marker and preserve all real splits for COUNT(column).

### Release note

Fix incorrect COUNT(column) results on multi-split Iceberg and Paimon tables when table-level count pushdown is enabled.

### Check List (For Author)

- Test: Unit Test
    - ./run-fe-ut.sh --run org.apache.doris.datasource.iceberg.source.IcebergScanNodeTest,org.apache.doris.datasource.paimon.source.PaimonScanNodeTest (23 tests passed)
- Behavior changed: Yes. Only COUNT(*)/COUNT(1) may replace real Iceberg or Paimon splits with metadata count representatives; COUNT(column) keeps all real splits.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: Explicit COUNT(*) keeps a planner placeholder scan slot even though file aggregate metadata needs no column. TableReader opened the normal Parquet scan request before aggregate materialization, so an unsupported logical leaf such as adjusted TIME_MILLIS could be rejected as if it were user-projected and make COUNT(*) fail. Mark non-predicate columns as placeholders only after the existing COUNT(*) aggregate safety gate succeeds, and skip unsupported-type validation only for those placeholders while preserving strict predicate, COUNT(column), and ordinary projection validation.

### Release note

Fix COUNT(*) failures on Parquet files where column pruning retains an unsupported logical-type placeholder.

### Check List (For Author)

- Test: Unit Test
    - run-be-ut.sh targeted 4 tests (all passed)
- Behavior changed: Yes. Eligible COUNT(*) metadata pushdown ignores planner-only non-predicate placeholder validation; actual projections and COUNT(column) remain unchanged.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: Explicit COUNT(*) keeps a planner-only scan slot after column pruning. The previous implementation marked that slot only when metadata aggregate pushdown was eligible. Position deletes, deletion vectors, equality deletes, predicates, or pending runtime filters disable aggregate pushdown and fall back to row scanning, causing Parquet to validate and decode the arbitrary placeholder again. An unsupported logical leaf such as adjusted TIME_MILLIS could therefore reject COUNT(*) even though only the surviving row count was needed. Record exact COUNT(*) placeholder column ids independently of aggregate eligibility, keep real predicate and delete columns strict, and synthesize default values for surviving placeholder rows without physical column IO.

### Release note

Fix COUNT(*) fallback scans over Parquet files whose planner-only placeholder uses an unsupported logical type.

### Check List (For Author)

- Test: Unit Test
    - 4 targeted BE ASAN unit tests passed
- Behavior changed: Yes. COUNT(*) fallback scans no longer validate or read planner-only non-predicate placeholders; predicates, delete keys, COUNT(column), and normal projections remain unchanged.
- Does this need documentation: No
### What problem does this PR solve?\n\nFile-local struct predicates could hide lossy materialization errors, and Hive/TVF treated COUNT(column) like metadata-only COUNT(*).\n\nIssue Number: None\n\n### Release note\n\nNone\n\n### Check List\n\n- [x] Regression tests\n- [x] Code format
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: FileScannerV2 disabled adaptive batch sizing whenever the FE sent COUNT, even when TableReader rejected metadata COUNT because of multiple arguments, unsafe mappings, filters, or deletes. Those fallback scans materialized normal rows using the fixed runtime batch size, inflating block memory for wide columns. Track whether the active split actually emits metadata-derived COUNT rows and suppress adaptive sizing only in that case; fallback scans retain the first-batch probe and predictor updates.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - FileScannerV2Test.AdaptiveBatchSizeRunsForCountFallbackOnly
    - TableReaderTest COUNT coverage
- Behavior changed: No. Query results are unchanged; normal COUNT fallback scans retain adaptive batch sizing.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: HudiHybridReader and PaimonHybridReader forwarded the aggregate opcode to their active child readers but dropped the optional COUNT argument state. New BEs therefore treated explicit COUNT(*) and safe COUNT(column) plans as unknown old-FE semantics and fell back to full row scans. The hybrid wrappers also hid the child metadata-COUNT state from FileScannerV2, allowing synthetic aggregate rows to reach adaptive batch-size sampling. Forward COUNT arguments to both native and JNI children and delegate the active split metadata state through the hybrid reader.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - HudiHybridReaderTest.*
    - PaimonHybridReaderTest.*
    - FileScannerV2 and TableReader COUNT coverage
- Behavior changed: No. Query results are unchanged; eligible Hudi and Paimon COUNT scans retain metadata aggregation and correct adaptive-batch accounting.
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65548

Problem Summary: Nested fallback tests required the source column to stay in predicate_columns even though unsafe predicates remain table-level and readers may classify the required source as non-predicate. Verify the stable scan contract instead: the source column is scanned exactly once with the expected file-local id and no file conjunct is produced.

### Release note

None

### Check List (For Author)

- Test: Unit Test
  - ./run-be-ut.sh --run --filter="ColumnMapperCastTest.NestedElementAtConjunctStaysTableLevelForNullableFileLeafMappedToRequiredTableLeaf:ColumnMapperCastTest.NestedElementAtConjunctStaysTableLevelForNonLosslessFileToTableCast" (2 tests passed)
  - ./run-be-ut.sh --run --filter="ColumnMapper*.*" (111 tests passed)
- Behavior changed: No
- Does this need documentation: No
@Gabriel39
Gabriel39 dismissed stale reviews from yiguolei and 924060929 via 5ecb493 July 17, 2026 15:28
@Gabriel39
Gabriel39 force-pushed the codex/fix-file-scanner-v2-review-issues branch from 0115333 to 5ecb493 Compare July 17, 2026 15:28
@Gabriel39

Copy link
Copy Markdown
Contributor Author

run buildall

@Gabriel39

Copy link
Copy Markdown
Contributor Author

/review

@github-actions github-actions Bot removed the approved Indicates a PR has been approved by one committer. label Jul 17, 2026
@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.62% (1908/2458)
Line Coverage 64.48% (34151/52966)
Region Coverage 64.91% (17576/27076)
Branch Coverage 54.07% (9421/17424)

@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.

Found one blocking correctness issue in the supported BE-first rolling-upgrade path; details are inline. Current-version COUNT semantics and the scanner hardening otherwise look coherent after duplicate suppression.

Critical checkpoint conclusions:

  • Goal and proof: The patch largely preserves COUNT(*)/COUNT(col) identity through Nereids, thrift, V1/V2, table readers, and hybrid readers, and hardens EOF, schema-evolution, unsupported-type, and cache paths. Unit coverage is broad, but no test covers an old FE that has already reduced Iceberg/Paimon splits before a new BE handles absent field 55; the inline issue shows the goal is not fully met.
  • Scope and clarity: Changes are focused on scanner-v2 review fixes and COUNT semantics. The new absent/empty/non-empty protocol is clearly commented, but its upgrade invariant is incomplete.
  • Concurrency: FE state is coordinator-local and scanner COUNT state is per operator/split. The shared Parquet page-cache directory and per-file indexes are independently bounded and mutex-protected; no reverse lock order or heavy I/O under those locks was found.
  • Lifecycle: TableReader and hybrid metadata-count state reset per split. The page-cache directory is a function-local static with bounded strong references and no cycle; reader close releases reader-local ranges while shared metadata safely survives warm scans.
  • Configuration: No configuration item was added.
  • Compatibility: Current FE/current BE semantics are separated correctly, but old-FE/new-BE Iceberg/Paimon plans can silently undercount after irreversible FE split reduction. New-FE/old-BE ambiguity is already covered by the existing rolling-upgrade thread.
  • Parallel paths: V1/V2, Hive/TVF, Iceberg/Paimon/Hudi, native/JNI, Parquet/ORC, table-level/file-level metadata, deletes, and adaptive fallback were checked. The accepted issue affects both V1 and V2; no additional split-truncation instance exists in Hive/TVF/Hudi.
  • Conditional checks: COUNT argument absence, explicit empty, non-empty, casts, multiple arguments, non-trivial mappings, filters/runtime filters, and delete dependencies were traced. Current guards are sound except when nullopt arrives after old-FE table-format split loss.
  • Test coverage: Added BE/FE unit tests cover transport, fallback, placeholders, malformed Native input, nested predicates, unsupported Parquet types, hybrid forwarding, and page-cache bounds. The mixed-version reduced-split case is missing. The TVF regression still does not reach planner COUNT pushdown, already reported in discussion r3593618409.
  • Test results: The changed expected output is consistent with the fixture queries. Per the review-only contract, I did not build or run tests and am not independently confirming the author-reported runs.
  • Observability: Existing scan profiles/counters cover metadata COUNT, adaptive behavior, empty files, and page cache; no new logging or metric is required for this patch.
  • Transactions and persistence: Not involved.
  • Data writes: Not involved; this is a read/planning path.
  • FE-BE variables: push_down_count_slot_ids is wired through current Nereids file scans and both BE scanner generations, with hybrid forwarding. The missing safe protocol is specifically the supported mixed old-FE/new-BE table-level plan.
  • Performance: Adaptive fallback, bounded cache metadata, warm subrange reuse, and no-split conditions were checked. No additional material regression remains at current head.
  • Other correctness/error/memory checks: Nested nullability and lossless-cast gates preserve residual error behavior; unsupported requested Parquet leaves are rejected before pruning/aggregation; page-cache ownership and partial-miss fallback are safe. The remaining Native zero-byte read concern is the exact existing discussion r3578952073 and was not duplicated.

User focus: no additional focus was supplied, so the full authoritative change set was reviewed.

Comment thread be/src/format_v2/table_reader.cpp
@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 65.85% (27/41) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17621	4106	4112	4106
q2	2040	347	198	198
q3	10917	1413	842	842
q4	4774	471	339	339
q5	8492	836	596	596
q6	351	167	137	137
q7	856	808	606	606
q8	10591	1580	1507	1507
q9	5945	4406	4366	4366
q10	6848	1774	1460	1460
q11	504	350	317	317
q12	744	604	446	446
q13	18109	3786	2745	2745
q14	270	259	236	236
q15	q16	790	775	707	707
q17	1053	933	950	933
q18	6739	5692	5539	5539
q19	1172	1386	1104	1104
q20	774	698	551	551
q21	5590	2529	2444	2444
q22	427	358	297	297
Total cold run time: 104607 ms
Total hot run time: 29476 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4408	4325	4354	4325
q2	291	317	214	214
q3	4527	4956	4426	4426
q4	2077	2153	1371	1371
q5	4424	4264	4273	4264
q6	233	179	128	128
q7	2318	1830	1602	1602
q8	2505	2107	2133	2107
q9	7969	7767	7892	7767
q10	4743	4683	4246	4246
q11	762	415	381	381
q12	744	751	551	551
q13	3316	3619	2989	2989
q14	326	325	286	286
q15	q16	746	721	656	656
q17	1358	1363	1373	1363
q18	7917	7464	6734	6734
q19	1094	1064	1055	1055
q20	2227	2198	1947	1947
q21	5253	4628	4436	4436
q22	544	474	409	409
Total cold run time: 57782 ms
Total hot run time: 51257 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 179220 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 5ecb49361259519cf8010046c1c0468a7335c7b4, data reload: false

query5	4335	677	517	517
query6	466	225	213	213
query7	4899	617	324	324
query8	336	190	173	173
query9	8769	4107	4109	4107
query10	503	351	308	308
query11	5948	2361	2207	2207
query12	156	111	112	111
query13	1327	647	440	440
query14	6081	5384	4992	4992
query14_1	4374	4384	4344	4344
query15	242	202	177	177
query16	1039	457	453	453
query17	1107	703	571	571
query18	2484	485	340	340
query19	206	181	143	143
query20	111	107	108	107
query21	233	154	132	132
query22	13633	13471	13406	13406
query23	17471	16498	16141	16141
query23_1	16300	16248	16226	16226
query24	7507	1775	1296	1296
query24_1	1336	1294	1287	1287
query25	533	449	365	365
query26	1331	356	216	216
query27	2578	605	366	366
query28	4477	1993	1962	1962
query29	1045	613	475	475
query30	355	266	239	239
query31	1137	1105	1015	1015
query32	123	65	62	62
query33	535	325	265	265
query34	1200	1127	644	644
query35	790	801	674	674
query36	1216	1179	1047	1047
query37	163	113	88	88
query38	1915	1749	1720	1720
query39	898	878	855	855
query39_1	852	852	845	845
query40	266	177	154	154
query41	75	69	68	68
query42	96	96	94	94
query43	330	326	281	281
query44	1479	767	756	756
query45	205	190	182	182
query46	1117	1196	732	732
query47	2126	2131	2042	2042
query48	409	399	295	295
query49	597	436	313	313
query50	1060	434	351	351
query51	10895	10652	10815	10652
query52	95	95	76	76
query53	263	277	201	201
query54	292	271	228	228
query55	74	71	68	68
query56	336	314	302	302
query57	1322	1272	1194	1194
query58	286	282	249	249
query59	1619	1681	1456	1456
query60	326	282	253	253
query61	153	156	144	144
query62	536	499	425	425
query63	240	196	204	196
query64	2841	1059	871	871
query65	4867	4766	4786	4766
query66	1814	515	385	385
query67	29774	29617	29474	29474
query68	3141	1568	952	952
query69	407	309	274	274
query70	1066	953	976	953
query71	364	343	319	319
query72	3131	2683	2355	2355
query73	872	753	425	425
query74	5116	4936	4714	4714
query75	2577	2528	2183	2183
query76	2309	1183	816	816
query77	363	386	276	276
query78	12374	12234	11548	11548
query79	1414	1191	712	712
query80	654	556	463	463
query81	458	356	299	299
query82	570	153	124	124
query83	408	326	303	303
query84	284	160	136	136
query85	942	614	519	519
query86	364	302	282	282
query87	1865	1880	1786	1786
query88	3717	2756	2761	2756
query89	465	388	343	343
query90	1896	202	196	196
query91	207	193	162	162
query92	64	60	56	56
query93	1599	1478	1009	1009
query94	549	358	331	331
query95	832	632	502	502
query96	1043	779	329	329
query97	2661	2642	2498	2498
query98	227	209	201	201
query99	1100	1108	1035	1035
Total cold run time: 264712 ms
Total hot run time: 179220 ms

@hello-stephen

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

query1	0.01	0.01	0.00
query2	0.14	0.09	0.09
query3	0.37	0.25	0.24
query4	1.62	0.24	0.24
query5	0.33	0.31	0.32
query6	1.15	0.67	0.66
query7	0.04	0.01	0.00
query8	0.08	0.07	0.08
query9	0.52	0.38	0.38
query10	0.59	0.58	0.58
query11	0.32	0.19	0.18
query12	0.31	0.19	0.18
query13	0.52	0.54	0.54
query14	0.93	0.92	0.92
query15	0.69	0.59	0.60
query16	0.38	0.38	0.40
query17	1.03	0.98	1.02
query18	0.31	0.29	0.29
query19	1.96	1.78	1.81
query20	0.02	0.02	0.01
query21	15.40	0.36	0.31
query22	4.89	0.13	0.13
query23	15.84	0.48	0.30
query24	2.35	0.66	0.45
query25	0.16	0.10	0.09
query26	0.78	0.27	0.23
query27	0.10	0.10	0.11
query28	3.51	0.86	0.52
query29	12.48	4.18	3.32
query30	0.39	0.28	0.26
query31	2.76	0.63	0.32
query32	3.24	0.59	0.46
query33	3.03	2.89	2.96
query34	15.80	4.13	3.32
query35	3.25	3.31	3.24
query36	0.66	0.53	0.51
query37	0.13	0.10	0.09
query38	0.09	0.08	0.07
query39	0.07	0.06	0.06
query40	0.20	0.19	0.17
query41	0.14	0.09	0.08
query42	0.09	0.06	0.07
query43	0.08	0.07	0.07
Total cold run time: 96.76 s
Total hot run time: 25.47 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 86.16% (442/513) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.48% (23969/41698)
Line Coverage 41.22% (235816/572104)
Region Coverage 37.04% (186359/503130)
Branch Coverage 38.22% (83660/218900)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 90.85% (457/503) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 75.07% (30536/40675)
Line Coverage 59.23% (336769/568580)
Region Coverage 55.82% (281905/505025)
Branch Coverage 57.22% (125345/219042)

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Jul 18, 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.2.x

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants