[opt](build) Enable unity builds for the remaining BE targets - #66789
Open
morningman wants to merge 13 commits into
Open
[opt](build) Enable unity builds for the remaining BE targets#66789morningman wants to merge 13 commits into
morningman wants to merge 13 commits into
Conversation
…der unity Preparation for unity builds of the whole Cloud and Storage targets: merged TUs surface copy-pasted file-scope names as redefinitions. Same-value copies get one shared definition; a diverged copy gets its own name. - WINDOW_5M/30M/1H (cloud_internal_service.cpp, cloud_warm_up_manager.cpp): identical warm-up metric window spans, moved to util/bvar_windowed_adder.h next to the class they parameterize. - k_segment_magic/_length (segment_writer.cpp, vertical_segment_writer.cpp): identical "D0R1" footer magic; now inline constexpr in segment/common.h. segment_writer.cpp's copy was accidentally external (declared extern in segment_writer.h for segment.cpp's footer check); segment.cpp now includes common.h for it instead of the whole writer header. - path_allocated_bytes (variant_shredder.cpp, variant_path_builder.cpp, both in doris::segment_v2's anonymous namespaces; the copies arrived with ColumnVariantV2 segment IO in apache#66204): identical PathInData heap-accounting helper, now one inline definition in util/json/path_in_data.h next to PathInData. variant_shredder.cpp picks up the direct include it was missing. - create_index_io_context (segment.cpp, external_col_meta_util.cpp, both in doris::segment_v2's anonymous namespaces): the external_col_meta_util copy KEEPS the source context's file_cache_stats when stats==nullptr while the others reset it, so it is a divergent variant, renamed to create_ext_meta_io_context rather than deduplicated. (The third copy in primary_key_index.cpp lives in doris::(anon), a different namespace, and can never clash.) - merger.cpp used Status::Error<INTERNAL_ERROR> with types.pb.h in scope and no ErrorCode using-directive, so INTERNAL_ERROR bound to PPlanFragmentCancelReason::INTERNAL_ERROR (=3), not ErrorCode::INTERNAL_ERROR (=6): the five compaction-failure statuses carried the wrong code. Under unity a sibling's ErrorCode using-directive makes the name ambiguous, which is what surfaced it. Qualified all five as ErrorCode::INTERNAL_ERROR. Behavior change: those statuses now report TStatusCode::INTERNAL_ERROR, as intended. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
…rget-wide Cloud: 39 homogeneous glue TUs sharing the CloudStorageEngine / meta-service RPC header closure -> UNITY_BUILD ON, batch 12. Two http action TUs opt out: sibling TUs' file-scope `using namespace ErrorCode` makes the unscoped HttpStatus enum constants shadow ErrorCode variables under -Wshadow -Werror. Storage: flip the previous inverse-selection (index/-only unity) to graded opt-outs and let the whole target unity, batch 12: - seven macro-leak files stay individual (the four index/ ones, plus vcollect_iterator.cpp, tablet.cpp, engine_clone_task.cpp) - the three heaviest template-instantiation TUs (predicate creators, 16-32s each) stay individual so no batch inherits their weight - ENABLE_VARIANT_NESTED_GROUP module sources stay individual (unaudited) - compaction/collection_statistics.cpp stays individual: its test compiles it a second time by #including the .cpp, and the test object must shadow a never-pulled archive member (a unity batch would get pulled in for its siblings and hand the linker a duplicate definition) Verification on this branch (arm64, clang 20, -j14 + PCH): - 232 storage + 37 cloud members -> 20 + 4 unity TUs; full build green and doris_be links clean - ENABLE_UNITY_BUILD=OFF reconfigure: unity entries drop to zero and the batches dissolve back into their member files (TU accounting closes exactly); full rebuild green - libStorage.a 1592 MB -> 514 MB, libCloud.a 441 MB -> 107 MB (duplicate DWARF / weak-template collapse) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
…r unity Preparation for a unity build of the format_v2 tree: anonymous namespaces of sibling TUs merge inside a unity TU, so identical file-local helper copies become redefinitions. All three pairs are byte-identical, so each gets one shared inline definition next to the type it operates on: - is_cast_expr (column_mapper.cpp, column_mapper_nested.cpp) -> format_v2/expr/cast.h, beside the Cast class it downcasts to - get_field_ptr (table_reader.cpp, table/schema_history_util.cpp) -> format_v2/table/schema_history_util.h - count_range_rows (parquet/parquet_scan.cpp, parquet/parquet_statistics.cpp) -> format_v2/parquet/selection_vector.h, beside RowRange The other same-name constants the pre-scan flagged across the two trees (ROW_LINEAGE_*, HADOOP_OPTION_PREFIX, PAIMON_*) live in different enclosing namespaces (doris::format vs ::iceberg vs ::paimon) and cannot clash; left untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
The Format target compiles both trees: format/ (v1) and format_v2/. The v1 tree is slated for removal in a future version, so the v1/v2 twin-symbol deduplication a whole-target unity would require (~20 constant groups plus copied static helpers in the JNI/iceberg/parquet twins) is not worth doing: unity is scoped to format_v2/ only and every v1 file stays individual until the tree is deleted. When that happens, this configuration needs no work. A build-time "v2 only" switch was evaluated and rejected for now: 54 files across eight other targets include format/ (v1) headers directly (hive and iceberg sink writers, WAL/push_handler load paths, UDF glue, exec_env_init, storage predicates), and v1-vs-v2 reader selection happens at runtime, so compiling v1 out is call-site surgery that belongs to the v1 removal work, not to the build system. Within format_v2, adbc_reader.cpp opts out (file-scope RETURN_IF_ADBC_ERROR macro must not leak into unity siblings). Batch 8: 62 members -> 8 unity TUs. Verification (arm64, clang 20, -j14 + PCH): two dedup iterations then green; full incremental build + doris_be link clean; heaviest unity TU 14.5s under full -j14 load; archive symbol diff vs pre-change explained in full (five weak linkonce_odr libc++ template instantiations shifted emission location, one added, same class); libFormat.a 1091 MB -> 786 MB (-28%). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
… by unity Preparation for unity builds of Runtime, Load, IO and Util. Merged sibling TUs surface five independent latent issues: - column_predicate.h threw Exception(INTERNAL_ERROR, ...) with no ErrorCode using-directive in scope at header-parse time, so the name bound to PPlanFragmentCancelReason::INTERNAL_ERROR (=3) from types.pb.h instead of ErrorCode::INTERNAL_ERROR (=6) -- same latent wrong-code family as the merger.cpp fix. Qualified both throw sites. Behavior change: these two defensive throws now carry TStatusCode::INTERNAL_ERROR, as intended. - vdatetime_value.h defined `static RE2 time_zone_offset_format_reg` in the header: one RE2 instance constructed per including TU at startup. Now a C++17 inline variable, one instance program-wide. timezone_utils.cpp had its own external-linkage twin of the same regex; renamed to a file-local static tz_offset_format_reg (nothing else referenced it). - runtime_profile.h carried two never-referenced private fields (_is_sink/_is_set_sink, no reads or writes anywhere); unity's merged TU makes -Wunused-private-field notice them. Removed. - file_cache_type_index copied identically in the anonymous namespaces of block_file_cache.cpp and lru_queue_recorder.cpp: one inline definition in file_cache_common.h next to FileCacheType. - sm3.cpp's function-local hex table shadowed sha.cpp's file-scope dig_vec_lower under -Wshadow; renamed sm3_dig_vec_lower. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
Four mid-size targets of homogeneous glue TUs, each re-parsing its shared header closure once per file. Batch sizes track member weight: 12 for Runtime/Load (5s-mean TUs), 16 for IO (2.8s mean), 24 for Util (1.2s mean). Opt-outs, all macro-leak or hazard isolation: - Runtime: memory/jemalloc_hook.cpp (Linux-only member; malloc hooks, __THROW/ALIAS macros); descriptors.cpp, which a test compiles a second time by #including the .cpp -- the test object must shadow a never-pulled archive member, so it cannot join a unity batch that siblings pull in - Load: channel/load_stream.cpp, routine_load/routine_load_task_executor.cpp - IO: the CHECK_*_CLIENT filesystem trio, http_file_system.cpp (unscoped HttpStatus enum vs sibling `using namespace ErrorCode` under -Wshadow), benchmark/tool sources, ENABLE_TDE module swaps - Util: ten macro-leak files (bfd_parser, murmur_hash3, network_util, os_info, os_util, perf_counters, simd/parquet_kernels, thrift_util, zlib) plus hash/city.cc whose generic k0..k4 statics stay out of sibling scopes Verification (arm64, clang 20, -j14 + PCH): one fix iteration then all four targets green; full incremental rebuild of the broad-header ripple plus doris_be link clean; archive symbol diffs explained; unity TU envelopes well inside the 30-40s / 2.5-3GB budget. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
complex_type_deserialize_util.h and cgroup_cpu_ctl.h have no include guard at all -- the third and fourth such headers found by unity builds (after schema_scanner_helper.h and dictionary_factory.h). A single-TU compile never notices; any TU that reaches them twice redefines their classes. #pragma once, matching their sibling headers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
Core (batch 12): column/data_type/serde glue. Opt-outs beyond the macro-leak files: column_vector.cpp (the target's heaviest instantiation TU), data_type_serde.cpp (its member-level explicit instantiations collide with the per-type serde TUs' class-level ones when merged), the value/variant/ family (copied file-local helpers with diverging signatures; 9s of slot time total, not worth renaming), and the two files tests compile a second time by #including the .cpp (column_variant.cpp, convert_field_to_type.cpp) -- the test object must shadow a never-pulled archive member, so they cannot join a unity batch that siblings pull in. Agent, Udf, Common, ann_index (batch 0): small homogeneous targets merge into one unity TU each. Common keeps its seven macro-leak files individual, which also keeps the three same-name metric _s_hook_name statics apart. Service stays at the http-only unity scope: widening to the whole target at batch 8 was tried and measured slower (service segment slot time 104s -> 132s) -- splitting the single http jumbo into 8-file batches repays the shared-closure parse per batch, and the heterogeneous non-http TUs gain too little to cover it. The CMakeLists comment now records that negative result. Verification (arm64, clang 20, -j14 + PCH): one fix round then all five targets green; full incremental build + doris_be link clean; heaviest unity TU 25.9s under full -j14 load; archive symbol diffs all weak linkonce_odr shifts (plus the expected inline time_zone_offset_format_reg weak symbol). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
The 38 thrift-generated .cpp files pre-scan clean (thrift emits fully namespaced code, no file-scope statics) and merge without any source change: the archive exports the identical symbol set, to the symbol. Batch 8. Generated sources cannot be edited, so anything that clashes can only be opted out: every protobuf .cc stays individual (protoc emits the same file-scope statics -- schemas[], file_default_instances[] -- in each file, a structural clash for any merged pair), plus the two heaviest thrift TUs so no batch inherits their weight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ND7L1ZVTJf91TBpLwYSqct
…link The tool has its own main() and is GLOB_RECURSE'd into IO_FILES. As an individual archive member it was never pulled into the doris_be link (nothing references its symbols), but unity builds merge it into unity_0_cxx.cxx.o together with IO files the link does need, so its main() collides with doris_main.cpp's: ld.lld: error: duplicate symbol: main Remove it from the library exactly like fs_benchmark_tool.cpp above: the file is still built standalone by its own add_executable target when BUILD_FILE_CACHE_LRU_TOOL=ON, which does not read IO_FILES. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0121aRtZYjjYdNr2a6z8BLzR
set_source_files_properties() silently ignores paths that do not exist. Every unity opt-out list is therefore one rename away from quietly dissolving: the skip entry stops matching, the file rejoins its unity batch, and the build gets slower -- or starts clashing -- with no diagnostic anywhere. This is the one unguarded regression vector in the unity setup. Route all thirteen skip lists (including the previously merged Exec, Exprs and pilot-target ones) through a doris_skip_unity_inclusion() helper that FATAL_ERRORs on a nonexistent entry. Entries under GENSRC_DIR are exempt: they are emitted by add_custom_command at build time (wkt_lex.l.cpp, wkt_yacc.y.cpp, the generated thrift/protobuf sources) and legitimately do not exist on a fresh configure. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gdfkk7RqgD5e3Uv7bTM3NV
morningman
requested review from
Gabriel39,
airborne12,
csun5285,
eldenmoon,
gavinchou,
liaoxin01 and
yiguolei
as code owners
August 14, 2026 15:11
Contributor
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
11 tasks
Contributor
Author
|
run buildall |
1 similar comment
Contributor
Author
|
run buildall |
gavinchou
previously approved these changes
Aug 14, 2026
Contributor
|
PR approved by at least one committer and no changes requested. |
Contributor
|
PR approved by anyone and no changes requested. |
Contributor
TPC-H: Total hot run time: 17633 ms |
Contributor
TPC-DS: Total hot run time: 85815 ms |
Contributor
ClickBench: Total hot run time: 14.73 s |
…s sanitizers libstdc++-15 annotates loops inside its own headers with `#pragma GCC unroll` (bits/stl_algobase.h). clang honors the pragma and, when an optimization pass cannot apply it, raises -Wpass-failed=transform-warning -- which -Werror turns into a build failure. Whether the unroller punts depends on the exact codegen context: the ASAN+coverage pipeline compiles at -O1 with instrumentation, and there a storage unity batch emitted one such loop and went red (clang + libstdc++ only; local clang + libc++ builds never see it). A missed unrolling *hint* inside a system header carries no correctness signal, so drop the diagnostic tree-wide for clang instead of playing whack-a-mole per TU. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gdfkk7RqgD5e3Uv7bTM3NV
… queue FSFileCacheLeakCleanerTest's add_metadata_entry() waited for the meta store's write queue to drain as its "async write completed" barrier. But the async worker dequeues an operation *before* it issues the rocksdb Put, so an empty queue only proves the write is in flight, not that it is readable. If run_leak_cleanup() runs inside that window, approximate_entry_count() (which iterates rocksdb only, by design) sees zero metadata blocks and skips the cleanup entirely -- remove_orphan_and_tmp_files then finds its orphan and tmp files still on disk. The window is a few statements wide and never fired in per-file CI builds; the unity-batched IO objects shifted thread timing on the ASAN pipeline and hit it on the first round. Poll the store itself (get() reads only rocksdb, the same source approximate_entry_count() counts) instead of the queue size. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Gdfkk7RqgD5e3Uv7bTM3NV
Contributor
Author
|
run buildall |
Contributor
TPC-H: Total hot run time: 17963 ms |
Contributor
TPC-DS: Total hot run time: 85549 ms |
Contributor
ClickBench: Total hot run time: 14.75 s |
Contributor
Author
|
run buildall |
Contributor
Author
|
run performance |
Contributor
Author
|
run buildall |
Contributor
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
Contributor
TPC-H: Total hot run time: 17528 ms |
Contributor
TPC-DS: Total hot run time: 85305 ms |
Contributor
ClickBench: Total hot run time: 14.67 s |
Contributor
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What problem does this PR solve?
Related PR: #66510, #66712, #66776
Problem Summary:
Same mechanism as #66712/#66776: most of the cold-build cost of glue-heavy targets
is re-parsing the shared header closure once per small
.cpp, and CMake'sUNITY_BUILDmakes a batch pay that parse once. This PR applies it to the twelveremaining targets where the win is real, and writes down (in-tree) the two places
where it is not.
The eleven commits, in fix-then-enable pairs:
identical copies hoisted to one shared definition (warm-up metric window
spans ->
bvar_windowed_adder.h; the "D0R1" segment footer magic ->segment/common.h; thepath_allocated_bytesPathInData accounting helperthat [feature](variant) Support ColumnVariantV2 segment reads and writes #66204 landed in two variant v2 TUs ->
util/json/path_in_data.h), adivergent copy renamed instead (
create_ext_meta_io_contextkeepsfile-cache stats where its siblings reset them); plus one real latent
bug:
merger.cppthrew withINTERNAL_ERRORbound toPPlanFragmentCancelReason::INTERNAL_ERROR(=3) fromtypes.pb.hinsteadof
ErrorCode::INTERNAL_ERROR(=6) — noErrorCodeusing-directive was inscope. Qualified; those compaction-failure statuses now carry the intended
code.
previous index/-only inverse-selection flips to graded opt-outs. Cloud: 37
members -> 4 batches. Storage: 232 members -> 20 batches.
format/tree isslated for removal, so every v1 file stays individual rather than paying the
v1/v2 twin-symbol dedup a joint unity would need.
bugs found by merged TUs:
column_predicate.hhad the same unqualifiedINTERNAL_ERRORmis-binding asmerger.cpp, andvdatetime_value.hdefined astatic RE2in the header (one RE2 construction per including TU at startup;now a C++17 inline variable, one program-wide).
runtime_profile.halsocarried two never-referenced private fields; removed.
cgroup_cpu_ctl.h,complex_type_deserialize_util.h) — found the same way as the two in [opt](build) Enable unity builds for the Exec and Exprs targets #66776.result recorded in-tree (see below).
.ccfiles stayindividual structurally: protoc emits identical file-scope statics
(
schemas[],file_default_instances[]) in every one.file_cache_lru_tool.cppfromlibIO.a— a standalone tool with itsown
main()must not be an archive member once unity can merge it into anobject the
doris_belink actually pulls in.set_source_files_properties()silently ignores nonexistent paths, so arename would quietly dissolve a skip entry and the file would rejoin its
batch with no diagnostic. All thirteen skip lists (including the merged
Exec/Exprs and pilot ones) now go through
doris_skip_unity_inclusion(),which FATAL_ERRORs on a nonexistent entry (generated
GENSRC_DIRpathsexempt — they legitimately do not exist on a fresh configure).
Benefit
Measured on the development branch this series is split from (arm64 macOS,
clang 20,
-j14, PCH on, cold builds, same-machine paired runs):sum-of-TU CPU (user) 98.7 -> 76.7 min, compile units 7810 -> 7280.
(measured on this branch, unity OFF vs ON): libStorage.a 1592 -> 514 MB,
libCloud.a 441 -> 107 MB, libRuntime.a 356 -> 122 MB, libLoad.a 311 ->
100 MB, libFormat.a 1057 -> 760 MB, libCore.a 371 -> 182 MB. Less disk
thrash per build, faster archiving and linking.
Verification on this branch (arm64 macOS, clang 20, ENABLE_PCH=ON)
doris_belinks(319 MB). One upstream-drift clash surfaced and fixed first (the [feature](variant) Support ColumnVariantV2 segment reads and writes #66204
path_allocated_bytestwins — folded into the dedup commit).which this PR adds 63 batches / 696 members (per-target counts in the commit
messages);
compile_commands.jsonagrees.ENABLE_UNITY_BUILD=OFFreconfigure: unity entries drop to zero and the TUcount goes 7927 -> 9041 = exactly the 110 batches dissolving into their 1224
members; full rebuild green,
doris_berelinks -> the switch's blast radiusis precisely the unity config.
BUILD_TYPE_UT=Debug): doris_be_test compiles and links clean — thisspecifically exercises the four "a test #includes the src .cpp" opt-outs below.
fail with
unity skip entry does not exist (renamed or moved?): <path>andthe offending CMakeLists line; reverting restores a clean configure.
First CI round: two reds, both root-caused and fixed in-tree
#pragma GCC unroll; under-O1+ sanitizers + coverage the unroller puntsand clang's
-Wpass-failed(a missed-hint diagnostic with no correctnesssignal) became fatal under
-Werroronce a storage unity batch changed theemission context. Fixed by
-Wno-pass-failedfor clang tree-wide.FSFileCacheLeakCleanerTest.remove_orphan_and_tmp_files— apre-existing test-helper race: it waited for the meta-store write queue to
drain, but the async worker dequeues before it issues the rocksdb Put, so
the leak scan could still count zero metadata blocks and skip cleanup. The
unity-batched IO objects shifted thread timing on the ASAN runner and hit
the window (this test's only failure in its last 40 CI runs is this PR's
round — the race is upstream, the timing shift is ours). Fixed by polling
the store itself instead of the queue size.
Deliberate opt-outs (not omissions)
CMakeLists): file-scope macro leakers, the heaviest template-instantiation TUs
(so no batch inherits their weight),
ENABLE_VARIANT_NESTED_GROUP/ENABLE_TDEmodule swaps (unaudited out-of-tree sources), and generatedprotobuf
.cc.#include-ing the .cpp(
storage/compaction/collection_statistics.cpp,runtime/descriptors.cpp,core/column/column_variant.cpp,core/data_type/convert_field_to_type.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 definition.
Same failure class the first CI round of [opt](build) Enable unity builds for the Exec and Exprs targets #66776 hit; this time the whole tree
was swept up front (
grep -rn '#include ".*\.cpp"' be/test) and the remaininghits are either already opted out, structurally outside unity scope, or
test-side files.
was tried and measured slower (service segment slot time 104s -> 132s) —
splitting the single http jumbo repays the shared-closure parse per batch and
the heterogeneous non-http TUs gain too little to cover it. The CMakeLists
comment records this so nobody retries it blind.
2055 files with colliding
static c__1file-scope constants, structurallyun-unifiable.
Cross-platform note (please watch the gcc pipeline)
All local verification is macOS/clang. gcc-only hazards were audited up front:
the
-Wsubobject-linkagepattern that bit #66776 (an anonymous-namespace type asa member of an external-linkage class turns into an error only once unity makes
the file
#include-d) was swept across all 627 files entering unity scope —every anonymous-namespace type usage found is function-local, so no hazard — but
the sweep is heuristic, so the first Performance (gcc) CI round is worth watching.
Release note
None
Check List (For Author)
Test
doris_belinks.ENABLE_UNITY_BUILD=OFFreconfigure + full rebuild green; TUaccounting closes exactly (7927 -> 9041); flip back ON restores.
BUILD_TYPE_UT=Debug): doris_be_test compiles and links withzero duplicate symbols.
new fail-loud diagnostic; reverting restores a clean configure.
Behavior changed:
the commit messages):
merger.cppandcolumn_predicate.hthrew withINTERNAL_ERRORaccidentally bound toPPlanFragmentCancelReason(=3);they now carry
ErrorCode::INTERNAL_ERRORas intended. Alsovdatetime_value.h's header-definedstatic RE2became a C++17 inlinevariable: one instance program-wide instead of one per including TU
(same matching behavior, less startup work and memory).
Does this need documentation?
🤖 Generated with Claude Code
https://claude.ai/code/session_01Gdfkk7RqgD5e3Uv7bTM3NV