Skip to content

feat(pruning): expose IN-list rewrite size cap as a config option - #24074

Open
zhuqi-lucas wants to merge 4 commits into
apache:mainfrom
zhuqi-lucas:qizhu/config-pruning-in-list-rewrite-size
Open

feat(pruning): expose IN-list rewrite size cap as a config option#24074
zhuqi-lucas wants to merge 4 commits into
apache:mainfrom
zhuqi-lucas:qizhu/config-pruning-in-list-rewrite-size

Conversation

@zhuqi-lucas

@zhuqi-lucas zhuqi-lucas commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale

PruningPredicate rewrites col IN (v1..vn) into a chain of per-value min/max checks (via build_predicate_expression), but only when n <= MAX_LIST_VALUE_SIZE_REWRITE — currently a hardcoded 20. Beyond that, the IN branch falls through to unhandled_hook, which by default returns TRUE, so row-group and file-range statistics pruning does not fire at all for IN lists longer than 20.

This is problematic for query patterns that pass a batch of identifiers as col IN (...) — REST endpoints filtering by a page of ~25-100 values, ORM-generated WHERE id IN (25 items) queries, batched crawlers. On a table sorted by col, the reader is forced to materialize the filter column across every row group instead of skipping row groups whose stats disagree with the IN set.

Full context in #24059.

What changes are included in this PR?

  • New config option datafusion.execution.parquet.pruning_max_in_list_size: usize (default 20, preserving existing behaviour), placed next to max_predicate_cache_size on TableParquetOptions.global.
  • MAX_LIST_VALUE_SIZE_REWRITE promoted to pub const so callers can reference the historical default explicitly.
  • PredicateRewriter::with_max_in_list_size(usize) -> Self builder, mirroring the existing with_unhandled_hook.
  • PruningPredicate::try_new_with_max_in_list_size variant.
  • build_pruning_predicate_with_max_in_list_size variant of the public helper.
  • Value threaded through datasource-parquet: ParquetSource::pruning_max_in_list_size() reads from TableParquetOptions.global, propagates through ParquetMorselizerPreparedParquetOpenRowGroupPruner, then flows into build_pruning_predicates at the opener and build_pruning_predicate_with_max_in_list_size inside the dynamic row-group pruner.

Internal build_predicate_expression gains a new usize parameter (crate-private).

Backward compatibility

  • PruningPredicate::try_new and build_pruning_predicate are preserved as thin wrappers that pass the historical MAX_LIST_VALUE_SIZE_REWRITE default. All existing callers continue to work with unchanged behaviour.
  • The config option default is 20, so behaviour is unchanged unless the option is set explicitly.

Are these changes tested?

Two new unit tests in datafusion-pruning:

  • row_group_predicate_in_list_rewritten_at_raised_cap: PredicateRewriter::with_max_in_list_size(32) rewrites a 25-item IN into per-value min/max checks OR'd together, instead of falling through to true.
  • row_group_predicate_in_list_disabled_at_zero_cap: cap = 0 skips the IN rewrite even for small lists (opt-out path).

The existing row_group_predicate_in_list_to_many_values continues to pass, guarding the default-20 behaviour.

Are there any user-facing changes?

Yes — one new config option (datafusion.execution.parquet.pruning_max_in_list_size, default 20). Users who want row-group / file-range pruning for IN lists longer than 20 items can raise it (e.g., SET datafusion.execution.parquet.pruning_max_in_list_size = 128).

New public API on datafusion-pruning:

  • MAX_LIST_VALUE_SIZE_REWRITE: usize (re-exported)
  • PredicateRewriter::with_max_in_list_size(usize) -> Self
  • PruningPredicate::try_new_with_max_in_list_size(expr, schema, size)
  • build_pruning_predicate_with_max_in_list_size(predicate, schema, errors, size)

Issue: apache#24059

`PruningPredicate` rewrites `col IN (v1..vn)` into a chain of per-value
min/max checks (via `build_predicate_expression`), but only when `n` is
below a hardcoded `MAX_LIST_VALUE_SIZE_REWRITE = 20`. Beyond that, the
IN branch falls through to `unhandled_hook`, which by default returns
`TRUE` — so row-group / file-range statistics pruning does not fire at
all for IN lists longer than 20.

This is problematic for query patterns that pass a batch of identifiers
as `col IN (...)` (REST endpoints filtering by a page of ~25-100
values, ORM-generated `WHERE id IN (25 items)` queries, batched
crawlers). On a table sorted by `col`, the reader is forced to
materialize the filter column across every row group instead of
skipping row groups whose stats disagree with the IN set.

## Changes

- Add `datafusion.execution.parquet.pruning_max_in_list_size: usize`
  (default `20`, preserving existing behaviour) to `TableParquetOptions`
  next to `max_predicate_cache_size`.
- Add `PredicateRewriter::with_max_in_list_size(usize) -> Self` builder,
  mirroring the existing `with_unhandled_hook`.
- Add `PruningPredicate::try_new_with_max_in_list_size` variant.
- Add `build_pruning_predicate_with_max_in_list_size` variant of the
  public helper.
- Make `MAX_LIST_VALUE_SIZE_REWRITE` `pub const` so callers can
  reference the historical default explicitly.
- Wire the value through `datasource-parquet`:
  - `ParquetSource::pruning_max_in_list_size()` reads from
    `TableParquetOptions.global`.
  - `ParquetMorselizer` / `PreparedParquetOpen` / `RowGroupPruner` carry
    the value alongside `max_predicate_cache_size`.
  - `build_pruning_predicates` (opener) accepts the size and forwards to
    `build_pruning_predicate_with_max_in_list_size`.

## Backward compatibility

- Public `PruningPredicate::try_new` and `build_pruning_predicate` are
  preserved as thin wrappers passing the historical default.
- Internal `build_predicate_expression` takes a new `usize` parameter
  (crate-private).
- Default value of the config option is `20`, so behaviour is unchanged
  unless the option is set explicitly.

## Tests

- `row_group_predicate_in_list_rewritten_at_raised_cap`:
  `PredicateRewriter::with_max_in_list_size(32)` rewrites a 25-item IN
  into per-value min/max checks instead of falling through to `true`.
- `row_group_predicate_in_list_disabled_at_zero_cap`: cap = 0 skips the
  IN rewrite even for small lists (opt-out path).
- Existing `row_group_predicate_in_list_to_many_values` continues to
  pass, guarding the default-20 behaviour.
Copilot AI lite review requested due to automatic review settings August 4, 2026 03:59
@github-actions github-actions Bot added common Related to common crate datasource Changes to the datasource crate labels Aug 4, 2026

Copilot AI left a comment

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.

Pull request overview

This PR makes the IN (...)-list rewrite cap used by PruningPredicate configurable (instead of a hardcoded 20), and plumbs that setting through the parquet datasource so row-group / file-range stats pruning can remain effective for larger IN lists when users opt in.

Changes:

  • Add datafusion.execution.parquet.pruning_max_in_list_size (default 20) to parquet execution config and thread it through ParquetSource → opener/morselizer → row-group pruner.
  • Expose the historical default as pub const MAX_LIST_VALUE_SIZE_REWRITE and add API variants/builders to pass an explicit cap (with_max_in_list_size, try_new_with_max_in_list_size, build_pruning_predicate_with_max_in_list_size).
  • Add unit tests covering raised-cap rewrite behavior and cap=0 opt-out behavior.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
datafusion/pruning/src/pruning_predicate.rs Adds configurable IN-list rewrite cap to predicate rewriting/pruning APIs and tests it.
datafusion/pruning/src/lib.rs Re-exports the new const and helper function as part of the public pruning API.
datafusion/datasource-parquet/src/source.rs Reads the new config from TableParquetOptions.global and propagates it into pruning predicate construction.
datafusion/datasource-parquet/src/push_decoder.rs Stores and applies the cap when (re)building pruning predicates in RowGroupPruner.
datafusion/datasource-parquet/src/opener/mod.rs Threads the cap through ParquetMorselizer/PreparedParquetOpen and uses the new helper to build pruning predicates.
datafusion/common/src/file_options/parquet_writer.rs Updates writer options destructuring to account for the newly added parquet option field.
datafusion/common/src/config.rs Introduces the pruning_max_in_list_size parquet execution config option with documentation.
Suppressed comments (3)

datafusion/pruning/src/pruning_predicate.rs:493

  • Docs reference datafusion.execution.pruning_max_in_list_size, but the actual config option is datafusion.execution.parquet.pruning_max_in_list_size. Update this reference so callers can find the right setting.
    /// Same as [`PruningPredicate::try_new`] but with an explicit cap on the
    /// size of `IN (...)` lists rewritten into per-value statistics checks.
    /// Query engines typically pass
    /// `datafusion.execution.pruning_max_in_list_size` here.

datafusion/pruning/src/pruning_predicate.rs:1404

  • This doc comment points to datafusion.execution.pruning_max_in_list_size, but the new option is namespaced under parquet (datafusion.execution.parquet.pruning_max_in_list_size). Fixing the key avoids confusion for users trying to set the default cap explicitly.
/// Default maximum number of entries in an `IN (...)` list that will be
/// rewritten into a chain of per-value min/max checks by
/// [`build_predicate_expression`]. Callers threading a [`PredicateRewriter`]
/// can override this via [`PredicateRewriter::with_max_in_list_size`], and
/// query engines can wire it from the
/// `datafusion.execution.pruning_max_in_list_size` config option.
pub const MAX_LIST_VALUE_SIZE_REWRITE: usize = 20;

datafusion/pruning/src/pruning_predicate.rs:1445

  • This builder method's docs reference datafusion.execution.pruning_max_in_list_size, but the config key is datafusion.execution.parquet.pruning_max_in_list_size. Update the docs to match the actual option name.
    /// The default (see [`MAX_LIST_VALUE_SIZE_REWRITE`]) preserves the
    /// historical behaviour. Callers wiring config through can override via
    /// `datafusion.execution.pruning_max_in_list_size`.
    pub fn with_max_in_list_size(mut self, max_in_list_size: usize) -> Self {

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +399 to +402
/// Same as [`build_pruning_predicate`] but with an explicit cap on the size
/// of `IN (...)` lists rewritten into per-value statistics checks. Query
/// engines typically pass `datafusion.execution.pruning_max_in_list_size`
/// here.
Comment thread datafusion/datasource-parquet/src/opener/mod.rs
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

Thank you for opening this pull request!

Reviewer note: cargo-semver-checks reported the current version number is not SemVer-compatible with the changes in this pull request (compared against the base branch).

Details
     Cloning apache/main
    Building datafusion-common v54.1.0 (current)
       Built [  36.755s] (current)
     Parsing datafusion-common v54.1.0 (current)
      Parsed [   0.061s] (current)
    Building datafusion-common v54.1.0 (baseline)
       Built [  37.327s] (baseline)
     Parsing datafusion-common v54.1.0 (baseline)
      Parsed [   0.065s] (baseline)
    Checking datafusion-common v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.657s] 223 checks: 222 pass, 1 fail, 0 warn, 30 skip

--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.49.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/common/src/config.rs:1103

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  76.134s] datafusion-common
    Building datafusion-datasource-parquet v54.1.0 (current)
       Built [  49.077s] (current)
     Parsing datafusion-datasource-parquet v54.1.0 (current)
      Parsed [   0.031s] (current)
    Building datafusion-datasource-parquet v54.1.0 (baseline)
       Built [  48.227s] (baseline)
     Parsing datafusion-datasource-parquet v54.1.0 (baseline)
      Parsed [   0.033s] (baseline)
    Checking datafusion-datasource-parquet v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.145s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [  99.055s] datafusion-datasource-parquet
    Building datafusion-proto v54.1.0 (current)
       Built [  64.404s] (current)
     Parsing datafusion-proto v54.1.0 (current)
      Parsed [   0.018s] (current)
    Building datafusion-proto v54.1.0 (baseline)
       Built [  65.019s] (baseline)
     Parsing datafusion-proto v54.1.0 (baseline)
      Parsed [   0.019s] (baseline)
    Checking datafusion-proto v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.248s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [ 131.031s] datafusion-proto
    Building datafusion-proto-common v54.1.0 (current)
       Built [  23.589s] (current)
     Parsing datafusion-proto-common v54.1.0 (current)
      Parsed [   0.048s] (current)
    Building datafusion-proto-common v54.1.0 (baseline)
       Built [  24.160s] (baseline)
     Parsing datafusion-proto-common v54.1.0 (baseline)
      Parsed [   0.051s] (baseline)
    Checking datafusion-proto-common v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   1.130s] 223 checks: 222 pass, 1 fail, 0 warn, 30 skip

--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.49.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:866
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:866
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/proto-common/src/generated/prost.rs:866

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  50.217s] datafusion-proto-common
    Building datafusion-proto-models v54.1.0 (current)
       Built [  27.656s] (current)
     Parsing datafusion-proto-models v54.1.0 (current)
      Parsed [   0.135s] (current)
    Building datafusion-proto-models v54.1.0 (baseline)
       Built [  27.877s] (baseline)
     Parsing datafusion-proto-models v54.1.0 (baseline)
      Parsed [   0.138s] (baseline)
    Checking datafusion-proto-models v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   1.516s] 223 checks: 222 pass, 1 fail, 0 warn, 30 skip

--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.49.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:866
  field ParquetOptions.pruning_max_in_list_size in /home/runner/work/datafusion/datafusion/datafusion/proto-models/src/generated/datafusion_proto_common.rs:866

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  58.731s] datafusion-proto-models
    Building datafusion-pruning v54.1.0 (current)
       Built [  43.219s] (current)
     Parsing datafusion-pruning v54.1.0 (current)
      Parsed [   0.012s] (current)
    Building datafusion-pruning v54.1.0 (baseline)
       Built [  43.023s] (baseline)
     Parsing datafusion-pruning v54.1.0 (baseline)
      Parsed [   0.012s] (baseline)
    Checking datafusion-pruning v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.077s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [  87.422s] datafusion-pruning
    Building datafusion-sqllogictest v54.1.0 (current)
       Built [ 207.550s] (current)
     Parsing datafusion-sqllogictest v54.1.0 (current)
      Parsed [   0.021s] (current)
    Building datafusion-sqllogictest v54.1.0 (baseline)
       Built [ 200.100s] (baseline)
     Parsing datafusion-sqllogictest v54.1.0 (baseline)
      Parsed [   0.022s] (baseline)
    Checking datafusion-sqllogictest v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.089s] 223 checks: 223 pass, 30 skip
     Summary no semver update required
    Finished [ 411.681s] datafusion-sqllogictest

@github-actions github-actions Bot added auto detected api change Auto detected API change proto Related to proto crate labels Aug 4, 2026
The new ParquetOptions::pruning_max_in_list_size field was not carried
through the proto layer, so every explicit ParquetOptions initializer in
datafusion-proto-common and datafusion-proto failed to compile (E0063),
which also cascaded into the MSRV job.

- Add uint64 pruning_max_in_list_size = 38 to the ParquetOptions proto
  message and regenerate proto-common (prost.rs, pbjson.rs) and
  proto-models (datafusion_proto_common.rs).
- Map the field in proto-common from_proto/to_proto and in the proto
  crate's file_formats TryFromProto/IntoProto for TableParquetOptions.
- Reorder the datafusion_pruning import (cargo fmt) and drop the now
  unused build_pruning_predicate import.
@zhuqi-lucas
zhuqi-lucas force-pushed the qizhu/config-pruning-in-list-rewrite-size branch from 038b3ee to 5f4cfa1 Compare August 4, 2026 06:32
- cargo doc: the public MAX_LIST_VALUE_SIZE_REWRITE doc linked the private
  build_predicate_expression via an intra-doc link; demote it to a code span
  and correct the config path to datafusion.execution.parquet.pruning_max_in_list_size.
- Regenerate configs.md for the new pruning_max_in_list_size option.
- Add the two pruning_max_in_list_size rows to information_schema.slt (SHOW ALL
  and the df_settings description listing).
@github-actions github-actions Bot added documentation Improvements or additions to documentation sqllogictest SQL Logic Tests (.slt) labels Aug 4, 2026
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.59649% with 13 lines in your changes missing coverage. Please review.
✅ Project coverage is 80.89%. Comparing base (f248f45) to head (4ad8d50).
⚠️ Report is 4 commits behind head on main.

Files with missing lines Patch % Lines
datafusion/proto-common/src/generated/pbjson.rs 0.00% 13 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #24074    +/-   ##
========================================
  Coverage   80.88%   80.89%            
========================================
  Files        1102     1102            
  Lines      375892   376195   +303     
  Branches   375892   376195   +303     
========================================
+ Hits       304047   304314   +267     
- Misses      53740    53771    +31     
- Partials    18105    18110     +5     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alamb alamb left a comment

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 good @zhuqi-lucas . I had some suggestions on API design and naming, but the overall idea makes a lot of sense

enable_row_group_stats_pruning: false,
coerce_int96: None,
max_predicate_cache_size: None,
pruning_max_in_list_size: MAX_LIST_VALUE_SIZE_REWRITE,

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.

it is strange to me that these names are not the same -- I would expect something like

 pruning_max_in_list_size: PRUNING_MAX_IN_LIST_SIZE,

predicate,
file_schema,
predicate_creation_errors,
MAX_LIST_VALUE_SIZE_REWRITE,

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.

Why not just add the parameter to build_pruning_predicate ?

If we are going to introduce a new API, perhaps we can make one that is more future proof, like a builder

let pruning_predicate = PruningPredicaateBuilder::new()
  .with_file_schema(file_schema)
  .with_error_counter(predicate_creation_errors)
  .build(predicate)?;

That way if we add new parameters we have a place to put them

/// before calling this method to make sure the expressions can be used for pruning.
pub fn try_new(mut expr: Arc<dyn PhysicalExpr>, schema: SchemaRef) -> Result<Self> {
pub fn try_new(expr: Arc<dyn PhysicalExpr>, schema: SchemaRef) -> Result<Self> {
Self::try_new_with_max_in_list_size(expr, schema, MAX_LIST_VALUE_SIZE_REWRITE)

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.

Same comment above related to simplifying this API via a builder rather than more methods

Comment on lines +1192 to +1205
/// Maximum number of values in an `IN (...)` list for which the
/// pruning predicate will rewrite the list into a chain of per-value
/// statistics checks. Lists longer than this fall back to the
/// unhandled-predicate hook (defaulting to "keep the container"),
/// which effectively skips container-level pruning for large IN
/// lists.
///
/// Higher values keep row-group / file-range statistics pruning
/// effective for larger IN lists (for example, REST endpoints that
/// filter by a batch of ~25-100 identifiers), at the cost of a
/// larger rewritten predicate expression evaluated for every
/// container. Set to 0 to disable the rewrite path entirely.
///
/// The default of 20 preserves the previous hardcoded behaviour.

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.

I think we could rewrite this to focus more on the end user visible effects to make it clearer what was going on

Suggested change
/// Maximum number of values in an `IN (...)` list for which the
/// pruning predicate will rewrite the list into a chain of per-value
/// statistics checks. Lists longer than this fall back to the
/// unhandled-predicate hook (defaulting to "keep the container"),
/// which effectively skips container-level pruning for large IN
/// lists.
///
/// Higher values keep row-group / file-range statistics pruning
/// effective for larger IN lists (for example, REST endpoints that
/// filter by a batch of ~25-100 identifiers), at the cost of a
/// larger rewritten predicate expression evaluated for every
/// container. Set to 0 to disable the rewrite path entirely.
///
/// The default of 20 preserves the previous hardcoded behaviour.
/// Maximum number of values in an `IN (...)` list for which pruning will
/// occur. Longer lists will not be used to prune files, row groups, or
/// data pages.
///
/// Higher values help in cases such as a list of
/// of ~25-100 identifiers, but also makes the predicate
/// more expensive to evaluate. Set to 0 to disable the IN (..) list pruning entirely
///
/// Defaults to 20.

/// container. Set to 0 to disable the rewrite path entirely.
///
/// The default of 20 preserves the previous hardcoded behaviour.
pub pruning_max_in_list_size: usize, default = 20

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.

Also I suggest changing this to be something more conisstent with the others names like max_predicate_cache_size

Perhaps something likemax_in_list_size or max_in_list_pruning_size

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

Labels

auto detected api change Auto detected API change common Related to common crate datasource Changes to the datasource crate documentation Improvements or additions to documentation proto Related to proto crate sqllogictest SQL Logic Tests (.slt)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expose PruningPredicate's IN-list rewrite size limit as a config option

4 participants