Skip to content

[opt](build) Enable unity builds for the Exec and Exprs targets - #66776

Merged
morningman merged 4 commits into
apache:masterfrom
morningman:be-build-opt-2-unity-exec-exprs
Aug 14, 2026
Merged

[opt](build) Enable unity builds for the Exec and Exprs targets#66776
morningman merged 4 commits into
apache:masterfrom
morningman:be-build-opt-2-unity-exec-exprs

Conversation

@morningman

@morningman morningman commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Part of the BE build-time optimization series tracked in #66715.

Split out of #66510, which carries the whole
BE build-time batch. #66712 introduced the ENABLE_UNITY_BUILD switch and piloted
unity builds on three low-risk glue targets. This PR extends unity to Exec and
Exprs
— the two heaviest targets in the BE build and the largest single source of
the unity line's win. The remaining targets follow in one more PR.

What problem does this PR solve?

Related PR: #66510, #66712

Problem Summary:

Same mechanism as #66712: most of the cold-build cost of glue-heavy targets is
re-parsing the shared header closure once per small .cpp, and CMake's
UNITY_BUILD makes a batch pay that parse once. What is new here is the scale —
Exec (174 TUs, libExec.a 2450 MB) and Exprs (287 TUs, libExprs.a 2721 MB) are
the two heaviest targets in the tree, and their glue shares the heaviest closures
(operator.h/dependency.h for Exec; the vexpr/factory closure for Exprs).

The four commits:

  1. Deduplicate exec file-scope names that clash under unity (no behavior
    change): file_scanner.cpp/file_scanner_v2.cpp both defined the Iceberg
    delete content codes and is_iceberg_position_deletes_sys_table() in anonymous
    namespaces — the shared trio moves to iceberg_scan_semantics.h
    (file_scanner_v2_test.cpp carried a third copy, kept file-local by [fix](build) Fix the BE unit-test and benchmark build on macOS arm64 #66615
    because this header move had not landed yet; it now uses the header too).
    vtablet_writer.cpp/vtablet_writer_v2.cpp both defined a file-scope
    CLOSE_WAIT_EVENT_FALLBACK_MS — scoped into IndexChannel and
    VTabletWriterV2; v2's file-scope on_partitions_created() trampoline renamed
    on_partitions_created_v2 (the two functions cast to different writer types).
    exchange_sink_operator.cpp's namespace-scope timer_name renamed
    wait_for_dependency_timer_name (shadowed unity siblings' locals under
    -Wshadow -Werror).
  2. Unity for the whole Exec target: 167 of 174 TUs join 14 unity batches of
    ≤12 sources, gated on ENABLE_UNITY_BUILD like the pilot targets. Opted out:
    five files whose file-scope macros must not leak into siblings, plus the two
    heaviest template-instantiation TUs (operator.cpp, hashjoin_build_sink.cpp)
    which would dominate any batch they join; scan_operator.cpp is both.
  3. Three latent defects the Exprs conversion surfaced (stand on their own):
    dictionary_factory.h had no include guard at all — any TU reaching it
    through two include paths fails with a class redefinition, and under unity the
    clang error recovery poisoned unrelated batch members with spurious
    -Warray-bounds diagnostics. Now #pragma once. And
    function_dict_get_many.cpp had copy-pasted the DictGetState struct from
    function_dict_get.cpp at namespace scope — renamed DictGetManyState so the
    two TUs can share a batch. And function_variant_element_v2.cpp kept
    OwnedPathSegment in an anonymous namespace while using it as a field of the
    externally-visible ResolvedVariantElementV2Path::Impl — gcc's
    -Wsubobject-linkage (-Werror) rejects exactly that once the file is
    #included into a unity batch instead of being the main file of its TU
    (clang has no such warning); the struct moves to namespace scope.
  4. Unity for the Exprs glue: 246 of 287 TUs join 31 unity batches of ≤8
    sources, same switch. Opted out: the flex/bison/gperf generated tables, seven
    macro-leaking files, the 30 heavy template-instantiation TUs (>15 s wall or

    2.2 GB RSS in the compile bench: the min_max/collect/topn/percentile aggregate
    family, in.cpp, multiply.cpp, function_array_aggregation.cpp, …) whose
    per-file codegen would only stack into jumbo poles — and three files that
    tests compile a second time by #includeing the .cpp
    (function_variant_element.cpp, uuid.cpp, function_jsonb_transform.cpp),
    see the verification section.

Measured results

