)]}'
{
  "log": [
    {
      "commit": "82cea1462bff959021b881311c9ef9f4f22328af",
      "tree": "e7a3dca866dcb79a2ef460f0c9842d3f1821c74c",
      "parents": [
        "7849222154f6d66810bf6740987c12f89af5e149"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:59 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:59 2026 -0800"
      },
      "message": "chore(deps): bump swatinem/rust-cache (#90)\n\nBumps the github-actions group with 1 update in the /.github/actions/setup-rust directory: [swatinem/rust-cache](https://github.com/swatinem/rust-cache).\n\n\nUpdates `swatinem/rust-cache` from 2.9.2 to 2.9.3\n- [Release notes](https://github.com/swatinem/rust-cache/releases)\n- [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/swatinem/rust-cache/compare/6323deb102c322ba6fcbdcafc7e3dddab59af2b6...d1527c8f67ef9af357290475d4af4b0fab8f12e0)\n\n---\nupdated-dependencies:\n- dependency-name: swatinem/rust-cache\n  dependency-version: 2.9.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7849222154f6d66810bf6740987c12f89af5e149",
      "tree": "597aab95572185d7f655920d155c5f87ecf832f0",
      "parents": [
        "e6e8372798794f25b2dcb2344325976b95e75376"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:52 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:52 2026 -0800"
      },
      "message": "chore(deps): bump rustls from 0.23.45 to 0.23.46 (#93)\n\nBumps [rustls](https://github.com/rustls/rustls) from 0.23.45 to 0.23.46.\n- [Release notes](https://github.com/rustls/rustls/releases)\n- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/rustls/rustls/compare/v/0.23.45...v/0.23.46)\n\n---\nupdated-dependencies:\n- dependency-name: rustls\n  dependency-version: 0.23.46\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e6e8372798794f25b2dcb2344325976b95e75376",
      "tree": "9377e79e22858ccacc67d39cf73531f2e052ca50",
      "parents": [
        "12909075838a04838ecd49d3b9fd0ca12e265beb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:46 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:46 2026 -0800"
      },
      "message": "chore(deps): bump datafusion-sqllogictest from 55.0.0 to 55.2.0 (#96)\n\nBumps [datafusion-sqllogictest](https://github.com/apache/datafusion) from 55.0.0 to 55.2.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.0.0...55.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion-sqllogictest\n  dependency-version: 55.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "12909075838a04838ecd49d3b9fd0ca12e265beb",
      "tree": "98fc6b230ef584a1cf9502968c03299bb75ca3c2",
      "parents": [
        "4c45ed4f3a123e48f15105d7229cd3faca359d4a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:38 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:38 2026 -0800"
      },
      "message": "chore(deps): bump parquet from 59.3.0 to 59.3.2 (#97)\n\nBumps [parquet](https://github.com/apache/arrow-rs) from 59.3.0 to 59.3.2.\n- [Release notes](https://github.com/apache/arrow-rs/releases)\n- [Changelog](https://github.com/apache/arrow-rs/blob/59.3.2/CHANGELOG.md)\n- [Commits](https://github.com/apache/arrow-rs/compare/59.3.0...59.3.2)\n\n---\nupdated-dependencies:\n- dependency-name: parquet\n  dependency-version: 59.3.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4c45ed4f3a123e48f15105d7229cd3faca359d4a",
      "tree": "970d9d8f1086ab2ca8b1ae7b038f4c5c96347a82",
      "parents": [
        "795b25eea78f309a09b53cfe15a8ae21a8b10855"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:31 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:31 2026 -0800"
      },
      "message": "chore(deps): bump datafusion-cli from 55.0.0 to 55.2.0 (#98)\n\nBumps [datafusion-cli](https://github.com/apache/datafusion) from 55.0.0 to 55.2.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.0.0...55.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion-cli\n  dependency-version: 55.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "795b25eea78f309a09b53cfe15a8ae21a8b10855",
      "tree": "a5b8a05a6a739cc1a5f316738211a141e2d741f0",
      "parents": [
        "f2058c415cd357c6f47fdd25a4ba58f2116fe7a4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Nov 11 14:22:24 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 14:22:24 2026 -0800"
      },
      "message": "chore(deps): bump the all-other-cargo-deps group across 1 directory with 3 updates (#103)\n\nBumps the all-other-cargo-deps group with 3 updates in the / directory: [toml](https://github.com/toml-rs/toml), [uuid](https://github.com/uuid-rs/uuid) and [log](https://github.com/rust-lang/log).\n\n\nUpdates `toml` from 1.1.8+spec-1.1.0 to 1.2.1+spec-1.1.0\n- [Commits](https://github.com/toml-rs/toml/compare/toml-v1.1.8...toml-v1.2.1)\n\nUpdates `uuid` from 1.29.0 to 1.29.1\n- [Release notes](https://github.com/uuid-rs/uuid/releases)\n- [Commits](https://github.com/uuid-rs/uuid/compare/v1.29.0...v1.29.1)\n\nUpdates `log` from 0.4.34 to 0.4.35\n- [Release notes](https://github.com/rust-lang/log/releases)\n- [Changelog](https://github.com/rust-lang/log/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/rust-lang/log/compare/0.4.34...v0.4.35)\n\n---\nupdated-dependencies:\n- dependency-name: toml\n  dependency-version: 1.2.1+spec-1.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: all-other-cargo-deps\n- dependency-name: uuid\n  dependency-version: 1.29.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n- dependency-name: log\n  dependency-version: 0.4.35\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f2058c415cd357c6f47fdd25a4ba58f2116fe7a4",
      "tree": "71db758df06a3438581fa0b3a839433972a9509b",
      "parents": [
        "256c4b7bde01a5eee9e4c6b417a36dbe3eb761ec"
      ],
      "author": {
        "name": "Nikhil M.",
        "email": "nikhilmadhwani@yahoo.com",
        "time": "Tue Nov 10 15:44:33 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:14:33 2026 +0100"
      },
      "message": "fix: pass the session\u0027s batch_size to the Iceberg table scan (#102)\n\nIcebergDataSource::open did not pass execution.batch_size to\nget_batch_stream, which never called TableScanBuilder::with_batch_size,\nso scans always read arrow-rs\u0027s default 1024-row batches.\n\nAdd a regression test that sets batch_size above 1024 (smaller sizes\npass without the fix because DataFusion splits oversized batches after\nthe scan), and an IcebergTestHarness::query_batches helper that returns\nunformatted batches.\n\nCloses #100\n\nCo-authored-by: nikkhiil-hadoop \u003cnikhil.madhwani@starburstdata.com\u003e"
    },
    {
      "commit": "256c4b7bde01a5eee9e4c6b417a36dbe3eb761ec",
      "tree": "7969c0cc276427b76d30a3c0bc5fd354491d6e49",
      "parents": [
        "726e4208f4c2295e17b1bc5747332f6f04e7d965"
      ],
      "author": {
        "name": "Colin Marc",
        "email": "hi@colinmarc.com",
        "time": "Tue Nov 03 14:23:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 14:23:42 2026 +0100"
      },
      "message": "fix: preserve timezone-ness when creating predicates (#94)\n\nGiven a `ScalarValue` timestamp with a timezone attached, we should\ncreate `Datum::timestamptz_*`, instead of a naked `Datum::timestamp`.\nNote that the latter type doesn\u0027t actually store the time zone, only the\nequivalent UTC stamp."
    },
    {
      "commit": "726e4208f4c2295e17b1bc5747332f6f04e7d965",
      "tree": "77bcb1cb676bc6f01d72ef36bf2c6a352f99cb12",
      "parents": [
        "8979482936eff6509e40c2e4e3bfc1235d965d60"
      ],
      "author": {
        "name": "Colin Marc",
        "email": "hi@colinmarc.com",
        "time": "Mon Nov 02 16:41:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 16:41:03 2026 +0100"
      },
      "message": "fix: refuse to look inside casts in `expr_to_predicate` (#91)\n\nThe purpose of `expr_to_predicate` is to take an expr and return a\nvalid, equivalent push-down predicate. The existing behavior of just\ndropping the cast ignored many boundary conditions that would lead to\nincorrectly excluding partitions.\n\nThere was already a carveout for dates, because that is the most obvious\nexample. The following expressions are obviously not equivalent:\n\n    -- x is a date, eg \u00272026-01-22\u0027\n    arrow_cast(x, \u0027timestamp(ns)\u0027) \u003c \u00272026-01-22T12:00\u0027\n    -- After dropping the cast, iceberg coerces the literal, so the\n    -- resulting expr is:\n    x \u003c \u00272026-01-22T12:00\u0027\n\nWhether it\u0027s a bug depends on the type of `x`; if x is a date, or\nbroadly coarser than the literal, then dropping the cast creates a\nbad predicate (specifically: the partition \u00272026-01-22\u0027 would be\ndropped, even though the original expression should keep it).\n\nOnce I started looking, though, I found a few more weird cases:\n\n    -- x is int32. \u002710\u0027 \u003c \u00275\u0027 (lexicographically)\n    arrow_cast(x, \u0027utf8\u0027) \u003c \u00275\u0027\n    -- Drop the cast and Datum::to(\u00275\u0027, int32) gives you:\n    x \u003c 5\n\nAnd here\u0027s another:\n\n    -- x is f32. 0.1f32 \u003e 0.1f64 (0.100000001490116 \u003e 0.100000000000000005)\n    arrow_cast(x, \u0027float64\u0027) \u003e 0.1\n    -- Dropping the cast, plus coercion to f32:\n    x \u003e 0.1f32\n\nIt seems like there might be more, any time two conditions are\nfulfilled:\n\n- The cast is to a coarser type\n- The literal would be coerced in a lossy way by `Datum::to`\n\nFixes #36."
    },
    {
      "commit": "8979482936eff6509e40c2e4e3bfc1235d965d60",
      "tree": "0f2017bd1d5df81059cba221137ee2987ee45e1d",
      "parents": [
        "73f236d9adb435eee40a1d9ea86ec85d3c48a84d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 29 17:57:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 17:57:55 2026 -0700"
      },
      "message": "chore(deps): bump the all-other-cargo-deps group across 1 directory with 4 updates (#83)\n\nBumps the all-other-cargo-deps group with 4 updates in the / directory: [tokio](https://github.com/tokio-rs/tokio), [toml](https://github.com/toml-rs/toml), [uuid](https://github.com/uuid-rs/uuid) and [insta](https://github.com/mitsuhiko/insta).\n\n\nUpdates `tokio` from 1.53.2 to 1.54.1\n- [Release notes](https://github.com/tokio-rs/tokio/releases)\n- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.53.2...tokio-1.54.1)\n\nUpdates `toml` from 1.1.6+spec-1.1.0 to 1.1.8+spec-1.1.0\n- [Commits](https://github.com/toml-rs/toml/compare/toml-v1.1.6...toml-v1.1.8)\n\nUpdates `uuid` from 1.27.0 to 1.29.0\n- [Release notes](https://github.com/uuid-rs/uuid/releases)\n- [Commits](https://github.com/uuid-rs/uuid/compare/v1.27.0...v1.29.0)\n\nUpdates `insta` from 1.48.0 to 1.49.0\n- [Release notes](https://github.com/mitsuhiko/insta/releases)\n- [Changelog](https://github.com/mitsuhiko/insta/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/mitsuhiko/insta/compare/1.48.0...1.49.0)\n\n---\nupdated-dependencies:\n- dependency-name: insta\n  dependency-version: 1.49.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: all-other-cargo-deps\n- dependency-name: tokio\n  dependency-version: 1.53.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n- dependency-name: toml\n  dependency-version: 1.1.8+spec-1.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n- dependency-name: uuid\n  dependency-version: 1.28.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: all-other-cargo-deps\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "73f236d9adb435eee40a1d9ea86ec85d3c48a84d",
      "tree": "e4fa1e324a67bd798dc363699ca823bfa60886d8",
      "parents": [
        "7fb643f850e23e2764f742cf84088a5b7c07d33c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 29 17:56:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 17:56:56 2026 -0700"
      },
      "message": "chore(deps): bump datafusion from 55.1.0 to 55.2.0 (#78)\n\nBumps [datafusion](https://github.com/apache/datafusion) from 55.1.0 to 55.2.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.1.0...55.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion\n  dependency-version: 55.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7fb643f850e23e2764f742cf84088a5b7c07d33c",
      "tree": "dd10162129ed129edea15f0be72bc17c026a7bf0",
      "parents": [
        "afaba288cf3ae5e467463ba7ecdec19ff9269838"
      ],
      "author": {
        "name": "Terbe Dániel",
        "email": "terbed@gmail.com",
        "time": "Mon Oct 26 07:58:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 07:58:24 2026 +0100"
      },
      "message": "Enable page-index pruning for Iceberg scans (#65)\n\n* Enable page-index pruning for Iceberg scans\n\n* Simplify page-index coverage"
    },
    {
      "commit": "afaba288cf3ae5e467463ba7ecdec19ff9269838",
      "tree": "3dc9eeadf82a8a672cdb844bb0bddf57cad9b5f2",
      "parents": [
        "b641e5ebe9e92967499ae7e440ba10d7797712df"
      ],
      "author": {
        "name": "Animesh Kumar",
        "email": "61719828+CaptainAni187@users.noreply.github.com",
        "time": "Mon Oct 26 12:27:49 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 07:57:49 2026 +0100"
      },
      "message": "fix: unescape LIKE prefixes before pushing them down as STARTS WITH (#46)\n\nWithout an ESCAPE clause, DataFusion and Arrow treat a backslash in a\nLIKE pattern as an escape for the next character. The prefix pushdown\nignored that: \u0027a\\%\u0027 (the literal string \"a%\") was pushed down as\nSTARTS WITH \"a\\\", so Iceberg dropped the rows that match.\n\nParse the pattern with the same escape rules, so an escaped % or _ in\nthe prefix is a literal and an escaped trailing % isn\u0027t treated as a\nwildcard.\n\nCloses #40"
    },
    {
      "commit": "b641e5ebe9e92967499ae7e440ba10d7797712df",
      "tree": "ce4cc972382591c198038b678766d7111c0a92af",
      "parents": [
        "b08dfb39b5ba2547a5dd702ab782a6e8ae3fdf15"
      ],
      "author": {
        "name": "Anirudh",
        "email": "anirudh.s.c.96@hotmail.com",
        "time": "Tue Oct 13 13:09:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 13:09:30 2026 +0200"
      },
      "message": "fix: project columns correctly when scanning iceberg table metadata (#47)\n\n* fix: project columns correctly when scanning iceberg table metadata\n\n* chore: add todo for projection pushdown\n\n* tests: use the new test harness for metadata projection tests"
    },
    {
      "commit": "b08dfb39b5ba2547a5dd702ab782a6e8ae3fdf15",
      "tree": "09cdba68b4aa3c340bf36c5c28b727fb638c387b",
      "parents": [
        "20327db58c7a44330366da00a34a26e866d0da4d"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Tue Oct 13 10:02:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 11:02:50 2026 +0200"
      },
      "message": "test: migrate expect-test snapshots to insta (#64)\n\n* test: migrate expect-test snapshots to insta\n\n* test: use Schema Display for inline snapshots\n\n* test: display schema fields on separate lines"
    },
    {
      "commit": "20327db58c7a44330366da00a34a26e866d0da4d",
      "tree": "4fb7355a827431dc386a613d39ff96928651a2e3",
      "parents": [
        "b3d4edcc975046d624f7c5b17e7f27843f15afcc"
      ],
      "author": {
        "name": "Haresh Khanna",
        "email": "kh.haresh@gmail.com",
        "time": "Mon Oct 12 18:14:12 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 13:14:12 2026 -0400"
      },
      "message": "Use avro for datafiles collection from write-exec (#54)\n\n* Use avro for datafiles collection from write-exec\n\n* Remove avro buffer re-alloc\n\n* Adds an integration test\n\n* Bump iceberg-rust\n\n* Use internal error and enhance tests"
    },
    {
      "commit": "b3d4edcc975046d624f7c5b17e7f27843f15afcc",
      "tree": "8c3a5d3742091f44e39201a421a404a4273e2be6",
      "parents": [
        "5d0dd9850c68f824661d9d86403dfa3c443921b3"
      ],
      "author": {
        "name": "Anirudh",
        "email": "anirudh.s.c.96@hotmail.com",
        "time": "Mon Oct 12 08:27:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 08:27:46 2026 +0200"
      },
      "message": "fix: use an IcebergCatalog for the test harness (#66)"
    },
    {
      "commit": "5d0dd9850c68f824661d9d86403dfa3c443921b3",
      "tree": "04a0e2f7068c652e56c09d6c13d867617c57ccc1",
      "parents": [
        "d1b52344edd328ebbfe77f57aed78f44e56ea34b"
      ],
      "author": {
        "name": "NoahKusaba",
        "email": "97474796+NoahKusaba@users.noreply.github.com",
        "time": "Mon Oct 12 02:25:16 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 08:25:16 2026 +0200"
      },
      "message": "refactor: replace IcebergDataSource::new_with_predicate with a builder (#63)"
    },
    {
      "commit": "d1b52344edd328ebbfe77f57aed78f44e56ea34b",
      "tree": "50f9c8e2b08bc10ec5b60be7418a7dc471e438c6",
      "parents": [
        "acc1a9c51b53bc7c5a19cb59850fbe86b904deda"
      ],
      "author": {
        "name": "Andy Grove",
        "email": "agrove@apache.org",
        "time": "Sun Oct 11 11:33:27 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 11:33:27 2026 -0600"
      },
      "message": "chore: add release infrastructure (#32)"
    },
    {
      "commit": "acc1a9c51b53bc7c5a19cb59850fbe86b904deda",
      "tree": "30eecc4ea5e75e024d0dfc90f619dc36c72e46b6",
      "parents": [
        "9329a030c807b5889d9a2ac90fec0eb165a9508b"
      ],
      "author": {
        "name": "Andy Grove",
        "email": "agrove@apache.org",
        "time": "Sun Oct 11 11:11:11 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 11:11:11 2026 -0600"
      },
      "message": "chore: rename crate back to iceberg-datafusion and start at version 0.12.0 (#61)\n\n* chore: rename crate back to iceberg-datafusion\n\n* chore: set initial release version to 0.12.0"
    },
    {
      "commit": "9329a030c807b5889d9a2ac90fec0eb165a9508b",
      "tree": "3de8d4754aed94bf8fa134df7577f81c15532c23",
      "parents": [
        "1d2d4e78accf8c974f6571189c56defa96f69e55"
      ],
      "author": {
        "name": "Andy Grove",
        "email": "agrove@apache.org",
        "time": "Sun Oct 11 10:00:24 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 10:00:24 2026 -0600"
      },
      "message": "ci: add Apache RAT license header check (#60)"
    },
    {
      "commit": "1d2d4e78accf8c974f6571189c56defa96f69e55",
      "tree": "58394b906a873c1ae123de8898cbb65b091bd38d",
      "parents": [
        "72526809d80787c375ebc765ecee9b1db418a232"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Sun Oct 11 07:21:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 08:21:50 2026 +0200"
      },
      "message": "test: add Iceberg integration fixture (#18)\n\n* test: add Iceberg integration fixture\n\n* test: update DataFusion 55 plan snapshots\n\n* ci: fetch LFS test fixtures\n\n* docs: explain LFS fixture setup\n\n* test: stabilize fixture plan snapshots"
    },
    {
      "commit": "72526809d80787c375ebc765ecee9b1db418a232",
      "tree": "b2040ccb39219c40846523d55a0f3b7a6939959c",
      "parents": [
        "79d68a5a93f293c78b1b29fa8927b7acf6c929da"
      ],
      "author": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Oct 06 08:39:27 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Sat Oct 10 06:55:02 2026 +0200"
      },
      "message": "Refactor Iceberg reads to DataSource\n"
    },
    {
      "commit": "79d68a5a93f293c78b1b29fa8927b7acf6c929da",
      "tree": "14e1c3f4cddc6c2bb11ffa58881a3a0abd5eb7ea",
      "parents": [
        "961bceeeeb27802f441bb0f58fab39992bee8ede"
      ],
      "author": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon Oct 05 15:20:26 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Sat Oct 10 06:55:02 2026 +0200"
      },
      "message": "Refactor folder structure\n"
    },
    {
      "commit": "961bceeeeb27802f441bb0f58fab39992bee8ede",
      "tree": "4af4f26b8279829ac6ccf6c05cd4908a518bbba6",
      "parents": [
        "45b3cf3ac1b1384ffa7f98b47ac4ab83c9317c44"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 08 11:28:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:28:09 2026 -0700"
      },
      "message": "chore(deps): bump rustls from 0.23.44 to 0.23.45 (#53)\n\nBumps [rustls](https://github.com/rustls/rustls) from 0.23.44 to 0.23.45.\n- [Release notes](https://github.com/rustls/rustls/releases)\n- [Changelog](https://github.com/rustls/rustls/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/rustls/rustls/compare/v/0.23.44...v/0.23.45)\n\n---\nupdated-dependencies:\n- dependency-name: rustls\n  dependency-version: 0.23.45\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "45b3cf3ac1b1384ffa7f98b47ac4ab83c9317c44",
      "tree": "cf0a9b1c165376131991c51240d84dbdf7d48410",
      "parents": [
        "f9cc07cbb9df1ff5d863564a822f6e5f0aebacb2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 07 17:55:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 17:55:25 2026 +0200"
      },
      "message": "chore(deps): bump the all-other-cargo-deps group with 3 updates (#52)\n\nBumps the all-other-cargo-deps group with 3 updates: [tokio](https://github.com/tokio-rs/tokio), [uuid](https://github.com/uuid-rs/uuid) and [fs-err](https://github.com/andrewhickman/fs-err).\n\n\nUpdates `tokio` from 1.53.1 to 1.53.2\n- [Release notes](https://github.com/tokio-rs/tokio/releases)\n- [Commits](https://github.com/tokio-rs/tokio/compare/tokio-1.53.1...tokio-1.53.2)\n\nUpdates `uuid` from 1.26.1 to 1.27.0\n- [Release notes](https://github.com/uuid-rs/uuid/releases)\n- [Commits](https://github.com/uuid-rs/uuid/compare/v1.26.1...v1.27.0)\n\nUpdates `fs-err` from 3.3.1 to 3.3.2\n- [Changelog](https://github.com/andrewhickman/fs-err/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/andrewhickman/fs-err/commits/3.3.2)\n\n---\nupdated-dependencies:\n- dependency-name: tokio\n  dependency-version: 1.53.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n- dependency-name: uuid\n  dependency-version: 1.27.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: all-other-cargo-deps\n- dependency-name: fs-err\n  dependency-version: 3.3.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f9cc07cbb9df1ff5d863564a822f6e5f0aebacb2",
      "tree": "4b56aafe098bff64426a239265d7e03207db7c8a",
      "parents": [
        "9a959d635f21d3158cc65e9f64027893de9945b2"
      ],
      "author": {
        "name": "NoahKusaba",
        "email": "97474796+NoahKusaba@users.noreply.github.com",
        "time": "Tue Oct 06 15:43:42 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 12:43:42 2026 -0700"
      },
      "message": "feat: make the plan nodes inspectable and rebuildable (#20)\n\n* init\n\n* feat: make IcebergTableProvider::try_new public\n\nA plan codec rebuilds a catalog-backed provider from its catalog and\ntable identifier, which needs the constructor.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\n* fix: rebuild the commit and scan from what they expose\n\nA codec decoding these nodes in another process has only their\naccessors to work from, and two constructors asked for more than that.\n\n- IcebergCommitExec::new no longer takes a schema. It was only shown in\n  the verbose display and could not be read back from the node; the\n  display now shows the table\u0027s current schema on one line.\n- IcebergTableScan::new_with_predicate takes the output schema and the\n  projected column names, as schema() and projection() return them,\n  instead of the full table schema and indices, which the scan does not\n  expose. It returns an error when the names are not the schema\u0027s\n  fields in order, rather than building a scan whose batches do not\n  match its schema.\n\nThe integration test now executes a write and commit rebuilt from their\naccessors, and rebuilds scans from their accessors alone, with and\nwithout a projection.\n\n* fix: read the scan\u0027s columns by name, and assert full test outputs\n\nnew_with_predicate no longer takes a projection. When given, it had to\nrepeat the schema\u0027s field names; when not, the schema had to be the full\ntable schema, which was not checked, so a one-column schema with no\nprojection built a scan that reported one column and returned two. The\nscan now always selects the names of its schema\u0027s fields, which reads\nthe same columns as select_all for a full schema, so its batches match\nits schema by construction and the constructor cannot fail.\n\nThis also fixes the catalog-backed provider, which pairs the schema it\ncached when built with the table as loaded on each scan: after a column\nwas added and written to, a scan with no projection returned that\ncolumn too.\n\nprojection() keeps its signature and returns the schema\u0027s field names.\n\nThe tests now compare full outputs rather than parts of them, check the\npinned snapshot is read rather than the current one, and check each\n$snapshots row against the table\u0027s metadata.\n\n* refactor: keep IcebergMetadataTableProvider\u0027s methods in one impl block\n\nThe constructor and accessors went into a second inherent impl block;\nmove them into the existing one, beside scan.\n\n* test: check snapshot summaries against metadata, and import collect\n\nThe $snapshots test pinned each summary\u0027s file sizes, which depend on the\nbytes the Parquet writer produces, so a dependency bump could fail it with\nno change in behavior. Compare the summaries to each snapshot\u0027s metadata\ninstead, like the other columns.\n\nImport collect at the top of the file, as the commit tests do.\n\n* refactor: return the scan\u0027s projection as a slice and tidy the scan tests\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9a959d635f21d3158cc65e9f64027893de9945b2",
      "tree": "39fade5b720d3b0c68d8ab0871a061323357239f",
      "parents": [
        "be66d88fcd56ab0dc10b0953506f9dd0a9fa98b4"
      ],
      "author": {
        "name": "Andy Grove",
        "email": "agrove@apache.org",
        "time": "Mon Oct 05 06:36:00 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 14:36:00 2026 +0200"
      },
      "message": "docs: add AGENTS.md for coding agents (#34)\n\nDocument how CI builds and tests the workspace, conventions that are\neasy to miss, and the parts of the design that span several files,\nfollowing the AGENTS.md files in other DataFusion repositories.\nSymlink CLAUDE.md to it, as apache/datafusion does.\n\nCloses #33."
    },
    {
      "commit": "be66d88fcd56ab0dc10b0953506f9dd0a9fa98b4",
      "tree": "051463b8fcc15d0c4f57bf7019c9e8edc264d843",
      "parents": [
        "a2bc9427d0659591b5f8122b90fec710fe2f5de6"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Mon Oct 05 19:52:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 13:52:14 2026 +0200"
      },
      "message": "docs: add repository README (#29)\n\n* docs: add repository README\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e\n\n* Update README.md\n\nCo-authored-by: Andy Grove \u003cagrove@apache.org\u003e\n\n---------\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e\nCo-authored-by: Andy Grove \u003cagrove@apache.org\u003e"
    },
    {
      "commit": "a2bc9427d0659591b5f8122b90fec710fe2f5de6",
      "tree": "12405091152b1a305ad7de14b2459f61dc8779ca",
      "parents": [
        "833a0d1ab79eb47ca3d89967dc19b12a597f1664"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 14:44:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 14:44:40 2026 +0800"
      },
      "message": "chore(deps): bump datafusion-cli from 55.0.0 to 55.1.0 (#25)\n\nBumps [datafusion-cli](https://github.com/apache/datafusion) from 55.0.0 to 55.1.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.0.0...55.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion-cli\n  dependency-version: 55.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "833a0d1ab79eb47ca3d89967dc19b12a597f1664",
      "tree": "588e630c92a15393dc76c66421ed61f84c6b7bc8",
      "parents": [
        "4dfc8391bde67e1cbe573bbf625f0825fe253c66"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 01 14:44:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 14:44:10 2026 +0800"
      },
      "message": "chore(deps): bump datafusion-sqllogictest from 55.0.0 to 55.1.0 (#26)\n\nBumps [datafusion-sqllogictest](https://github.com/apache/datafusion) from 55.0.0 to 55.1.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.0.0...55.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion-sqllogictest\n  dependency-version: 55.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4dfc8391bde67e1cbe573bbf625f0825fe253c66",
      "tree": "18fe241c9eba1ddcdc3ad7fd8b520556883593ff",
      "parents": [
        "b12e9871dd2b2632cd05786d9f12dd6cde47dc2e"
      ],
      "author": {
        "name": "Wade Fletcher",
        "email": "3798059+wadefletch@users.noreply.github.com",
        "time": "Wed Sep 30 05:54:26 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 18:54:26 2026 +0800"
      },
      "message": "chore(deps): align Iceberg integration with current core (#21)"
    },
    {
      "commit": "b12e9871dd2b2632cd05786d9f12dd6cde47dc2e",
      "tree": "bec3722945123399b781e53ae6c705f699965fae",
      "parents": [
        "697c1da74adc3645419267880512ac91ad601ffa"
      ],
      "author": {
        "name": "NoahKusaba",
        "email": "97474796+NoahKusaba@users.noreply.github.com",
        "time": "Thu Sep 24 15:15:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 15:15:36 2026 -0400"
      },
      "message": "feat: make PartitionExpr reconstructible (#14)\n\n* feat: make PartitionExpr reconstructible\n\nPartitionExpr wraps a PartitionValueCalculator, which is a live object with\nno serializable form. Once the expression is built, nothing on it says which\npartition spec and schema produced it, so a caller holding the expression\ncannot rebuild an equivalent one.\n\nRetain both inputs on the expression and expose them:\n\n- try_new(partition_spec, table_schema) replaces new(calculator, spec) and\n  builds the calculator itself, so the two inputs and the calculator cannot\n  drift apart.\n- partition_spec() and table_schema() read them back. Both are self-contained\n  iceberg spec types, so a distributed engine can serialize them and rebuild\n  the expression on a worker with try_new.\n\nproject_with_partition is unchanged from the outside; it now hands the two\ninputs to try_new instead of constructing the calculator first.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* fix: compare PartitionExpr by value, not by pointer\n\nPartitionExpr compared calculator and spec with Arc::ptr_eq, and hashed\ntheir addresses. try_new allocates a fresh calculator Arc on every call,\nso two expressions built from identical inputs compared unequal even when\nhanded the same Arc\u003cPartitionSpec\u003e: the expression was equal only to\ndirect clones of itself.\n\nThat was defensible while new() was private and each plan held one\ninstance, so identity coincided with equality. Making the type\nreconstructible breaks that coincidence, and a round-tripped expression\nnever comparing equal to its original defeats the purpose of retaining\nthe spec and schema in the first place.\n\nCompare the partition spec and table schema by value instead. The\ncalculator is derived from those two, so it takes no part in equality.\nHash the spec and schema ids: neither type implements Hash, and equal\nexpressions agree on both ids, which is all Hash requires. Collisions\nare separated by PartialEq, and this avoids serializing on every hash\n - ProjectionMapping keys an IndexMap on the expression, so Hash and Eq\nrun on every partitioned write.\n\nTests:\n\n- test_partition_expr_rebuilds_from_its_retained_parts now rebuilds from\n  deep copies rather than cloned Arcs, and asserts equality and hash\n  equality. Comparing only evaluated arrays let the pointer-based impl\n  pass unnoticed.\n- test_partition_expr_equality_is_value_based pins the semantics,\n  including two specs that share a spec_id but partition on different\n  columns, so narrowing eq to the ids that Hash uses fails the suite.\n\nAlso document try_new, partition_spec and table_schema, which this\nbranch makes public.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* refactor: address review feedback\n\n- Import iceberg\u0027s SchemaRef as IcebergSchemaRef so it does not read as\n  arrow\u0027s SchemaRef at the use sites.\n- Move the test-local hasher imports to the top of the tests module,\n  alongside the rest.\n- Trim the comments and docs added on this branch.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* test: cover try_new error paths and schema-side equality\n\nAddress review feedback on the now-public try_new:\n\n- Document that an unpartitioned spec is rejected too. project_with_partition\n  returns early for those, but a codec calling try_new has no such guard.\n- test_try_new_error_paths covers the three ways binding fails: unpartitioned\n  spec, a source_id the schema lacks, and a transform the source type rejects.\n- test_partition_expr_differs_on_schema_with_shared_id covers the schema side\n  of equality. Two tables can share schema_id 0 with a field typed differently,\n  so the ids Hash uses cannot separate them and eq must compare the struct.\n- State in the PartialEq comment that both comparisons include spec_id and\n  schema_id, which Hash depends on.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* Update crates/datafusion/src/physical_plan/project.rs\n\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e\n\n* fix: restore try_new signature dropped by the applied suggestion\n\nCommitting the doc-example suggestion from the web UI replaced the\n`pub fn try_new(` line it was anchored to, leaving the parameter list\nwith no function declaration, and duplicated the `# Errors` line.\n\nRestore the signature and drop the duplicate. The example itself is\nkept and now runs as a doctest.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e"
    },
    {
      "commit": "697c1da74adc3645419267880512ac91ad601ffa",
      "tree": "eb87483d1e970a45f313d85a118b93296396e02b",
      "parents": [
        "2cc21852106b9e8927a68aac29444a5eea287658"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Wed Sep 23 22:58:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 16:58:54 2026 -0400"
      },
      "message": "refactor: use DataFusion errors in integration (#7)\n\n* refactor: use DataFusion errors in integration\n\n* test: update DataFusion error expectations\n\n---------\n\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e"
    },
    {
      "commit": "2cc21852106b9e8927a68aac29444a5eea287658",
      "tree": "323aec011140d7307b32227cc5c79c2527ea9e6b",
      "parents": [
        "840a8a6d848935fd5d598a0194bb234583f494f9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 16:45:07 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 16:45:07 2026 -0400"
      },
      "message": "chore(deps): bump dirs from 6.0.0 to 7.0.0 (#12)\n\nBumps dirs from 6.0.0 to 7.0.0.\n\n---\nupdated-dependencies:\n- dependency-name: dirs\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e\nCo-authored-by: Gabriel \u003c45515538+gabotechs@users.noreply.github.com\u003e"
    },
    {
      "commit": "840a8a6d848935fd5d598a0194bb234583f494f9",
      "tree": "fe2b5062d80d61f4e2629a1ec1dc187a614f827a",
      "parents": [
        "cbe789b3ae9194c02151088f65126d687377b72e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 16:44:57 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 16:44:57 2026 -0400"
      },
      "message": "chore(deps): bump toml from 0.8.23 to 1.1.6+spec-1.1.0 (#10)\n\nBumps [toml](https://github.com/toml-rs/toml) from 0.8.23 to 1.1.6+spec-1.1.0.\n- [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.23...toml-v1.1.6)\n\n---\nupdated-dependencies:\n- dependency-name: toml\n  dependency-version: 1.1.6+spec-1.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e\nCo-authored-by: Gabriel \u003c45515538+gabotechs@users.noreply.github.com\u003e"
    },
    {
      "commit": "cbe789b3ae9194c02151088f65126d687377b72e",
      "tree": "5fd444874b9d76d22d857bfb9a772e660a21f921",
      "parents": [
        "508721131cdf507f89c0f492971d0b9f00fc3775"
      ],
      "author": {
        "name": "Matt Butrovich",
        "email": "mbutrovich@users.noreply.github.com",
        "time": "Wed Sep 23 16:44:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 16:44:06 2026 -0400"
      },
      "message": "ci: Stop requiring PR branches to be up to date with main before merging (#17)"
    },
    {
      "commit": "508721131cdf507f89c0f492971d0b9f00fc3775",
      "tree": "37910b45bc64b37b9f634fb3b7fef7309fe6dcfb",
      "parents": [
        "7ac6084a17e8a5441e769faa24746879495cf552"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 12:58:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 12:58:59 2026 -0400"
      },
      "message": "chore(deps): bump datafusion from 55.0.0 to 55.1.0 (#11)\n\nBumps [datafusion](https://github.com/apache/datafusion) from 55.0.0 to 55.1.0.\n- [Changelog](https://github.com/apache/datafusion/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/apache/datafusion/compare/55.0.0...55.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: datafusion\n  dependency-version: 55.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e\nCo-authored-by: Gabriel \u003c45515538+gabotechs@users.noreply.github.com\u003e"
    },
    {
      "commit": "7ac6084a17e8a5441e769faa24746879495cf552",
      "tree": "c3cffec6370c39f26e8db2901e7b02881e017a13",
      "parents": [
        "bf52521e631d265c441a7e86616c33a6b0924bb4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 10:30:11 2026 -0400"
      },
      "message": "chore(deps): bump the all-other-cargo-deps group with 3 updates (#9)\n\nBumps the all-other-cargo-deps group with 3 updates: [uuid](https://github.com/uuid-rs/uuid), [log](https://github.com/rust-lang/log) and [clap](https://github.com/clap-rs/clap).\n\n\nUpdates `uuid` from 1.24.1 to 1.26.1\n- [Release notes](https://github.com/uuid-rs/uuid/releases)\n- [Commits](https://github.com/uuid-rs/uuid/compare/v1.24.1...v1.26.1)\n\nUpdates `log` from 0.4.33 to 0.4.34\n- [Release notes](https://github.com/rust-lang/log/releases)\n- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/rust-lang/log/compare/0.4.33...0.4.34)\n\nUpdates `clap` from 4.6.6 to 4.6.7\n- [Release notes](https://github.com/clap-rs/clap/releases)\n- [Changelog](https://github.com/clap-rs/clap/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)\n\n---\nupdated-dependencies:\n- dependency-name: uuid\n  dependency-version: 1.26.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: all-other-cargo-deps\n- dependency-name: log\n  dependency-version: 0.4.34\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n- dependency-name: clap\n  dependency-version: 4.6.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: all-other-cargo-deps\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Matt Butrovich \u003cmbutrovich@users.noreply.github.com\u003e\nCo-authored-by: Gabriel \u003c45515538+gabotechs@users.noreply.github.com\u003e"
    },
    {
      "commit": "bf52521e631d265c441a7e86616c33a6b0924bb4",
      "tree": "fdb9d6cd91f577479853a29fc75f344c225a428c",
      "parents": [
        "559a6485415e571cbdfddae2ac38595b75857479"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Wed Sep 23 15:16:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 15:16:40 2026 +0200"
      },
      "message": "ci: always run ASF allowlist check (#15)"
    },
    {
      "commit": "559a6485415e571cbdfddae2ac38595b75857479",
      "tree": "aa052b509cb28b932b2ee010a2b60f7c37f8dad7",
      "parents": [
        "05e277e8a8bf342db53cbf2d53ed6f2098b44a88"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 22 16:25:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 16:25:06 2026 -0400"
      },
      "message": "chore(deps): bump actions/checkout (#8)\n\nBumps the github-actions group with 1 update in the / directory: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 4 to 7\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "05e277e8a8bf342db53cbf2d53ed6f2098b44a88",
      "tree": "29a64cf036ebf38536a171164277dcfde4a29a5d",
      "parents": [
        "0bb050d8deddf5d551801ebd4e9be752687ad421"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Tue Sep 22 13:09:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 07:09:11 2026 -0400"
      },
      "message": "Add CI (#6)\n\n* Add basic CI for lint, test and format\n\n* Format the codebase\n\n* Fix rust toolchain version to 1.98.1\n\n* Better concurrency control for pipelines\n\n* Commit rust-toolchain.toml\n\n* Commit rustfmt.toml\n\n* Format code\n\n* Improve CARGO_INCREMENTAL comment\n\n* Add checks as required to asf.yaml"
    },
    {
      "commit": "0bb050d8deddf5d551801ebd4e9be752687ad421",
      "tree": "5e298d7658065a944c6a60d4965009056b71da3d",
      "parents": [
        "bf53e295bcd97bd52b80fa964728262cc0dd2912",
        "b34a86ece887b14f25c58a0a2dda81b4579f4ad8"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrew@nerdnetworks.org",
        "time": "Sun Sep 20 06:07:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 06:07:24 2026 -0400"
      },
      "message": "Merge pull request #5 from alamb/rename-asf-yaml\n\nRename `.asf.yml` to `.asf.yaml` so ASF infra applies the settings"
    },
    {
      "commit": "b34a86ece887b14f25c58a0a2dda81b4579f4ad8",
      "tree": "5e298d7658065a944c6a60d4965009056b71da3d",
      "parents": [
        "bf53e295bcd97bd52b80fa964728262cc0dd2912"
      ],
      "author": {
        "name": "Andrew Lamb",
        "email": "andrew@nerdnetworks.org",
        "time": "Sun Sep 20 06:01:31 2026 -0400"
      },
      "committer": {
        "name": "Andrew Lamb",
        "email": "andrew@nerdnetworks.org",
        "time": "Sun Sep 20 06:01:31 2026 -0400"
      },
      "message": "Rename .asf.yml to .asf.yaml so ASF infra applies the settings\n\nASF\u0027s asfyaml service only reads a file named exactly `.asf.yaml`\n(see `os.path.join(repo_path, \".asf.yaml\")` in\napache/infrastructure-asfyaml). This repo\u0027s file was named `.asf.yml`,\nso it has been silently ignored since it was added: GitHub issues are\nstill disabled and the repo description/homepage are still the\ndefaults rather than the values in the file.\n\nAlso add the usual doc-link header, repo labels, and the trailing\nslash on the homepage, matching apache/datafusion/.asf.yaml.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bf53e295bcd97bd52b80fa964728262cc0dd2912",
      "tree": "f5eb44d71f22ad08338ad659a8d93d057712c713",
      "parents": [
        "3cc66ed44b7091c6a5ad21891ab973ba95fa89c9"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Fri Sep 18 15:33:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 15:33:37 2026 +0200"
      },
      "message": "Rearrange Cargo.toml files to make the project compile and tests pass. (#2)\n\nRemove DEPENDENCIES.rust.tsv and public-api.txt files"
    },
    {
      "commit": "3cc66ed44b7091c6a5ad21891ab973ba95fa89c9",
      "tree": "15df5139a31cd55af2b7b6f38f374ba6763a6207",
      "parents": [
        "8877b4b4985da93cd9bba82259e88591f8342a5a",
        "9f35881e8a11072a9c25cb647d89962732ddc2dc"
      ],
      "author": {
        "name": "Gabriel",
        "email": "45515538+gabotechs@users.noreply.github.com",
        "time": "Thu Sep 17 09:07:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 09:07:17 2026 +0200"
      },
      "message": "Merge pull request #1 from apache/gabotechs/port-iceberg-rust-history\n\nPort iceberg-rust history"
    },
    {
      "commit": "8877b4b4985da93cd9bba82259e88591f8342a5a",
      "tree": "23536a05d5ecdd34ea989bc6d222fec2fe29bfef",
      "parents": [],
      "author": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Sep 09 15:54:53 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Sep 09 15:56:17 2026 +0200"
      },
      "message": "Add ASF configuration\n"
    },
    {
      "commit": "9f35881e8a11072a9c25cb647d89962732ddc2dc",
      "tree": "15df5139a31cd55af2b7b6f38f374ba6763a6207",
      "parents": [
        "6ad1b9803cb9d4251470c0b30c2f67d9490e3ed3"
      ],
      "author": {
        "name": "Matt Butrovich",
        "email": "mbutrovich@users.noreply.github.com",
        "time": "Thu Sep 03 13:28:56 2026 -0400"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Sep 03 13:28:56 2026 -0400"
      },
      "message": "deps: upgrade to DataFusion 55.0 and Arrow/Parquet 59.2 (#2958)\n\n* bump df to 55.0 (head on main) and arrow to 59.1\n\n* upmerge main after opendal bump\n\n* fix some CI failures\n\n* python version bumps\n\n* bump to branch-55 and rc2 commit. bump to arrow and parquet 59.2\n\n* bump to branch-55 and rc2 commit. bump to arrow and parquet 59.2\n\n* bump to final crates, fix API changes\n\n* update public API\n\n* gate test\n"
    },
    {
      "commit": "6ad1b9803cb9d4251470c0b30c2f67d9490e3ed3",
      "tree": "9676cba54c23ec6415548fc89b77a78e578da948",
      "parents": [
        "7c231813507780117ae5add3da68515d04996635"
      ],
      "author": {
        "name": "blackmwk",
        "email": "257669749+blackmwk@users.noreply.github.com",
        "time": "Fri Aug 28 18:36:25 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Aug 28 18:36:25 2026 +0800"
      },
      "message": "refactor: parse table properties lazily (#3030)\n"
    },
    {
      "commit": "7c231813507780117ae5add3da68515d04996635",
      "tree": "90615ec4e584c350a5f11323a1d6f9c6166308e8",
      "parents": [
        "252ed5e4400677e04d60368418c1170f93e78371"
      ],
      "author": {
        "name": "Daniel Carl Jones",
        "email": "djonesoa@amazon.com",
        "time": "Thu Aug 27 23:32:05 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Aug 27 23:32:05 2026 +0100"
      },
      "message": "chore: Update MSRV to Rust 1.95 (#3083)\n"
    },
    {
      "commit": "252ed5e4400677e04d60368418c1170f93e78371",
      "tree": "93576c93504530c5eeb03d8eaacb8047206af18e",
      "parents": [
        "8119cfe1abf8cd439678581b3d2309eafc639d5d"
      ],
      "author": {
        "name": "Joseph Lenton",
        "email": "JosephLenton@users.noreply.github.com",
        "time": "Wed Aug 26 10:37:24 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Aug 26 10:37:24 2026 +0100"
      },
      "message": "docs: fix references in public docs (#2937)\n\n* docs: fix references in public docs\n\n* chore: make private items that are publicly referenced public\n\n* feat: make TransactionAction public and correct more issues with docs\n\n* docs: change Schema method docs to be worded more naturally\n\n* docs: fix incorrect links when rendering docs\n\n* feat: make actions public again\n\n* chore: remove default from transactions\n\n* Remove default implementation on actions, remove public visibility of TransactionAction\n\n---------\n\nCo-authored-by: Daniel Carl Jones \u003cdjonesoa@amazon.com\u003e\n"
    },
    {
      "commit": "8119cfe1abf8cd439678581b3d2309eafc639d5d",
      "tree": "cc6e70b04a2174edbaae0b3a598fe154d529ff10",
      "parents": [
        "f5551c2ac2a88f209155a373ecdf70470b466098"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Fri Aug 21 10:00:55 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Aug 21 10:00:55 2026 +0100"
      },
      "message": "feature(encryption): [17/N] Enable encrypted writes (#3018)\n\n* Enable encrypted writes\n\n* fix test\n\n* make encryption purge test parameterized\n\n* more catalogs\n\n* remove hms\n"
    },
    {
      "commit": "f5551c2ac2a88f209155a373ecdf70470b466098",
      "tree": "798da22b770699677069ce0b6643f3ca570dd3ee",
      "parents": [
        "c795a7add320909a1e25ad8d1815ff7d31bb5571"
      ],
      "author": {
        "name": "blackmwk",
        "email": "yxchang@amazon.com",
        "time": "Fri Aug 21 12:22:52 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Aug 21 12:22:52 2026 +0800"
      },
      "message": "refactor: Migrate TableProperties consumers to getters (#2989)\n\nReplace direct TableProperties field access throughout Iceberg and DataFusion with the generated read-only accessors, then make the backing fields private and update the public API snapshot.\\n\\nCloses #2969.\n"
    },
    {
      "commit": "c795a7add320909a1e25ad8d1815ff7d31bb5571",
      "tree": "9ff7a500e7e597ef35a1b598fecdb8063af8817b",
      "parents": [
        "b63c687217117038b37fed456f23c30bb55f0981"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Thu Aug 20 11:19:13 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Aug 20 11:19:13 2026 +0100"
      },
      "message": "refactor: Add manifest reader (#2884)\n\n* Refactor manifest reader into its own struct\n\n* pub api\n\n* make crate pub\n\n* remove doc\n\n* remove load method\n\n* fix up\n"
    },
    {
      "commit": "b63c687217117038b37fed456f23c30bb55f0981",
      "tree": "8a7826e9388586dae0c99487c04d9776f8f8daea",
      "parents": [
        "7297528f30c0590988c7c6b49d849aefc8cee47c"
      ],
      "author": {
        "name": "aarushigupta132",
        "email": "aarushig132@gmail.com",
        "time": "Tue Aug 18 09:44:58 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Aug 18 09:44:58 2026 +0100"
      },
      "message": "feat(encryption) [15/N] write encrypted parquet data files (#2701)\n\n* feat(encryption): write encrypted parquet data files\n\n* refactor(encryption): address review comments\n\n* refactor(encryption): route DEK generation through EncryptionManager\n\n* refactor(encryption): opt into encryption via with_encryption_manager\n\n* refactor(encryption): reword encryption doc comments\n\n* refactor(encryption): gate encryption on the encryption manager alone\n\n* refactor(encryption): drop redundant doc lines\n"
    },
    {
      "commit": "7297528f30c0590988c7c6b49d849aefc8cee47c",
      "tree": "2b8ad35cca083459f3502c0f0074078a31a10605",
      "parents": [
        "b3cdba005da017473adf174607c429aeaf520e9e"
      ],
      "author": {
        "name": "NoahKusaba",
        "email": "97474796+NoahKusaba@users.noreply.github.com",
        "time": "Tue Aug 11 03:39:26 2026 -0400"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Aug 11 03:39:26 2026 -0400"
      },
      "message": "fix (datafusion) IcebergWriteExec emits incorrect schema (#2975)\n\ninit\n"
    },
    {
      "commit": "b3cdba005da017473adf174607c429aeaf520e9e",
      "tree": "c7a51a4469f0d488c9377a6cc4dcb1eef8bd3a65",
      "parents": [
        "00ed3ee1ece249a91b41bf95b3f3d706251c7121"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Thu Aug 06 04:02:53 2026 -0600"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Aug 06 04:02:53 2026 -0600"
      },
      "message": "feat(parquet): wire in additional parquet writer settings (#2887)\n\n* feat(paquet): wire in additional parquet writer settings\n\n* fix compression level\n\n* fmt\n\n* move comments\n\n* move to codec mod\n\n* fmt\n"
    },
    {
      "commit": "00ed3ee1ece249a91b41bf95b3f3d706251c7121",
      "tree": "44663be822bb8a4c8736a96863f7fc18bcf20daf",
      "parents": [
        "500cb8c3fd188d73bc965be4fd83234f01c8d80c"
      ],
      "author": {
        "name": "Gustavo Schneiter",
        "email": "gustavomalleths@gmail.com",
        "time": "Fri Jul 24 17:09:34 2026 -0300"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jul 24 17:09:34 2026 -0300"
      },
      "message": "feat: add history metadata table (#2825)\n\n## Which issue does this PR close?\n\nPart of #823 (metadata tables tracking issue). Follows the pattern of\nthe existing `snapshots` and `manifests` tables.\n\n## What changes are included in this PR?\n\nAdds the `history` metadata table, mirroring Java\u0027s `HistoryTable`:\n\n- `HistoryTable` in `iceberg::inspect` with the Java schema exactly\n(field ids 1–4: `made_current_at` timestamptz, `snapshot_id`, nullable\n`parent_id`, `is_current_ancestor`).\n- One row per snapshot-log entry. `is_current_ancestor` is computed by\nwalking the current snapshot\u0027s parent chain — rolled-back snapshots stay\nvisible in the log but are flagged `false`, matching\n`SnapshotUtil.currentAncestorIds` semantics.\n- `parent_id` is null when the entry\u0027s snapshot has been expired,\nmatching Java\u0027s null guard.\n- The ancestor walk carries a cycle guard, so corrupt metadata with a\nparent cycle cannot hang the scan.\n- Registered in `MetadataTableType` and the DataFusion provider\n(`table$history`).\n\n## Are these changes tested?\n\n- `test_history_table_with_rolled_back_snapshot`: a table rolled back\nfrom S2 and re-committed as S3 (parent S1) — asserts S2 remains in\nhistory with `is_current_ancestor \u003d false` while S1/S3 stay `true`. This\nlineage divergence is what distinguishes `history` from `snapshots`.\n- The same test also covers expired-snapshot log entries (null\n`parent_id`, `false` ancestor flag) and a snapshot appearing twice in\nthe log (one row per entry).\n- `test_history_table`: schema + full-row assertions over the shared\nfixture.\n- DataFusion table listing and `SHOW TABLES` sqllogictest updated;\n`public-api.txt` regenerated.\n"
    },
    {
      "commit": "500cb8c3fd188d73bc965be4fd83234f01c8d80c",
      "tree": "de6c17639c451549519396715bd15b826e356ea8",
      "parents": [
        "0db700184067bc84c9f5ae11bd174611a5dfbbb7"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Fri Jul 17 09:30:05 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jul 17 09:30:05 2026 +0100"
      },
      "message": "chore(lint) check unused_qualifications (#2839)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\nWe have inconsistency across the repo when it comes to using\n`used_qualifications` which makes code harder to read and maintain in a\nconsistent style.\n\nI did an audit of some popular crate to see if other folks enforce this\nlint and I found that our friends in the Datafusion community do use\nthis https://github.com/apache/datafusion/pull/13086. But also aware\nthat repos like tokio choose not to.\n\n- Closes #.\n\n## What changes are included in this PR?\n\nThis PR adds `unused_qualifications \u003d \"deny\"` to the root `Cargo.toml`\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "0db700184067bc84c9f5ae11bd174611a5dfbbb7",
      "tree": "5ca2e7da50381c8fcea3461af57d7b05d7458b99",
      "parents": [
        "9596b5ac266e0d4d243b7e5a8963e3bdfa9b3a9a"
      ],
      "author": {
        "name": "Christian",
        "email": "christian@vakamo.com",
        "time": "Thu Jul 16 11:20:32 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Jul 16 11:20:32 2026 +0200"
      },
      "message": "feat: Variant Support (#2188)\n\n## Which issue does this PR close?\nVariant Support.\nArrow value support is currently missing as I am unsure how we want to\nextend `Literal`\n\n## What changes are included in this PR?\n### Core: Variant Type\n- `crates/iceberg/src/spec/datatypes.rs` — new `Variant` type\n- `crates/iceberg/src/spec/values/literal.rs` — `Variant` literal value\n- `crates/iceberg/src/spec/schema/` — visitor, index, pruning, mod, id\nreassigner all handle `Variant`\n- `crates/iceberg/src/spec/table_metadata.rs` — metadata support\n\n### Avro\n- `crates/iceberg/src/avro/schema.rs` — read/write `Variant` in Avro\n\n### Arrow\n- `crates/iceberg/src/arrow/schema.rs` — map `Variant` to Arrow type\n- `crates/iceberg/src/arrow/reader.rs` — read `Variant` from Arrow\n- `crates/iceberg/src/arrow/value.rs` — Arrow value conversion\n- Minor fixes in `caching_delete_file_loader.rs` and\n`nan_val_cnt_visitor.rs`\n\n### Parquet\n- `crates/iceberg/src/writer/file_writer/parquet_writer.rs` — write\n`Variant` columns\n\n### Tests \u0026 Dev\n- `crates/integration_tests/tests/read_variant.rs` — new integration\ntest for reading Variant data\n- `dev/spark/provision.py` — Spark provisioning to generate Variant test\ndata\n\n## Are these changes tested?\nSure! Even integration tested :)\n\n---------\n\nCo-authored-by: Shawn Chang \u003cyxchang@amazon.com\u003e\n"
    },
    {
      "commit": "9596b5ac266e0d4d243b7e5a8963e3bdfa9b3a9a",
      "tree": "1370744493bd8af483273d332235584d58b1536f",
      "parents": [
        "04fedf0d65bc5c7ac2d45f751471bfbeac5141c6"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Wed Jul 08 00:02:50 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jul 08 00:02:50 2026 +0100"
      },
      "message": "chore(deps): Bump DataFusion to 54.0.0 (#2648)\n\n## Which issue does this PR close?\n\nDataFusion to 54.0.0 was recently released, we should try and track\nlatests releases.\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\n\n[ExecutionPlan](https://github.com/apache/datafusion/pull/21263)\n[TableProvider, SchemaProvider, CatalogProvider,\nCatalogProviderList](https://github.com/apache/datafusion/pull/21346)\nand [PhysicalExpr](https://github.com/apache/datafusion/pull/21573) have\nall had their `as_any` removed from the trait. That\u0027s really the only\nchange needed here. [Upgrade guide documents\nthis](https://datafusion.apache.org/library-user-guide/upgrading/54.0.0.html#remove-as-any-from-physicalexpr-scalarudfimpl-aggregateudfimpl-windowudfimpl-executionplan-tableprovider-schemaprovider-catalogprovider-catalogproviderlist-tablesource-filesource-fileformat-fileformatfactory-datasource-and-datasink)\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "04fedf0d65bc5c7ac2d45f751471bfbeac5141c6",
      "tree": "8f900fc1de46e1e9ab4d188b09ce18fdc9918a0c",
      "parents": [
        "d945f8b83564a914882addf077eb37bb5764dca9"
      ],
      "author": {
        "name": "Daniel Carl Jones",
        "email": "djonesoa@amazon.com",
        "time": "Tue Jul 07 18:04:08 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jul 07 18:04:08 2026 +0100"
      },
      "message": "chore: Update changelog for 0.10.0 (#2782)\n\n## What changes are included in this PR?\n\nUpdate changelog and dependency files for 0.10.0 release (RC3).\n\n0.10.0 tracking: https://github.com/apache/iceberg-rust/issues/2527\n\n## Are these changes tested?\n\nN/A\n"
    },
    {
      "commit": "d945f8b83564a914882addf077eb37bb5764dca9",
      "tree": "ccf4ecdbe37c3fc9e806fa6d38545ceaf9559db6",
      "parents": [
        "27ce1149d28da601db81ec4ab35512ae418e8b67"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Wed Jul 01 01:45:19 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jul 01 01:45:19 2026 +0200"
      },
      "message": "feat(writer): honor write.parquet.* via ParquetWriterBuilder::from_table_properties (#2561)\n\n## Which issue does this PR close?\n\nN/A — no tracking issue.\n\n## What changes are included in this PR?\n\nOnly the DataFusion `INSERT INTO` path honored `write.parquet.*` table\nproperties, and only the content-defined-chunking (CDC) keys, via a\nhand-rolled translation inlined in `IcebergWriteExec`. Anything writing\nthrough the writer stack directly (`DataFileWriter` →\n`ParquetWriterBuilder`) silently fell back to parquet-rs defaults.\n\nThis PR moves that translation behind a reusable constructor:\n\n- Add `ParquetWriterBuilder::from_table_properties(\u0026TableProperties,\nschema)`, the single place that maps `write.parquet.*` into\n`WriterProperties`. It currently translates the CDC keys\n(`write.parquet.content-defined-chunking.*`); other keys still fall back\nto parquet-rs defaults and can be added here later.\n- Add a chainable `with_match_mode` setter so the field match mode can\nbe overridden — DataFusion needs name-based matching since its Arrow\nbatches carry no field-id metadata.\n- Refactor the DataFusion `insert_into` writer to build via\n`from_table_properties`, reusing the `TableProperties` it already parses\nand dropping the inline CDC translation.\n\nAdditive only: `new` and `new_with_match_mode` are unchanged; no\nbreaking changes.\n\n## Are these changes tested?\n\n- Unit tests in `parquet_writer.rs`: CDC is off by default, and CDC\nproperties propagate through `build()` to the writer\u0027s\n`WriterProperties` — asserted on the getter rather than by re-reading a\nwritten file, so future `write.parquet.*` options only need an assertion\non their corresponding getter.\n- Existing `test_insert_into*` DataFusion integration tests cover the\nrefactored path, which is behaviorally unchanged.\n"
    },
    {
      "commit": "27ce1149d28da601db81ec4ab35512ae418e8b67",
      "tree": "49bc2db7cf29ba0f1828a94182829b252f29f7f5",
      "parents": [
        "f0be0910344d9858083083662bfd3882b206f142"
      ],
      "author": {
        "name": "kid",
        "email": "lucian1412@outlook.com",
        "time": "Wed Jul 01 07:44:08 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jul 01 07:44:08 2026 +0800"
      },
      "message": "fix(datafusion): reject non-append insert operations (#2714)\n\n## Which issue does this PR close?\n\n- Closes #2711.\n\n## What changes are included in this PR?\n\nReject DataFusion `InsertOp::Overwrite` and `InsertOp::Replace` before\nconstructing an Iceberg write plan.\n\nPreviously, `IcebergTableProvider::insert_into` ignored the requested\ninsert operation while the commit executor always used `fast_append`.\nUnsupported overwrite or replace requests could therefore be silently\nexecuted with append semantics.\n\nThis patch keeps the existing append path unchanged and returns\n`DataFusionError::NotImplemented` for unsupported insert operations. It\npreserves the existing `_insert_op` parameter name to avoid changing the\ngenerated public API snapshot.\n\n## Are these changes tested?\n\nYes. Added unit tests verifying that:\n\n- `InsertOp::Overwrite` returns `DataFusionError::NotImplemented`.\n- `InsertOp::Replace` returns `DataFusionError::NotImplemented`.\n- Existing append-insert behavior remains unchanged.\n\nLocal verification:\n\n- `cargo test -p iceberg-datafusion test_catalog_backed_provider_rejects\n-- --nocapture`\n- `cargo fmt --all -- --check`\n- `git diff --check`\n"
    },
    {
      "commit": "f0be0910344d9858083083662bfd3882b206f142",
      "tree": "ed80226821e7e1738f3d67c7e6bca9e5ca8fd744",
      "parents": [
        "bcfccc5df9ecb27518868d1e22a1018a39288b57"
      ],
      "author": {
        "name": "kid",
        "email": "lucian1412@outlook.com",
        "time": "Wed Jul 01 07:43:15 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jul 01 07:43:15 2026 +0800"
      },
      "message": "fix(datafusion): return single row with count 0 for empty inserts (#2712)\n\nWhich issue does this PR close?\n-------------------------------\n\n* Closes #2713.\n\nWhat changes are included in this PR?\n-------------------------------------\n\nFix empty inserts in the DataFusion integration.\n\nWhen an `INSERT` produces no data files (e.g. `INSERT INTO ... SELECT\n... WHERE false`), `IcebergCommitExec` previously returned an empty\n`RecordBatch`. DataFusion expects a single-row count result for DML\nstatements, so this PR changes the empty-data path to return a batch\nwith count `0`.\n\nfor empty inserts, the code returns early when there are no data files,\nbefore it ever starts a transaction, so it will not create snapshot.\n\nAre these changes tested?\n-------------------------\n\nYes. Added tests verifying that:\n\n* Empty inserts return a single-row `UInt64` count batch with value `0`.\n* Existing insert tests continue to pass.\n\nLocal verification:\n\n* `cargo test -p iceberg-datafusion`\n* `cargo clippy -p iceberg-datafusion --all-targets -- -D warnings`\n* `cargo fmt --all -- --check`\n* `git diff --check`\n"
    },
    {
      "commit": "bcfccc5df9ecb27518868d1e22a1018a39288b57",
      "tree": "50c5438e2246a86bcd905bc501fb9c9816890bcf",
      "parents": [
        "56793fcb0bd0b8868ec6d2ea13c0d397a81dffde"
      ],
      "author": {
        "name": "Daniel Carl Jones",
        "email": "djonesoa@amazon.com",
        "time": "Tue Jun 30 00:12:35 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jun 30 00:12:35 2026 +0100"
      },
      "message": "chore: Update changelog and dependency lists for 0.10.0 (#2745)\n\n## Which issue does this PR close?\n\nN/A\n\n## What changes are included in this PR?\n\nUpdate changelog for us to cut 0.10.0-rc2.\n\n## Are these changes tested?\n\nNo, changelog update only.\n"
    },
    {
      "commit": "56793fcb0bd0b8868ec6d2ea13c0d397a81dffde",
      "tree": "0d97ff5fd90a628058e26cf64abd211d8e541078",
      "parents": [
        "5ecc2299d049d2a1a8436d941e269dca9679d37f"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "schang@apache.org",
        "time": "Wed Jun 24 19:31:20 2026 -0700"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jun 24 19:31:20 2026 -0700"
      },
      "message": "chore: Bump version to 0.10.0, update changelog (#2700)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- release tracking issue: #2527\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "5ecc2299d049d2a1a8436d941e269dca9679d37f",
      "tree": "0a3050817a61d128c2f8b28f710c56bbb6a0286b",
      "parents": [
        "97963eb84b10d8fa26e49a43f0ec1bac6e2630fb"
      ],
      "author": {
        "name": "Daniel Carl Jones",
        "email": "djonesoa@amazon.com",
        "time": "Fri Jun 19 22:52:11 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jun 19 22:52:11 2026 +0100"
      },
      "message": "chore: Move dependency list generation from a release task to a PR author responsibility (#2676)\n\n## Which issue does this PR close?\n\n- Closes #2675.\n\n## What changes are included in this PR?\n\nThis change moves the responsibility for dependency TSV file updates\nfrom the release manager to the PR author.\n\nCI is updated to enforce this and prompt the PR author on what to\nchange.\n\nNote, the check for licenses is already checked by CI and so I am\nremoving this from the release runbook also.\n\n## Are these changes tested?\n\nNo. I have updated the dependency TSV files based on the instruction,\nhowever I have not exercised the new CI workflow.\n"
    },
    {
      "commit": "97963eb84b10d8fa26e49a43f0ec1bac6e2630fb",
      "tree": "f5f6b8a0d760b84b9487723ed2113c6c1609f43f",
      "parents": [
        "d90995635f23ecd97785f46a948b2c2e47b5b1ef"
      ],
      "author": {
        "name": "Xin Huang",
        "email": "42597328+huan233usc@users.noreply.github.com",
        "time": "Tue Jun 16 14:48:21 2026 -0700"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jun 16 14:48:21 2026 -0700"
      },
      "message": "feat(datafusion): push down isnan over NaN-preserving numeric expressions (#2592)\n\n## Which issue does this PR close?\n\nPart of #2154.\n\n## What changes are included in this PR?\n\nPreviously, scalar-function pushdown only handled `isnan(...)` when the\nargument was a bare column reference; complex numeric arguments such as\n`isnan(qux + 1)` were silently dropped.\n\nThis PR adds `resolve_nan_preserving_reference`, which resolves an\n`isnan` argument down to a single column `Reference` through\ntransformations that preserve NaN-ness, so `isnan(\u003cexpr\u003e)` can be pushed\ndown as `\u003ccol\u003e IS NAN`:\n\n- negation `-x`\n- numeric casts (date casts still rejected)\n- `x + c`, `c + x`, `x - c`, `c - x` for a finite literal `c`\n- `x * c`, `c * x`, `x / c` for a finite, non-zero literal `c`\n- arbitrary nesting of the above (e.g. `isnan(-(qux + 1) * 3)`)\n\nResolving **scalar-function arguments** (e.g. `abs(x)`) is intentionally\nleft for a follow-up PR to keep this change small; `isnan(abs(x))` is\nnot pushed down here.\n\n### Why is this sound?\n\nFilter pushdown is reported as `Inexact`, so DataFusion re-applies the\noriginal predicate after scanning. The pushed-down predicate therefore\nonly needs to be implied by the original filter (it may match extra\nrows, but must never drop a matching one). Every supported\ntransformation keeps NaN-ness *exactly* equivalent — the result is NaN\niff the wrapped column is NaN — so both `isnan(...)` and `NOT\nisnan(...)` remain correct.\n\nCases that do **not** preserve NaN-ness are intentionally rejected (and\ncovered by tests): `x * 0` / `x / 0` (`±inf * 0` is NaN), `c / x` (`0 /\n0` is NaN), and multi-column expressions.\n\n## Are these changes tested?\n\nYes. Updated the existing `isnan(qux + 1)` \"unsupported\" test and added\nunit tests covering negation, additive and multiplicative forms, nested\nexpressions, combination with other predicates, and the\nrejected/deferred cases. All unit tests in `expr_to_predicate` pass,\nalong with `clippy` and `rustfmt`.\n"
    },
    {
      "commit": "d90995635f23ecd97785f46a948b2c2e47b5b1ef",
      "tree": "96e2c90c76b259f4f47206d79d8c0c3133538ece",
      "parents": [
        "92ac288790e19587c4b9e9a3d80f99067cef55b4"
      ],
      "author": {
        "name": "Daniel Carl Jones",
        "email": "djonesoa@amazon.com",
        "time": "Tue Jun 16 04:11:10 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jun 16 04:11:10 2026 +0100"
      },
      "message": "chore: Bump MSRV to 1.94 (#2652)\n\n## Which issue does this PR close?\n\nN/A\n\nUpdating MSRV ahead of 0.10 release. #2527\n\n## What changes are included in this PR?\n\nBump the MSRV for the crates, as well as the Rust toolchain used for\nClippy and Rustfmt checks.\n\nNew Clippy warnings are addressed in this PR.\n\n## Are these changes tested?\n\nNo additional checks beyond CI.\n"
    },
    {
      "commit": "92ac288790e19587c4b9e9a3d80f99067cef55b4",
      "tree": "75654bf56845764a6e74ee7f62d85c14dc6b6e6f",
      "parents": [
        "a7a84b1c3d7bf2ca40b78ff95e883cad94552be3"
      ],
      "author": {
        "name": "Sreesh Maheshwar",
        "email": "maheshwarsreesh@gmail.com",
        "time": "Thu Jun 11 23:40:21 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Jun 11 23:40:21 2026 +0100"
      },
      "message": "refactor!(writer): borrow TableMetadata in DefaultLocationGenerator::new (#2604)\n\n`DefaultLocationGenerator::new` took `TableMetadata` by value but only\never reads `.location()` and `.properties()` (both `\u0026self` accessors).\n\nTaking it by value forced every caller to deep-clone the whole\n`TableMetadata` just to satisfy the signature,.\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #2605.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\nChange the parameter to `\u0026TableMetadata` and drop the `.clone()` at each\ncall site, eliminating an unnecessary deep clone on the write path.\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\nN/A\n\n---------\n\nCo-authored-by: Sreesh Maheshwar \u003csmaheshwar@palantir.com\u003e\n"
    },
    {
      "commit": "a7a84b1c3d7bf2ca40b78ff95e883cad94552be3",
      "tree": "1d8511dcb0d53988025a4610e59f8159210ff32c",
      "parents": [
        "0a9a588deb039658de7057e68269dde14acac706"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Wed Jun 03 12:40:24 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jun 03 12:40:24 2026 +0100"
      },
      "message": "chore(refactor): add manifest list reader (#2541)\n\n## Which issue does this PR close?\nRefactor required for\n[PR](https://github.com/apache/iceberg-rust/pull/2453/changes) which\nadds a `ManifestListReader` which mirrors the current\n`ManifestListWriter`. This will allow us to carry the encryption manager\nhere also in the linked PR\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\nAdds a new public struct `ManifestListReader` which carries the things\nrequired to read a manifest list. Refactors call-sites to use this new\nstruct and adds a deprecation for the old method.\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "0a9a588deb039658de7057e68269dde14acac706",
      "tree": "a219ef9b42f0640153b32603db5f308e3c7eaa64",
      "parents": [
        "739f0a8d6f3bef6ac674c3fa960f2e20385955bf"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Mon Jun 01 12:39:48 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon Jun 01 12:39:48 2026 +0100"
      },
      "message": "chore(ci): omit blanket/auto-trait/auto-derived impls from public API (#2542)\n\nhttps://github.com/apache/iceberg-rust/pull/2525 introduced public-api\nfiles but after writing\nhttps://github.com/apache/iceberg-rust/pull/2541/changes I realised this\nmight be a little too noisy since it incudes all auto-trait like `Send`\n`Sync` etc.\n\nOptions are:\n* -s Omits blanket impls (From\u003cT\u003e, Into\u003cU\u003e, Borrow, Any, etc.)\n* -ss Also omits auto-trait impls (Send, Sync, Unpin, Freeze, etc.)\n* -sss Also omits auto-derived impls (Clone, Debug, Eq)\n\nI think -sss is enough for reviewers to be made aware of public API\nchanges without it being so noisy that we don\u0027t pay attention to the\nactual changes. Downside is it\u0027s less \"accurate\" in the sense that a PR\nmight introduce a change to the public API that wouldn\u0027t be caught in\nthese tests so there\u0027s some sort of balance we need to strike here.\nInterested to know what the community thinks.\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\n\nPass -sss to cargo-public-api to reduce noise in public-api.txt files.\nThis removes ~13k lines of auto-generated blanket impls, auto-trait\nimpls, and auto-derived impls that obscure actual API surface changes in\ndiffs.\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "739f0a8d6f3bef6ac674c3fa960f2e20385955bf",
      "tree": "0fdcda19972b2986ef4bd1128a88cd40b96948ff",
      "parents": [
        "6168a915bc8b4c1d7daddf3a8938d8d623b461ad"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Fri May 29 13:56:06 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri May 29 13:56:06 2026 +0100"
      },
      "message": "feat(ci): add cargo-public-api checks for public API stability (#2525)\n\nAdd infrastructure to track and enforce the public API surface of all\npublished crates. This catches unintentional breaking changes in PRs by\ndiffing the current API against committed lock files.\n\n- Add `public-api/` directory with lock files for 10 published crates\n- Add GitHub Actions workflow that runs on crate/dependency changes\n- Add `make generate-public-api` and `make check-public-api` targets\n- Exclude generated lock files from license header checks\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "6168a915bc8b4c1d7daddf3a8938d8d623b461ad",
      "tree": "fe7095288d91ad60f9cedf47741d587e5a5b1aa7",
      "parents": [
        "e63d4bd8eb3339dc09468a1af122c1be9696c20d"
      ],
      "author": {
        "name": "blackmwk",
        "email": "liurenjie1024@outlook.com",
        "time": "Mon May 25 23:57:08 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon May 25 23:57:08 2026 +0800"
      },
      "message": "Use cargo publish to publish crates (#2489)\n\n## Which issue does this PR close?\n\n- Closes #2488 .\n\n## What changes are included in this PR?\n\nInspired by #2485 , we add missing crates in publish workflow. But\ninstead of maintaining crates publishing order manually, we switch to\nuse `cargo publish --workspace` to publish crates.\n\n## Are these changes tested?\n\nRan `cargo publish --workspace --all-features --dry-run --no-verify\n--allow-dirty` locally.\n"
    },
    {
      "commit": "e63d4bd8eb3339dc09468a1af122c1be9696c20d",
      "tree": "c5c8c0cbb8e8a3be5d76984e83560774d63520db",
      "parents": [
        "adab7ae49c41bd10c42d5f1e0fa92de35e69e35c"
      ],
      "author": {
        "name": "Liang Gong",
        "email": "145010810+TwinklerG@users.noreply.github.com",
        "time": "Mon May 25 20:39:04 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon May 25 20:39:04 2026 +0800"
      },
      "message": "ci(toml): check toml fmt (#2504)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #2503\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\nTaplo fmt check is added in `check-fmt` target in `Makefile`.\n\nFormat all TOML files.\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\nYes.\n"
    },
    {
      "commit": "adab7ae49c41bd10c42d5f1e0fa92de35e69e35c",
      "tree": "d4eca2dee6386739227760af9e9e7f10e45efcd8",
      "parents": [
        "ed9d511d59b8c967765e6af6a075eeaa5622d69e"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Thu May 21 10:02:11 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu May 21 10:02:11 2026 +0200"
      },
      "message": "feat: HuggingFace Hub storage backend and CDC table properties (#2375)\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\nAdds two opt-in capabilities for storing Iceberg tables on HuggingFace\nHub with content-defined chunking for efficient deduplication.\n\n### HuggingFace Hub storage\n\nNew `opendal-hf` feature on `iceberg-storage-opendal` (off by default,\nincluded in `opendal-all`) that wires HuggingFace\u0027s OpenDAL service into\n`FileIO`. Paths use the form:\n\n`hf://\u003crepo_type\u003e/\u003cowner\u003e/\u003crepo\u003e[@\u003crevision\u003e]/\u003cpath_in_repo\u003e`\n\nwhere `repo_type` must be one of `models`, `datasets`, `spaces`, or\n`buckets`. The prefix is mandatory. Configuration via `FileIOBuilder`\nproperties:\n- `hf.token` — API token (required for private repos / writes)\n- `hf.endpoint` — Hub endpoint, defaults to https://huggingface.co\n- `hf.revision` — fallback revision when a path has no `@\u003crevision\u003e`\n\n`OpenDalResolvingStorage` recognises the `hf` scheme and lazily\nconstructs a per-scheme storage instance. `delete_stream` groups paths\nby `\u003crepo_type\u003e/\u003crepo_id\u003e` so bucket and dataset paths to the same repo\ndo not share an operator.\n\n### CDC (content-defined chunking) table properties\n\nNew table properties under `write.parquet.content-defined-chunking.*`\n(matching PyIceberg convention):\n- `write.parquet.content-defined-chunking.enabled` (bool, default false)\n- `write.parquet.content-defined-chunking.min-chunk-size` (bytes,\ndefault 256 KiB)\n- `write.parquet.content-defined-chunking.max-chunk-size` (bytes,\ndefault 1 MiB)\n- `write.parquet.content-defined-chunking.norm-level` (i32, default 0)\n\nCDC activates only when `enabled \u003d \"true\"` is set explicitly. Defaults\nmatch parquet\u0027s own `CdcOptions` defaults. CDC options are applied in\nthe DataFusion physical write plan.\n\n## Are these changes tested?\n\n- Rust unit tests for `HfUri` parsing and CDC property parsing.\n- Rust integration tests in `file_io_hf_test.rs` guarded on\n`HF_OPENDAL_TOKEN`, `HF_OPENDAL_BUCKET`, `HF_OPENDAL_DATASET`; tests\nskip gracefully when env vars are unset.\n- Python tests in `test_huggingface_and_cdc.py` covering CDC property\npersistence, PyIceberg writes with CDC, DataFusion read-back, and HF\ncredentials end-to-end (skipped without `HF_OPENDAL_TOKEN` /\n`HF_OPENDAL_TABLE_METADATA`).\n"
    },
    {
      "commit": "ed9d511d59b8c967765e6af6a075eeaa5622d69e",
      "tree": "d98aa57ebc9da197a1ac61305430aab1dc94b7df",
      "parents": [
        "9f3c9d7622085a337ee10fa7c6830fd46a169bcd"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "schang@apache.org",
        "time": "Sat May 16 02:25:19 2026 -0700"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Sat May 16 02:25:19 2026 -0700"
      },
      "message": "feat!(runtime): Support custom Runtime in Catalog (#2308)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #1958\n\n## What changes are included in this PR?\n- Introduced RuntimeHandle\n- Refactored Runtime to compose two RuntimeHandles: one for IO-bound\nwork (io()) and one for CPU-bound work (cpu()).\n- Added `with_runtime` to `CatalogBuilder` trait\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\nYes\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\n---------\n\nCo-authored-by: blackmwk \u003cliurenjie1024@outlook.com\u003e\n"
    },
    {
      "commit": "9f3c9d7622085a337ee10fa7c6830fd46a169bcd",
      "tree": "40636908b12a782eb37058da1cc7f4dc9357a01d",
      "parents": [
        "37e6b40f8e5ac9df05005fe7e3ab58fbb10e1a43"
      ],
      "author": {
        "name": "Liang Gong",
        "email": "145010810+TwinklerG@users.noreply.github.com",
        "time": "Thu May 07 19:14:22 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu May 07 19:14:22 2026 +0800"
      },
      "message": "fix(tests): remove unnecessary `.to_string()` calls for metadata_location (#2407)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\nNo related issue. Just some simple fixes for unnecessary `.to_string()`\ncalls.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\nRemove some redundant `to_string()` calls in `mod tests` for method\n`metadata_location`.\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\nSure.\n"
    },
    {
      "commit": "37e6b40f8e5ac9df05005fe7e3ab58fbb10e1a43",
      "tree": "0ae70c11dde2708a0a897b766919b520144cc85d",
      "parents": [
        "3450c56d74d503246fb9adfedf6b23dd3cb45ebe"
      ],
      "author": {
        "name": "Charles-Antoine Leger",
        "email": "charlesantoine.leger@datadoghq.com",
        "time": "Mon May 04 18:45:56 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon May 04 18:45:56 2026 +0200"
      },
      "message": "fix(sqllogictest): add missing tokio `rt-multi-thread` feature (#2386)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #2385 .\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n`crates/sqllogictest/Cargo.toml` was missing the `rt-multi-thread`\nfeature for tokio, while `tests/sqllogictests.rs` calls\n`tokio::runtime::Builder::new_multi_thread()` which requires it.\n\nThis meant `cargo test -p iceberg-sqllogictest` failed to compile when\nrun in isolation. The issue was invisible when using `make build`\n(`--all-features --workspace`) because `crates/examples` already enables\n`tokio \u003d { features \u003d [\"full\"] }`, and Cargo features are additive\nacross the workspace graph.\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\n```sh\ncargo test -p iceberg-sqllogictest\n```\n"
    },
    {
      "commit": "3450c56d74d503246fb9adfedf6b23dd3cb45ebe",
      "tree": "c1381405c8a83f19c7e8fb0155f9dc0d97599234",
      "parents": [
        "73e93119f737fc5c35acd860b08fc574e7a3ff82"
      ],
      "author": {
        "name": "Charles-Antoine Leger",
        "email": "ca@leger.email",
        "time": "Thu Apr 23 11:40:46 2026 +0200"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Apr 23 11:40:46 2026 +0200"
      },
      "message": "feat(datafusion): show pushed-down limit in IcebergTableScan EXPLAIN output (#2360)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #2359.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\nEmit ` limit:[N]` in `IcebergTableScan`\u0027s `DisplayAs` output when a\n`LIMIT` is pushed down to the scan. When no limit is pushed down, the\noutput is unchanged.\n\n- Before (unchanged):\n`IcebergTableScan projection:[id,name] predicate:[...]`\n\n- After (new, only when a limit reaches the scan):\n`IcebergTableScan projection:[...] predicate:[] limit:[3]`\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\nYes: new `EXPLAIN ... LIMIT 3` assertion in\n`crates/sqllogictest/testdata/slts/df_test/basic_queries.slt`. Existing\nsnapshots are unchanged, which confirms the additive-only behavior.\n"
    },
    {
      "commit": "73e93119f737fc5c35acd860b08fc574e7a3ff82",
      "tree": "1c6bd04ddfca8914b93840a8ff8fc26180263fe2",
      "parents": [
        "ce887d8a48a8a6917fd9a5f7dbc892f02fe30628"
      ],
      "author": {
        "name": "Den",
        "email": "ssdenis99@gmail.com",
        "time": "Mon Mar 30 12:11:37 2026 +0300"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon Mar 30 12:11:37 2026 +0300"
      },
      "message": "Make `convert_filters_to_predicate` public (#2118)\n\n## What changes are included in this PR?\n\n- Make `convert_filters_to_predicate` public in the DataFusion\nintegration to allow external usage of the filter conversion logic.\n\n## Are these changes tested?\n\n- This is a visibility change (`pub use`) and does not introduce new\nlogic.\n\nCo-authored-by: Denis Semenov \u003cd.s.semenov@vkteam.ru\u003e\n"
    },
    {
      "commit": "ce887d8a48a8a6917fd9a5f7dbc892f02fe30628",
      "tree": "494d1aa6b819ae19bb3d56ef17830ecd702f6e92",
      "parents": [
        "9c64d7882a4fcfdb81ba7b9949251bc0ac807997"
      ],
      "author": {
        "name": "Matt Butrovich",
        "email": "mbutrovich@users.noreply.github.com",
        "time": "Wed Mar 25 13:43:06 2026 -0400"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Mar 25 13:43:06 2026 -0400"
      },
      "message": "deps: upgrade DataFusion to 53.0, Arrow to 58 (#2206)\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\n- Bump DataFusion to 53.0.0, Arrow/Parquet to 58, sqllogictest to 0.29,\npyo3 to 0.28.\n- Adapt to DataFusion 53 API changes in physical plan executors and\npython bindings.\n- Update SLT expected test output.\n\n## Are these changes tested?\n\nExisting tests.\n\n---------\n\nCo-authored-by: Xander \u003czander181@googlemail.com\u003e\n"
    },
    {
      "commit": "9c64d7882a4fcfdb81ba7b9949251bc0ac807997",
      "tree": "8ce65156e0ee39a65ad0acc9498d8b0ff0a61b06",
      "parents": [
        "96e4210822abb3c56c607ce9672734c33720afdf"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "yxchang@amazon.com",
        "time": "Mon Mar 09 17:22:08 2026 -0700"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon Mar 09 17:22:08 2026 -0700"
      },
      "message": "chore: Bump version to 0.9.0, update dep list and changelog (#2223)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- A part of release work: #2213\n\n## What changes are included in this PR?\n- Version bump to 0.9.0\n- Update dep list\n- Update CHANGELOG.md\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\nNA\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "96e4210822abb3c56c607ce9672734c33720afdf",
      "tree": "e7452380f85417506906a3e42e2bfa91e3a4a4dc",
      "parents": [
        "bb45037c30790cc249922beb668595d5bc864e9e"
      ],
      "author": {
        "name": "Xander",
        "email": "zander181@googlemail.com",
        "time": "Thu Mar 05 00:38:41 2026 +0000"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Mar 05 00:38:41 2026 +0000"
      },
      "message": "chore: Update MSRV to 1.91.0 (#2204)\n\n## Which issue does this PR close?\nhttps://github.com/apache/iceberg-rust/pull/2199 requires a bump to MSRV\n1.91.0. This version is within the policy of this project.\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "bb45037c30790cc249922beb668595d5bc864e9e",
      "tree": "2cc0762a4f2ac2b76f221e29cf74d52754c65dee",
      "parents": [
        "4a98359a36ffdb84452c5e75448261f8e9156623"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "yxchang@amazon.com",
        "time": "Tue Mar 03 20:06:20 2026 -0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Mar 03 20:06:20 2026 -0800"
      },
      "message": "feat!(storage): Integration Storage trait with FileIO (#2116)\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- This depends on #2109\n- Closes #2058\n\n## What changes are included in this PR?\n- Update `FileIO` to hold `dyn Storage` instead of `OpenDalStorage`\n- Update `FileIOBuilder` accordingly\n- Removed `Extensions` from `FileIO`\n- Add `with_storage_factory` in `CatalogBuilder` and update all\nimplementations accordingly\n- Add an optional `dyn StorageFactory` to `IcebergTableProviderFactory`\n- Update other FileIOBuilder usages accordingly\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\nMostly rely on the existing tests, added some uts for FileIOBuilder\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n"
    },
    {
      "commit": "4a98359a36ffdb84452c5e75448261f8e9156623",
      "tree": "e9d365d8333b6dbeb50135ba286c642ac7a61728",
      "parents": [
        "f1147b239d3da431deccd96f54a08f774b3bc39a"
      ],
      "author": {
        "name": "Ethan Urbanski",
        "email": "ethanurbanski@gmail.com",
        "time": "Thu Feb 26 15:11:42 2026 -0500"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Feb 26 15:11:42 2026 -0500"
      },
      "message": "chore(deps): upgrade to DataFusion 52 (#1997)\n\n## Which issue does this PR close?\n\nValidates and adopts DataFusion 52\n\n## What changes are included in this PR?\n- Upgrade DataFusion integration from 51.x to 52.x\n- Keep the DataFusion Python dependency dynamic within major version 52\n- Update the Python FFI table provider bridge for DataFusion 52 API/ABI\nexpectations:\n  - session-aware `__datafusion_table_provider__(session)` integration\n- DF52 compatible FFI table provider construction with task context and\nlogical codec handling\n- Update sqllogictest physical plan expectations for DataFusion 52\nplanner output changes\n- Refresh lockfiles impacted by the upgrade\n\n###  DataFusion FFI API change\n\nDataFusion 52 expanded table provider FFI construction to include task\ncontext and optional logical codec parameters.\n\nUpdated the Rust/Python bridge accordingly allowing filter/logical\nexpression serialization remains compatible across the FFI boundary.\n\n## Are these changes tested?\nYes\n\n---------\n\nSigned-off-by: Ethan Urbanski \u003cethan@urbanskitech.com\u003e\n"
    },
    {
      "commit": "f1147b239d3da431deccd96f54a08f774b3bc39a",
      "tree": "06d227a157a3102c4d4de806406d07ff409ae98f",
      "parents": [
        "477620229f80aad19abafe113b9fe3c6703b67d8"
      ],
      "author": {
        "name": "Kaiqi Dong",
        "email": "kaiqidong1991@gmail.com",
        "time": "Thu Feb 26 02:38:34 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Feb 26 02:38:34 2026 +0100"
      },
      "message": "feat(datafusion): support isnan predicate pushdown to Iceberg (#2142)\n\n## Which issue does this PR close?\n\nPart of the ongoing effort to improve predicate pushdown coverage in the\nDataFusion integration.\n\n- Closes #2143\n\n## What changes are included in this PR?\n\nThis PR adds support for pushing down `isnan()` predicates from\nDataFusion to Iceberg\u0027s native `IsNan` / `NotNan` predicate operators.\n\nIn DataFusion, `isnan()` is represented as a scalar function\n(`Expr::ScalarFunction`) rather than a dedicated `Expr` variant (unlike\n`IsNull` / `IsNotNull`). This PR introduces a new\n`scalar_function_to_iceberg_predicate` helper in `expr_to_predicate.rs`\nthat matches scalar functions by name at runtime and converts\n`isnan(col)` into `Predicate::Unary(IsNan, col)`.\n\nNegation (`NOT isnan(col)`) is handled automatically: the existing\n`Expr::Not` arm wraps the result in `Predicate::Not(...)`, and Iceberg\u0027s\ndownstream `rewrite_not` visitor normalizes it into\n`Predicate::Unary(NotNan, col)`.\n\nThis enables file pruning using `nan_value_counts` in manifest metadata\nfor float/double columns, as defined in the [Iceberg spec — Manifest\nFiles: field summaries and column\nstatistics](https://iceberg.apache.org/spec/#manifests).\n\n## Are these changes tested?\n\nYes\n"
    },
    {
      "commit": "477620229f80aad19abafe113b9fe3c6703b67d8",
      "tree": "ce0dad5431b87a281419e0735c2143686413717a",
      "parents": [
        "53b6318aafe3f0b9fe54c60089a3f6b804c47aa6"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Tue Feb 24 06:07:38 2026 +0530"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Feb 24 06:07:38 2026 +0530"
      },
      "message": "feat(playground): add memory catalog support (#2121)\n\n## Which issue does this PR close?\n\n- Closes https://github.com/apache/iceberg-rust/issues/1160\n\n## What changes are included in this PR?\n\n- Added MemoryCatalogBuilder\n- Changed the return to use the already-Arc-wrapped catalog\n- Replaced the hardcoded rest-only check with a match statement: Easy\nextensibility (just add a new match arm for new catalog types)\n\n## Are these changes tested?\n\nAfter build :\n```\n\n$ cargo build -p iceberg-playground --release\n\n$ cat ~/.icebergrc\n[[catalogs]]\nname \u003d \"local\"\ntype \u003d \"memory\"\n[catalogs.config]\nwarehouse \u003d \"/tmp/iceberg-warehouse\"\n\n$ ./target/release/iceberg-playground --rc /path/to/config.toml\n\n```\n"
    },
    {
      "commit": "53b6318aafe3f0b9fe54c60089a3f6b804c47aa6",
      "tree": "e0019e61d8e36fc43807c5c9052306912ee8a9ac",
      "parents": [
        "1c41515ff5642d57a64f70c6299f1a45bd6399f2"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Fri Jan 30 14:12:09 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jan 30 14:12:09 2026 +0800"
      },
      "message": "feat(datafusion): Add Timestamp scalar value conversion for predicate pushdown (#2069)\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\nAdd support for converting DataFusion Timestamp scalar values to Iceberg\nDatum for predicate pushdown. This enables timestamp literal comparisons\nto be pushed down to the storage layer when DataFusion provides\ntimestamp literals in ScalarValue form, improving query performance.\n\nChanges:\n- Add conversion for 2 timestamp time units (Microsecond, Nanosecond) to\nIceberg\u0027s native representations\n- Add comprehensive unit tests covering all time units and edge cases\n- Add sqllogictest (timestamp_predicate_pushdown.slt) to validate\nend-to-end timestamp predicate filtering and pushdown behavior\n\nImplementation details:\n- Iceberg uses microseconds and nanoseconds as the native timestamp\nrepresentations\n- Timezone information in ScalarValue is preserved but not used in\nconversion (Iceberg timestamp type is timezone-agnostic)\n\n## Are these changes tested?\n\n---------\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1c41515ff5642d57a64f70c6299f1a45bd6399f2",
      "tree": "352adb4807f511252b96ba9cde86ab2a272258fc",
      "parents": [
        "2308f551d40f6f1439e4bd7251ab1208ee3ac5c5"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Fri Jan 30 08:18:26 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jan 30 08:18:26 2026 +0800"
      },
      "message": "feat(datafusion): Add Boolean predicate pushdown support (#2082)\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\nThis commit adds comprehensive support for pushing down Boolean\npredicates to the Iceberg table scan layer, improving query performance\nby filtering data at the storage level.\n\nChanges:\n- Enhanced expr_to_predicate.rs to handle boolean column expressions:\n* Bare boolean columns in filters (e.g., WHERE is_active) are converted\nto column \u003d true predicates\n* NOT of boolean columns (e.g., WHERE NOT is_active) are converted to\ncolumn \u003d false predicates\n  * Added Boolean scalar value to Datum conversion\n- Added comprehensive sqllogictest (boolean_predicate_pushdown.slt)\nwith:\n  * Tests for is_active \u003d true/false with EXPLAIN verification\n  * Tests for is_active !\u003d true with EXPLAIN verification\n  * Tests for combined predicates (AND/OR)\n  * Tests for IS NULL/IS NOT NULL on boolean columns\n- Created test_boolean_table in engine setup for testing\n- Updated test schedule and show_tables baseline\n\nAll tests verify that predicates are successfully pushed down to\nIcebergTableScan, not just executed in FilterExec.\n\n## Are these changes tested?\n\n---------\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "2308f551d40f6f1439e4bd7251ab1208ee3ac5c5",
      "tree": "ac4449266f205ed2003ca1441b10055fc2d88d08",
      "parents": [
        "d8f42fa5760cd3009d1cb011c863c36a45222e6b"
      ],
      "author": {
        "name": "Renjie Liu",
        "email": "liurenjie2008@gmail.com",
        "time": "Thu Jan 29 13:02:34 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Thu Jan 29 13:02:34 2026 +0800"
      },
      "message": "Split sqllogictests into different schedule (#2085)\n\n## Which issue does this PR close?\n\n- Closes #2084 .\n\n## What changes are included in this PR?\n\nSplit sqllogictests into different schedules to run in parallel.\n\n## Are these changes tested?\n\nYes, ci.\n"
    },
    {
      "commit": "d8f42fa5760cd3009d1cb011c863c36a45222e6b",
      "tree": "cad0ea9f703aeaf9011cd50cb171e2354145ed9c",
      "parents": [
        "b9705eddbbd9a0a26f858f377a20e094d6639d2d"
      ],
      "author": {
        "name": "Renjie Liu",
        "email": "liurenjie2008@gmail.com",
        "time": "Wed Jan 28 12:23:50 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jan 28 12:23:50 2026 +0800"
      },
      "message": "Cleanup integration tests (#2074)\n"
    },
    {
      "commit": "b9705eddbbd9a0a26f858f377a20e094d6639d2d",
      "tree": "22c6b81ab0a78b3f7202ab27c0b8d0f4a45210b0",
      "parents": [
        "dc560e4d3077fb98ac196cc438058a9a1c28c6fb"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Mon Jan 26 19:03:58 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Mon Jan 26 19:03:58 2026 +0800"
      },
      "message": "feat(datafusion): Add LIKE predicate pushdown for StartsWith patterns (#2014)\n\nImplement pushdown for LIKE predicates with simple prefix patterns\n(e.g., \u0027prefix%\u0027) to Iceberg\u0027s StartsWith operator. This optimization\nallows filtering to be performed at the storage layer, significantly\nimproving query performance for prefix searches.\n\nChanges:\n- Add support for Expr::Like in predicate conversion\n- Convert LIKE \u0027prefix%\u0027 patterns to StartsWith operator\n- Convert NOT LIKE \u0027prefix%\u0027 patterns to NotStartsWith operator\n- Handle edge cases: empty prefix, unicode, special characters\n- Reject complex patterns that cannot be pushed down (wildcards in\nmiddle, underscore, ILIKE)\n- Add 8 comprehensive unit tests covering various scenarios\n\nImplementation details:\n- Only simple prefix patterns ending with % are converted\n- Patterns with % or _ wildcards in the prefix are not pushed down\n- Case-insensitive LIKE (ILIKE) is not supported for pushdown\n- Escape characters are not supported for pushdown\n- Works seamlessly with other predicates in AND/OR expressions\n\n## Which issue does this PR close?\n\n\u003c!--\nWe generally require a GitHub issue to be filed for all bug fixes and\nenhancements and this helps us generate change logs for our releases.\nYou can link an issue to this PR using the GitHub syntax. For example\n`Closes #123` indicates that this PR will close issue #123.\n--\u003e\n\n- Closes #.\n\n## What changes are included in this PR?\n\n\u003c!--\nProvide a summary of the modifications in this PR. List the main changes\nsuch as new features, bug fixes, refactoring, or any other updates.\n--\u003e\n\n## Are these changes tested?\n\n\u003c!--\nSpecify what test covers (unit test, integration test, etc.).\n\nIf tests are not included in your PR, please explain why (for example,\nare they covered by existing tests)?\n--\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Renjie Liu \u003cliurenjie2008@gmail.com\u003e\n"
    },
    {
      "commit": "dc560e4d3077fb98ac196cc438058a9a1c28c6fb",
      "tree": "a35a04558021530030642dfcf7f87e33d19a95a3",
      "parents": [
        "95267d58d950c737ac2eeeff083294cf65384d09"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "yxchang@amazon.com",
        "time": "Wed Jan 21 17:16:19 2026 -0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jan 21 17:16:19 2026 -0800"
      },
      "message": "feat(datafusion): Add support for DROP TABLE (#2033)\n\n## Which issue does this PR close?\n\n- Closes #2060\n\n## What changes are included in this PR?\n- Support DROP TABLE syntax by implementing\n`SchemaProvider::deregister_table`\n\n## Are these changes tested?\nAdded sqllogictests\n"
    },
    {
      "commit": "95267d58d950c737ac2eeeff083294cf65384d09",
      "tree": "0e206fb5b0fc14759ad3be78409b31b046d8fe10",
      "parents": [
        "882d9b772c554f2689e1f86648131ba4fa3a9af9"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Wed Jan 21 09:01:26 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Wed Jan 21 09:01:26 2026 +0800"
      },
      "message": "feat(datafusion): Add Binary scalar value conversion for predicate pushdown (#2048)\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\nAdd support for converting Binary and LargeBinary DataFusion ScalarValue\ntypes to Iceberg Datum, enabling binary predicates to be pushed down to\nthe Iceberg storage layer.\n\nThis conversion allows SQL queries with binary hex literals (X\u0027...\u0027) to\npush predicates down to Iceberg, improving query performance by\nfiltering data at the storage level rather than in DataFusion.\n\nThe integration test verifies that binary predicates are successfully\npushed down end-to-end:\n- Without conversion: predicate stays in FilterExec with predicate:[]\n- With conversion: predicate pushed to IcebergTableScan\n\nOther scalar types (Boolean, Timestamp, Decimal) were investigated but\nexcluded because they are not reachable through practical usage:\n- Boolean: DataFusion aggressively optimizes comparisons (e.g., x\u003dtrue\nbecomes just x) before reaching the converter\n- Timestamp/Decimal: SQL literals are converted to strings/other types\nbefore reaching the converter\n\n## Are these changes tested?\n\n---------\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "882d9b772c554f2689e1f86648131ba4fa3a9af9",
      "tree": "c97544b7c0edeaa88b017e9e2ffa64cf55fa39cd",
      "parents": [
        "d38e42f2e53b7c164fc777c70a0dcfa475ba0479"
      ],
      "author": {
        "name": "Shawn Chang",
        "email": "yxchang@amazon.com",
        "time": "Tue Jan 13 16:00:03 2026 -0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jan 13 16:00:03 2026 -0800"
      },
      "message": "feat(datafusion): Support `CREATE TABLE` for DataFusion (#1972)\n\n## Which issue does this PR close?\n\n- Closes #1905\n\n## What changes are included in this PR?\n- Implement `register_table` in `IcebergSchemaProvider`\n- Added a new slt: `create_table.slt`\n- Updated existing slts\n\nNote: This does NOT cover the syntax `CREATE TABLE ... AS VALUES`\n\n## Are these changes tested?\nYes\n"
    },
    {
      "commit": "d38e42f2e53b7c164fc777c70a0dcfa475ba0479",
      "tree": "1881e5cb185caabc03f491380500736783486937",
      "parents": [
        "919c28d1b4eb42642b0542395543a98f1e194184"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Tue Jan 13 09:58:37 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Tue Jan 13 09:58:37 2026 +0800"
      },
      "message": "feat(datafusion): Add schema validation for partition projection (#2008)\n\nImplement schema validation in project_with_partition to ensure the\ninput schema matches the Iceberg table schema before calculating\npartition values. This prevents subtle bugs from schema mismatches and\nprovides clear error messages when schemas don\u0027t match.\n\nChanges:\n- Add helper functions to recursively strip metadata from Arrow schemas\n- Implement schema validation that compares input schema with expected\nIceberg table schema, ignoring metadata differences\n- Add comprehensive tests for metadata stripping and schema validation\n- Closes #1752\n\nThe implementation follows the approach suggested in issue #1752:\n- Recursively visits schema and removes metadata from all fields\n- Compares cleaned schemas using Arrow\u0027s built-in equality operator\n- Returns helpful error messages showing both schemas on mismatch\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\n## Are these changes tested?\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "919c28d1b4eb42642b0542395543a98f1e194184",
      "tree": "27b40199dafeb8b2c1d438b396171a0bc6ef6077",
      "parents": [
        "3c2d10833a4af82c1ee8929573f96c43b71a7788"
      ],
      "author": {
        "name": "Nathan Metzger",
        "email": "39155588+xbattlax@users.noreply.github.com",
        "time": "Sat Jan 10 02:37:18 2026 +0100"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Sat Jan 10 02:37:18 2026 +0100"
      },
      "message": "feat(spec): add table_properties() method to TableMetadata (#2002)\n\n## Summary\n\nAdd a type-safe accessor method `table_properties()` to `TableMetadata`\nthat returns `TableProperties`, eliminating manual `TryFrom` conversions\nat call sites.\n\n### Changes\n- Add `table_properties()` method to `TableMetadata` that parses and\nreturns typed `TableProperties`\n- Update `transaction/mod.rs` to use the new method\n- Simplify `datafusion/write.rs` property access (~60 lines reduced to\n~10)\n- Add unit tests for the new accessor method\n\nCloses #1878\n"
    },
    {
      "commit": "3c2d10833a4af82c1ee8929573f96c43b71a7788",
      "tree": "cb4036e41121849f29c52c99e2a15cdefebf6522",
      "parents": [
        "b951236b2eaf10be60d8644a6a5262e58d49c424"
      ],
      "author": {
        "name": "Liang-Chi Hsieh",
        "email": "viirya@gmail.com",
        "time": "Fri Jan 09 11:37:44 2026 +0800"
      },
      "committer": {
        "name": "Gabriel",
        "email": "gabriel.musatmestre@datadoghq.com",
        "time": "Fri Jan 09 11:37:44 2026 +0800"
      },
      "message": "feat(datafusion): Add LIMIT pushdown support (#2006)\n\nImplement LIMIT pushdown to optimize queries with LIMIT clauses by\nstopping data processing once the limit is reached. This reduces\nunnecessary I/O and computation for queries that only need a subset of\nrows.\n\nChanges:\n- Add limit field to IcebergTableScan to track row limit\n- Apply limit at stream level by filtering/slicing record batches\n- Update IcebergTableProvider and IcebergStaticTableProvider to pass\nlimit parameter to scan\n- Add comprehensive tests for limit pushdown functionality\n\n## Which issue does this PR close?\n\n- Closes #.\n\n## What changes are included in this PR?\n\n## Are these changes tested?\n\nCo-authored-by: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    }
  ],
  "next": "b951236b2eaf10be60d8644a6a5262e58d49c424"
}
