Cap BuzzHouse max_depth in CI to prevent ASan allocation-size-too-big by groeneai · Pull Request #103736 · ClickHouse/ClickHouse · GitHub
Skip to content

Cap BuzzHouse max_depth in CI to prevent ASan allocation-size-too-big#103736

Merged
PedroTadim merged 3 commits into
ClickHouse:masterfrom
groeneai:fix/buzzhouse-nested-value-explosion
Apr 30, 2026
Merged

Cap BuzzHouse max_depth in CI to prevent ASan allocation-size-too-big#103736
PedroTadim merged 3 commits into
ClickHouse:masterfrom
groeneai:fix/buzzhouse-nested-value-explosion

Conversation

@groeneai

@groeneai groeneai commented Apr 29, 2026

Copy link
Copy Markdown
Contributor

BuzzHouse value generators for compound types Map and Array recurse on
their child types when producing SQL string values, multiplying the per-level
row count at each nesting level. With the CI fuzzer config — max_nested_rows
up to ~100 and max_depth up to 5 — that gives up to 100^5 ≈ 10^10 entries
in a single value, which trips ASan's allocation-size-too-big limit and
aborts the fuzzer mid-run.

Observed in 4 unrelated PRs in the last 30 days on BuzzHouse (arm_asan_ubsan),
always with the same stack trace through BuzzHouse::MapType::appendRandomRawValue
(SQLTypes.cpp:1280/:1282):

SUMMARY: AddressSanitizer: allocation-size-too-big
    std::__1::basic_string::__grow_by_and_replace
    BuzzHouse::MapType::appendRandomRawValue
    BuzzHouse::MapType::appendRandomRawValue
    BuzzHouse::StatementGenerator::strAppendAnyValue
    BuzzHouse::StatementGenerator::generateUpdateSets

CIDB cross-PR cross-check (last 30 days, all unrelated PRs):

PR Author Title
99346 Manerone "For input formats with column names, search columns case-insensitively..."
101705 rschu1ze "Add INDEX_LENGTH column alias to information_schema.tables"
102244 zoomxi "Add selective replication for ReplicatedMergeTree"
99537 alexey-milovidov "Enable use_top_k_dynamic_filtering and use_skip_indexes_for_top_k by default"

These four PRs share no code or domain — the bug is in the BuzzHouse client
fuzzer itself, not in any of them.

Approach

Add a public value_gen_depth counter on StatementGenerator (kept distinct
from the existing private depth field, which tracks type-generation
recursion in randomNextType/randomAggregateType) and a small helper
depthCappedNestedRows that bit-shifts the configured max_nested_rows
cap by 2 * depth. The cap is applied in MapType::appendRandomRawValue,
MapType::insertNumberEntry, ArrayType::appendRandomRawValue, and
ArrayType::insertNumberEntry — the four sites that loop multiplicatively
over a randomly-sampled row count.

The total entry count is then bounded by a small polynomial in
max_nested_rows instead of exponential. With the CI worst case
(max_nested_rows = 105), the cap sequence is 105, 26, 6, 1, 1, ..., so the
product across 5 nesting levels stays under ~16k entries instead of ~13 billion.

Symmetric subsystems checked

  • TupleType value gen iterates a fixed subtypes vector — no
    per-level row sampling, no multiplicative blowup.
  • VariantType value gen picks a single subtype — no loop.
  • QBitType iterates the type-fixed dimension — bounded by type.
  • AggregateFunctionType already uses the private depth counter for
    its own recursion guard.

Validation

  • Built with -DENABLE_BUZZHOUSE=1 (clang-21).
  • Smoke-tested by running clickhouse-client --buzz-house-config=... for
    90 s against a local server with max_depth=5, max_nested_rows=100,
    max_string_length=50 — no ASan abort, no allocation-size-too-big,
    exit on timeout as expected.
  • Math validated standalone: depthCappedNestedRows(105, 0..6) =
    {105, 26, 6, 1, 1, 1, 1}; product across depth 0..4 is 16380.

Reproducing the exact ASan trip locally would require running the BuzzHouse
fuzzer with the same random seed CI used at the moment of the failure;
instead, this PR is bounded by analyzing the recursion math and confirming
the cap reduces the worst-case entry count by ~6 orders of magnitude.

Triggered by directive on #99537.

Session: cron:clickhouse-ci-task-worker:20260429-174500

Changelog category (leave one):

  • CI Fix or Improvement (changelog entry is not required)

Changelog entry (a user-readable short description of the changes that goes into CHANGELOG.md):

...

Documentation entry for user-facing changes

  • Documentation is written (mandatory for new features)

Version info

  • Merged into: 26.5.1.190

BuzzHouse value generators for compound types `Map` and `Array` recurse on
their child types when producing SQL string values, multiplying the per-level
row count at each nesting level. With the CI fuzzer config — `max_nested_rows`
up to ~100 and `max_depth` up to 5 — that gives up to 100^5 ≈ 10^10 entries
in a single value, which trips ASan's `allocation-size-too-big` limit and
aborts the fuzzer mid-run.

Observed in 4 unrelated PRs in the last 30 days on `BuzzHouse (arm_asan_ubsan)`,
always with the same stack through `BuzzHouse::MapType::appendRandomRawValue`
(`SQLTypes.cpp:1280/:1282`):

    SUMMARY: AddressSanitizer: allocation-size-too-big
        std::__1::basic_string::__grow_by_and_replace
        BuzzHouse::MapType::appendRandomRawValue
        BuzzHouse::MapType::appendRandomRawValue
        BuzzHouse::StatementGenerator::strAppendAnyValue
        BuzzHouse::StatementGenerator::generateUpdateSets

Add a public `value_gen_depth` counter on `StatementGenerator` (kept distinct
from the existing private `depth` field, which tracks type-generation
recursion in `randomNextType`/`randomAggregateType`) and a small helper
`depthCappedNestedRows` that bit-shifts the configured `max_nested_rows`
cap by `2 * depth`. The cap is applied in `MapType::appendRandomRawValue`,
`MapType::insertNumberEntry`, `ArrayType::appendRandomRawValue`, and
`ArrayType::insertNumberEntry` — the four sites that loop multiplicatively
over a randomly-sampled row count.

The total entry count is then bounded by a small polynomial in
`max_nested_rows` instead of exponential. With the CI worst case
(`max_nested_rows = 105`), the cap sequence is 105, 26, 6, 1, 1, ..., so the
product across 5 levels stays under ~16k entries instead of ~13 billion.

Symmetric subsystems checked:
- `TupleType` value gen iterates a fixed `subtypes` vector — no
  per-level row sampling, no multiplicative blowup.
- `VariantType` value gen picks a single subtype — no loop.
- `QBitType` iterates the type-fixed `dimension` — bounded by type.
- `AggregateFunctionType` already uses the private `depth` counter for
  its own recursion guard.

Validation:
- Built with `-DENABLE_BUZZHOUSE=1` (clang-21).
- Smoke-tested: `clickhouse-client --buzz-house-config=...` ran for 90 s
  against a local server with `max_depth=5`, `max_nested_rows=100` — no
  ASan abort, no `allocation-size-too-big`, exit on timeout as expected.
- Math validated standalone: `depthCappedNestedRows(105, 0..6)` =
  `{105, 26, 6, 1, 1, 1, 1}`; product across depth 0..4 is 16380.
@groeneai

Copy link
Copy Markdown
Contributor Author

Pre-PR validation gate (per TASK.md Phase 4 step 9):

# Question Answer
a Deterministic repro? No — fuzzer-internal bug; the exact ASan trip depends on a random seed that CI happened to land on. The bug is bounded instead by analytic argument: the recursion in MapType::appendRandomRawValue / ArrayType::appendRandomRawValue multiplies row count at every nesting level, and with the CI fuzzer config (max_nested_rows ≤ 105, max_depth ≤ 5) the worst case is 105^5 ≈ 1.3 × 10^10 entries — well above ASan's allocation cap. CIDB confirmed 4 unrelated PRs hit the same stack trace in the last 30 days.
b Root cause explained? Yes. MapType and ArrayType value generators sample a row count from [min_nested_rows, max_nested_rows] and recurse on key/value subtypes. When the type itself is nested (e.g. Map(Map(Map(...)))), each level multiplies the entry count, producing a string too large for ASan's allocator. There is no depth-aware cap on either the row count or the output string size.
c Fix matches root cause? Yes — adds depth-aware bound to the only recursion sites that loop multiplicatively over a randomly-sampled row count. Tuple, Variant, QBit, and AggregateFunction value gens were each checked: their loop bounds are fixed by the type (not random), so they don't blow up multiplicatively.
d Test intent preserved? / New tests added? Test intent (exercise nested compound types) is preserved at depth 0 — the top-level cap is unchanged at max_nested_rows. Only nested levels are damped (4× per level via >> 2). No standalone unit test added: BuzzHouse code has no existing test suite, and the fix is in randomly-driven generator code where deterministic tests would require mocking RandomGenerator extensively.
e Demonstrated in both directions? Partial. With fix: a 90 s clickhouse-client --buzz-house-config=... smoke run against a local server with max_depth=5, max_nested_rows=100 completed without ASan abort and exited on timeout as expected. Without fix: not reproduced locally because the original crash is randomly seeded; the CIDB stack trace + recursion math is what establishes the failure mode.
f Fix is general, not a narrow patch? Yes — applied symmetrically to all four sites that loop on a sampled row count (Map::appendRandomRawValue, Map::insertNumberEntry, Array::appendRandomRawValue, Array::insertNumberEntry). Other value generators (Tuple, Variant, QBit, AggregateFunction) were re-read and confirmed not to share the same exponential-blowup pattern.

@groeneai

Copy link
Copy Markdown
Contributor Author

cc @PedroTadim @alexey-milovidov — could you review this? @PedroTadim wrote ~1500 of the BuzzHouse commits and is the natural owner of Generator/SQLTypes.cpp; @alexey-milovidov triggered this investigation on #99537 and has the most BuzzHouse review experience after Pedro. The change is a localized depth-aware row-count cap in 4 appendRandomRawValue / insertNumberEntry sites for Map / Array types, plus a new public value_gen_depth counter on StatementGenerator (kept distinct from the existing private depth field used by randomNextType).

@PedroTadim PedroTadim self-requested a review April 30, 2026 00:53
@PedroTadim

Copy link
Copy Markdown
Member

@groeneai maybe you can update the range of values that can be used at buzzhouse_job.py instead

@groeneai

Copy link
Copy Markdown
Contributor Author

@PedroTadim — thanks for the suggestion. Looking at the current bounds in buzzhouse_job.py:

allow_hardcoded_inserts = random.choice([True, False])
min_nested_rows = random.randint(0, 5)
max_nested_rows = min_nested_rows + (5 if allow_hardcoded_inserts else 100)  # up to ~105
...
"max_depth": random.randint(2, 5),  # up to 5

Worst case (allow_hardcoded_inserts=False): max_nested_rows ^ max_depth = 105 ^ 5 ≈ 1.3 × 10^10 recursive entries — well beyond ASan's allocator cap.

Current PR's C++ fix: depthCappedNestedRows(rows, depth) = rows >> (2 * depth) produces per-level caps {105, 26, 6, 1, 1, …} → ~16 K nested entries worst case (capped geometrically and depth-independent).

Config-only alternatives in buzzhouse_job.py:

Change Worst-case product Note
max_depth = random.randint(2, 3) 105 ^ 3 ≈ 1.2 × 10^6 Single-line change; loses depth-4/5 type-nesting coverage
Cap max_nested_rows at 20 (no-hardcoded branch) 20 ^ 5 = 3.2 × 10^6 Two-line change; preserves max_depth=5 coverage
max_depth = random.randint(2, 4) 105 ^ 4 ≈ 1.2 × 10^8 Borderline — large strings can still trip ASan

I can take any of:

  • A. Switch the PR to config-only — pick one of the safe options above, drop the C++ change.
  • B. Keep the current C++ fix.
  • C. Both (defense in depth) — keep the C++ cap and also tighten the job config.

The C++ fix is geometrically tighter (~750× lower per nested level vs. config option 1), so anyone running BuzzHouse outside CI at the documented limits stays safe. The config approach is simpler but leaves the generator unsafe at its advertised ranges. Your call as BuzzHouse owner — happy to revise either way.

@PedroTadim

Copy link
Copy Markdown
Member

@PedroTadim — thanks for the suggestion. Looking at the current bounds in buzzhouse_job.py:

allow_hardcoded_inserts = random.choice([True, False])
min_nested_rows = random.randint(0, 5)
max_nested_rows = min_nested_rows + (5 if allow_hardcoded_inserts else 100)  # up to ~105
...
"max_depth": random.randint(2, 5),  # up to 5

Worst case (allow_hardcoded_inserts=False): max_nested_rows ^ max_depth = 105 ^ 5 ≈ 1.3 × 10^10 recursive entries — well beyond ASan's allocator cap.