All numbers from the development branch this series is split from, macOS arm64 +
clang 20, -j14, ENABLE_PCH=ON, cold builds, back-to-back A/B. The baseline is
the #66712 state of that branch (10m16s), so the two waves compose with the pilot:

wave build phase wall target slot time archive size
Exec unity 10m16s → 8m57s (-79.2 s / -12.9%) 1533 s → 579 s (2.6×) libExec.a 2450 MB → 641 MB
Exprs unity 8m57s → 7m57s (-60.0 s / -11.2%) 2147 s → 1333 s libExprs.a 2721 MB → 1392 MB

Jumbo-TU envelope: the largest Exec unity TU compiles in 32 s / 2.6 GB RSS
standalone, the largest Exprs one in 25 s / 1.95 GB — both below the largest
existing individual TU in the tree (3.9 GB), so -jN memory envelopes are
unchanged.

Risk and verification

  • Unity changes TU grouping only. The code commits riding along are hygiene:
    constants deduplicated with identical values, one constant scoped into its class,
    two renames, one #pragma once. No logic change.
  • Archive symbol parity (checked on the development branch): Exec keeps all
    external defined symbols — three weak linkonce_odr template instantiations dedup
    away, which is the point of unity, not a loss. Exprs likewise (one weak
    instantiation dedups; the DictGetManyState rename carries its shared_ptr
    machinery under the new name).
  • This exact branch, rebased onto current master, full BE build from scratch
    (macOS arm64, clang 20, ENABLE_PCH=ON, ENABLE_UNITY_BUILD=ON):
    7981/7981 ninja edges, zero failures, doris_be links (325 MB). Exec
    produces exactly 14 unity TUs and Exprs exactly 31, as advertised. This includes
    pipeline/rec_cte_shared_state.cpp, added upstream after the waves were
    measured — it lands inside an Exec unity batch via the existing GLOB_RECURSE
    with zero CMakeLists edits, which is the intended maintenance story.
  • The first CI round of this PR did its job and caught two issues; both are
    fixed in the current revision.
    1. BE UT lane, duplicate symbols at link: three test files compile a src
      .cpp a second time by #includeing it (function_variant_element_test,
      function_uuid_test, function_json_object_flatten_test). Pre-unity this
      linked only by archive-member selectivity: the test object defines the
      symbols first and the library member is never pulled. A unity batch,
      however, is pulled in for its siblings and brings a second strong
      definition. The three #included files
      (function_variant_element.cpp, uuid.cpp, function_jsonb_transform.cpp)
      are now SKIP_UNITY_BUILD_INCLUSION — individual archive members restore
      exactly the shadowing semantics master links with today.
    2. Performance lane (the one gcc lane), -Werror=subobject-linkage:
      function_variant_element_v2.cpp held OwnedPathSegment in an anonymous
      namespace as a field type of the externally-visible ...Path::Impl. gcc
      only raises -Wsubobject-linkage when the definition sits in an
      #included file — which is what unity turns a .cpp into; clang has no
      such warning, so every local build was green. The struct moves to
      namespace scope (name unique to the TU); fixed at the source rather than
      SKIPped.
  • The OFF path, checked on the same tree: reconfiguring with
    ENABLE_UNITY_BUILD=OFF drops all 51 unity_*.cxx entries from
    compile_commands.json (Exec 14, Exprs 31, the [opt](build) Add ENABLE_UNITY_BUILD and pilot unity builds on three glue targets #66712 pilots 6) and the TU
    count goes 8464 → 9042 — the batches return to exactly their 629 member files.
    Reconfiguring back ON restores exactly the same 51 batches. The switch
    semantics themselves (including winning over a stale CMAKE_UNITY_BUILD
    cache) were established in [opt](build) Add ENABLE_UNITY_BUILD and pilot unity builds on three glue targets #66712.
  • These two targets have been building as unity TUs on the development branch
    since 2026-08-08
    , through repeated full-tree builds and the BE UT builds that
    verified [opt](build) Cut three more waves of hot include edges in the BE header graph #66672 (the UT binaries link against these same target libraries).
  • The file_scanner_v2_test.cpp hunk was compile-verified standalone against this
    branch (-fsyntax-only with the test TU's full include closure).

Proactive disclosure

  • Cross-platform is the blind spot, closed by this PR's own CI — every local
    build and measurement above is macOS arm64 + clang 20. With ENABLE_UNITY_BUILD
    defaulting ON since [opt](build) Add ENABLE_UNITY_BUILD and pilot unity builds on three glue targets #66712, the Linux compile lanes and every regression pipeline
    in this PR's CI run against unity Exec/Exprs — that is the validation, and the
    first round proved it works: the BE UT and gcc lanes each caught one real
    unity interaction (detailed above), fixed in this revision. Escape hatches, in order:
    per-user ENABLE_UNITY_BUILD=OFF, per-file SKIP_UNITY_BUILD_INCLUSION, or a
    one-line default flip.
  • The incremental-rebuild trade-off is real: touching one .cpp inside a
    batch recompiles the whole batch (≤12 sources for Exec, ≤8 for Exprs; a batch
    compiles in ~25–32 s). This is why the heaviest, most-edited TUs
    (operator.cpp, hashjoin_build_sink.cpp, the aggregate families, in.cpp,
    multiply.cpp, …) are deliberately SKIPped and keep per-file granularity, and
    ENABLE_UNITY_BUILD=OFF restores it everywhere.
  • The SKIP lists are coverage policy, not leftovers: 7 Exec + 38 Exprs files
    stay individual on purpose — generated parsers (flex/bison/gperf), files whose
    file-scope macros would leak into siblings, and the heavy codegen TUs where
    merging saves no closure parse worth the jumbo-TU cost. A future file whose
    file-scope symbols clash inside a unity TU opts out the same one-line way.
  • Unity covers the glue of these targets, not the codegen-heavy families — the
    30 heavy Exprs SKIPs mean the headline per-target ratios (2.6× Exec slot time)
    are earned on the batched part; the SKIPped monsters keep their cost and their
    per-file granularity.

Release note

None

Check List (For Author)

  • Test

    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change. (full BE build + BE UT builds on the development branch; per-target archive symbol-parity checks)
  • Behavior changed:

    • No.
  • Does this need documentation?

    • No.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Gdfkk7RqgD5e3Uv7bTM3NV

Prepares the Exec target for unity builds; no behavior change:

- file_scanner.cpp / file_scanner_v2.cpp both defined the Iceberg delete
  content codes and is_iceberg_position_deletes_sys_table() in anonymous
  namespaces; move the shared trio into iceberg_scan_semantics.h.
  file_scanner_v2_test.cpp carried a third copy of the content codes
  (apache#66615 kept it file-local because this header move had not landed
  yet); it now uses the shared header too.
- vtablet_writer.cpp / vtablet_writer_v2.cpp both defined a file-scope
  CLOSE_WAIT_EVENT_FALLBACK_MS; scope it into IndexChannel and
  VTabletWriterV2 respectively, and rename v2's static
  on_partitions_created() trampoline to on_partitions_created_v2 (the
  two file-scope functions cast to different writer types).
- exchange_sink_operator.cpp's namespace-scope timer_name shadowed the
  function-local timer_name of unity siblings (-Wshadow -Werror);
  rename it to wait_for_dependency_timer_name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
@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?

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

morningman and others added 3 commits August 14, 2026 18:03
Fourth target of the unity rollout (after InformationSchema, the http
glue and storage/index in apache#66712). 167 of 174 Exec TUs join unity
batches of <=12 sources (14 unity TUs), gated on the ENABLE_UNITY_BUILD
knob so -DENABLE_UNITY_BUILD=OFF still compiles every TU individually.
Opted out: five files whose file-scope macros must not leak into unity
siblings, plus the two heaviest template-instantiation TUs
(operator.cpp, hashjoin_build_sink.cpp) which would dominate any batch
they join; scan_operator.cpp is both.

Measured on the validation build (-j14 + PCH): the 14 unity TUs take
425s of slot time under full parallel load where their members summed
to ~1418s in the cold bench (3.3x); the whole target drops from 1533s
to 539s. The largest unity TU compiles in 32s / 2.6GB RSS standalone,
below the existing per-TU peaks elsewhere in the build. The archive
keeps all external symbols (three weak linkonce_odr template
instantiations dedup away) and shrinks 2450MB -> 641MB.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
…, subobject linkage

Prepares the Exprs target for unity builds; no behavior change:

- dictionary_factory.h had no include guard at all, so any TU reaching
  it through two include paths fails with a class redefinition; add
  #pragma once. Under unity this also poisoned the whole batch: clang
  error recovery then produced spurious -Warray-bounds diagnostics in
  the unrelated function_encryption.cpp members of the same batch.
- function_dict_get_many.cpp copied the DictGetState struct definition
  from function_dict_get.cpp at namespace scope; rename it to
  DictGetManyState so the two adjacent TUs can share a unity batch.
- function_variant_element_v2.cpp kept OwnedPathSegment in an anonymous
  namespace while using it as a field of the externally-visible
  ResolvedVariantElementV2Path::Impl. gcc's -Wsubobject-linkage
  (-Werror) rejects exactly that as soon as the file is #included into
  a unity batch instead of being the main file of its TU; clang has no
  such warning, so only the gcc CI lane sees it. Move the struct to
  namespace scope (the name is unique to this TU).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
Fifth target of the unity rollout (after InformationSchema, http,
storage/index and Exec). 246 of 287 Exprs TUs join unity batches of
<=8 sources (31 unity TUs), driven by DORIS_UNITY_BUILD so
-DENABLE_UNITY_BUILD=OFF still compiles every TU individually. Opted
out and kept individual:
 - the flex/bison/gperf generated tables,
 - seven files whose file-scope macros must not leak into unity
   siblings,
 - the 30 heavy template-instantiation TUs (>15s wall or >2.2GB RSS in
   the compile bench: the min_max/collect/topn/percentile aggregate
   family, in.cpp, multiply.cpp, function_array_aggregation.cpp, ...)
   whose per-file codegen would only stack into jumbo poles,
 - three files that tests compile a second time by #including the .cpp
   (function_variant_element.cpp, uuid.cpp, function_jsonb_transform.cpp):
   the test object must shadow a never-pulled archive member, but a
   unity batch is pulled in for its siblings and the linker sees a
   duplicate strong definition (caught by the BE UT lane).

Measured on the validation build (-j14 + PCH, on the 32-batch layout
before the three test-shadowed files were opted out): the unity TUs
take 533s of slot time under full parallel load where their members
summed to ~1418s in the cold bench; the largest unity TU compiles in
25s / 1.95GB RSS standalone. The archive keeps all external symbols
(one weak linkonce_odr instantiation dedups away; the DictGetManyState
rename adds its shared_ptr machinery under the new name) and shrinks
2721MB -> 1392MB.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
@morningman
morningman force-pushed the be-build-opt-2-unity-exec-exprs branch from 9f486b7 to d5b8f0b Compare August 14, 2026 10:12
@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17687	3145	3140	3140
q2	1934	239	155	155
q3	10412	884	511	511
q4	4667	257	201	201
q5	7672	598	402	402
q6	142	117	93	93
q7	533	551	380	380
q8	9248	953	975	953
q9	3487	2363	2371	2363
q10	6531	895	727	727
q11	442	256	247	247
q12	689	397	323	323
q13	17889	1879	1569	1569
q14	165	153	140	140
q15	q16	436	405	364	364
q17	830	794	821	794
q18	3147	2335	2292	2292
q19	1138	924	783	783
q20	620	547	498	498
q21	5290	1901	1943	1901
q22	332	276	235	235
Total cold run time: 93291 ms
Total hot run time: 18071 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	3560	3497	3469	3469
q2	215	221	153	153
q3	2284	2642	2170	2170
q4	1195	1196	908	908
q5	2239	2169	2149	2149
q6	175	122	90	90
q7	1072	931	874	874
q8	1652	1481	1427	1427
q9	3146	3124	3092	3092
q10	1900	1833	1671	1671
q11	357	273	255	255
q12	473	439	354	354
q13	1856	1886	1582	1582
q14	176	178	167	167
q15	q16	405	396	362	362
q17	1065	1054	1053	1053
q18	5015	4513	4801	4513
q19	858	850	853	850
q20	998	1091	844	844
q21	3832	3196	3421	3196
q22	410	350	317	317
Total cold run time: 32883 ms
Total hot run time: 29496 ms

@hello-stephen

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

query5	4245	400	329	329
query6	395	175	151	151
query7	4891	455	256	256
query8	298	125	112	112
query9	8669	2927	2928	2927
query10	424	250	240	240
query11	5418	1056	935	935
query12	120	74	70	70
query13	1221	437	346	346
query14	5974	2039	1928	1928
query14_1	1818	1798	1783	1783
query15	172	124	118	118
query16	924	386	385	385
query17	805	471	382	382
query18	2343	347	243	243
query19	172	151	117	117
query20	71	71	71	71
query21	210	120	105	105
query22	5496	5453	5479	5453
query23	7476	6699	6494	6494
query23_1	6621	6639	6639	6639
query24	7261	1104	806	806
query24_1	781	767	775	767
query25	436	320	266	266
query26	1254	283	175	175
query27	2691	466	300	300
query28	4615	1505	1514	1505
query29	962	454	372	372
query30	274	180	162	162
query31	967	658	619	619
query32	103	53	51	51
query33	470	222	187	187
query34	978	822	477	477
query35	412	406	356	356
query36	555	575	532	532
query37	128	86	77	77
query38	1019	863	811	811
query39	522	561	527	527
query39_1	529	530	534	530
query40	227	128	115	115
query41	59	56	59	56
query42	79	77	75	75
query43	256	257	220	220
query44	1039	584	579	579
query45	116	110	106	106
query46	816	867	527	527
query47	1000	959	967	959
query48	354	315	236	236
query49	529	237	177	177
query50	803	318	267	267
query51	8493	8380	8373	8373
query52	70	93	61	61
query53	217	223	164	164
query54	250	210	173	173
query55	72	67	56	56
query56	236	240	245	240
query57	661	643	617	617
query58	218	221	181	181
query59	1159	1133	955	955
query60	254	203	198	198
query61	121	110	112	110
query62	339	197	181	181
query63	177	150	153	150
query64	2616	643	586	586
query65	1577	1572	1578	1572
query66	1806	292	239	239
query67	9714	9934	9806	9806
query68	2933	1189	823	823
query69	356	228	199	199
query70	653	591	591	591
query71	304	270	232	232
query72	2349	1768	1564	1564
query73	667	642	335	335
query74	1986	1239	1161	1161
query75	1243	1135	992	992
query76	2341	764	558	558
query77	260	262	207	207
query78	5247	4909	4567	4567
query79	1162	897	592	592
query80	1193	381	347	347
query81	472	201	176	176
query82	622	142	108	108
query83	319	252	231	231
query84	308	129	103	103
query85	855	440	381	381
query86	383	188	164	164
query87	1013	982	922	922
query88	2785	2140	2153	2140
query89	313	235	207	207
query90	1845	148	147	147
query91	165	150	127	127
query92	49	48	46	46
query93	1368	1200	837	837
query94	620	251	229	229
query95	616	425	346	346
query96	805	576	284	284
query97	1021	1055	1044	1044
query98	146	134	141	134
query99	412	359	311	311
Total cold run time: 179216 ms
Total hot run time: 86823 ms

@hello-stephen

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

query1	0.01	0.00	0.00
query2	0.08	0.04	0.03
query3	0.24	0.12	0.11
query4	1.60	0.11	0.10
query5	0.17	0.15	0.15
query6	1.23	0.71	0.69
query7	0.04	0.01	0.00
query8	0.05	0.03	0.04
query9	0.30	0.21	0.21
query10	0.33	0.35	0.37
query11	0.16	0.11	0.11
query12	0.15	0.13	0.12
query13	0.31	0.32	0.29
query14	0.47	0.49	0.47
query15	0.39	0.36	0.35
query16	0.21	0.22	0.23
query17	0.72	0.66	0.74
query18	0.17	0.16	0.16
query19	1.23	1.25	1.22
query20	0.02	0.01	0.01
query21	15.43	0.15	0.11
query22	5.09	0.04	0.04
query23	16.18	0.25	0.09
query24	3.00	0.31	0.27
query25	0.11	0.04	0.03
query26	0.81	0.17	0.12
query27	0.04	0.02	0.03
query28	3.65	0.52	0.28
query29	12.46	3.19	2.59
query30	0.25	0.12	0.13
query31	2.76	0.36	0.17
query32	3.52	0.32	0.23
query33	1.44	1.42	1.42
query34	15.40	2.23	1.80
query35	1.77	1.75	1.73
query36	0.47	0.31	0.28
query37	0.06	0.04	0.04
query38	0.05	0.03	0.03
query39	0.04	0.03	0.03
query40	0.12	0.08	0.08
query41	0.08	0.03	0.02
query42	0.04	0.02	0.03
query43	0.04	0.03	0.03
Total cold run time: 90.69 s
Total hot run time: 14.83 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 87.50% (7/8) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 60.44% (26586/43990)
Line Coverage 44.83% (271073/604649)
Region Coverage 40.57% (216180/532908)
Branch Coverage 42.03% (99542/236851)

@morningman

Copy link
Copy Markdown
Contributor Author

run p0

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (8/8) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 76.05% (32592/42857)
Line Coverage 61.00% (366116/600166)
Region Coverage 57.67% (307835/533775)
Branch Coverage 59.00% (139669/236747)

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Aug 14, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

PR approved by anyone and no changes requested.

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (8/8) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 76.10% (32613/42857)
Line Coverage 61.06% (366479/600166)
Region Coverage 57.73% (308164/533775)
Branch Coverage 59.06% (139826/236747)

@morningman
morningman merged commit d340d56 into apache:master Aug 14, 2026
32 of 33 checks passed
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. reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants