Skip to content

Read Parquet bloom filters in one request when a file has many row groups - #2588

Open
ianton-ru wants to merge 24 commits into
antalya-26.8from
feature/antalya-26.8/parquet-bloom-filter-coalesce
Open

ianton-ru wants to merge 24 commits into
antalya-26.8from
feature/antalya-26.8/parquet-bloom-filter-coalesce

Conversation

@ianton-ru

@ianton-ru ianton-ru commented Oct 16, 2026 •

Copy link
Copy Markdown

Separate GETs for each filter dominate cold reads from object storage. input_format_parquet_bloom_filter_coalesce_max_bytes merges contiguous filters, and reads a small file once when that is cheaper.

Changelog category (leave one):

  • Performance Improvement

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

Read Parquet bloom filters in one request when a file has many row groups

Documentation entry for user-facing changes

ClickHouse can build Bloom-filter for Iceberg tables for queries with 'WHERE' condition not on key columns. For this ClickHouse reads metainfo for each row group from source files. In initial implementation it use single read operation for each row group, which is converted to separate GET request when data files are on object storage like S3. For large table it can produce thousands of requests. In customer test first request takes near 500 seconds, while second (when data are in local cache) less than 4 seconds.
This PR introduced reading metainfo for multiple row groups in single request, when possible. It can increase total traffic, but decrease number of requests, which can reduce time for query execution.

Benchmark

Script: https://gist.github.com/ianton-ru/50851f884c9df12d600ac0064aae43c7
Emulated latency in 0.5 seconds for one GET request.
Result on my comuter:

small filters (~2 KiB): seek is enough
mode    gets    ms
separate        43      21988
seek    4       2047
coalesce        2       1096

large filters (~16 KiB): seek is not enough
mode    gets    ms
separate        41      20124
seek    40      20621
coalesce        3       1562

separate: coalescing off, remote_read_min_bytes_for_seek = 1. Each filter is its own GET.
seek: coalescing off, seek = 8 KiB. A filter shorter than 8 KiB is merged into a neighbor. A longer filter stays its own GET.
coalesce: coalescing on (64 MiB), same seek of 8 KiB. Back-to-back filters share one GET even when each filter is longer than the seek.

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)

ianton-ru and others added 8 commits October 16, 2026 15:36
…oups.

Separate GETs for each filter dominate cold reads from object storage. `input_format_parquet_bloom_filter_coalesce_max_bytes` merges contiguous filters, and reads a small file once when that is cheaper.

Co-authored-by: Cursor <cursoragent@cursor.com>
… buffer.

The bloom-filter header that starts the read is reset as soon as it is parsed, so charging that handle let the scheduler treat a live buffer as free.

Related: #2526
Co-authored-by: Cursor <cursoragent@cursor.com>
That field is optional. Filters that only store an offset were left out of coalescing, even though their length is already derived later.

Related: #2526
Co-authored-by: Cursor <cursoragent@cursor.com>
…or a whole-file read.

Co-authored-by: Cursor <cursoragent@cursor.com>
…compatibility` values restore separate reads.

Co-authored-by: Cursor <cursoragent@cursor.com>
…is below `bytes_per_read_task`.

Co-authored-by: Cursor <cursoragent@cursor.com>
…and the filters after it stay inside `input_format_parquet_bloom_filter_coalesce_max_bytes`.

Co-authored-by: Cursor <cursoragent@cursor.com>
….6 so older `compatibility` values restore separate reads, and count only the bloom ranges `Reader` registers.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@ianton-ru ianton-ru added antalya antalya-26.8 Session label (releasy session config) labels Oct 16, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-10T17:32:32.081203Z 19f1ace Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Workflow [PR], commit [d99830a]

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 356269bf74

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

| `input_format_parquet_filter_push_down` | When reading Parquet files, skip whole row groups based on the WHERE/PREWHERE expressions and min/max statistics in the Parquet metadata. | `1` |
| `input_format_parquet_bloom_filter_push_down` | When reading Parquet files, skip whole row groups based on the WHERE expressions and bloom filter in the Parquet metadata. | `0` |
| `input_format_parquet_dictionary_filter_push_down` | When reading Parquet files (with reader v3), skip whole row groups based on the WHERE/PREWHERE expressions and the dictionary page contents, for equality and `IN` conditions, when all data pages of a column chunk are dictionary-encoded. The value is the maximum dictionary page size (in bytes) for which this optimization is applied; set to `0` to disable. Takes precedence over the bloom filter when both are available. | `1048576` |
| `input_format_parquet_bloom_filter_coalesce_max_bytes` | Max bytes of one read when loading Parquet bloom filters. Contiguous filters are read together. A file not larger than this, with many filters, is read once. 0 keeps one read per bloom filter. | `67108864` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Remove the direct edit to generated Parquet documentation

This line is inside the page's AUTOGENERATED_START/AUTOGENERATED_END region, so editing it in this feature commit will fail the documentation check unless the PR is the dedicated autogeneration change. Keep the corresponding source-registration update in ParquetV3BlockInputFormat.cpp and let the documentation workflow regenerate this file.

AGENTS.md reference: docs/reference/AGENTS.md:L1-L3

Useful? React with 👍 / 👎.

const size_t prospective_start = std::min(start_offset, r.start);
const size_t prospective_end = std::max(end_offset, r.end);
const bool end_past_cap = same_group && prospective_end - prospective_start > span_limit;
if ((initial_req->coalesce_group != 0 && !same_group) ||

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Isolate coalescing groups from ungrouped starter requests

When an ungrouped request starts first, this condition does not stop it from absorbing an adjacent grouped bloom-filter header because it checks only whether initial_req belongs to a group. This is reachable when a row group without an applicable bloom filter advances to index or data prefetching while another row group's bloom-header work remains queued; the bloom read then follows ordinary bytes_per_read_task rules and can exceed input_format_parquet_bloom_filter_coalesce_max_bytes (especially when configured below 4 MiB). Treat a group mismatch as a boundary whenever either request has a nonzero group, symmetrically in both scan directions.

Useful? React with 👍 / 👎.

ianton-ru and others added 2 commits October 21, 2026 12:41
…_bloom_filter_coalesce_max_bytes` row stays in the `Documentation` source.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ichever range starts the coalescing scan.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 24138136ea

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

const bool group_boundary = initial_req->coalesce_group != r.request->coalesce_group
&& (initial_req->coalesce_group != 0 || r.request->coalesce_group != 0);
if (group_boundary ||
r.end + gap_limit <= start_offset || // short gap

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve coalescing when the seek threshold is zero

When remote_read_min_bytes_for_seek=0 (or the corresponding local-file setting is zero), gap_limit is zero and this <= check stops at two exactly adjacent ranges because r.end == start_offset; the symmetric right-hand scan has the same behavior. ClickHouse writes bloom filters back-to-back in flushBloomFilters, so this valid configuration still issues one request per filter despite the new coalescing setting. Treat zero-byte gaps as contiguous independently of the ordinary seek threshold.

Useful? React with 👍 / 👎.

ianton-ru and others added 3 commits October 21, 2026 13:27
…or_seek` is 0.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ip a filter for a row group that produces no rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

…er row group.

https: //altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2588&sha=6e16e1d87e4b679d422fd7bd4b4f35df4e0bd4be&name_0=PR&name_1=Stateless%20tests%20%28amd_asan_ubsan%2C%20distributed%20plan%2C%20parallel%2C%20selected%20tests%29
https: //github.com//pull/2588
Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

Failed to set up container
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ac5724ff5d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

/// `end_past_cap` is the same-group cap. This addition wraps when the cap is `UInt64` max.
(!same_group && r.start + span_limit <= initial_offset) || // task not too big
end_past_cap ||
(!same_group && !r.request->allow_incidental_read.load(std::memory_order_relaxed))) // range wants to be coalesced

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve lazy bloom fallback for dictionary-filtered chunks

When a column chunk is eligible for dictionary filtering and also has a bloom filter, starting its header now absorbs the overlapping full bloom-filter body because same-group ranges bypass allow_incidental_read. This defeats the contract in Reader::initializePrefetches that only the small header is read unless dictionary pruning cannot be used: even when the exact dictionary filter succeeds, the query has already downloaded and pinned potentially every bloom body, causing substantial unnecessary object-storage traffic across many files. Keep fallback bloom bodies out of header-triggered coalescing until the fallback is actually selected.

Useful? React with 👍 / 👎.

ianton-ru and others added 2 commits October 22, 2026 13:32
…r read.

The header and the body were in one coalesce group, so the header read downloaded the body before the dictionary filter was tried.

Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru
ianton-ru marked this pull request as ready for review October 22, 2026 11:50
…iffers from `remote_read_min_bytes_for_seek`.

The seek threshold can merge small adjacent filters, but it also applies to other Parquet ranges and has no bloom-only cap.

Co-authored-by: Cursor <cursoragent@cursor.com>
@alsugiliazova alsugiliazova mentioned this pull request Oct 23, 2026
10 of 30 tasks
@ianton-ru ianton-ru added the port-antalya PRs to be ported to all new Antalya releases label Oct 26, 2026
@ianton-ru ianton-ru changed the title Read Parquet bloom filters in one request when a file has many row groups- #2526 Read Parquet bloom filters in one request when a file has many row groups Oct 27, 2026
@Selfeer

Selfeer commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

Defects in #2588

Head b493a5e420939a717b24075970abf5c74bf1f9b7.

Medium

A plain column's bloom read still downloads the previous column's dictionary-fallback bloom body.

The fallback body is registered in coalesce group 0 so its own header will not pull it in. The header stays in group 1. Filters are written back-to-back, and the header is only the first few hundred bytes of the body. When the next column is not dictionary-encoded, the left scan starts at that column's header, includes its own body, then steps onto the previous column's short header because the gap (body length - header length) is smaller than min_bytes_for_seek (4 MiB on remote reads, 8 KiB on local files). Accepting that header moves the task start to the beginning of the previous filter. The scan then stops on the group-0 body, but the byte range already covers it. The body request is not attached to the task, so a later fallback reads those bytes again. A dictionary filter that succeeds still pays for them.

tests/queries/0_stateless/05386_parquet_bloom_filter_dictionary_fallback.sh uses one dictionary column, so every body is group 0 and this path does not run.

src/Processors/Formats/Impl/Parquet/Reader.cpp, lines 1171–1180:

const uint8_t bloom_data_group = column.use_dictionary_filter ? uint8_t{0} : bloom_group;
column.bloom_filter_data_prefetch = prefetcher.registerRange(
    size_t(column.meta->meta_data.bloom_filter_offset),
    len, /*likely_to_be_used=*/ false, bloom_data_group);
}
column.use_bloom_filter = true;
column.bloom_filter_header_prefetch = prefetcher.registerRange(
    size_t(column.meta->meta_data.bloom_filter_offset),
    max_header_length, /*likely_to_be_used=*/ true, bloom_group);

src/Processors/Formats/Impl/Parquet/Prefetcher.cpp, lines 363–373:

const bool group_boundary = initial_req->coalesce_group != r.request->coalesce_group
    && (initial_req->coalesce_group != 0 || r.request->coalesce_group != 0);
const bool positive_gap = same_group ? r.end < start_offset : true;
if (group_boundary ||
    (positive_gap && r.end + gap_limit <= start_offset) ||
    (!same_group && r.start + span_limit <= initial_offset) ||
    end_past_cap ||
    (!same_group && !r.request->allow_incidental_read.load(std::memory_order_relaxed)))
    break;

For dictionary column A then plain column B, both of length L under the seek threshold, the scan from B's header does this:

  1. B's body is the same group and the same start, so the task becomes [B, B+L).
  2. A's header ends at H. H + min_bytes_for_seek <= B is false, so the header is included and the task start moves to A.
  3. A's body is group 0, so group_boundary stops the scan. The task is already [A, B+L).

Medium

The coalesced buffer is charged once on BloomFilterHeader and kept until every handle in that task is reset. That stage gets 5% of input_format_parquet_memory_high_watermark, divided by the number of files read in parallel. Defaults are 4 GiB and a 64 MiB cap: one file has about 200 MiB of budget and still schedules. Four files have about 50 MiB. A coalesced span above that budget fails the scheduler for every row group except first_incomplete_row_group. The charge drops only when a later row group runs and releases its handle, and that row group runs only after each earlier one has been fully delivered. The file is then read one row group at a time for the whole coalesced span.

src/Processors/Formats/Impl/Parquet/Prefetcher.cpp, lines 195–207:

if (req->coalesce_group != 0 || task->coalesce_memory_state.load(std::memory_order_acquire) == 1)
{
    if (req->coalesce_group != 0 && task->length > 0)
    {
        uint8_t expected = 0;
        if (task->coalesce_memory_state.compare_exchange_strong(expected, 2, std::memory_order_acq_rel))
        {
            task->coalesce_memory = MemoryUsageToken(task->length, diff);
            task->coalesce_memory_state.store(1, std::memory_order_release);
        }
    }
    memory_usage = 0;
}

src/Processors/Formats/Impl/Parquet/ReadManager.cpp, line 101:

set_fractions(ReadStage::BloomFilterHeader, 0.05, issuer_thread_fraction);

src/Processors/Formats/Impl/Parquet/ReadManager.cpp, lines 624–637:

auto is_privileged_task = [&](size_t row_group_idx)
{
    size_t i = first_incomplete_row_group.load();
    if (row_group_idx != i)
        return false;
    const RowGroup & row_group = reader.row_groups[row_group_idx];
    /// Before column data, read_ptr is not advanced yet. This row group still has to run: a coalesced
    /// prefetch is charged until every handle that pins it has finished, including handles of later
    /// row groups. Blocking this row group would leave that charge stuck.
    if (row_group.stage.load(std::memory_order_acquire) < ReadStage::ColumnData)
        return true;
    return row_group.read_ptr.load() == row_group.delivery_ptr.load();
};

Low

The setting is recorded as introduced in 26.8.6.20001.altinityantalya. This branch is v26.8.34.20001.altinityantalya, and 26.8.27.20001.altinityantalya is already in the history. compatibility restores the previous value only when it is older than the change. compatibility at 26.8.27 or 26.8.34 therefore leaves input_format_parquet_bloom_filter_coalesce_max_bytes at 64 MiB. Those versions did not have the setting. 26.8 and older still restore 0.

src/Core/SettingsChangesHistory.cpp, lines 44–47:

addSettingsChanges(settings_changes_history, "26.8.6.20001.altinityantalya",
{
    {"input_format_parquet_bloom_filter_coalesce_max_bytes", 0, 64 * 1024 * 1024, "Read contiguous Parquet bloom filters, or a small file that has many of them, in one request."},
});

ianton-ru and others added 4 commits November 10, 2026 14:37
…lback body.

A dictionary-encoded column keeps its bloom body as a fallback in coalesce group 0,
while its header stays in group 1. Both start at the same offset, and the body sorts first.
The coalescing scans could take the header of the next plain column, which pulled the
fallback body into the task even though no request was attached to it. The bytes were
downloaded and then discarded.

Both scans now refuse to cover such a body: the left scan stops before a header whose
body precedes it, and the right scan does not extend past an initial header whose body
is still ahead.

Test 05428 checks that a longer seek issues the same number of prefetcher reads as a
short one. Without this change the counts differ (6 and 5).

Related: #2588
Co-authored-by: Cursor <cursoragent@cursor.com>
…over the header budget.

The coalesced bloom buffer is charged once, on the `BloomFilterHeader` stage, and the charge
stays until every row group pinning that buffer has finished. A large coalesced read can exceed
that stage's budget, which is a share of `input_format_parquet_memory_high_watermark` split across
files. The scheduler then refused every row group except the first incomplete one, so the file was
read one row group at a time.

A row group whose bloom header is already covered by a charged buffer adds no memory. Such row groups
are now scheduled even when the budget is exceeded. A row group that would start a new read is still
held back.

Test 05429 compares task batches for one query under the default and a 4 MiB watermark.

Related: #2588
Co-authored-by: Cursor <cursoragent@cursor.com>
@ianton-ru

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 19f1aceff6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

`05428_parquet_bloom_filter_dictionary_neighbor` writes a Parquet file, and the fast test build has no Parquet reader, so the test failed with `Unknown format Parquet` before checking any read counts. Tag it `no-fasttest`, like the other Parquet bloom-filter tests.

CI report: https://altinity-build-artifacts.s3.amazonaws.com/json.html?PR=2588&sha=19f1aceff6bcc1a00e6ccbcc21c774bf7165ca82&name_0=PR&name_1=Fast%20test
PR: #2588

Co-authored-by: Cursor <cursoragent@cursor.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

antalya antalya-26.8 Session label (releasy session config) port-antalya PRs to be ported to all new Antalya releases

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants