Skip to content

[NOT FOR MERGE] Testing backport + fixes in CI - #1605

Closed
mkmkme wants to merge 7 commits into
antalya-26.1from
mkmkme/antalya-26.1/iceberg-fix-prewhere
Closed

mkmkme wants to merge 7 commits into
antalya-26.1from
mkmkme/antalya-26.1/iceberg-fix-prewhere

Conversation

@mkmkme

@mkmkme mkmkme commented Mar 31, 2026

Copy link
Copy Markdown
Collaborator

Changelog category (leave one):

  • Not for changelog (changelog entry is not required)

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

...

Documentation entry for user-facing changes

...

CI/CD Options

Exclude tests:

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

Regression jobs to run:

  • Fast suites (mostly <1h)
  • Aggregate Functions (2h)
  • Alter (1.5h)
  • Benchmark (30m)
  • ClickHouse Keeper (1h)
  • Iceberg (2h)
  • LDAP (1h)
  • Parquet (1.5h)
  • RBAC (1.5h)
  • SSL Server (1h)
  • S3 (2h)
  • S3 Export (2h)
  • Swarms (30m)
  • Tiered Storage (2h)

@github-actions

github-actions Bot commented Mar 31, 2026 •

Copy link
Copy Markdown

Workflow [PR], commit [b7696a3]

alexey-milovidov and others added 7 commits March 31, 2026 22:58
…ere-external-columns

Fix exception in Parquet PREWHERE when column is not in file
…o-assertion

Fix exception in `updateFormatPrewhereInfo` when only row-level filter is set
…bled

The Iceberg read optimization (`allow_experimental_iceberg_read_optimization`)
identifies constant columns from Iceberg metadata and removes them from the
read request. When all requested columns become constant, it sets
`need_only_count = true`, which tells the Parquet reader to skip all
initialization — including `preparePrewhere` — and just return the raw row
count from file metadata.

This completely bypasses `row_level_filter` (row policies) and `prewhere_info`,
returning unfiltered row counts. The InterpreterSelectQuery relies on the
storage to apply these filters when `supportsPrewhere` is true and does not
add a fallback FilterStep to the query plan, so the filter is silently lost.

The fix prevents `need_only_count` from being set when an active
`row_level_filter` or `prewhere_info` exists in the format filter info.

Fixes #1595
…t NULLs

The Altinity-specific constant column optimization
(`allow_experimental_iceberg_read_optimization`) scans `requested_columns`
for nullable columns absent from the Iceberg file metadata and replaces
them with constant NULLs. However, `requested_columns` can also contain
columns produced by `prewhere_info` or `row_level_filter` expressions
(e.g. `equals(boolean_col, false)`). These computed columns are not in
the file metadata, and their result type is often `Nullable(UInt8)`, so
the optimization incorrectly treats them as missing file columns and
replaces them with NULLs.

This corrupts the prewhere pipeline: the Parquet reader evaluates the
filter expression correctly, but the constant column optimization then
overwrites the result with NULLs. With `need_filter = false` (old planner,
PREWHERE + WHERE), all rows appear to fail the filter, producing empty
output. With `need_filter = true`, the filter column is NULL so all rows
are filtered out.

The fix skips columns that match the `prewhere_info` or `row_level_filter`
column names, since these are computed at read time and never stored in
the file.
@mkmkme
mkmkme force-pushed the mkmkme/antalya-26.1/iceberg-fix-prewhere branch from 341e1ff to b7696a3 Compare March 31, 2026 21:10
@mkmkme mkmkme closed this Mar 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants