Query condition cache for iceberg tables by scanhex12 · Pull Request #102115 · ClickHouse/ClickHouse · GitHub
Skip to content

Query condition cache for iceberg tables#102115

Merged
scanhex12 merged 19 commits into
ClickHouse:masterfrom
scanhex12:iceberg_qcc
May 7, 2026
Merged

Query condition cache for iceberg tables#102115
scanhex12 merged 19 commits into
ClickHouse:masterfrom
scanhex12:iceberg_qcc

Conversation

@scanhex12

@scanhex12 scanhex12 commented Apr 8, 2026

Copy link
Copy Markdown
Member

Changelog category (leave one):

  • New Feature

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

Query condition cache for iceberg tables

Documentation entry for user-facing changes

  • Documentation is written (mandatory for new features)

Version info

  • Merged into: 26.5.1.367

@scanhex12 scanhex12 marked this pull request as draft April 8, 2026 17:43
@scanhex12 scanhex12 changed the title Query condition cache for iceberg tables [WIP] Query condition cache for iceberg tables Apr 8, 2026
@scanhex12

Copy link
Copy Markdown
Member Author

@clickhouse-gh

clickhouse-gh Bot commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

Workflow [PR], commit [e80e78d]

Summary:

job_name test_name status info comment
Finish Workflow FAIL
python3 ./ci/jobs/scripts/workflow_hooks/feature_docs.py FAIL

AI Review

Summary

This PR adds query-condition-cache integration for Iceberg/object-storage reads by propagating table identity (StorageID with UUID), adding condition hashing in FormatFilterInfo, and wiring row-group pruning for Parquet. High-level verdict: ⚠️ Request changes due to two correctness/safety issues still present in cache keying and UUID parsing, plus PR metadata incompleteness.

PR Metadata
  • ⚠️ Changelog category (New Feature) is plausible for this change, but the documentation checkbox is still unchecked.
  • ⚠️ For a New Feature, either provide docs or explicitly justify why none are needed in the PR description.
Findings

❌ Blockers

  • [src/Storages/ObjectStorage/StorageObjectStorageSource.cpp:674, src/Storages/ObjectStorage/StorageObjectStorageSource.cpp:552] Query-condition-cache lookup/write uses object_info->getFileName() as object identity. Different objects with the same basename in different directories can alias and reuse incorrect row-group masks, causing wrong pruning decisions and potentially incorrect results.
    • Suggested fix: key cache entries by a unique object identity (object_info->getPath() or another full unique storage path), not basename.
  • [src/Databases/DataLake/DatabaseDataLake.cpp:670] parseFromString<UUID>(*catalog_uuid) is called without validation for external catalog metadata. A malformed catalog UUID causes an exception on table open path.
    • Suggested fix: use safe parsing (tryParse/guarded parse) and fall back to UUIDHelpers::Nil with a warning when metadata is invalid.

💡 Nits

  • [PR description] Documentation checkbox for New Feature remains unchecked.
Tests
  • ⚠️ Add a regression test with two files that have the same basename under different directories and distinct row-group matches, then verify cache hits do not cross-contaminate between them.
ClickHouse Rules
Item Status Notes
Deletion logging
Serialization versioning
Core-area scrutiny
No test removal
Experimental gate
No magic constants
Backward compatibility ⚠️ Invalid external table-uuid metadata now causes exception during table open
SettingsChangesHistory.cpp
PR metadata quality ⚠️ New Feature doc checkbox is unchecked
Safe rollout ⚠️ Cache key aliases between same basenames can cause unsafe rollout
Compilation time ⚠️ New heavy includes added to IObjectIterator.h increase transitive fan-out
No large/binary files
Final Verdict
  • Status: ⚠️ Request changes
  • Minimum required actions:
    1. Switch query-condition-cache object key from basename to unique full object identity.
    2. Make catalog UUID parsing tolerant to malformed external metadata (no hard failure on parse).
    3. Complete PR metadata for New Feature documentation requirement.

@clickhouse-gh clickhouse-gh Bot added the pr-feature Pull request with new product feature label Apr 8, 2026
format_filter_info->filter_actions_dag->dumpNames(),
unmatched_ranges,
unmatched_ranges.size(),
false

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.

getMatchedBuckets is called for every format when condition_hash is set, but the default implementation in IInputFormat throws NOT_IMPLEMENTED.

This means enabling use_query_condition_cache can throw on non-Parquet object-storage formats after EOF (getMatchedBuckets is not implemented for this format).

Please guard this path by format/capability (or make default behavior non-throwing) so unsupported formats keep working.

*format_filter_info->condition_hash,
format_filter_info->filter_actions_dag->dumpNames(),
unmatched_ranges,
unmatched_ranges.size(),

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.

QueryConditionCache::write expects marks_count to be the total number of marks/row-groups in the file, but here unmatched_ranges.size() is passed instead.

This can break correctness and memory safety. Concrete trace: if only row group 7 matches, then unmatched_ranges = [{7,8}] and unmatched_ranges.size() == 1; inside write, std::fill(entry->matching_marks.begin() + 7, ... + 8, false) is applied to a vector of size 1, which is out-of-bounds.

Please pass the full row-group count (and ensure ranges are in the expected coordinate space).

unmatched_ranges.push_back({UInt64(rg), UInt64(rg + 1)});
}
auto query_condition_cache = Context::getGlobalContextInstance()->getQueryConditionCache();
std::cerr << "write to cache " << storage_id.getNameForLogs() << ' ' << object_info->getFileName() << '\n';

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.

Looks like accidental debug output left in server path:

std::cerr << "write to cache " << ...

Please replace with LOG_TRACE/LOG_DEBUG (or remove). Writing directly to stderr bypasses ClickHouse logging controls and can pollute service logs.

@scanhex12

scanhex12 commented Apr 9, 2026

Copy link
Copy Markdown
Member Author

Now (I mean after fixes) is much better:

Mac :) 
Mac :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' and hits = 5 settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 1

Query id: d2767502-349b-4e50-bf3f-5113e89e5af3

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 322.735 sec. 

Mac :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' and hits = 5 settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 1

Query id: 709adee9-4aed-412c-baba-312cf45d4806

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 159.676 sec. 

Mac :) 
Mac :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' and hits = 5 settings use_query_condition_cache = false;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = false

Query id: 61700950-fd26-409d-9426-e739a3cb624e

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 325.656 sec. 



if (object_info->file_bucket_info)
{
auto filtered = object_info->file_bucket_info->filterByMatchingRowGroups(matching_row_groups);

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.

Using object_info->getFileName() as the cache key can cause false cache hits between different objects that share the same basename (e.g. .../part=1/data.parquet and .../part=2/data.parquet).

QueryConditionCache::read/write then mixes predicates for different files under the same storage_id.uuid, and matching_row_groups.empty() can skip an unrelated file entirely. That is a correctness issue (rows can be missed).

Please key by a path-unique identifier (for example object_info->getPathOrPathToArchiveIfArchive() or another stable full object path), and use the same key consistently in both read and write paths.

@scanhex12

scanhex12 commented Apr 9, 2026

Copy link
Copy Markdown
Member Author

Results on my dev machine


.eu-west-1.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE path = 'Main_Page'
SETTINGS use_query_condition_cache = 1

Query id: 420f2f22-5d0e-4ebe-a210-633b56dadbae

   ┌─sum(hits)─┐
1. │ 213832822 │ -- 213.83 million
   └───────────┘

1 row in set. Elapsed: 20.698 sec. Processed 27.87 thousand rows, 4.17 GB (1.35 thousand rows/s., 201.24 MB/s.)
Peak memory usage: 594.37 MiB.

.eu-west-1.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE path = 'Main_Page'
SETTINGS use_query_condition_cache = 1

Query id: 63558620-0c44-43a3-8cd7-9ac35b50902c

   ┌─sum(hits)─┐
1. │ 213832822 │ -- 213.83 million
   └───────────┘

1 row in set. Elapsed: 15.536 sec. Processed 27.87 thousand rows, 4.17 GB (1.79 thousand rows/s., 268.11 MB/s.)
Peak memory usage: 651.54 MiB.

.eu-west-1.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' settings use_query_condition_cache = 0;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE path = 'Main_Page'
SETTINGS use_query_condition_cache = 0

Query id: e2f5931f-c51a-42dd-951c-d60807b9a276

   ┌─sum(hits)─┐
1. │ 213832822 │ -- 213.83 million
   └───────────┘

1 row in set. Elapsed: 19.473 sec. Processed 27.87 thousand rows, 4.17 GB (1.43 thousand rows/s., 213.90 MB/s.)
Peak memory usage: 649.19 MiB.

.eu-west-1.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE path = 'Main_Page'
SETTINGS use_query_condition_cache = 1

Query id: e61b52b0-ee76-4dcc-a2c6-2fabb93e29ad

   ┌─sum(hits)─┐
1. │ 213832822 │ -- 213.83 million
   └───────────┘

1 row in set. Elapsed: 16.898 sec. Processed 27.87 thousand rows, 4.17 GB (1.65 thousand rows/s., 246.49 MB/s.)
Peak memory usage: 647.91 MiB.

.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' settings use_query_condition_cache = 0;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE path = 'Main_Page'
SETTINGS use_query_condition_cache = 0

Query id: 35792fa5-9a2c-4bdf-aa6d-a618e1a76226

   ┌─sum(hits)─┐
1. │ 213832822 │ -- 213.83 million
   └───────────┘

1 row in set. Elapsed: 18.229 sec. Processed 27.87 thousand rows, 4.17 GB (1.53 thousand rows/s., 228.51 MB/s.)
Peak memory usage: 639.19 MiB.

.eu-west-1.compute.internal :) ```

@scanhex12 scanhex12 changed the title [WIP] Query condition cache for iceberg tables Query condition cache for iceberg tables Apr 9, 2026
@scanhex12 scanhex12 marked this pull request as ready for review April 9, 2026 14:05
#include <Disks/DiskObjectStorage/ObjectStorages/IObjectStorage.h>
#include <Processors/ISimpleTransform.h>
#include <Storages/ObjectStorage/StorageObjectStorageConfiguration.h>
#include <Interpreters/Cache/QueryConditionCache.h>

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.

This header now pulls in QueryConditionCache and FormatFilterInfo types, but this file is included transitively in many object-storage and interpreter paths.

That increases recompilation fan-out and violates the compilation-time guideline for high-fan-out headers. Please forward-declare these types in the header (e.g. class QueryConditionCache; struct FormatFilterInfo;) and keep the heavy includes in IObjectIterator.cpp.

ObjectStoragePtr object_storage_,
const ContextPtr & context_);
const ContextPtr & context_,
const StorageID & storage_id_ = StorageID::createEmpty(),

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.

ObjectIteratorSplitByBuckets now accepts storage_id and format_filter_info specifically for query-condition-cache pruning, but both parameters default to empty values.

That makes this change easy to miss at call sites: StorageObjectStorageCluster::getTaskIteratorExtension still calls this ctor with only 4 args, so cache-aware pruning is silently disabled for cluster table-function reads when cluster_table_function_split_granularity='bucket'. Because createReader skips cache lookup when file_bucket_info is already set, those tasks never get pruned later either.

Please pass storage_id and a real FormatFilterInfo here (same as non-cluster object-storage reads), or remove defaults to force all call sites to wire these parameters explicitly.

@grantholly-clickhouse grantholly-clickhouse Apr 26, 2026

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.

This seems legitimate, but the downside doesn't seem risky. In the case where we have empty values, we just won't engage the cache, but it is not like we would be doing anything incorrect. Honestly, I think it is fine as-is

@alexey-milovidov

Copy link
Copy Markdown
Member

The Can't adjust last granule error in CI is a known issue. The fix is in #101641

@alexey-milovidov

Copy link
Copy Markdown
Member

The test_database_iceberg_nessie_catalog and test_database_iceberg_lakekeeper_catalog failures in this PR's CI are false positives caused by a bug in PR #100583 (merged to master on 2026-04-09 at 11:19 UTC). That PR broke the metadata file path resolution in getMetadataLocation for Iceberg catalog tests — it produced a doubled S3 key like table_path/warehouse-rest/table_path/metadata/... instead of table_path/metadata/..., causing MinIO to return 403.

The bug was reverted by PR #102247 (merged at ~14:48 UTC). All nessie/lakekeeper test failures between these two merges are unrelated to this PR.

@alexey-milovidov

Copy link
Copy Markdown
Member

The flaky check failure is fixed in #102148, let's update the branch.

Comment thread src/Storages/ObjectStorage/StorageObjectStorageSource.h
Comment thread src/Storages/ObjectStorage/StorageObjectStorageSource.cpp Outdated
Comment thread src/Storages/ObjectStorage/StorageObjectStorageSource.cpp Outdated


@pytest.mark.parametrize("storage_type", ["s3", "azure", "local"])
def test_query_condition_cache(started_cluster_iceberg_with_spark, storage_type):

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.

QueryConditionCache correctness here depends on object identity. Since this PR uses file-name-based cache keys in object-storage paths, please add a regression case that creates two files in different directories with the same basename (for example .../a/data.parquet and .../b/data.parquet) and validates that cache hits for one file do not affect the other.

Without this, we can miss key-collision regressions while still seeing green cache-hit counters.

@scanhex12

Copy link
Copy Markdown
Member Author
compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' AND hits = 5 settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 1

Query id: e8b9904e-ccd4-4e7e-86f6-6516f3e09eb0

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 17.293 sec. 

.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' AND hits = 5 settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 1

Query id: 2026a171-85b4-4e11-80e4-fedf76bc93f9

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 9.424 sec. 

compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' AND hits = 5 settings use_query_condition_cache = 0;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 0

Query id: aa729a8f-97e5-4acd-bd91-a2bd0877c067

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 17.252 sec. 
.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' AND hits = 5 settings use_query_condition_cache = 0;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 0

Query id: d9896285-bf78-478e-9aef-5f0fdecf3a1c

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 19.845 sec. 

.compute.internal :) select sum(hits) from wikistat_iceberg2 where path = 'Main_Page' AND hits = 5 settings use_query_condition_cache = 1;

SELECT sum(hits)
FROM wikistat_iceberg2
WHERE (path = 'Main_Page') AND (hits = 5)
SETTINGS use_query_condition_cache = 1

Query id: 08b550da-c5b4-45a0-8ae8-3fe5480cb3a0

   ┌─sum(hits)─┐
1. │      3905 │
   └───────────┘

1 row in set. Elapsed: 9.663 sec. 

@CheSema CheSema self-assigned this Apr 22, 2026
, prewhere_info(std::move(prewhere_info_))
, column_mapper(column_mapper_)
{
bool use_query_condition_cache = context_->getSettingsRef()[Setting::use_query_condition_cache];

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.

Changelog category is New Feature, but the PR template still has the documentation checkbox unchecked. This change is user-facing (use_query_condition_cache now affects Iceberg/object-storage reads), so please add docs or explicitly explain why no documentation update is needed.

@clickhouse-gh

clickhouse-gh Bot commented May 6, 2026

Copy link
Copy Markdown
Contributor

LLVM Coverage Report

Metric Baseline Current Δ
Lines 84.10% 84.10% +0.00%
Functions 91.10% 91.10% +0.00%
Branches 76.60% 76.60% +0.00%

Changed lines: 61.25% (147/240) | lost baseline coverage: 8 line(s) · Uncovered code

Full report · Diff report

@grantholly-clickhouse grantholly-clickhouse added this pull request to the merge queue May 6, 2026
@scanhex12 scanhex12 removed this pull request from the merge queue due to a manual request May 6, 2026
@scanhex12 scanhex12 added this pull request to the merge queue May 7, 2026
Merged via the queue into ClickHouse:master with commit 69167ef May 7, 2026
323 of 326 checks passed
@scanhex12 scanhex12 deleted the iceberg_qcc branch May 7, 2026 02:39
@robot-clickhouse robot-clickhouse added the pr-synced-to-cloud The PR is synced to the cloud repo label May 7, 2026
@clickgapai

Copy link
Copy Markdown
Contributor

Hi @scanhex12 @grantholly-clickhouse — while reviewing this PR I found the following:

Happy to discuss — close anything that's wrong or already addressed.

@clickgapai

Copy link
Copy Markdown
Contributor

Update on the earlier review: CI on the proof PR #104278 confirmed the suspected bug via Integration tests (amd_tsan, 1/6). Filed as a separate Issue so it isn't lost when the proof PR closes:

(Automated follow-up. The proof PR has been closed; please track the bug on the Issue.)

@clickgapai

Copy link
Copy Markdown
Contributor

Correction — false-positive confirmation. My earlier comment at 11:01 UTC on this PR claimed the QCC bucket-poisoning bug was confirmed by CI on proof PR #104278. That was wrong — both the previous Issue #104288 (closed as not_planned) and this confirmation were the same false-positive shape: a Python ValueError: Mismatch in fields in the proof test's pyiceberg setup, mis-classified by the bot as a sanitizer-detected bug.

Two distinct bot bugs combined: (1) the proof test had a real schema mismatch (int32 schema vs int64 dataframe), and (2) when re-evaluating the reopened proof PR, the bot picked up the stale CI run's log instead of the latest run, locking in the same wrong classification.

Dropping this finding. The bug claim about cluster_table_function_split_granularity=BUCKET poisoning the QCC remains plausible but unverified — a maintainer can re-investigate with a working test if interested.

groeneai added a commit to groeneai/ClickHouse that referenced this pull request May 7, 2026
…terInfo

Bot review on PR ClickHouse#104225 surfaced that the `isQueryConditionCacheWritable`
predicate added in commits 0eb3d0e9 / 1860c81 / bfa2364 was wired into the
three `MergeTree` write paths but missed a fourth, very recently added one:
the object-storage QCC write in `StorageObjectStorageSource::generate`
(introduced by PR ClickHouse#102115 -- "Query condition cache for iceberg tables",
merged 2026-05-07). That site populates the cache from `Iceberg`/`S3`/`Azure`
queries when the format reader produces matched-bucket information, keyed by
`FormatFilterInfo::condition_hash` -- which until now was created based only on
`use_query_condition_cache`, with no writability check. So a query against an
object-storage table running with `allow_suspicious_low_cardinality_types = 1`
or any non-`Production` `allow_experimental_*` setting could still poison the
cache for a subsequent default-settings query, leaving issue ClickHouse#104203 only
partially closed for the engine as a whole.

Mirror the existing `MergeTreeReaderSettings::query_condition_cache_writable`
flag on `FormatFilterInfo`. Set it from the same predicate
(`Settings::isQueryConditionCacheWritable`) at the same site where
`condition_hash` is computed. Gate the `query_condition_cache->write` call in
`StorageObjectStorageSource::generate` on the new flag. Reads through
`condition_hash` stay open -- the lookup-side path remains valid because
entries written from "writable" contexts are correct, and the same context
that wrote nothing can still benefit from cache hits produced by ordinary
queries.

Coverage: extended `tests/integration/test_storage_iceberg_with_spark/test_query_condition_cache.py`
with `test_query_condition_cache_not_writable_with_relaxed_settings`,
parametrized across (`s3`, `azure`, `local`) and three triggering settings
(`allow_suspicious_low_cardinality_types`, `allow_experimental_funnel_functions`
[`Experimental` tier], `allow_experimental_database_iceberg` [`Beta` tier]).
The test asserts that `system.query_condition_cache` stays empty after a
filtered query in any of those contexts.

Stateless test `04208_query_condition_cache_writable_104203` continues to
exercise the `MergeTree` write paths and is unaffected.
@PedroTadim

Copy link
Copy Markdown
Member

il9ue pushed a commit to il9ue/ClickHouse that referenced this pull request May 20, 2026
…solution in next commit)

---
Original cherry-pick message follows:

Merge pull request ClickHouse#102115 from scanhex12/iceberg_qcc

Query condition cache for iceberg tables

# Conflicts:
#	src/Databases/DataLake/DatabaseDataLake.cpp
#	src/Processors/Formats/Impl/ParquetV3BlockInputFormat.cpp
#	src/Processors/Formats/Impl/ParquetV3BlockInputFormat.h
#	src/Storages/ObjectStorage/DataLakes/Iceberg/ManifestFileIterator.cpp
#	src/Storages/ObjectStorage/StorageObjectStorageSource.cpp
il9ue pushed a commit to il9ue/ClickHouse that referenced this pull request May 20, 2026
subkanthi pushed a commit to Altinity/ClickHouse that referenced this pull request May 26, 2026
…solution in next commit)

---
Original cherry-pick message follows:

Merge pull request ClickHouse#102115 from scanhex12/iceberg_qcc

Query condition cache for iceberg tables

# Conflicts:
#	src/Databases/DataLake/DatabaseDataLake.cpp
#	src/Processors/Formats/Impl/ParquetV3BlockInputFormat.cpp
#	src/Processors/Formats/Impl/ParquetV3BlockInputFormat.h
#	src/Storages/ObjectStorage/DataLakes/Iceberg/ManifestFileIterator.cpp
#	src/Storages/ObjectStorage/StorageObjectStorageSource.cpp
subkanthi pushed a commit to Altinity/ClickHouse that referenced this pull request May 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-feature Pull request with new product feature 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.

8 participants