Skip to content

Fix ColumnReplicated type mismatch crash in merge algorithms#101036

Merged
Avogar merged 3 commits intoClickHouse:masterfrom
groeneai:fix/stid-2508-column-replicated-merge-crash
Apr 21, 2026
Merged

Fix ColumnReplicated type mismatch crash in merge algorithms#101036
Avogar merged 3 commits intoClickHouse:masterfrom
groeneai:fix/stid-2508-column-replicated-merge-crash

Conversation

@groeneai
Copy link
Copy Markdown
Contributor

Problem

When enable_lazy_columns_replication=1 (randomized in CI), JOIN queries produce
ColumnReplicated columns for lazy column replication. These columns flow through
merge-sort pipelines (ORDER BY, MergeTree merges). During MergedData::initialize(),
destination columns are wrapped as ColumnReplicated only if initial inputs contain
ColumnReplicated columns — but inputs that are null (no chunk) at initialization
time are skipped.

When those late-arriving inputs provide chunks via consume(), the previous code
only materialized sort columns via removeReplicatedFromSortingColumns(), leaving
non-sort ColumnReplicated columns intact. When MergedData::insertRow/insertRows
tried to insert from a ColumnReplicated source into a regular destination column,
it triggered the assertTypeEquality assertion at IColumn.h:862:

Logical error: '(isConst() || isSparse() || isReplicated()) ? getDataType() == rhs.getDataType() : typeid(*this) == typeid(rhs)'

This is STID 2508 family: 47+ hits across 40+ PRs and 4+ master hits in 30 days,
accelerating to 15+ hits in the last 3 days alone.

Fix

Two-layer fix:

Primary: All merge algorithm consume() methods now call
removeReplicatedFromAllColumns() instead of removeReplicatedFromSortingColumns().
This materializes ALL ColumnReplicated columns in new chunks, not just sort
columns, preventing the type mismatch from reaching MergedData.

Defense-in-depth: MergedData::insertRow, insertRows, and insertChunk now
check for ColumnReplicated/regular mismatches and materialize the source when
needed.

The initialize() path is unchanged — it still detects ColumnReplicated in
initial inputs and wraps destinations, preserving the lazy replication optimization
for the initial chunks. The consume() materialization only affects late-arriving
chunks where the optimization can't be safely applied.

Affected merge algorithms

  • MergingSortedAlgorithm (ORDER BY merge)
  • IMergingAlgorithmWithSharedChunks (Replacing, Collapsing, VersionedCollapsing, Graphite)
  • SummingSortedAlgorithm
  • AggregatingSortedAlgorithm
  • FinishAggregatingInOrderAlgorithm

Testing

  • 3 new unit tests covering insertRow, insertRows, and insertChunk paths
  • Existing ColumnReplicated tests pass (7/7)
  • Functional queries with enable_lazy_columns_replication=1 produce correct results

Changelog category (leave one):

  • Bug Fix (user-visible misbehavior in an official stable release)

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

Fix crash (Logical error: isConst/isSparse/isReplicated assertTypeEquality) in merge algorithms when lazy column replication (enable_lazy_columns_replication) produces ColumnReplicated columns that flow into merge-sort pipelines with late-arriving inputs.

Documentation entry for user-facing changes

  • Documentation is written (mandatory for new features)

@groeneai
Copy link
Copy Markdown
Contributor Author

Pre-PR Validation Gate

Session: cron:clickhouse-ci-task-worker:20260328-201500

a) Deterministic repro?

Yes. Unit test MergedDataReplicated.InsertRowsReplicatedSourceRegularDestination constructs exactly the crash conditions: MergedData initialized with regular columns (some inputs null), then insertRows called with ColumnReplicated source. In debug/sanitizer builds, the original code triggers chassert at IColumn.h:862 because typeid(ColumnInt64) != typeid(ColumnReplicated).

b) Root cause explained?

MergedData::initialize() wraps destination columns as ColumnReplicated based on initial inputs. Null inputs at init time are skipped — their ColumnReplicated status is unknown. When those inputs arrive via consume(), removeReplicatedFromSortingColumns() only materializes sort columns. Non-sort ColumnReplicated columns survive to insertRows() where assertTypeEquality fails: destination is regular ColumnInt64, source is ColumnReplicated wrapping ColumnInt64typeid mismatch → assertion → crash.

c) Fix matches root cause?

Yes. Primary fix: removeReplicatedFromAllColumns() in consume() materializes ALL columns, preventing ColumnReplicated from reaching MergedData. Defense-in-depth: MergedData::insertRow/insertRows/insertChunk materialization guards for any remaining paths.

d) Test intent preserved / new tests added?

3 new unit tests covering all three insertion paths (insertRow, insertRows, insertChunk). No existing tests modified.

e) Both directions demonstrated?

  • Without fix: chassert((isConst() || isSparse() || isReplicated()) ? ... : typeid(*this) == typeid(rhs)) fires because this is ColumnInt64 (regular) and rhs is ColumnReplicatedabort()
  • With fix: Defensive check materializes ColumnReplicated source → insertFrom receives matching ColumnInt64 types → succeeds

All 3 new tests pass. All 7 existing ColumnReplicated tests pass. Build succeeds (105/105 targets). Functional queries with enable_lazy_columns_replication=1 produce correct results.

@groeneai
Copy link
Copy Markdown
Contributor Author

cc @Avogar @CurtizJ — could you review this? It fixes the STID 2508 family of crashes where ColumnReplicated columns from lazy JOIN replication pass through merge algorithm consume() without being materialized, causing type mismatch assertions when MergedData destinations are regular columns (initialized before the ColumnReplicated inputs arrived).

@pufit pufit added the can be tested Allows running workflows for external contributors label Mar 29, 2026
@clickhouse-gh
Copy link
Copy Markdown
Contributor

clickhouse-gh Bot commented Mar 29, 2026

Workflow [PR], commit [e9eae8c]

Summary:

job_name test_name status info comment
Stateless tests (amd_llvm_coverage, 1/3) FAIL
00600_replace_running_query FAIL cidb, issue ISSUE CREATED

AI Review

Summary

This PR fixes a real correctness issue where late-arriving ColumnReplicated inputs could hit type mismatches in merge paths, and adds focused regression tests (including the dynamic-structure insertChunk path). After reviewing the current PR head, I did not find remaining correctness, safety, concurrency, or performance blockers. The previously reported insertChunk dynamic-branch risk from clickhouse-gh[bot] appears addressed by wrapping the destination before insertRangeFrom in that branch.

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
Compilation time
No large/binary files
Final Verdict
  • Status: ✅ Approve

@clickhouse-gh clickhouse-gh Bot added the pr-bugfix Pull request with bugfix, not backported by default label Mar 29, 2026
{
columns[i] = ColumnReplicated::create(std::move(chunk_columns[i]));
}
else if (!columns[i]->isReplicated() && chunk_columns[i]->isReplicated())
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.

insertChunk still has a type-mismatch path for non-sort dynamic/statistics columns because the new replicated-materialization branch runs after hasDynamicStructure / hasStatistics branches.

Concrete trace:

  1. initialize sees late/empty input, so destination columns[i] stays regular (not ColumnReplicated).
  2. Later insertChunk gets chunk_columns[i] = ColumnReplicated(ColumnObject) (or another hasDynamicStructure/hasStatistics type).
  3. At line 126, columns[i]->hasDynamicStructure() is true, so code executes columns[i] = columns[i]->cloneEmpty(); columns[i]->insertRangeFrom(*chunk_columns[i], 0, num_rows);.
  4. ColumnObject::insertRangeFrom does assert_cast<const ColumnObject &>(src); src is ColumnReplicated, so this is an exception in debug/ASan and UB in release.

So the mismatch guard at lines 142-146 is never reached for these column families. Please move replicated materialization before hasDynamicStructure / hasStatistics handling (or materialize chunk_columns[i] up front once per column).

@alexey-milovidov
Copy link
Copy Markdown
Member

@groeneai, check the review comments.

Also, for all new errors found by CI:

Stateless tests (arm_binary, sequential) failure
02916_another_move_partition_inactive_replica FAIL cidb
Stress test (amd_tsan) failure
Logical error: Sizes of nested column and null map of Nullable column are not equal after deserialization (null map size = A, nested column size = B) (STID: 6726-6874) FAIL cidb

Link the existing fixes if any, or create new PRs with fixes.

@groeneai
Copy link
Copy Markdown
Contributor Author

@alexey-milovidov — addressed the review comments and pushed a fix (commit 3bbf514):

Review blocker fixed: Moved ColumnReplicated materialization to the top of the per-column loop in insertChunk, before all type-specific branches (hasDynamicStructure, hasStatistics, etc.). Previously the guard ran after those branches, so ColumnReplicated(ColumnDynamic) would enter the hasDynamicStructure path first and crash via assert_cast<const ColumnDynamic &>. Now chunk columns are materialized once up front — all downstream branches receive concrete column types.

Also added a regression test (InsertChunkReplicatedDynamicSourceRegularDestination) that creates a ColumnReplicated(ColumnDynamic) source and verifies insertChunk handles it correctly.

CI failures — both are pre-existing and tracked:

@alexey-milovidov
Copy link
Copy Markdown
Member

Thanks! Now investigate the hung check failure. If it is fixed by any open or recently merged PRs, link them here.

@groeneai
Copy link
Copy Markdown
Contributor Author

@alexey-milovidov — investigated the hung check failure. It is a pre-existing trunk issue, not caused by this PR.

CIDB evidence (30-day window):

  • 31 master hits + 97 PR hits across 85 distinct unrelated PRs
  • Active since at least Feb 28, hitting every day
  • Last 7 days alone: 18 master hits, 80 PR hits across 78 distinct PRs

Breakdown by stress test type (last 7 days):

Check Hung check failures
amd_tsan 30
amd_debug 25
amd_msan 19
arm_asan_ubsan, s3 13
azure, amd_tsan 4
Others 7

Recently merged fix PRs that partially address this:

Open PR that may address remaining cases:

Despite the merged fixes, hung check failures continue at a high rate (~18 master hits/week). The root cause appears to be multiple independent deadlock/hang paths in stress tests, not a single issue.

@nikitamikhaylov
Copy link
Copy Markdown
Member

@groeneai Resolve conflicts.

groeneai and others added 2 commits April 16, 2026 15:18
When MergedData::initialize() runs, it wraps destination columns as
ColumnReplicated only if initial inputs have ColumnReplicated columns.
However, inputs that are null (no chunk) at initialization time are
skipped. When those inputs later arrive via consume(), the previous
code only materialized sort columns via removeReplicatedFromSortingColumns(),
leaving non-sort ColumnReplicated columns intact. This caused a type
mismatch when insertRow/insertRows tried to insert from ColumnReplicated
source into a regular destination column, triggering the assertTypeEquality
assertion at IColumn.h:862.

The fix has two layers:
1. Primary: All merge algorithm consume() methods now call
   removeReplicatedFromAllColumns() which materializes ALL ColumnReplicated
   columns, not just sort columns. This prevents the mismatch from occurring.
2. Defense-in-depth: MergedData::insertRow, insertRows, and insertChunk
   now check for ColumnReplicated/regular mismatches and materialize the
   source when needed.

This addresses STID 2508 family crashes (2508-37b9, 2508-35cc,
2508-394e, 2508-32f6, 2508-35de, 2508-33f1, 2508-2c31) which
collectively account for 47+ hits across 40+ PRs and 4+ master
hits in 30 days, accelerating to 15+ hits in the last 3 days.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move ColumnReplicated materialization to the top of the per-column loop
in insertChunk, before hasDynamicStructure/hasStatistics branches. This
prevents ColumnDynamic::insertRangeFrom from receiving a ColumnReplicated
source (causing assert_cast crash in debug/sanitizer, UB in release).

The previous code had the replicated guard after dynamic/statistics
branches, so ColumnReplicated(ColumnDynamic) would enter the
hasDynamicStructure path first and crash.

Also adds a regression test with ColumnReplicated(ColumnDynamic) in
insertChunk to cover this specific code path.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@groeneai groeneai force-pushed the fix/stid-2508-column-replicated-merge-crash branch from cb439a3 to 50df338 Compare April 16, 2026 15:18
@groeneai
Copy link
Copy Markdown
Contributor Author

@nikitamikhaylov Conflicts resolved — rebased onto latest master. Clean 2-commit history:

  1. 8b5e32d — Fix ColumnReplicated type mismatch crash in merge algorithms (main fix: removeReplicatedFromAllColumns in all 5 merge algorithm consume() methods + defensive guards in MergedData)
  2. 50df338 — Fix insertChunk branch ordering for ColumnReplicated + Dynamic columns (moves materialization before hasDynamicStructure/hasStatistics branches)

The only conflict was in MergingSortedAlgorithm::consume() where the new virtual row handling (from recent master) needed to be preserved alongside our removeReplicatedFromAllColumns call — straightforward merge.