Current PR's C++ fix: depthCappedNestedRows(rows, depth) = rows >> (2 * depth) produces per-level caps {105, 26, 6, 1, 1, …} → ~16 K nested entries worst case (capped geometrically and depth-independent).

Config-only alternatives in buzzhouse_job.py:
Change Worst-case product Note
max_depth = random.randint(2, 3) 105 ^ 3 ≈ 1.2 × 10^6 Single-line change; loses depth-4/5 type-nesting coverage
Cap max_nested_rows at 20 (no-hardcoded branch) 20 ^ 5 = 3.2 × 10^6 Two-line change; preserves max_depth=5 coverage
max_depth = random.randint(2, 4) 105 ^ 4 ≈ 1.2 × 10^8 Borderline — large strings can still trip ASan

I can take any of:

* **A.** Switch the PR to config-only — pick one of the safe options above, drop the C++ change.

* **B.** Keep the current C++ fix.

* **C.** Both (defense in depth) — keep the C++ cap and also tighten the job config.

The C++ fix is geometrically tighter (~750× lower per nested level vs. config option 1), so anyone running BuzzHouse outside CI at the documented limits stays safe. The config approach is simpler but leaves the generator unsafe at its advertised ranges. Your call as BuzzHouse owner — happy to revise either way.

@groeneai go for A, not many people run BuzzHouse.

Per @PedroTadim (BuzzHouse owner) on
ClickHouse#103736:
> "@groeneai go for A, not many people run BuzzHouse."

Reverts the generator-side cap in `MapType::appendRandomRawValue`,
`ArrayType::appendRandomRawValue`, and the `value_gen_depth` counter
on `StatementGenerator`. Replaces it with a single-line tightening
in `ci/jobs/buzzhouse_job.py`: `max_depth = random.randint(2, 3)`
(was `2..5`).

Math: with `max_nested_rows` up to 105 and depth 3, the worst-case
nested-value product is `105^3 ≈ 1.2 * 10^6` entries instead of
`105^5 ≈ 1.3 * 10^10`, which keeps it well below ASan's
`allocation-size-too-big` guard.

Trade-off: the BuzzHouse generators remain capable of producing
~10^10-entry values at the documented limits — that's a latent bug
in the generator, but BuzzHouse is essentially CI-only, so
tightening CI config is sufficient and avoids touching generator
code that @PedroTadim owns.

Triggered by directive on
ClickHouse#99537.
@groeneai groeneai changed the title Bound BuzzHouse nested-value depth to prevent ASan abort Cap BuzzHouse max_depth in CI to prevent ASan allocation-size-too-big Apr 30, 2026
@groeneai

Copy link
Copy Markdown
Contributor Author

Thanks @PedroTadim — pushed Option A as d880d6fe.

The C++ generator-side cap (value_gen_depth counter, depthCappedNestedRows helper, four call-site changes in MapType / ArrayType) is reverted. The new commit replaces it with a single-line tightening in ci/jobs/buzzhouse_job.py:

"max_depth": random.randint(2, 3),  # was random.randint(2, 5)

Net PR diff is now 8 lines, single file, only ci/jobs/buzzhouse_job.py touched. With max_nested_rows up to 105 and depth 3, the worst-case value product is 105^3 ≈ 1.2 × 10^6 entries — about 4 orders of magnitude below ASan's allocation-size-too-big limit (was ~10^10 at depth 5).

Trade-off accepted as discussed: the BuzzHouse generators stay capable of producing 10^10-entry values at the documented config limits, but since BuzzHouse is essentially CI-only, tightening CI config is sufficient.

Branch history kept (commit-then-revert) per repo policy of not rebasing/amending shared branches. PR title updated to reflect the new scope.

@groeneai

Copy link
Copy Markdown
Contributor Author

Pre-PR validation gate (rewritten approach, commit d880d6fe)

(a) Deterministic repro? No — original ASan abort needs CI's BuzzHouse random seed at the moment of failure. The math is the deterministic argument: MapType::appendRandomRawValue recurses on child types, so the per-level row count multiplies. With max_nested_rows=105 and max_depth=5, the worst-case product is 105^5 ≈ 1.27 × 10^10 entries — over ASan's allocation-size-too-big guard. Cross-PR cross-check (4 unrelated PRs in 30 days, identical stack trace) confirms a chronic generator-side blowup, not a per-PR symptom.

(b) Root cause explained? Yes. MapType::appendRandomRawValue and ArrayType::appendRandomRawValue build a SQL string value by sampling a random row count r ∈ [min_nested_rows, max_nested_rows] and recursing on the child type for each row. When the child type is itself a Map/Array, the recursion multiplies. Total entries across d nesting levels is bounded by r^d. ASan's allocator fails when this product exceeds ~10 GB.

(c) Fix matches root cause? Explicitly a config-only band-aid, not a root-cause fix. The generator code remains capable of producing 10^10-entry values at the documented config limits (max_nested_rows=100, max_depth=5). Per @PedroTadim's directive ("not many people run BuzzHouse"), tightening the CI config is sufficient — the algorithmic cap can land in C++ later if BuzzHouse is ever exposed to wider use. The latent generator bug is documented in the PR description.

(d) Test intent preserved? / New tests added? BuzzHouse fuzzer behavior at depths 2 and 3 is preserved (these were already 50% of the prior randint(2, 5) sweep). Depth-4/5 random coverage is dropped from the sweep — accepted because depth-5 was hitting unrunnable values. No dedicated regression test added (BuzzHouse is fuzzer infrastructure itself).

(e) Demonstrated in both directions? With prior randint(2, 5): random sweep occasionally hit depth 5 → 105^5 ≈ 1.27 × 10^10 entries → ASan trip (observed 4× in 30 days across unrelated PRs in CIDB). With new randint(2, 3): max product is 105^3 ≈ 1.16 × 10^6 entries × max_string_length=400 ≈ 460 MB raw size — well below ASan's ~10 GB guard. Math validation, not runtime repro.

(f) Fix is general, not a narrow patch? N/A — config change, not a C++ fix. The wider scope (the generator continues to produce blowing-up values at the documented type-system limits) is acknowledged as out-of-scope per the BuzzHouse owner's directive.

@PedroTadim

Copy link
Copy Markdown
Member

@groeneai can you can keep the longer max depth if the max nested number of rows is very small (like 0 or 1 nested rows). We also need high max depth for larger queries.

Replace the flat `max_depth = randint(2, 3)` cap with a conditional
ladder driven by `max_nested_rows`:

  max_nested_rows <=  5 -> max_depth up to 5
  max_nested_rows <= 20 -> max_depth up to 4
  max_nested_rows  > 20 -> max_depth up to 3

This preserves deep type-shape exploration (depth 5) for runs that
sample a tiny number of nested rows (where `rows^depth` stays trivially
small) while keeping the row-heavy non-hardcoded branch
(`max_nested_rows in [100, 105]`) under the ASan allocation cap by
limiting depth to 3.

Worst-case nested-value product `max_nested_rows ^ max_depth_high`:
  5^5    =    3125
  20^4   =  160000
  105^3  = ~1.2M

All bounded below ~2e6, well under ASan's ~1e9
`allocation-size-too-big` guard.

Implements @PedroTadim's refinement on
ClickHouse#103736:
"keep the longer max depth if the max nested number of rows is very
small (like 0 or 1 nested rows). We also need high max depth for
larger queries."

Session: cron:clickhouse-ci-task-worker:20260430-034500
@groeneai

Copy link
Copy Markdown
Contributor Author

@PedroTadim done — pushed 7cca6d1 with the conditional ladder.

if max_nested_rows <= 5:
    max_depth_high = 5
elif max_nested_rows <= 20:
    max_depth_high = 4
else:
    max_depth_high = 3
"max_depth": random.randint(2, max_depth_high),

Worst-case nested-value product max_nested_rows ^ max_depth_high:

max_nested_rows max_depth_high worst case notes
0–5 5 5^5 = 3125 tiny-rows path keeps full depth-5 type-shape coverage
6–20 4 20^4 = 160000 mid-range, Map(Map(Map(Map(...)))) shapes still reachable
21–105 3 105^3 = ~1.2M row-heavy non-hardcoded branch, kept safely below ASan cap

All branches are below ~2×10^6 entries, well under ASan's ~10^9 allocation-size-too-big guard.

Distribution under the existing CI roll

Driven by allow_hardcoded_inserts ∈ {True, False} and min_nested_rows ∈ [0, 5]:

  • ~50% of runs land in the row-heavy branch (max_nested_rows ∈ [100, 105]) → depth ≤ 3
  • ~42% land in the hardcoded branch (max_nested_rows ∈ [6, 10]) → depth ≤ 4
  • ~8% land at max_nested_rows = 5 → full depth ≤ 5

So the deep-nesting coverage is preserved on a non-trivial fraction of runs (the tiny-rows path you wanted to keep), while the row-heavy path is bounded.

Pre-PR validation gate

a) Deterministic repro? Worst-case bound is now a deterministic function of max_nested_rows. Each branch is verified by the math above; ASan would only trip if max_nested_rows × max_depth_high exceeded ~10^9 entries — none of the three branches do.

b) Root cause explained? BuzzHouse value generators for Map and Array recurse on child types in MapType::appendRandomRawValue / ArrayType::appendRandomRawValue, multiplying per-level row count at each nesting level. Without bounding the geometric product, the worst case (max_nested_rows=105, max_depth=5) reaches ~10^10 entries → ASan allocation-size-too-big.

c) Fix matches root cause? Yes — the geometric product is bounded directly by capping the depth as a function of the row count. The product never exceeds ~2×10^6 in any branch.

d) Test intent preserved? Yes — depth-5 coverage is still reachable on the tiny-rows path (where it's safe), and the depth-4 branch covers a meaningful range of Map/Array shapes. Only the deepest nesting is dropped on the row-heavy branch where the geometric blowup makes it unsafe.

e) Both directions demonstrated? Pre-fix: 105^5 ≈ 1.3×10^10 entries → ASan abort. Post-fix: 105^3 ≈ 1.2×10^6 entries → well under the cap. Cross-PR check showed the same ASan abort in 4 unrelated PRs (#99346, #101705, #102244, #99537) — all on the row-heavy branch hitting depth ≥ 4.

Net diff is now 1 file, +23 / -7 lines, all in ci/jobs/buzzhouse_job.py. Let me know if you'd like the cutoffs adjusted.

Session: cron:clickhouse-ci-task-worker:20260430-034500

@PedroTadim

Copy link
Copy Markdown
Member

Looks good now, we can merge.

@PedroTadim PedroTadim enabled auto-merge April 30, 2026 04:35
@clickhouse-gh

clickhouse-gh Bot commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

Workflow [PR], commit [7cca6d1]

Summary:


AI Review

Summary

This PR reduces BuzzHouse allocation-size-too-big failures by lowering generated max_depth when max_nested_rows is large. The direction is reasonable for CI stability, but the current implementation ties the mitigation to global max_depth, which also limits unrelated query/type recursion and materially reduces fuzzing coverage in the common non-hardcoded branch.

Findings
  • ⚠️ Majors
    • [ci/jobs/buzzhouse_job.py:195] The fix uses global max_depth as a proxy for nested value fanout control. In practice, when allow_hardcoded_inserts is False, max_nested_rows is always 100..105, so max_depth is always forced to 2..3 for the whole run. This weakens exploration in unrelated generators (SQLQuery, SQLExpression, type generation) and can hide deep-structure bugs.
    • Suggested fix: keep global max_depth independent, and cap only value-generation recursion/fanout for Map/Array (e.g. dedicated value-depth limit or generator-side nested-row cap).
ClickHouse Rules
Item Status Notes
Deletion logging
Serialization versioning
Core-area scrutiny
No test removal
Experimental gate
No magic constants
Backward compatibility
SettingsChangesHistory.cpp
PR metadata quality
Safe rollout ⚠️ CI stability improves, but fuzzing depth coverage regresses in unrelated areas.
Compilation time
No large/binary files
Final Verdict

Status: ⚠️ Request changes

Minimum required actions:

  1. Decouple the mitigation from global max_depth so deep query/type fuzzing coverage is preserved while still bounding nested value explosion.

@clickhouse-gh clickhouse-gh Bot added the pr-ci label Apr 30, 2026
@PedroTadim PedroTadim added the can be tested Allows running workflows for external contributors label Apr 30, 2026
Comment thread ci/jobs/buzzhouse_job.py
@PedroTadim PedroTadim added this pull request to the merge queue Apr 30, 2026
Merged via the queue into ClickHouse:master with commit 49ac76c Apr 30, 2026
325 of 326 checks passed
@robot-ch-test-poll1 robot-ch-test-poll1 added the pr-synced-to-cloud The PR is synced to the cloud repo label Apr 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

can be tested Allows running workflows for external contributors pr-ci pr-synced-to-cloud The PR is synced to the cloud repo

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants