Skip to content

Stable 26.3: Bump to 26.3.33 - #2357

Merged
zvonand merged 593 commits into
stable-26.3from
bump/stable-26.3/26.3.33
Sep 18, 2026
Merged

zvonand merged 593 commits into
stable-26.3from
bump/stable-26.3/26.3.33

Conversation

@zvonand

@zvonand zvonand commented Sep 14, 2026

Copy link
Copy Markdown
Member

Changelog category (leave one):

  • Not for changelog (changelog entry is not required)

CI/CD Options

Exclude tests:

  • Fast test
  • Integration Tests
  • Stateless tests
  • Stateful tests
  • Unit tests
  • Performance tests
  • Aarch64 tests
  • All with ASAN
  • All with TSAN
  • All with MSAN
  • All with UBSAN
  • All with Coverage
  • All Regression
  • Disable CI Cache

Regression jobs to run:

  • Fast suites (mostly <1h)
  • Aggregate Functions (2h)
  • Alter (1.5h)
  • Benchmark (30m)
  • CAS (content-addressed storage; Antalya only)
  • ClickHouse Keeper (1h)
  • Iceberg (2h)
  • LDAP (1h)
  • OAuth (5m)
  • Parquet (1.5h)
  • RBAC (1.5h)
  • SSL Server (1h)
  • S3 (2h)
  • S3 Export (2h)
  • Swarms (30m)
  • Tiered Storage (2h)

robot-clickhouse and others added 30 commits August 18, 2026 05:23
…1842

Backport ClickHouse#111842 to 26.3: Resolve hive partitioning sample path lazily
…3188

Backport ClickHouse#113188 to 26.3: Fix hang when dropping a Refreshable Materialized View during refresh planning
…5132

Backport ClickHouse#115132 to 26.3: Disable distributed index analysis with projections (wrong results)
…5734

Backport ClickHouse#105734 to 26.3: Fix singleValueOrNull null-state merge
…D VIEW ... POPULATE losing the source subscription
…2329

Backport ClickHouse#112329 to 26.3: Enforce parent table row policy in mergeTreeProjection table function
`CREATE OR REPLACE MATERIALIZED VIEW` does not exist on 26.3: the parser guards
the `MATERIALIZED` keyword with `!replace_view` and only master dropped that
guard, in `ed062fd96e1` (first released in 26.5). Both backported tests therefore
failed with `Syntax error ... at position 19 (MATERIALIZED)` rather than
exercising anything. `04493` also collided with the existing
`04493_async_insert_dedup_optimize_on_insert_replicated_merge_tree`.

The backported fix is still wanted here, because the same stale storage-cache
entry breaks `CREATE OR REPLACE TABLE ... AS SELECT`, which 26.3 does support:
the internal drop of the replaced table resolves the temporary name to the new,
live table and cancels its merges forever. So both tests are replaced by one that
covers that path.

Verified in both directions with release binaries: on 26.3.17.110, which lacks
the fix, `OPTIMIZE` fails with `Code: 236 ... Cancelled merging parts (ABORTED)`;
on 26.7.4.58, which has it, the test passes.

Related: ClickHouse#115288
Related: ClickHouse#108728

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…mization when the aggregate argument contains arrayJoin
…5579

Backport ClickHouse#105579 to 26.3: Fix nullptr deref in CREATE TABLE TO INNER UUID without ENGINE
The push of 6cd5f64 updated the branch ref but GitHub never recorded the
matching synchronize event, so the pull request still reported 085201f as
its head and no CI ran on the new commit.
…8728

Backport ClickHouse#108728 to 26.3: Fix CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE losing the source subscription
…that hide argument nullability inside uniq
…4620

Backport ClickHouse#114620 to 26.3: Fix serialization of Map-valued settings in access entities
…lt fix

The backported `getSourceNullMap` helper in `castOrDefault.cpp` calls
`ColumnVariant::createNullMap`, which was introduced on master by an
unrelated, unbackported commit ("Fix `toFloat64`/`toUInt32`/`toString`/etc.
on Dynamic ignoring `cast_keep_nullable`"), so the build failed with
`no member named 'createNullMap' in 'DB::ColumnVariant'`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
PedroTadim and others added 17 commits September 8, 2026 11:28
…3244

Backport ClickHouse#113244 to 26.3: Fix set index on an expression with a Nullable operand
…1144

Backport ClickHouse#101144 to 26.3: Fix out-of-bounds access in getRequiredHeaderPositions for lazy materialization
…prewhere in 26.3

Under parallel replicas with a local plan, lazy materialization drops the
ORDER BY column when a row policy on bare `_part_offset` is combined with a
PREWHERE that uses `_part_offset` in an expression, and the query fails with
NOT_FOUND_COLUMN_IN_BLOCK. The test randomizer reaches this through
automatic_parallel_replicas_mode=2 in about a quarter of runs. Master and
26.4+ pass this under parallel replicas, so the tag is 26.3-only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…7991

Backport ClickHouse#107991 to 26.3: validate discriminators in Variant binary bulk deserialization
…5329

Backport ClickHouse#115329 to 26.3: Fix not applying max_dynamic_subcolumns_in_json_type_parsing for inserts in some cases
…8210

Backport ClickHouse#118210 to 26.3: Fix PostgreSQL out-of-cycle message recovery and stale unnamed extended-query state
…8220

Backport ClickHouse#118220 to 26.3: Make 05054_embedded_rocksdb_explicit_dir_file_grant stress-restart safe
…8615

Backport ClickHouse#118615 to 26.3: Fix S3 listObjects dropping objects on an empty page with a continuation token
…-column-merge-race

Fixing 26.3 flaky tests
…5707

Backport ClickHouse#115707 to 26.3: Fix a use-after-free in the gRPC server
…4233

Backport ClickHouse#114233 to 26.3: Fix std::out_of_range when a space-filling curve is not a key column
…5510

Backport ClickHouse#115510 to 26.3: Reject a bare carriage return in HTTP header names and values
…7523

Backport ClickHouse#117523 to 26.3: Mask credentials in setting values in logs and system tables
@zvonand zvonand added the 26.3 label Sep 14, 2026
@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

Workflow [PR], commit [81da36d]

The nested-alias case used `MD5`, which is registered only under
`USE_SSL`. The Fast test build is configured with `-DENABLE_LIBRARIES=0`,
so it has no OpenSSL and the `CREATE TABLE` fails there with
`Function with name `MD5` does not exist`.

Use the non-cryptographic `cityHash64` instead, following the upstream
fix. It has no OpenSSL dependency and is not FIPS-restricted, so the case
runs in every build configuration while exercising the same inline-alias
resolution path inside and outside a lambda.

CI report:
https://altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2357&sha=8c4326a3e5bd4f5a80f9b4de3227a6566b81fa3a&name_0=PR&name_1=Fast+test&name_2=Tests
@zvonand

zvonand commented Sep 16, 2026

Copy link
Copy Markdown
Member Author

@blau-ai

@blau-ai

blau-ai commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

CI triage for #2357 (bump to 26.3.33)

Verdict — 6 red buckets: 0 caused by the upstream 26.3.33 content, but 3 are real blockers that live in Altinity-fork code. Two are pre-existing fork bugs (one of them newly caught by a test the bump imported), one is a non-idempotent test, plus the usual DCO + regression-flake noise. Nothing here is a defect in the 26.3.33 changes themselves — every failing product path (FunctionsAES, plain-rewritable metadata, the AES fast path) is byte-identical to stable-26.3 or is exercised by a newly-added test.

Head SHA: f82b79b. Evidence is from the praktika result_pr.json and the S3 job logs.


1. Unit tests (asan) + (ubsan) — 🔴 real crash, blocks this PR (latent fork bug, newly caught)

Both jobs error with no gtest.json. The asan .log aborts on:

src/Disks/tests/gtest_disk_object_storage.cpp  ->  DiskObjectStorageTest.CopyEmptyFileToPlainRewritable
Skipping writing empty blob for path CopyEmptyFileToPlainRewritable_file, key ...
contrib/llvm-project/libcxx/include/__vector/vector.h:429: libc++ Hardening assertion !empty() failed: front() called on an empty vector

Root cause (I traced it):

  • The test (copy a 0-byte file to a plain_rewritable disk) is new — it does not exist on stable-26.3; it arrived with the 26.3.33 bump.
  • Because the plain-rewritable metadata storage reports supportsEmptyFilesWithoutBlobs() == true, DiskObjectStorageTransaction.cpp:350-351 takes the "skip empty blob" branch and calls tx->createMetadataFile(path, /*objects=*/{}) with an empty list.
  • MetadataStorageFromPlainRewritableObjectStorage.cpp:410 then does objects.front() unconditionallyfront() on empty vector → abort.

The objects.front() code and the empty-blob-skip both already exist on stable-26.3, so this is a pre-existing latent bug in the fork's plain-rewritable path that the newly-imported upstream test simply exposes. It still has to be fixed for this PR to go green.

Concrete fix (pick one):

  • In MetadataStorageFromPlainRewritableObjectStorageTransaction::createMetadataFile (.../MetadataStorages/PlainRewritable/MetadataStorageFromPlainRewritableObjectStorage.cpp:406-415), handle the empty-objects case instead of calling objects.front() (create a zero-blob metadata entry), or
  • have the plain-rewritable metadata storage return supportsEmptyFilesWithoutBlobs() == false (it doesn't actually support blob-less empty files given the .front() assumption), so the transaction writes a real empty blob.

The first is preferable — it keeps the empty-files-without-blobs optimization. This needs someone familiar with the Antalya plain-rewritable design.


2. Stateless tests — amd_debug / amd_ubsan / amd_asan(dist plan 3/4) / amd_debug(s3) — 🔴 real, but pre-existing, NOT caused by this bump

All four shards fail on the same test, 04337_encrypt_decrypt_block_modes (result differs with reference). The actual output balloons from 104 to ~1630 rows with ciphertext that accumulates across rows (row N contains row N-1's blocks) — a genuine state-leak in the AES ECB/CBC fast path.

Why it's not this PR's doing:

  • src/Functions/FunctionsAES.h has an identical blob SHA on stable-26.3 and on this PR's head (a4e9ec0…). No AES/encrypt/decrypt source is touched by the PR.
  • The test file is also unchanged and already exists on stable-26.3 (3602b9b…).

Same code + same test ⇒ it fails identically on the base branch. This is a pre-existing bug in the fork's AES fast-path optimization (the test was added by Altinity precisely to guard it, per the header comment referencing ClickHouse#65116). Recommend filing a separate issue against stable-26.3; it should not block the bump, but it is a real correctness bug worth fixing on its own.


3. Integration tests (amd_asan, targeted) — 9/460 — 🟡 non-idempotent test, not a product regression

All 9 failures are the same test under CI's 10× repeat: test_lost_part_during_startup[1-10] … [10-10] (only one repetition passes). Error:

Code: 57. DB::Exception: Table default.test_lost already exists. (TABLE_ALREADY_EXISTS)
(query: CREATE TABLE test_lost ... ReplicatedMergeTree('/clickhouse/test_lost', '1') ...)

tests/integration/test_lost_part_during_startup/test.py creates a fixed table name + fixed ZK path and never drops it. When the targeted job runs it 10× against the same module cluster, repetitions 2..10 collide. The test file is unchanged by this PR — this is a pre-existing test-isolation defect that only shows up under the repeat harness.

Concrete fix: add DROP TABLE IF EXISTS test_lost SYNC on both nodes at the start of the test (and/or a teardown fixture), or make the table name/ZK path unique per run. Safe to treat as noise for the bump; the fix is a one-liner in the test.


4. DCO — 🟡 expected for a bump PR

Merge/bump PR carrying ~100 upstream commits without Signed-off-by for the bumper. Standard for these branches — a maintainer override/waiver, not a code change.


5. Regression release parquet / parquet_aws_s3 — 🟡 likely flaky, re-run to confirm

Both report the top-level /parquet module failing with retries that partially recovered (5 retries: 3 ok, 2 failed). That retry-mixed pattern is the signature of instability in the TestFlows Parquet suite rather than a hard regression. I could not pin the specific failing scenario from the --log-failed output (only the top-level ✘ [ Fail ] '/parquet' is surfaced). Suggested next step: re-run the two regression jobs; if they reproduce, open the parquet report to find the failing sub-test.


6. "PR" check — aggregate gate, red only because of the above.


What to do

I can prepare the #1 and #3 fixes as a blau/* PR (or, if you'd rather, as a direct commit to bump/stable-26.3/26.3.33) — say the word and which delivery you prefer. I did not push anything. Note: I can't build/run ClickHouse here, so any fix would be validated by CI on the resulting PR.

🤖 automated CI triage by @blau-ai · code/log excerpts are evidence, not verified locally

@zvonand
zvonand force-pushed the bump/stable-26.3/26.3.33 branch from 38a2534 to 6223939 Compare September 17, 2026 12:39
…ion under secret masking

`MultipleDisksObjectStorageTransaction::copyFile` never received the
empty-blobs guard that the backport of ClickHouse#107040 added to
`DiskObjectStorageTransaction::copyFile`. Copying a zero-byte file between
two object storage disks that share a data source description goes through
the former, so
`MetadataStorageFromPlainRewritableObjectStorageTransaction::createMetadataFile`
got an empty `StoredObjects` and called `front` on it, aborting
`unit_tests_dbms` on a libc++ hardening assertion in
`DiskObjectStorageTest.CopyEmptyFileToPlainRewritable`. Upstream `master`
keeps the guard in a shared `copyFileImpl`; apply it in place here.

Masking a secret function argument also renames its constants in the
`ActionsDAG`. When such a constant feeds an `arrayJoin`, the masked
occurrence stops sharing a name with the unmasked one, the planner emits a
second `ARRAY JOIN`, and the query returns a cross product:
`04337_encrypt_decrypt_block_modes` grew from 109 to 1635 rows. Leave a
secret argument unmasked when its subtree contains an `arrayJoin`.

CI report:
https://altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2357&sha=f82b79bfb87e586a53c70d1ab0e7dab0980a1131&name_0=PR

Tolerate concurrently removed entries in `LocalObjectStorage::listObjects`

`listObjects` stats every directory entry through the throwing
`getObjectMetadata`, so a file removed between `readdir` and the stat aborts
the whole listing with `filesystem error: ... No such file or directory`.
`tryGetObjectMetadata` had the same hole: it tolerated a vanished entry in
`last_write_time` but then called the throwing `fs::file_size`.

`PaimonLatestHint.ReadsConcurrentlyReplacedHintAsSmallObject`, added by the
26.3.33 bump, hits this. Its writer thread publishes `LATEST` by renaming
`LATEST.tmp.<n>` over it, and the reader iterations that see the older hint
fall back to listing the `snapshot` directory, where those temporary names
come and go.

Skip an entry that disappears mid-listing, the way a remote object storage
omits a concurrently deleted object, and propagate every other error.
Upstream carries the same tolerance in the backport of ClickHouse#111483,
which reaches 26.3 only after 26.3.33.

CI report:
https://altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2357&sha=374d4c2a70a2b3a18725bfb374f8d0d9384f88ce&name_0=PR

Drop `test_lost` before recreating it in `test_lost_part_during_startup`

The test creates a fixed table name over a fixed ZooKeeper path and never
drops it, so every repetition after the first fails with
`TABLE_ALREADY_EXISTS` when CI runs the module ten times in a row.

CI report:
https://altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2357&sha=374d4c2a70a2b3a18725bfb374f8d0d9384f88ce&name_0=PR
@zvonand
zvonand force-pushed the bump/stable-26.3/26.3.33 branch from 6223939 to 81da36d Compare September 17, 2026 12:40
@zvonand
zvonand merged commit cde98ff into stable-26.3 Sep 18, 2026
270 of 273 checks passed
@zvonand zvonand added the verified Approved for release label Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.