@Avogar Avogar self-assigned this Apr 16, 2026
@groeneai
Copy link
Copy Markdown
Contributor Author

Status update — PR ready for review (new evidence: same bug just hit master in release build)

New data point: On 2026-04-18 23:14 UTC, master commit 794c01e7 hit a fresh variant of the same bug:

  • Check: Stress test (experimental, serverfuzz, arm_release)
  • STID: 1367-427cLogical error: 'Too large size (17726168133382777559) passed to allocator.'
  • Stack: ColumnString::insertFromMergedData::insertRowsMergingSortedAlgorithm::insertRowsidentical crash path as the STID 2508 family this PR fixes.

This is the release-build manifestation of the same bug: when ColumnReplicated reaches MergedData::insertRows with a regular-column destination, the debug assertion fires STID 2508 ((isConst()||isSparse()||isReplicated())?getDataType()==rhs.getDataType():typeid(*this)==typeid(rhs)), but in release builds assert_cast degenerates to static_cast and reads garbage bytes → corrupt size passed to allocator (17726168133382777559 ≈ 0xF5FBE95E44857D17, looks like a pointer value). This PR fixes both paths by materializing ColumnReplicated in consume() across all 5 merge algorithms + defensive guards in MergedData.

CIDB evidence (last 30 days, STID 2508 family on master):

STID master hits PR hits Last seen
2508-5dc3 14 6 2026-04-18 16:40 UTC
2508-37b9 7 39 2026-04-18 22:46 UTC
2508-6644 7 4 2026-04-17 13:34 UTC
2508-32f6 6 23 2026-04-16 14:59 UTC
2508-35de 5 10 2026-04-17 13:41 UTC
1367-427c 1 (NEW) 0 2026-04-18 23:14 UTC

~65 master hits + hundreds of PR hits in the 30 days this PR has been waiting.

Failing CI checks — all confirmed pre-existing / unrelated to this PR

Check Failure Classification
AST fuzzer (amd_debug, targeted, old_compatibility) Logical error: Primary key type mismatch, expected A, got B. (STID: 3436-4175) Chronic trunk bug — 6 distinct unrelated PRs over 30d, 0 master hits. Not PR-caused.
Unit tests (asan_ubsan) FunctionsStress.stressunexpected_error: isInjective is false with arguments but true without on partitionId(CAST(... AS Variant(...)), b) Pre-existing partitionId function bug on Variant-cast arguments. This PR only modifies Processors/Merges/Algorithms/, no function code touched. Test was recently updated (commits f9e7727, 927095e) so zero CIDB history.
Upgrade check (amd_release) Cannot parse input: expected 'storing_version:' before 'creation_tid: ...' Chronic flaky — 200+ PR hits in 30d, 0 master hits. Tracked via PR #101576.
Stateless tests (amd_tsan, flaky check) N/A — 0 tests reported Praktika pre-run infra error.
Stateless tests (amd_msan, flaky check) Failed to do a job pre-run step, it is praktika bug or misconfiguration Praktika pre-run infra error.

My 4 added unit tests (MergedDataReplicated.*) all pass on asan_ubsan. Coverage: 100% (144/144) of changed lines.

Ask

@Avogar @CurtizJ @alexey-milovidov @nikitamikhaylov — could one of you approve this? Master is taking hits from this bug daily and the branch is clean (rebased 2026-04-16, 100% changed-line coverage, all genuine failures addressed). Happy to rebase again if needed.

Copy link
Copy Markdown
Member

@Avogar Avogar left a comment

Choose a reason for hiding this comment

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

I don't understand the fix. First, there is no real SQL test that reproduced the issue. Adding a unit test that creates some classes with bad arguments migth be unrealistic scenario and not good enough. Second, the changes kill optimization from ColumnReplicated by removing them from all inputs except for the initial ones.

If the problem with late arriving Replicated columns is real and can be confirmed by some SQL/integration test, we can just catch it and wrap the column in the merged data to Replicated.

If it's impossible to reproduce it with the real SQL/integration tests, we can first add an additional check in MergedData when input column is Replicated but the accumulated column is not and throw a specific error message about it, so we can ensure this is the problem and try to reproduce it

…stination

Based on @Avogar's review feedback on PR ClickHouse#101036, this commit redesigns the
fix for the `STID 2508` family `MergedData` type mismatch exception
(`isConst() || isSparse() || isReplicated()` assertion at `IColumn.h:862`).

Previous fix (reverted here) materialized all `ColumnReplicated` columns in
the merge algorithms' `consume` methods, which killed the lazy replication
optimization for every late-arriving chunk. It also materialized sources
in `MergedData::insertRow` / `insertRows`, losing the optimization on
every row insertion.

New approach: detect the mismatch in `MergedData` and WRAP the destination
in `ColumnReplicated` using the identity-indexes constructor. After
wrapping, `ColumnReplicated::insertFrom` / `insertRangeFrom` consume both
regular and replicated sources through the same optimized path, preserving
the lazy replication optimization for the entire merged output.

Changes:

1. Revert `removeReplicatedFromAllColumns` in all 5 merge algorithm
   `consume` methods. Restore `removeReplicatedFromSortingColumns`, which
   only materializes sort columns — non-sort `ColumnReplicated` columns
   now flow through to `MergedData` unchanged.

2. In `MergedData::insertRow` and `insertRows`: when the source is
   `ColumnReplicated` but the destination is regular, wrap the destination
   in `ColumnReplicated` via `ColumnReplicated::create(std::move(columns[i]))`.
   The identity-indexes constructor is a structural wrap — existing data
   is preserved in `nested_column` with indexes `[0, 1, ..., N-1]`.

3. In `MergedData::insertChunk`: drop the eager up-front materialization.
   Handle each branch on its own terms:
   - `hasDynamicStructure` wraps the empty destination in `ColumnReplicated`
     when the chunk is replicated, so `ColumnReplicated::insertRangeFrom`
     handles the source (not `ColumnDynamic::insertRangeFrom`, which would
     `assert_cast` a `ColumnReplicated` source).
   - `hasStatistics` works unchanged — `takeOrCalculateStatisticsFrom` is
     delegated through `ColumnReplicated` to the nested column.
   - `columns[i]->isReplicated()` handles a replicated chunk via
     `std::move` instead of re-wrapping.
   - The simple else branch lets `ColumnReplicated` chunks flow through,
     so the merged destination inherits the optimization.

4. Rewrite `gtest_merged_data_replicated.cpp`:
   - Keep regression tests for `insertRow` / `insertRows` / `insertChunk`
     covering regular destination + `ColumnReplicated` source, including
     `ColumnReplicated(ColumnDynamic)`.
   - Add `InsertRowsWrapsDestinationPreservingOptimization` which asserts
     the merged destination is `ColumnReplicated` after mismatch handling
     (not materialized as regular).

Reproduction note: over ~3 weeks of attempts I could not reproduce the
assertion failure through SQL or integration tests — it requires the
stress-test-scale parallelism + sanitizer timing that CI provides. The
gtests exercise the exact conditions that arrive at `MergedData` under
that environment.
@groeneai
Copy link
Copy Markdown
Contributor Author

Thanks for the review @Avogar — you were right on both points. Pushed e9eae8c to address them.

On the optimization loss: Reverted removeReplicatedFromAllColumns in all 5 merge algorithms' consume methods. They now use removeReplicatedFromSortingColumns again, so non-sort ColumnReplicated columns from late-arriving chunks flow through to MergedData unchanged.

On the fix approach: Took the "wrap the column in the merged data to Replicated" path you suggested. When MergedData::insertRow / insertRows detects a ColumnReplicated source against a regular destination, it now wraps the destination via ColumnReplicated::create(std::move(columns[i])) — the identity-indexes constructor preserves existing rows as nested_column with indexes [0, 1, ..., N-1]. After wrapping, ColumnReplicated::insertFrom consumes both regular and replicated sources through the same optimized path, so the lazy replication optimization is preserved for the entire merged output (not just the initial inputs).

insertChunk gets the same treatment — the eager up-front materialization is gone. The hasDynamicStructure branch wraps the empty destination in ColumnReplicated when the chunk is replicated, hasStatistics works unchanged (takeOrCalculateStatisticsFrom is delegated through ColumnReplicated to the nested column), the isReplicated branch now handles replicated chunks via std::move instead of re-wrapping, and the simple else branch lets ColumnReplicated chunks flow through.

On SQL reproduction: Being transparent — over ~3 weeks of attempts I could not reproduce the assertion through real SQL or integration tests. I tried the exact failing queries from CIDB (LEFT JOIN + ORDER BY + LIMIT shapes, viewExplain with FINAL), concurrent enable_lazy_columns_replication = 1 workloads with varied randomization (max_threads 2-16, max_block_size 32-1024, external merge sort thresholds, different parallelism + parts layouts), and combinations of all the above. The assertion only surfaces under stress-test-scale parallelism + sanitizer timing. So per your "if it's impossible to reproduce it with the real SQL/integration tests" branch, the gtests remain the regression coverage — but they now verify the correct behavior: the destination IS wrapped as ColumnReplicated after the mismatch (InsertRowsWrapsDestinationPreservingOptimization asserts this explicitly). All 5 gtests pass, along with the 7 existing ColumnReplicated tests and the 4 existing lazy-column-replication stateless tests (03352, 03580, 03789, 04010).

Session: cron:clickhouse-ci-task-worker:20260420-181500

@clickhouse-gh
Copy link
Copy Markdown
Contributor

clickhouse-gh Bot commented Apr 20, 2026

LLVM Coverage Report

Metric Baseline Current Δ
Lines 84.00% 84.00% +0.00%
Functions 91.10% 91.10% +0.00%
Branches 76.50% 76.50% +0.00%

Changed lines: 100.00% (137/137) · Uncovered code

Full report · Diff report

@Avogar Avogar added this pull request to the merge queue Apr 21, 2026
Merged via the queue into ClickHouse:master with commit 4f3b256 Apr 21, 2026
159 of 161 checks passed
@clickgapai
Copy link
Copy Markdown
Contributor

Hi — this PR may need backporting to 26.3 (LTS), 26.2, 26.1, but no backport label was found.

Affected code: MergedData::insertRow, MergedData::insertRows, MergedData::insertChunk in MergedData.cpp — introduced in 25.10.

Why: enable_lazy_columns_replication was introduced in 25.10 (default=false) and enabled by default in 25.11. The bug manifests when this setting is enabled. Supported branches 26.1, 26.2, and 26.3 all have this setting enabled by default. Branch 25.8 predates the feature and is unaffected. The PR description reports 47+ CI hits across 40+ PRs — this is a high-frequency failure.

Other supported branches (25.8) predate 25.10 and do not contain this code.

If this should be backported, consider adding pr-must-backport or a version-specific label (e.g. v26.3-must-backport). Ignore this if backporting is not applicable.

@robot-ch-test-poll4 robot-ch-test-poll4 added the pr-synced-to-cloud The PR is synced to the cloud repo label Apr 21, 2026
@Avogar Avogar added the pr-must-backport Pull request should be backported intentionally. Use this label with great care! label Apr 21, 2026
@robot-clickhouse robot-clickhouse added the pr-must-backport-synced The `*-must-backport` labels are synced into the cloud Sync PR label Apr 21, 2026
robot-ch-test-poll added a commit that referenced this pull request Apr 21, 2026
Cherry pick #101036 to 26.3: Fix ColumnReplicated type mismatch crash in merge algorithms
robot-clickhouse added a commit that referenced this pull request Apr 21, 2026
Avogar added a commit that referenced this pull request Apr 22, 2026
Backport #101036 to 26.3: Fix ColumnReplicated type mismatch crash in merge algorithms
robot-ch-test-poll added a commit that referenced this pull request Apr 22, 2026
Cherry pick #101036 to 26.2: Fix ColumnReplicated type mismatch crash in merge algorithms
robot-clickhouse added a commit that referenced this pull request Apr 22, 2026
robot-clickhouse added a commit that referenced this pull request Apr 22, 2026
Cherry pick #101036 to 26.1: Fix ColumnReplicated type mismatch crash in merge algorithms
robot-clickhouse added a commit that referenced this pull request Apr 22, 2026
@robot-ch-test-poll1 robot-ch-test-poll1 added the pr-backports-created Backport PRs are successfully created, it won't be processed by CI script anymore label Apr 22, 2026
Avogar added a commit that referenced this pull request Apr 23, 2026
Backport #101036 to 26.2: Fix ColumnReplicated type mismatch crash in merge algorithms
Avogar added a commit that referenced this pull request Apr 23, 2026
Backport #101036 to 26.1: Fix ColumnReplicated type mismatch crash in merge algorithms
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-backports-created Backport PRs are successfully created, it won't be processed by CI script anymore pr-bugfix Pull request with bugfix, not backported by default pr-must-backport Pull request should be backported intentionally. Use this label with great care! pr-must-backport-synced The `*-must-backport` labels are synced into the cloud Sync PR 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.

9 participants