Skip to content

feat: Support sorted_by for data_rewrite_files procedure#26804

Merged
hantangwangd merged 4 commits intoprestodb:masterfrom
hantangwangd:support_sort_order_for_rewrite
Jan 16, 2026
Merged

feat: Support sorted_by for data_rewrite_files procedure#26804
hantangwangd merged 4 commits intoprestodb:masterfrom
hantangwangd:support_sort_order_for_rewrite

Conversation

@hantangwangd
Copy link
Copy Markdown
Member

@hantangwangd hantangwangd commented Dec 14, 2025

Description

This PR support specifying sorted_by argument when calling rewrite_ data_files procedure. It use the same syntax that is used to specify the sorting property when creating a table:

CALL iceberg.system.rewrite_data_files('db', 'sample', 'partition_key = 1', ARRAY['join_date DESC NULLS FIRST', 'emp_id ASC NULLS LAST']);

CALL iceberg.system.rewrite_data_files(schema => 'db', table_name => 'sample', filter => 'partition_key = 1', sorted_by => ARRAY['join_date']);

It's especially useful when the table itself is not defined as a sorted table, or its sorting property is somewhat insufficient. This significantly optimizes scanning performance by allowing more irrelevant data files to be filtered out.

Motivation and Context

See issue #26824

Impact

Users can specify sort_by argument when calling rewrite_data_files procedure.

Test Plan

Newly added test cases to show rewriting data files with specified sort orders.

Contributor checklist

  • Please make sure your submission complies with our contributing guide, in particular code style and commit standards.
  • PR description addresses the issue accurately and concisely. If the change is non-trivial, a GitHub Issue is referenced.
  • Documented new properties (with its default value), SQL syntax, functions, or other functionality.
  • If release notes are required, they follow the release notes guidelines.
  • Adequate tests were added if applicable.
  • CI passed.
  • If adding new dependencies, verified they have an OpenSSF Scorecard score of 5.0 or higher (or obtained explicit TSC approval for lower scores).

Release Notes

== NO RELEASE NOTE ==

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai bot commented Dec 14, 2025

Reviewer's Guide

Add support for an optional sorted_by argument to the Iceberg rewrite_data_files distributed procedure, propagating sort order through the SPI and native execution handle so rewrites can physically sort data files while enforcing compatibility with the table’s existing sort order, and add tests for behavior and procedure wiring updates.

Sequence diagram for rewrite_data_files with optional sorted_by propagation

sequenceDiagram
    actor User
    participant PrestoCoordinator
    participant AnalyzerPlanner
    participant TableDataRewriteDistributedProcedure
    participant RewriteDataFilesProcedure
    participant IcebergDistributedProcedureHandle
    participant NativeWorker

    User->>PrestoCoordinator: CALL iceberg.system.rewrite_data_files(..., sorted_by => ARRAY['join_date DESC'])
    PrestoCoordinator->>AnalyzerPlanner: Parse and prepare procedure call
    AnalyzerPlanner->>TableDataRewriteDistributedProcedure: Resolve arguments(schema, table_name, filter, sorted_by, options)
    TableDataRewriteDistributedProcedure->>TableDataRewriteDistributedProcedure: Determine sortOrderIndex
    TableDataRewriteDistributedProcedure->>RewriteDataFilesProcedure: begin(session, context, layoutHandle, arguments, sortOrderIndex)

    RewriteDataFilesProcedure->>RewriteDataFilesProcedure: Read Iceberg table and layout
    RewriteDataFilesProcedure->>RewriteDataFilesProcedure: sortFieldStrings = arguments[sortOrderIndex]
    alt sorted_by provided
        RewriteDataFilesProcedure->>RewriteDataFilesProcedure: specifiedSortOrder = parseSortFields(schema, sortFieldStrings)
        alt specifiedSortOrder satisfies table.sortOrder
            RewriteDataFilesProcedure->>RewriteDataFilesProcedure: sortOrder = specifiedSortOrder
        else incompatible sort order
            RewriteDataFilesProcedure-->>PrestoCoordinator: Throw PrestoException(NOT_SUPPORTED)
            PrestoCoordinator-->>User: Error: Specified sort order is incompatible
            RewriteDataFilesProcedure-->>RewriteDataFilesProcedure: return
        end
    else no sorted_by
        RewriteDataFilesProcedure->>RewriteDataFilesProcedure: sortOrder = table.sortOrder()
    end

    RewriteDataFilesProcedure->>RewriteDataFilesProcedure: sortFields = getSupportedSortFields(schema, sortOrder)
    RewriteDataFilesProcedure->>IcebergDistributedProcedureHandle: new IcebergDistributedProcedureHandle(..., tableLayoutHandle, sortFields, relevantData)
    IcebergDistributedProcedureHandle-->>PrestoCoordinator: ConnectorDistributedProcedureHandle

    PrestoCoordinator->>NativeWorker: Send handle as JSON (includes sortOrder)
    NativeWorker->>NativeWorker: Deserialize IcebergDistributedProcedureHandle.sortOrder
    NativeWorker->>NativeWorker: Plan physical rewrite using sortOrder
    NativeWorker-->>PrestoCoordinator: Rewrite result
    PrestoCoordinator-->>User: Procedure completed successfully
Loading

Updated class diagram for Iceberg rewrite_data_files distributed procedure

classDiagram
    class TableDataRewriteDistributedProcedure {
        <<abstract>>
        +static String SCHEMA
        +static String TABLE_NAME
        +static String FILTER
        +static String SORT_ORDER
        -BeginCallDistributedProcedure beginCallDistributedProcedure
        -FinishCallDistributedProcedure finishCallDistributedProcedure
        -int schemaIndex
        -int tableNameIndex
        -OptionalInt filterIndex
        -OptionalInt sortOrderIndex
        +TableDataRewriteDistributedProcedure(String schema, String name, List~Argument~ arguments, BeginCallDistributedProcedure begin, FinishCallDistributedProcedure finish)
        +ConnectorDistributedProcedureHandle begin(ConnectorSession session, ConnectorProcedureContext procedureContext, ConnectorTableLayoutHandle tableLayoutHandle, Object[] arguments)
        +String getSchema(Object[] parameters)
        +String getTableName(Object[] parameters)
        +String getFilter(Object[] parameters)
        +OptionalInt getSortOrderIndex()
    }

    class BeginCallDistributedProcedure {
        <<interface>>
        +ConnectorDistributedProcedureHandle begin(ConnectorSession session, ConnectorProcedureContext procedureContext, ConnectorTableLayoutHandle tableLayoutHandle, Object[] arguments, OptionalInt sortOrderIndex)
    }

    class FinishCallDistributedProcedure {
        <<interface>>
        +Void finish(ConnectorSession session, ConnectorProcedureContext procedureContext, ConnectorTableHandle tableHandle, List~Object~ fragments)
    }

    class RewriteDataFilesProcedure {
        +DistributedProcedure get()
        -ConnectorDistributedProcedureHandle beginCallDistributedProcedure(ConnectorSession session, IcebergProcedureContext procedureContext, IcebergTableLayoutHandle layoutHandle, Object[] arguments, OptionalInt sortOrderIndex)
        -SortOrder parseSortFields(Schema schema, List~String~ sortFieldStrings)
        -List~SortField~ getSupportedSortFields(Schema schema, SortOrder sortOrder)
    }

    class IcebergDistributedProcedureHandle {
        +SchemaTableName schemaTableName
        +IcebergFileFormat fileFormat
        +HiveCompressionCodec compressionCodec
        +Map~String,String~ storageProperties
        +IcebergTableLayoutHandle tableLayoutHandle
        +List~SortField~ sortOrder
        +Map~String,String~ relevantData
        +IcebergDistributedProcedureHandle(SchemaTableName schemaTableName, String icebergTableName, IcebergFileFormat fileFormat, HiveCompressionCodec compressionCodec, Map~String,String~ storageProperties, IcebergTableLayoutHandle tableLayoutHandle, List~SortField~ sortOrder, Map~String,String~ relevantData)
    }

    class IcebergDistributedProcedureHandle_cpp {
        <<struct>>
        +SchemaTableName schemaTableName
        +String icebergTableName
        +IcebergFileFormat fileFormat
        +HiveCompressionCodec compressionCodec
        +Map~String,String~ storageProperties
        +IcebergTableLayoutHandle tableLayoutHandle
        +List~SortField~ sortOrder
        +Map~String,String~ relevantData
        +IcebergDistributedProcedureHandle()
    }

    TableDataRewriteDistributedProcedure o--> BeginCallDistributedProcedure
    TableDataRewriteDistributedProcedure o--> FinishCallDistributedProcedure
    RewriteDataFilesProcedure ..> TableDataRewriteDistributedProcedure : uses
    RewriteDataFilesProcedure ..> IcebergDistributedProcedureHandle : constructs
    IcebergDistributedProcedureHandle_cpp <.. IcebergDistributedProcedureHandle : JSON serialization
Loading

File-Level Changes

Change Details Files
Add sorted_by argument support to Iceberg rewrite_data_files procedure and enforce compatibility with table sort order.
  • Extend the rewrite_data_files distributed procedure signature to accept an optional sorted_by array(varchar) argument alongside filter and options.
  • Compute a SortOrder from the specified sorted_by strings using parseSortFields and validate it satisfies the table’s existing internal sort order, otherwise throw a NOT_SUPPORTED PrestoException.
  • Derive supported SortField list via getSupportedSortFields from the effective SortOrder and pass it through the IcebergDistributedProcedureHandle to control rewrite sorting behavior.
presto-iceberg/src/main/java/com/facebook/presto/iceberg/procedure/RewriteDataFilesProcedure.java
presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergDistributedProcedureHandle.java
presto-spi/src/main/java/com/facebook/presto/spi/procedure/TableDataRewriteDistributedProcedure.java
Plumb sort order metadata through distributed procedure SPI and native protocol serialization.
  • Extend TableDataRewriteDistributedProcedure’s BeginCallDistributedProcedure functional interface to accept an OptionalInt sortOrderIndex and track the index for the sorted_by argument.
  • Update all distributed procedure test stubs and call sites to match the new BeginCallDistributedProcedure signature with sortOrderIndex.
  • Add sortOrder field to IcebergDistributedProcedureHandle C++ representation and include it in JSON (de)serialization in presto_protocol_iceberg.{h,cpp} and related specializations so native execution can see the sort order.
presto-spi/src/main/java/com/facebook/presto/spi/procedure/TableDataRewriteDistributedProcedure.java
presto-tests/src/test/java/com/facebook/presto/tests/TestProcedureCreation.java
presto-analyzer/src/test/java/com/facebook/presto/sql/analyzer/TestBuiltInQueryPreparer.java
presto-main-base/src/test/java/com/facebook/presto/sql/analyzer/AbstractAnalyzerTest.java
presto-main-base/src/test/java/com/facebook/presto/sql/planner/TestLogicalPlanner.java
presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergDistributedProcedureHandle.java
presto-native-execution/presto_cpp/presto_protocol/connector/iceberg/presto_protocol_iceberg.h
presto-native-execution/presto_cpp/presto_protocol/connector/iceberg/presto_protocol_iceberg.cpp
presto-native-execution/presto_cpp/presto_protocol/connector/iceberg/special/IcebergDistributedProcedureHandle.hpp.inc
Add integration tests to validate sorted rewrite behavior for Iceberg tables under various sort and partition configurations.
  • Add tests that call system.rewrite_data_files with sorted_by => ARRAY['id'] and ARRAY['id DESC'] on unpartitioned and partitioned tables and verify resulting files are sorted via isFileSorted and that partitioned tables keep multiple files.
  • Add tests for tables with existing sorted_by table property to ensure compatible specified sort orders are accepted (e.g., extending sort with emp_name) and incompatible ones fail with the expected error message.
  • Reuse the existing isFileSorted helper to inspect rewritten Iceberg file content and order.
presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedTestBase.java

Assessment against linked issues

Issue Objective Addressed Explanation
#26824 Add support for a sorted_by argument to the rewrite_data_files Iceberg procedure, using the same sort syntax as the table sorted_by property.
#26824 Ensure that any sorted_by definition passed to rewrite_data_files is validated to be compatible with the table’s existing sort order, if one exists, and reject incompatible sort orders.

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@hantangwangd hantangwangd force-pushed the support_sort_order_for_rewrite branch 2 times, most recently from cf6071b to abbc90a Compare December 18, 2025 08:17
@hantangwangd hantangwangd linked an issue Dec 18, 2025 that may be closed by this pull request
@hantangwangd hantangwangd force-pushed the support_sort_order_for_rewrite branch from abbc90a to 4ff8a33 Compare December 20, 2025 10:28
@hantangwangd hantangwangd marked this pull request as ready for review December 28, 2025 01:44
Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

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

Hey - I've found 3 issues, and left some high level feedback:

  • The new Iceberg rewrite tests repeat the same table creation/insert/drop patterns several times; consider extracting a small helper to set up and tear down these tables to reduce duplication and make intent clearer.
  • In the new tests that create temporary tables, a try/finally pattern around assertions can ensure the DROP TABLE always runs even when an assertion fails, preventing leftover tables from impacting other tests.
  • When throwing NOT_SUPPORTED for an incompatible sort order, consider including the table's existing sort order and the requested sort order in the exception message to make debugging misconfigurations easier.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The new Iceberg rewrite tests repeat the same table creation/insert/drop patterns several times; consider extracting a small helper to set up and tear down these tables to reduce duplication and make intent clearer.
- In the new tests that create temporary tables, a try/finally pattern around assertions can ensure the DROP TABLE always runs even when an assertion fails, preventing leftover tables from impacting other tests.
- When throwing NOT_SUPPORTED for an incompatible sort order, consider including the table's existing sort order and the requested sort order in the exception message to make debugging misconfigurations easier.

## Individual Comments

### Comment 1
<location> `presto-iceberg/src/main/java/com/facebook/presto/iceberg/procedure/RewriteDataFilesProcedure.java:119-126` </location>
<code_context>
+    private ConnectorDistributedProcedureHandle beginCallDistributedProcedure(ConnectorSession session, IcebergProcedureContext procedureContext, IcebergTableLayoutHandle layoutHandle, Object[] arguments, OptionalInt sortOrderIndex)
</code_context>

<issue_to_address>
**suggestion (bug_risk):** Tighten handling of the `sorted_by` argument to avoid unchecked cast and potential surprises with nulls.

This currently uses an unchecked `(List<String>)` cast and permits `sortFieldStrings` to be `null`. Consider validating the argument type and normalizing nulls up front, e.g.:

```java
List<String> sortFieldStrings = ImmutableList.of();
if (sortOrderIndex.isPresent()) {
    Object value = arguments[sortOrderIndex.getAsInt()];
    if (value == null) {
        sortFieldStrings = ImmutableList.of();
    }
    else if (value instanceof List<?>) {
        sortFieldStrings = ((List<?>) value).stream()
                .map(String.class::cast)
                .collect(toImmutableList());
    }
    else {
        throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "sorted_by must be an array(varchar)");
    }
}
```

This avoids a possible `ClassCastException`, gives users a clearer error, and removes the need for special null handling later.

Suggested implementation:

```java
            Table icebergTable = procedureContext.getTable();
            IcebergTableHandle tableHandle = layoutHandle.getTable();

            SortOrder sortOrder = icebergTable.sortOrder();
            List<String> sortFieldStrings = ImmutableList.of();
            if (sortOrderIndex.isPresent()) {
                Object value = arguments[sortOrderIndex.getAsInt()];
                if (value == null) {
                    sortFieldStrings = ImmutableList.of();
                }
                else if (value instanceof List<?>) {
                    sortFieldStrings = ((List<?>) value).stream()
                            .map(String.class::cast)
                            .collect(toImmutableList());
                }
                else {
                    throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "sorted_by must be an array(varchar)");
                }
            }

            if (!sortFieldStrings.isEmpty()) {

```

To compile successfully, ensure the following imports exist in `RewriteDataFilesProcedure.java`:
1. `import com.facebook.presto.spi.PrestoException;`
2. `import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT;`
3. `import static com.google.common.collect.ImmutableList.toImmutableList;`

If any of these are missing, add them alongside the existing imports.
</issue_to_address>

### Comment 2
<location> `presto-native-execution/presto_cpp/presto_protocol/connector/iceberg/presto_protocol_iceberg.cpp:1191-1197` </location>
<code_context>
       "IcebergDistributedProcedureHandle",
       "IcebergTableLayoutHandle",
       "tableLayoutHandle");
+  to_json_key(
+      j,
+      "sortOrder",
+      p.sortOrder,
+      "IcebergDistributedProcedureHandle",
+      "List<SortField>",
+      "sortOrder");
   to_json_key(
       j,
</code_context>

<issue_to_address>
**issue (bug_risk):** Double-check mixed-version compatibility for the new `sortOrder` protocol field.

Please confirm that:
- `from_json_key` treats a missing `sortOrder` as optional and leaves `p.sortOrder` at its default, so older writers → newer readers still work.
- The Java side can deserialize payloads that omit `sortOrder` (e.g., via a non-required `@JsonProperty` or a suitable default), so newer writers ↔ older components don’t fail.

If missing fields aren’t tolerated on either side, mixed-version deployments may see runtime errors.
</issue_to_address>

### Comment 3
<location> `presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedTestBase.java:1687-1696` </location>
<code_context>
+    @Test
</code_context>

<issue_to_address>
**suggestion (testing):** Add coverage for combining `filter` and `sorted_by` in `rewrite_data_files`

Given the PR description emphasizes using `rewrite_data_files` with both `filter` and `sorted_by`, please add a test invoking `CALL system.rewrite_data_files(schema => ..., table_name => ..., filter => 'id > 3', sorted_by => ARRAY['id'])`. The test should assert that only the filtered rows are rewritten and that the resulting files are ordered by `id`, so we have explicit coverage of their interaction and can detect regressions in filter handling when `sorted_by` is used.

Suggested implementation:

```java
        }
    }

    @Test
    public void testRewriteDataFilesWithFilterAndSortOrder()
            throws IOException
    {
        String tableName = "test_rewrite_data_with_filter_and_sort_order_" + randomTableSuffix();
        String schema = getSession().getSchema().get();

        assertUpdate("CREATE TABLE " + tableName + " (id int, emp_name varchar)");

        // Create multiple data files with mixed id values so that only a subset is rewritten
        assertUpdate("INSERT INTO " + tableName + " VALUES (1, 'AAAA'), (2, 'BBBB'), (3, 'CCCC')", 3);
        assertUpdate("INSERT INTO " + tableName + " VALUES (4, 'DDDD'), (5, 'EEEE')", 2);
        assertUpdate("INSERT INTO " + tableName + " VALUES (6, 'FFFF'), (7, 'GGGG')", 2);

        // Rewrite only rows with id > 3 and sort the rewritten data files by id
        assertUpdate(format(
                "CALL system.rewrite_data_files(" +
                        "schema_name => '%s', " +
                        "table_name => '%s', " +
                        "filter => 'id > 3', " +
                        "sorted_by => ARRAY['id'])",
                schema,
                tableName));

        // All data is still present
        assertQuery(
                "SELECT id, emp_name FROM " + tableName,
                "VALUES " +
                        "(1, 'AAAA'), " +
                        "(2, 'BBBB'), " +
                        "(3, 'CCCC'), " +
                        "(4, 'DDDD'), " +
                        "(5, 'EEEE'), " +
                        "(6, 'FFFF'), " +
                        "(7, 'GGGG')");

        // Filtered rows (id > 3) should appear ordered by id after rewrite_data_files with sorted_by
        assertQuery(
                "SELECT id, emp_name FROM " + tableName + " WHERE id > 3",
                "VALUES " +
                        "(4, 'DDDD'), " +
                        "(5, 'EEEE'), " +
                        "(6, 'FFFF'), " +
                        "(7, 'GGGG')");
    }

    @Test
    public void testRewriteDataFilesWithSortOrder()
            throws IOException
    {
        String tableName = "test_rewrite_data_with_sort_order_" + randomTableSuffix();
        String schema = getSession().getSchema().get();
        assertUpdate("CREATE TABLE " + tableName + "(id int, emp_name varchar)");
        assertUpdate("INSERT INTO " + tableName + " VALUES (5, 'EEEE'), (3, 'CCCC'), (1, 'AAAA')", 3);
        assertUpdate("INSERT INTO " + tableName + " VALUES (2, 'BBBB'), (4,'DDDD')", 2);
        assertUpdate("INSERT INTO " + tableName + " VALUES (9, 'CCCC'), (11,'FFFF')", 2);

```

1. If this class uses a helper for building `CALL system.rewrite_data_files(...)` statements or for asserting row ordering, you may want to adjust the new test to reuse those helpers instead of hardcoding the SQL.
2. If the existing tests explicitly inspect Iceberg metadata (e.g., `$files` or `$snapshots`) to verify which data files were rewritten, you can extend the new test similarly to assert that only files containing rows with `id > 3` changed. The basic interaction and coverage for `filter` + `sorted_by` is implemented above, but you might refine the metadata assertions to match the style of the rest of the suite.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@tdcmeehan tdcmeehan self-assigned this Dec 28, 2025
Copy link
Copy Markdown
Contributor

@steveburnett steveburnett left a comment

Choose a reason for hiding this comment

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

Thank you for the doc! A couple of formatting and phrasing nits only.

@hantangwangd hantangwangd force-pushed the support_sort_order_for_rewrite branch from 4ff8a33 to 78dd55b Compare January 9, 2026 08:49
@hantangwangd
Copy link
Copy Markdown
Member Author

@steveburnett thanks for the review and suggestion. I've addressed the comments. Please take a look when you have a chance.

Copy link
Copy Markdown
Contributor

@steveburnett steveburnett left a comment

Choose a reason for hiding this comment

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

LGTM! (docs)

Pull updated branch, new local doc build. Looks good, thanks!

Copy link
Copy Markdown
Contributor

@tdcmeehan tdcmeehan left a comment

Choose a reason for hiding this comment

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

Looks great, thanks @hantangwangd !

@hantangwangd hantangwangd merged commit d26ecdc into prestodb:master Jan 16, 2026
114 of 117 checks passed
@hantangwangd hantangwangd deleted the support_sort_order_for_rewrite branch January 16, 2026 01:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support sorted_by argument for rewrite_data_files procedure

3 participants