)]}'
{
  "log": [
    {
      "commit": "7ed8202351a0f213fba42e5de6d1777b67c4f1e0",
      "tree": "7bb793c44cf834a2f85647efa5a4f2e7dd921d09",
      "parents": [
        "62c5c2f81b1d31622e343890b4cd0ba7d2a9eca9"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Fri Oct 23 00:04:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:04:59 2026 +0800"
      },
      "message": "fix(ci): scope PR tests to relevant workflow changes (#1048)\n\nSkip unrelated GitHub workflow and configuration updates in the general, AWS, SQL catalog, and sanitizer test suites. Keep each suite\u0027s own workflow and shared actions as inputs, together with sanitizer suppression files.\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "62c5c2f81b1d31622e343890b4cd0ba7d2a9eca9",
      "tree": "355cd3e456aaefd0ac7865d8c20d9649ea095c28",
      "parents": [
        "48d0a5f17c959f7f0290527992728280013bc241"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Thu Oct 22 20:46:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 20:46:12 2026 +0800"
      },
      "message": "fix(parquet): validate geospatial projection parameters (#1050)\n\nReject incompatible geometry/geography CRS and geography edge algorithms during projection. Resolve omitted Parquet CRS to OGC:CRS84 and include the field path in mismatch errors.\n\nExtract common CRS normalization, parameter comparison, and mismatch reporting into a helper used by geometry and geography projection.\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "48d0a5f17c959f7f0290527992728280013bc241",
      "tree": "36697e7af6c03ebdc75e5aaffc21e7cf0056f230",
      "parents": [
        "041459e4d092c82c2fec9a8c3601fbddc12a561b"
      ],
      "author": {
        "name": "Haoxiang Meng",
        "email": "52441206+fairytale0828@users.noreply.github.com",
        "time": "Thu Oct 22 14:56:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 14:56:40 2026 +0800"
      },
      "message": "feat(parquet): apply name mapping to files without field IDs (#1044)\n\nCo-authored-by: kiwimeng \u003ckiwimeng@tencent.com\u003e"
    },
    {
      "commit": "041459e4d092c82c2fec9a8c3601fbddc12a561b",
      "tree": "578f3c333a950a36934c1d6320ee0dfa2ab565b4",
      "parents": [
        "49f8a8778571789a076b1501950fbd2115c34bb5"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Thu Oct 22 12:01:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 12:01:07 2026 +0800"
      },
      "message": "ci: use ASF-approved sccache action v0.0.11 (#1051)\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "49f8a8778571789a076b1501950fbd2115c34bb5",
      "tree": "003e94128c34c9daebda20c1782e1748501f4d88",
      "parents": [
        "1b1232bdd0379ee10039dae3170df41ca93181fe"
      ],
      "author": {
        "name": "Guotao Yu",
        "email": "guotao.yugt@gmail.com",
        "time": "Thu Oct 22 11:04:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:04:07 2026 +0800"
      },
      "message": "fix(manifest): validate enum fields when parsing manifests (#1034)\n\nManifest and manifest list readers cast raw integers from the file\nstraight into ManifestStatus, DataFile::Content and ManifestContent.\nOut-of-range values then reached switches ending in unreachable(),\nwhich is undefined behavior. Validate these fields through the\n*FromInt helpers at parse time, and return an error instead of\nunreachable() for an unknown status in ManifestWriter::WriteEntry.\n\nParseDataFile\u0027s hand-rolled loop for DataFile::kFileFormatFieldId\nskipped the field when null instead of checking `required` and\nreturning MakeNullError like every other field in the switch,\naddressing review feedback on PR #1034."
    },
    {
      "commit": "1b1232bdd0379ee10039dae3170df41ca93181fe",
      "tree": "31eac8b32ddbcfde6dd456f25310f67ab3c9af88",
      "parents": [
        "5107eda08bdea434ede4efee66a8e5bc7732cc22"
      ],
      "author": {
        "name": "Guotao Yu",
        "email": "guotao.yugt@gmail.com",
        "time": "Thu Oct 22 11:01:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:01:13 2026 +0800"
      },
      "message": "fix(avro): key projection cache on Avro node to avoid OOB read (#1022)\n\nThe avro-to-projection cache was keyed on projections.data() only. All\nempty-struct projections share the same (null) data(), so a second empty\nstruct with more Avro fields reused a cached vector sized for the first\nand read out of bounds. Include the Avro node in the key and reject\nout-of-range projected field indexes."
    },
    {
      "commit": "5107eda08bdea434ede4efee66a8e5bc7732cc22",
      "tree": "16e1fcdffe90cebf14e717299946f13b377eb953",
      "parents": [
        "29900cae9a6a5c110016b6c3e9dca8d14d6beef4"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Wed Oct 21 12:11:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 00:11:00 2026 +0800"
      },
      "message": "fix(metadata): write and detect gzip-compressed table metadata (#1014)\n\nCodec::FromFileName used find_last_of with the multi-character suffix\n\u0027.metadata.json\u0027, which matches the last single character of the set\n(the final \u0027n\u0027) instead of the suffix. For gzip-compressed metadata\nwritten by Iceberg Java as \u0027\u003cname\u003e.gz.metadata.json\u0027, the resulting\nfile_name_without_suffix kept the wrong tail, the \u0027.gz\u0027 check failed,\nand the file was misclassified as uncompressed kNone. Reading such a\nfile then fails to decompress.\n\nUse rfind so the whole suffix matches. The legacy \u0027.metadata.json.gz\u0027\ncompatibility branch is unchanged. Round-trip reading of Java-written\ngzip metadata files is covered by new unit tests.\n\nNewTableMetadataFilePath names the file \u0027\u003cversion\u003e-\u003cuuid\u003e.gz.metadata.json\u0027\nwhen write.metadata.compression-codec is gzip, but Write always emitted plain\nJSON, so the file contradicted its own name and no reader could inflate it.\nAdd a GZipCompressor next to the existing GZipDecompressor and compress in\nWrite when the location\u0027s codec is gzip, completing the round trip."
    },
    {
      "commit": "29900cae9a6a5c110016b6c3e9dca8d14d6beef4",
      "tree": "a99fae52d37c86b127d03e8e2fda7ccc67278ee8",
      "parents": [
        "c6ccd05f310f9d3088024032885a03c1eb0d5ee5"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Wed Oct 21 12:03:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 00:03:14 2026 +0800"
      },
      "message": "fix(metadata): drop removed schema ids from the builder\u0027s schema index (#1012)\n\nRemoveSchemas filtered metadata_.schemas but left schemas_by_id_\nuntouched, so within one builder session the removed ids stayed\nresolvable: SetCurrentSchema on a removed id passed its existence\ncheck and Build() emitted metadata whose current-schema-id dangles\noutside schemas, and a later AddSchema reuse of the id took the\nupdate path against a schema the metadata no longer contains. Erase\nthe removed ids from the index alongside the vector filter."
    },
    {
      "commit": "c6ccd05f310f9d3088024032885a03c1eb0d5ee5",
      "tree": "2dcc1e0cf1647395009d95bef236ada2e96cb99d",
      "parents": [
        "8698e9351f357d36b33e8e4f39350b11566132d1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Oct 21 17:46:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 23:46:57 2026 +0800"
      },
      "message": "perf(util): encode Base64 in three-byte blocks (#1045)"
    },
    {
      "commit": "8698e9351f357d36b33e8e4f39350b11566132d1",
      "tree": "73899e637a707f4fdbad13474d8e6845604e7f0f",
      "parents": [
        "4f195d0be65dde346802b3a6555bd46eaf344fa2"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Wed Oct 21 23:25:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 23:25:51 2026 +0800"
      },
      "message": "chore(deps): bump allowlist-check to v1.0.1 (#1047)\n\nUse the commit referenced by the allowlist-check/v1.0.1 tag to avoid the ref-version-mismatch failure in PR #1037.\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "4f195d0be65dde346802b3a6555bd46eaf344fa2",
      "tree": "2eeb59735dd575630c5e8ffd11e16222cc57bcf0",
      "parents": [
        "08d2f863b3c921674c8cca9b532c84143d05619b"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "xinlishang@gmail.com",
        "time": "Wed Oct 21 01:38:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 16:38:27 2026 +0800"
      },
      "message": "feat(encryption): add AES GCM cipher and AES GCM Stream (AGS1) files (#1030)"
    },
    {
      "commit": "08d2f863b3c921674c8cca9b532c84143d05619b",
      "tree": "cb33fb14a4384a1fae4cfeb0cf147bab88d2aa91",
      "parents": [
        "8e35d0560419be6b422dfa95c74289a172e21373"
      ],
      "author": {
        "name": "YinZheng-Sun",
        "email": "57469177+YinZheng-Sun@users.noreply.github.com",
        "time": "Wed Oct 21 15:47:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:47:42 2026 +0800"
      },
      "message": "fix(row): apply array offsets in ArrowArray wrappers (#1039)\n\nArrowArrayStructLike, ArrowArrayArrayLike and ArrowArrayMapLike ignored the\noffset of the wrapped ArrowArray, so sliced inputs returned wrong rows:\n\n- Struct children are not shifted by the parent\u0027s offset in the Arrow C data\n  interface, so GetField must add the struct\u0027s own offset.\n- ArrowArrayViewListChildOffset and the raw map offsets buffer are indexed\n  without the array\u0027s offset, so list/map rows must add it before lookup.\n- Map key/value children are not shifted by the entries struct\u0027s offset.\n\nAdd tests for sliced struct, list and map arrays.\n\nCo-authored-by: yinzhengsun \u003cyinzhengsun@tencent.com\u003e"
    },
    {
      "commit": "8e35d0560419be6b422dfa95c74289a172e21373",
      "tree": "2617ec251c35b9c10183e6e2fede4ebfe0865c5b",
      "parents": [
        "7f8009f88372a6adc950fb0ae6457e50273c2aa1"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Wed Oct 21 15:31:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:31:32 2026 +0800"
      },
      "message": "fix: qualify Iceberg names in public error macros (#1026)\n\nICEBERG_RETURN_UNEXPECTED, and through it ICEBERG_ASSIGN_OR_RAISE, named\nError without its namespace. ICEBERG_PRECHECK and ICEBERG_CHECK did the\nsame with InvalidArgument and ValidationFailed, and the ICEBERG_BUILDER_*\nmacros with ErrorKind. Those names resolve only inside namespace iceberg,\nso code that includes the installed headers could not use the macros.\n\nQualify them with ::iceberg::, as the logging macros already do, and use\n::iceberg:: in the exception macros as well.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7f8009f88372a6adc950fb0ae6457e50273c2aa1",
      "tree": "8cbbaa4d8e5d8795f8ec93a6c39b0073faffddee",
      "parents": [
        "90c93405ff09bde5395b5e69ddf8786abe81f955"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Tue Oct 20 20:22:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 11:22:01 2026 +0800"
      },
      "message": "feat(scan): read Parquet files by task range (#1002)"
    },
    {
      "commit": "90c93405ff09bde5395b5e69ddf8786abe81f955",
      "tree": "eeec1b5a79846b23abcb4f8e4d9d8cb3b1d05ff3",
      "parents": [
        "e1633ad5667f9933c0876bdcf2402ec9657814f3"
      ],
      "author": {
        "name": "lishuxu",
        "email": "lishuxu@gmail.com",
        "time": "Tue Oct 20 08:44:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 08:44:53 2026 +0800"
      },
      "message": "fix(json): limit nesting depth of parsed JSON documents (#1025)\n\nType, name-mapping and expression parsers walk parsed JSON recursively,\nso a deeply nested document could exhaust the stack. Check the nesting\ndepth of objects and arrays iteratively right after parsing in\nFromJsonString and FileMetadataFromJsonString, and reject documents\nnested deeper than 200 levels, matching the default limit of\nJackson\u0027s StreamReadConstraints."
    },
    {
      "commit": "e1633ad5667f9933c0876bdcf2402ec9657814f3",
      "tree": "772687491ba16310d7476bc21346620e3d1a8b11",
      "parents": [
        "059a116435698db0397594abf35c104331f8a234"
      ],
      "author": {
        "name": "Haoxiang Meng",
        "email": "52441206+fairytale0828@users.noreply.github.com",
        "time": "Mon Oct 19 15:22:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 15:22:54 2026 +0800"
      },
      "message": "fix: preserve list types for empty Parquet splits (#1040)\n\nUse Arrow\u0027s record batch reader for empty splits so schema alignment preserves configured and stored list types. Add regression tests for empty-split schema consistency and end-of-stream behavior.\n\nCo-authored-by: kiwimeng \u003ckiwimeng@tencent.com\u003e"
    },
    {
      "commit": "059a116435698db0397594abf35c104331f8a234",
      "tree": "515a94499de623f3ed853ab55c993a81a92c91d2",
      "parents": [
        "20f2407105d1a918e7084daf0e224d3497c4af91"
      ],
      "author": {
        "name": "lishuxu",
        "email": "lishuxu@gmail.com",
        "time": "Mon Oct 19 13:05:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 13:05:41 2026 +0800"
      },
      "message": "fix(rest): do not follow HTTP redirects in HttpClient (#1024)\n\nSigned requests are bound to the exact request URL and cannot be\ntransparently re-signed for a redirect target, and custom headers set\non the request are forwarded verbatim when cpr follows a redirect.\nDisable redirect following for all HttpClient requests so that a 3xx\nresponse is surfaced to the caller as an error."
    },
    {
      "commit": "20f2407105d1a918e7084daf0e224d3497c4af91",
      "tree": "a86915045b22d601b9da744458c540d94dd985e6",
      "parents": [
        "6b7e5ac8805a657534f83591121805972ca9bc06"
      ],
      "author": {
        "name": "lishuxu",
        "email": "lishuxu@gmail.com",
        "time": "Mon Oct 19 11:26:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:26:47 2026 +0800"
      },
      "message": "fix(json): omit JSON values from parse errors (#1003)\n\nMalformed REST responses and metadata can produce parse errors containing entire JSON documents or raw field values. Report field names, JSON types, and structural reasons instead, and report only the input byte count when JSON parsing fails.\n\nThe shared helpers also omit underlying exception text. Add regression coverage for REST table responses, OAuth token responses, and malformed JSON, and update existing assertions to use the new diagnostics. Successful parsing behavior is unchanged."
    },
    {
      "commit": "6b7e5ac8805a657534f83591121805972ca9bc06",
      "tree": "51069886aa511e42deaa7733113be4a427f7d94d",
      "parents": [
        "1534d5c7c0cceae3046a612f4f1cb3feb3558a13"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 09:56:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:56:05 2026 +0800"
      },
      "message": "chore(deps): bump actions/download-artifact from 8.0.1 to 8.0.2 (#1038)\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 8.0.1 to 8.0.2.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c...9000827ccba6bdab643e8b6fd33ac0654aef8333)\n\n---\nupdated-dependencies:\n- dependency-name: actions/download-artifact\n  dependency-version: 8.0.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": "1534d5c7c0cceae3046a612f4f1cb3feb3558a13",
      "tree": "87d6787de2eae674b7bd9bc04e9afffeb13df320",
      "parents": [
        "cc51b9b796db0870e7e650b129b18bee197819c2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 09:55:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:55:45 2026 +0800"
      },
      "message": "chore(deps): bump the codeql-action group with 2 updates (#1035)\n\nBumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action/init` from 4.38.2 to 4.38.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2...24c54180a607b1449ed407dd24f251e4e9147c8d)\n\nUpdates `github/codeql-action/analyze` from 4.38.2 to 4.38.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2...24c54180a607b1449ed407dd24f251e4e9147c8d)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.38.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.38.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\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": "cc51b9b796db0870e7e650b129b18bee197819c2",
      "tree": "e136f2303411da66ce67e0a5ce588036c036742e",
      "parents": [
        "72fbb5aef6cc5950107af385fca76b5bef9978aa"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 09:55:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:55:38 2026 +0800"
      },
      "message": "chore(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2 (#1036)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.1 to 7.0.2.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a...cf430e030ddbb5b0abf93d22962f4752f3646cd9)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: 7.0.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": "72fbb5aef6cc5950107af385fca76b5bef9978aa",
      "tree": "148de367b171405a6d267aa77754841143c37165",
      "parents": [
        "cec3229e784bd3ac1f86771cee8c167f7c490385"
      ],
      "author": {
        "name": "Jiajia Li",
        "email": "lijiajia@outlook.com",
        "time": "Sun Oct 18 00:46:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 00:46:04 2026 +0800"
      },
      "message": "feat(io): refresh vended storage credentials per prefix (#892)\n\nVended storage credentials can expire while an `ArrowS3FileIO` instance and its\nfile handles are still in use. This change refreshes them on demand and keeps\nthe refresh state scoped to each storage prefix.\n\nThe implementation:\n\n- Keeps one `CredentialStore` for credential snapshots, per-prefix slots,\n  expiry state, refresh coordination, backoff, and generation checks.\n- Resolves each credential once into its normalized prefix, effective client\n  properties, client settings, and AWS credentials.\n- Refreshes credentials independently by prefix. A response may update the\n  prefixes that are still active; invalid, expired, missing, or incompatible\n  entries keep their previous state.\n- Preserves S3-compatible schemes during routing. For example, `s3://` and\n  `oss://` remain separate prefixes so credentials for one endpoint cannot be\n  sent to another.\n- Lets existing AWS SDK clients pick up refreshed credentials through\n  `AWSCredentialsProvider`, while keeping clients and handles safe when the\n  `FileIO` or a credential generation is replaced.\n- Uses the REST client connection and request timeout properties for all HTTP\n  methods. Transport failures during table creation or commit are reported as\n  `CommitStateUnknown` because the server may already have applied the write.\n\nThe change removes the previous global expiry/layout bookkeeping and duplicate\ncredential-property parsing, making the refresh path easier to maintain and\nextend while preserving the existing `StorageCredentialProvider` API.\n\nTests cover prefix routing, refresh timing and concurrency, failed and invalid\nrefreshes, reordered responses, expiry handling, REST client timeouts, and\nreal S3-compatible round trips."
    },
    {
      "commit": "cec3229e784bd3ac1f86771cee8c167f7c490385",
      "tree": "65997e7e10d29219ff4184387ea1c791d381f108",
      "parents": [
        "0bdf7ce9961d7ef8e1c2b8670ae412e86526c53b"
      ],
      "author": {
        "name": "Raúl Cumplido",
        "email": "raulcd@apache.org",
        "time": "Sat Oct 17 06:47:17 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 13:47:17 2026 +0800"
      },
      "message": "build: apply patch on Arrow so it can be used with older versions of CMake (#1029)"
    },
    {
      "commit": "0bdf7ce9961d7ef8e1c2b8670ae412e86526c53b",
      "tree": "741d2f2688e69814ef005a22f5aae8e8097df279",
      "parents": [
        "310bb055d8f98e6fe31ea103632eb889b7ebc92b"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "xinlishang@gmail.com",
        "time": "Fri Oct 16 15:37:16 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:37:16 2026 +0800"
      },
      "message": "feat: add standard encryption key metadata (#991)\n\nStandardKeyMetadata is the per-file key metadata of the standard Iceberg\nencryption scheme: the data encryption key, the AAD prefix (file ID) and,\nfor AES GCM streams, the encrypted file length. It is stored in the\nkey_metadata field of data, delete and manifest files, and (encrypted) in\nthe table metadata encryption-keys for manifest lists.\n\nThe serialized form is Java\u0027s: a schema version byte (1) followed by an\nAvro binary record. Tests check byte-for-byte compatibility with vectors\nwritten by Java (checked in under test/resources/encryption/vectors,\nexcluded from the text-fixing pre-commit hooks).\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "310bb055d8f98e6fe31ea103632eb889b7ebc92b",
      "tree": "5b631082c19036ca7919086d95bd3f9e04d9ffa8",
      "parents": [
        "31659e73db59396bf5c8a4086f39e5b235a3bf68"
      ],
      "author": {
        "name": "advancedxy",
        "email": "807537+advancedxy@users.noreply.github.com",
        "time": "Fri Oct 16 14:24:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:24:29 2026 +0800"
      },
      "message": "refactor(parquet): simplify row position handling in projections (#1020)"
    },
    {
      "commit": "31659e73db59396bf5c8a4086f39e5b235a3bf68",
      "tree": "b32e2499931b42afeab0662bee3970344502c716",
      "parents": [
        "7f247005e3edc5bce30415b6eea4c9c78fadea95"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Fri Oct 16 12:44:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 12:44:10 2026 +0800"
      },
      "message": "build: rename VendoredArrow to Arrow (#1021)"
    },
    {
      "commit": "7f247005e3edc5bce30415b6eea4c9c78fadea95",
      "tree": "a7ecca418e9b75c193556140db78ad7670bdbe69",
      "parents": [
        "60e67fa2aecf41c3626e26fbc71be6afe5c8ef4a"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Fri Oct 16 12:43:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 12:43:49 2026 +0800"
      },
      "message": "fix(bucket): use endian-safe MurmurHash block loads (#1019)\n\nfix(bucket): make MurmurHash3 endian-safe\n\nRead unaligned blocks in canonical little-endian order, accept size_t lengths, and mix integer halves directly. Keep path entropy on the raw helper and preserve upstream bucket input validation.\n\nCover canonical byte hashes, integer encoding, byte literal buckets, and path prefixes with small regressions."
    },
    {
      "commit": "60e67fa2aecf41c3626e26fbc71be6afe5c8ef4a",
      "tree": "8ba13410c485dfe01ac01949c0201ac4557cee37",
      "parents": [
        "768ac65919ce7d1bc8dc51371f7b87f045d882c2"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Thu Oct 15 17:47:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 17:47:05 2026 +0800"
      },
      "message": "refactor: guard oversized bucket hash input in BucketIndex (#1023)\n\nBucketUtils::HashBytes still rejects inputs larger than INT32_MAX with an\nIcebergError, but BucketIndex now checks the byte length of string, binary, and\nfixed literals before hashing and returns InvalidArgument instead, so the\nResult-returning entry point no longer throws.\n\nThis replaces the internal HashBytes(const uint8_t*, size_t) overload and the\nbucket_util_internal.h header, which existed only so a test could reach the\nguard without materializing an oversized value. That overload, the header, and\nthe HashBytesRejectsOversizedInput test are all removed: the guard cannot be\nexercised from a test without either a 2 GiB allocation or an invalid\nstd::span."
    },
    {
      "commit": "768ac65919ce7d1bc8dc51371f7b87f045d882c2",
      "tree": "af30ac310db69863ee8f17d6e58c0dbdcf372884",
      "parents": [
        "d98d851873bd6bd9a456ae7f58fb430da2bceb6e"
      ],
      "author": {
        "name": "wzhuo",
        "email": "wngzhuo@gmail.com",
        "time": "Thu Oct 15 16:42:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 16:42:39 2026 +0800"
      },
      "message": "fix(bucket): reject oversized input in BucketUtils::HashBytes (#961)\n\n* fix(bucket): reject oversized input in BucketUtils::HashBytes\n\nHashBytes passed a size_t length straight to the vendored\nMurmurHash3_x86_32, whose length parameter is a signed 32-bit int. For\ninputs of 2^31 bytes or more the length wrapped negative, making the\nhash loop read far out of bounds (and nblocks * 4 signed-overflow UB);\nfor inputs above 2^32 bytes a silently wrong prefix was hashed, breaking\nthe bucket contract against other implementations.\n\nEvery literal hash path (kDecimal/kString/kUuid/kBinary/kFixed) funnels\nthrough this one function, so guard it there: reject lengths above\nINT32_MAX with ICEBERG_CHECK_OR_DIE before the narrowing cast. The bound\nmatches the limit implied by iceberg-java\u0027s byte arrays, so no legal\nbucket input is rejected. The vendored murmurhash3_internal.cc is left\nuntouched (tagged third-party code) and the now-checked narrowing is\nmade explicit with static_cast\u003cint\u003e.\n\nAdd BucketUtilsTest.HashBytesRejectsOversizedInput, which fabricates an\noversized span over a 1-byte buffer (never dereferenced, so no 2 GiB\nallocation is needed in CI). Without the guard the test segfaults.\n\n* test(bucket): guard raw byte input so the oversized-length test is well-formed\n\nThe regression test built a std::span over INT32_MAX + 1 elements of a\none-byte object, which violates the std::span constructor precondition and\nis undefined behavior even though the data is never read.\n\nMove the length guard into an internal HashBytes(const uint8_t*, size_t)\noverload and keep BucketUtils::HashBytes(std::span) as a thin wrapper, so the\ntest can pass a null pointer with the oversized length instead.\n\nAlso document that HashBytes and BucketIndex throw IcebergError for inputs\nlarger than INT32_MAX, which the public headers did not mention.\n\n---------\n\nCo-authored-by: Gang Wu \u003custcwg@gmail.com\u003e"
    },
    {
      "commit": "d98d851873bd6bd9a456ae7f58fb430da2bceb6e",
      "tree": "aed61af7e884cbd2c2790b15bd8ed46b692ab951",
      "parents": [
        "5a9350342b04a102f69aa8f626ca624072f69098"
      ],
      "author": {
        "name": "Guotao Yu",
        "email": "guotao.yugt@gmail.com",
        "time": "Thu Oct 15 15:00:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:00:12 2026 +0800"
      },
      "message": "fix(deletes): validate roaring bitmap after deserialization (#1005)\n\nfix(deletes): validate roaring bitmap structure after deserialization\n\nreadSafe only bounds-checks the read and does not verify CRoaring\u0027s\nstructural invariants. A forged deletion vector (e.g. bitset container\nwith a wrong cardinality or wrapping run containers) could later cause\nout-of-bounds access during merge or serialize. Call\nroaring_bitmap_internal_validate right after readSafe and reject invalid\nbitmaps with InvalidArgument."
    },
    {
      "commit": "5a9350342b04a102f69aa8f626ca624072f69098",
      "tree": "100dc7ba95bcffc6ca2f74b0e80f921a2e308e26",
      "parents": [
        "f8eca4faae2c8fcbc6484fbfa476254b851cc2d7"
      ],
      "author": {
        "name": "advancedxy",
        "email": "807537+advancedxy@users.noreply.github.com",
        "time": "Thu Oct 15 14:18:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:18:41 2026 +0800"
      },
      "message": "feat(parquet): add row number reader for selected row groups (#1006)"
    },
    {
      "commit": "f8eca4faae2c8fcbc6484fbfa476254b851cc2d7",
      "tree": "9329e1d78ed9a11fac53b6109db9cc7c3601bb34",
      "parents": [
        "7686cfeae7e735980405b20a2eb7f88b76f0ff6f"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Thu Oct 15 14:12:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:12:20 2026 +0800"
      },
      "message": "build: avoid duplicate libraries in the C++20 compatibility test (#1015)"
    },
    {
      "commit": "7686cfeae7e735980405b20a2eb7f88b76f0ff6f",
      "tree": "86b2817247c938970dea93d641118107270d5aca",
      "parents": [
        "ce4544b1af0b570773a10b89e0e81716ed1200fb"
      ],
      "author": {
        "name": "Matthias Vallentin",
        "email": "vallentin@berkeley.edu",
        "time": "Thu Oct 15 08:10:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 14:10:01 2026 +0800"
      },
      "message": "fix(manifest): write spec-compliant partition-spec and schema-id headers (#1017)\n\nThe manifest writers stored the full partition spec object, such as\n{\"fields\":[],\"spec-id\":0}, in the `partition-spec` Avro metadata. The\nspec requires only the partition fields array there. They also omitted\nthe separate `schema-id` metadata, which is required for v2 and later.\n\nAdd PartitionFieldsToJson to serialize only the partition fields and use\nit for the manifest header in all format versions. ToJson(PartitionSpec)\nkeeps producing the full object for table metadata and REST requests.\nWrite the ID of the schema used to write the manifest as `schema-id`."
    },
    {
      "commit": "ce4544b1af0b570773a10b89e0e81716ed1200fb",
      "tree": "a31a679a862f3c6dedb7d33a14a16eddd253cf44",
      "parents": [
        "1b6d6a3f85bf9d8f0ffcbe59a67e59310bac6580"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "xinlishang@gmail.com",
        "time": "Thu Oct 15 14:32:39 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:32:39 2026 +0800"
      },
      "message": "feat: add snapshot encryption key-id (#990)\n\nSpec v3 snapshots of encrypted tables carry `key-id`, the ID of the\nentry in `encryption-keys` that holds the encrypted key metadata of the\nsnapshot\u0027s manifest list. Add it to Snapshot, read and write it in the\nJSON serde, and include it in snapshot equality.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1b6d6a3f85bf9d8f0ffcbe59a67e59310bac6580",
      "tree": "1ede8feb475033f941b41ef441cfa667db6e9863",
      "parents": [
        "26ae9eab89d809a0861dfcef61ed6dc10f2b30bb"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "xinlishang@gmail.com",
        "time": "Thu Oct 15 13:32:26 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 12:32:26 2026 +0800"
      },
      "message": "build: enable Parquet modular encryption and zstd in vendored Arrow (#989)\n\nPart of #988.\n\nAdds the `ICEBERG_ENCRYPTION` CMake option (default on), which builds the vendored Arrow with Parquet modular encryption and zstd and links OpenSSL into the bundle library. This makes the crypto available for the following table encryption steps; there is no behavior change for tables.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "26ae9eab89d809a0861dfcef61ed6dc10f2b30bb",
      "tree": "7f8edfc92328cdd2939ab0977a53230ef65b3677",
      "parents": [
        "f87954d10c6d9ce61f22dd8fb3b31e525c4e3c1f"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Wed Oct 14 20:22:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 11:22:33 2026 +0800"
      },
      "message": "feat(scan): Support split and parallel scans - Part-1: validated FileScanTask byte ranges (#976)\n\nPreserve start and length in core and REST JSON, and reject partial\nreads until the reader can honor ranges.\n\nA shared DataFile\u0027s size may change after MakeSplit, so ToJson could\nemit a range that FileScanTaskFromJson rejects. Revalidate the range\nbefore serializing, matching the REST serializer.\n\nCo-authored-by: Isaac \u003cno-reply@databricks.com\u003e"
    },
    {
      "commit": "f87954d10c6d9ce61f22dd8fb3b31e525c4e3c1f",
      "tree": "fff8fb2182ede93064bf273d46b646f475b5e1dc",
      "parents": [
        "ad221b772ccbdeebfe6f01748186d1ff6faef944"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Thu Oct 15 10:05:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:05:18 2026 +0800"
      },
      "message": "chore: upgrade avro to 3a207fa (#1018)\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "ad221b772ccbdeebfe6f01748186d1ff6faef944",
      "tree": "d5c163fea91d04bd05657ebcb8961b20227f2ab2",
      "parents": [
        "57ec6b8101952a47916ab9cd4328a17319b40195"
      ],
      "author": {
        "name": "Nihal Jain",
        "email": "nihaljain.cs@gmail.com",
        "time": "Wed Oct 14 20:01:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 22:31:27 2026 +0800"
      },
      "message": "feat: support catalog labels on tables loaded from REST catalogs (#960)\n\nParse the optional `labels` field of the REST load-table response and\nexpose it through Table::labels(), mirroring apache/iceberg#18045 and\napache/iceberg#18046. Labels are catalog-provided rather than table\nstate, so they live on the Table instance instead of TableMetadata.\n\nPart of #938."
    },
    {
      "commit": "57ec6b8101952a47916ab9cd4328a17319b40195",
      "tree": "f3cf41fcdfcfc1b932625f081c6a8f8c7be7bd51",
      "parents": [
        "a036fae8ec947b6ea8da1cae36a666add5eea461"
      ],
      "author": {
        "name": "Sandeep Gottimukkala",
        "email": "gsandeep.1241@gmail.com",
        "time": "Wed Oct 14 00:18:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 15:18:33 2026 +0800"
      },
      "message": "feat(rest): add scan plan endpoint support to REST catalog client (#783)\n\nWhen a table is loaded from a REST catalog with scan-planning-mode\u003dserver (table config takes precedence over catalog config), NewScan() now returns a RestTableScanBuilder whose Build() produces a RestTableScan. PlanFiles() and PlanFilesStream() on that scan delegate manifest resolution to the server via POST /plan, GET /plan/{id} (with exponential backoff), POST /tasks, and DELETE /plan/{id} (best-effort cancel), instead of reading manifests locally.\n\n- Add RestTable, RestTableScanBuilder, RestTableScan and RestScanContext\n- Promote DataTableScan::PlanFilesStream, TableScan::io and TableScanBuilder::Build to virtual\n- Convert RestCatalog::client_ and paths_ to shared_ptr so RestScanContext can share ownership with live scans\n- Add REST incremental append planning for scans with an exclusive start snapshot; scans without one (including an inclusive root snapshot) return NotSupported\n- Use storage credentials returned by planning responses in a scan-scoped FileIO"
    },
    {
      "commit": "a036fae8ec947b6ea8da1cae36a666add5eea461",
      "tree": "98713806499803ba6c50dff35a37524ab13ac589",
      "parents": [
        "12a16bd592bcd841654a23ed8225dcc2caf807d3"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Tue Oct 13 17:57:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 17:57:12 2026 +0800"
      },
      "message": "fix: respect ancestor nullability when folding IS NULL/NOT NULL predicates (#995)\n\nA required field nested in an optional struct, list, or map can be null when its\nparent is null, so IS NULL and NOT NULL must not be folded for it. Only fold\nwhen the field and all of its ancestors are required, matching Java\u0027s\nUnboundPredicate#bindUnaryOperation."
    },
    {
      "commit": "12a16bd592bcd841654a23ed8225dcc2caf807d3",
      "tree": "211f92d69f3c944193e05582a90227c91e3844f1",
      "parents": [
        "de7c9ce0715c5846ab5ce3cbcaa6d90c199a5ba1"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Oct 13 16:02:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 16:02:13 2026 +0800"
      },
      "message": "fix(manifest): round-trip decimal partition values (#998)\n\nShare decimal encoding across direct and generic writers, preserve signed\nvalues at the schema fixed width, and reject representation overflow.\nCover exact wire bytes and decimal file round trips in both backends.\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "de7c9ce0715c5846ab5ce3cbcaa6d90c199a5ba1",
      "tree": "3b906780e0ec33db65b6518e53bec8307f3e30b8",
      "parents": [
        "bbc235910706c44dcee69202d3d8c165cede6992"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Tue Oct 13 03:16:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:16:52 2026 +0800"
      },
      "message": "fix(expression): treat COUNT(*) as referencing no fields in GetReferencedFieldIds (#981)\n\nReferenceVisitor::Aggregate unconditionally called\naggregate-\u003ereference()-\u003efield_id(), but BoundAggregate::reference()\nreturns nullptr for aggregates without a term such as COUNT(*), so\nGetReferencedFieldIds on a bound count(*) dereferenced null and\ncrashed. Skip the insert when there is no reference; the aggregate\nthen correctly contributes no field ids, matching the Java reference."
    },
    {
      "commit": "bbc235910706c44dcee69202d3d8c165cede6992",
      "tree": "4a690f00ba4c08d8c162444f74e7b7517f7d07d8",
      "parents": [
        "db796cbf5d51bd74aa1cfba7647eae748d91ff05"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Tue Oct 13 03:15:27 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:15:27 2026 +0800"
      },
      "message": "fix(catalog): validate namespace existence in InMemoryCatalog create and register (#980)\n\n## What\n\n`InMemoryCatalog` did not correctly check that a table\u0027s namespace exists, in two methods.\n\n`CreateTable` wrote the table metadata file before validating the namespace. Creating a table under a missing namespace returned `kNoSuchNamespace`, but on object-store `FileIO` it first left an orphaned `00000-\u003cuuid\u003e.metadata.json` that nothing later removes, and on the default local `FileIO` the stray write failed with a misleading `kIOError`.\n\n`RegisterTable` guarded with `if (!root_namespace_-\u003eNamespaceExists(identifier.ns))`. `NamespaceExists` returns `Result\u003cbool\u003e`, so `!result` tests `has_value()` rather than the bool, and a missing namespace is a value `false`, not an error. The branch was dead code, and a missing namespace surfaced as `kUnknownError` instead of `kNoSuchNamespace`.\n\nCloses #977.\n\n## How\n\n`CreateTable` now validates the namespace before writing any metadata, matching `SqlCatalog::CreateTable`. `RegisterTable` reads the metadata outside the lock, then validates the namespace and registers under a single lock: the dead `if (!NamespaceExists(...))` check (which tested the `Result\u003cbool\u003e`\u0027s `has_value()` rather than the contained bool) becomes an unwrap that returns `kNoSuchNamespace`. Keeping the namespace check and the registration in one critical section leaves them atomic, and the metadata read stays off the lock. The empty (root) namespace still resolves to `true`, so ordinary table creation is unaffected.\n\n## Testing\n\nTwo new tests in `in_memory_catalog_test.cc`:\n\n- `CreateTableNonexistentNamespace` — creating a table under a missing namespace returns `kNoSuchNamespace` and leaves no metadata file behind. It passes an explicit location whose `metadata/` directory already exists, so the pre-fix write lands a detectable orphan there; the zero-file assertion is what fails without the fix. The error-kind assertion alone would still pass pre-fix, because the later `UpdateTableMetadataLocation` also returns `kNoSuchNamespace` after the orphan is written.\n- `RegisterTableNonexistentNamespace` — registering under a missing namespace returns `kNoSuchNamespace`; without the fix the dead `Result\u003cbool\u003e` check let it fall through to `kUnknownError`."
    },
    {
      "commit": "db796cbf5d51bd74aa1cfba7647eae748d91ff05",
      "tree": "65325c0d41da0b10d66182c5112956b5ea395f17",
      "parents": [
        "f799dcbc41a19f589123a4f5966075503347a49a"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Oct 13 14:48:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 14:48:15 2026 +0800"
      },
      "message": "fix: preserve partition types after source columns are dropped (#999)\n\nCo-authored-by: Codex \u003ccodex@openai.com\u003e"
    },
    {
      "commit": "f799dcbc41a19f589123a4f5966075503347a49a",
      "tree": "dfb906c25f8dffb179b7013ba5b8f6c498439893",
      "parents": [
        "7543e8042180080d34b5ee44a6d4c18b86e47ac1"
      ],
      "author": {
        "name": "YinZheng-Sun",
        "email": "57469177+YinZheng-Sun@users.noreply.github.com",
        "time": "Tue Oct 13 10:36:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 10:36:43 2026 +0800"
      },
      "message": "fix(expression): treat constants as neutral in IsBoundVisitor (#1004)\n\nAlwaysTrue/AlwaysFalse no longer make IsBoundVisitor fail. Constants contain no references and are now neutral when combining binding states, so And(True, unbound) is unbound and And(True, bound) is bound. Mixing bound and unbound predicates is rejected with an error. This follows Java\u0027s IsBoundVisitor.\n\nCo-authored-by: yinzhengsun \u003cyinzhengsun@tencent.com\u003e"
    },
    {
      "commit": "7543e8042180080d34b5ee44a6d4c18b86e47ac1",
      "tree": "3dddbb01e4e7098cb5dcc030851d01f5a2384d23",
      "parents": [
        "274d1bbb4f46114806dc6515b2493483b47b3702"
      ],
      "author": {
        "name": "Jiajia Li",
        "email": "lijiajia@outlook.com",
        "time": "Tue Oct 13 08:47:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 08:47:52 2026 +0800"
      },
      "message": "fix(io): attempt every S3 delete and report how many failed (#966)\n\nFollow-up to https://github.com/apache/iceberg-cpp/pull/898#discussion_r4091927837.\n\n`ArrowS3FileIO::DeleteFiles` returned at the first credential prefix whose delete failed, so files under the remaining prefixes were never attempted. It now attempts every file unless task submission fails, logs deletion failures, and returns `Failed to delete N of M files`. Exceptions thrown by individual deletes are counted too.\n\n- Deletion is sequential by default. `InitializeS3FileIODeleteExecutor(Executor*)` initializes a caller-owned executor shared by all S3 FileIOs, including registry-created instances. Initialize it before the first delete; otherwise, the first delete freezes the default `nullptr`. Repeating the same pointer is allowed, but replacing it is not. The executor must remain alive until the last delete completes.\n- `s3.delete.num-threads` limits worker tasks per call, defaulting to the hardware thread count. Workers share a file index, keeping task/future storage bounded by the configured parallelism. The shared executor controls total concurrency; this property does not create or resize a thread pool.\n- Accepted tasks finish before the call exits, including when submission returns an error or throws. Submission failures are returned without falling back to the calling thread and bypassing the executor\u0027s concurrency limit. All workers use the same delegate snapshot and the caller\u0027s logger.\n\nArrow has no public S3 batch-delete API, so each request still deletes one file. `ResolvingFileIO` keeps its existing fail-fast behavior across delegates.\n\nTests cover deletion across allowed/denied prefixes, thrown deletes, rejected/throwing submissions, bounded task counts and concurrency, immutable executor initialization, and executor configuration for both direct and registry-created FileIOs."
    },
    {
      "commit": "274d1bbb4f46114806dc6515b2493483b47b3702",
      "tree": "df37410c4d526bae06db564ff9230d650c823c07",
      "parents": [
        "cbca7d268f5a96848eb40de5fa5bfe8c763e1e98"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Mon Oct 12 09:57:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:57:09 2026 +0800"
      },
      "message": "chore: upgrade CRoaring to 4.7.1 (#1001)\n\nInclude the upstream portable IO endian fix and check canonical\nlittle-endian bitmap bytes when serializing and reading.\n\nPreserve the fixture\u0027s embedded zeros and exact wire length while\nsatisfying modernize-avoid-c-arrays."
    },
    {
      "commit": "cbca7d268f5a96848eb40de5fa5bfe8c763e1e98",
      "tree": "a2d3425f654ae5384cdc4934245e326278016a73",
      "parents": [
        "0a22087d6fae7b26a6dacd9a64e3ef93239700ea"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Sun Oct 11 08:24:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 23:24:58 2026 +0800"
      },
      "message": "fix(serde): reject invalid schema and partition IDs in JSON (#940)"
    },
    {
      "commit": "0a22087d6fae7b26a6dacd9a64e3ef93239700ea",
      "tree": "56bf818c4d20f89c785aa8dc62b70c7dc2c1e2cc",
      "parents": [
        "87ed9632fda681fdfaa9d884a0ce47942aff3e56"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Sun Oct 11 07:54:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 22:54:45 2026 +0800"
      },
      "message": "feat(serde): support standalone FileScanTask JSON in core (#939)"
    },
    {
      "commit": "87ed9632fda681fdfaa9d884a0ce47942aff3e56",
      "tree": "0231ee855df42b7e1ecc69a54a69a378bb1fc30c",
      "parents": [
        "ed6608de5d3095550dd1631d9d0a4073b3034e1e"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Sun Oct 11 06:55:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:55:34 2026 +0800"
      },
      "message": "fix(serde): make DataFile JSON compatible with Java Iceberg (#975)"
    },
    {
      "commit": "ed6608de5d3095550dd1631d9d0a4073b3034e1e",
      "tree": "310da06b3c2c840d7130781c9d35bc3615c7b728",
      "parents": [
        "c712948f8cd29e14a3d83ae7070b3724579d34ac"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Sun Oct 11 09:21:45 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:21:45 2026 +0800"
      },
      "message": "fix(json): return a parse error for a list type missing \u0027element\u0027 (#997)\n\nListTypeFromJson read the nested element type with the raw const\njson[kElement] accessor, which is undefined behavior (an assertion in\ndebug nlohmann builds) when a list type object is missing the required\n\u0027element\u0027 key. Use GetJsonValue\u003cnlohmann::json\u003e(json, kElement) like\nthe sibling MapTypeFromJson does, so malformed schema or table-metadata\nJSON yields JsonParseError instead of asserting."
    },
    {
      "commit": "c712948f8cd29e14a3d83ae7070b3724579d34ac",
      "tree": "8d5d68060efef95f33c9546a84262583f9a989a1",
      "parents": [
        "ecf36247c6abbfaee591a0c89f8c5055344e3a1b"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Sun Oct 11 21:19:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:19:38 2026 +0800"
      },
      "message": "refactor: move each TableScan subclass to its own file (#994)\n\nMove DataTableScan, IncrementalAppendScan and IncrementalChangelogScan\ninto data_table_scan.{h,cc}, incremental_append_scan.{h,cc} and\nincremental_changelog_scan.{h,cc}. table_scan.{h,cc} keep TableScan,\nIncrementalScan, TableScanBuilder, the scan task types and\nTableScanContext.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ecf36247c6abbfaee591a0c89f8c5055344e3a1b",
      "tree": "1002add080df7a5fb2f701b1ee471132c4d357fc",
      "parents": [
        "0919f96b042e0fb832578d5eeb35574d69f55e4b"
      ],
      "author": {
        "name": "YangJie",
        "email": "yangjie01@baidu.com",
        "time": "Sun Oct 11 09:16:30 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:16:30 2026 +0800"
      },
      "message": "fix(expression): return a parse error for non-string type nodes in expression JSON (#982)\n\nIsTransformTerm, NamedReferenceFromJson, both LiteralFromJson\noverloads, and ExpressionFromJson read the \u0027type\u0027 discriminator with\njson[kType].get\u003cstd::string\u003e() guarded only by contains(), so a\npresent-but-non-string \u0027type\u0027 (e.g. a number) threw an uncaught\nnlohmann type_error out of the Result-returning parse API. Check\nis_string() first, matching the sibling OperationTypeFromJson guard,\nso malformed expression JSON yields JsonParseError instead of an\nescaped exception."
    },
    {
      "commit": "0919f96b042e0fb832578d5eeb35574d69f55e4b",
      "tree": "41df36e781b5d48df0cb443f057411a6a08b70de",
      "parents": [
        "44e29e109e461e7c9069855c9a90442002580d23"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Sun Oct 11 06:05:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:05:56 2026 +0800"
      },
      "message": "refactor(serde): move DataFile JSON handling from REST to core (#974)"
    },
    {
      "commit": "44e29e109e461e7c9069855c9a90442002580d23",
      "tree": "d01bf20f4a935737d4e2ee5a51382d9f0f015c52",
      "parents": [
        "a88f88a0ba5a3ce4d1b6cd1876483a668d8cf871"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "xinlishang@gmail.com",
        "time": "Sun Oct 11 09:30:30 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 08:30:30 2026 +0800"
      },
      "message": "feat: add CherryPickOperation and wire SnapshotManager::Cherrypick (#926)\n\nAdds `CherryPickOperation` and implements `SnapshotManager::Cherrypick()`, which was a TODO stub.\n\nFollows Java\u0027s `CherryPickOperation`: appends re-apply their added files, dynamic overwrites (`replace-partitions`) re-apply adds and deletes and are rejected if a replaced partition changed, and anything else can only be fast-forward. Records `source-snapshot-id` and `published-wap-id`, and rejects a WAP id that was already published.\n\nLike Java, the operation is reachable only through `Transaction`, not `Table`.\n\nFast-forwards also follow Java: `Apply()` returns the picked snapshot itself when it is a child of the current state, so no new snapshot is created. Because that decision is re-evaluated on every apply, a commit retry against moved metadata replays the pick on top of the new state instead of being rejected.\n\nTests ported from Java `TestSnapshotManager` and `TestWapWorkflow`, plus regression coverage for commit retries and the fast-forward/replay transitions.\n\nPart of #637."
    },
    {
      "commit": "a88f88a0ba5a3ce4d1b6cd1876483a668d8cf871",
      "tree": "e6b4852a02773a6f0faba16bfdfdd6b6ed2bbee4",
      "parents": [
        "84fb526b312c03021c8e0952207d836039342998"
      ],
      "author": {
        "name": "Byeonggyu Park",
        "email": "byeonggyu1214@gmail.com",
        "time": "Sat Oct 10 18:50:41 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 17:50:41 2026 +0800"
      },
      "message": "feat: fold IS NULL/NOT NULL predicates on unknown type (#983)"
    },
    {
      "commit": "84fb526b312c03021c8e0952207d836039342998",
      "tree": "bdaf3d86f5b80a6d6e6fd248badc7e7a5064aac4",
      "parents": [
        "b409051bd019ea8afb92e2a7ea280fcc5ff03e85"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Sat Oct 10 17:43:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 17:43:36 2026 +0800"
      },
      "message": "fix: prevent copying and moving StructLikeAccessor (#993)"
    },
    {
      "commit": "b409051bd019ea8afb92e2a7ea280fcc5ff03e85",
      "tree": "55a2f01e3098b20d7fe5f09e871b95e5c538f0b6",
      "parents": [
        "66d7ef5c75db7fbdb710d115a5ad52fc12eb677c"
      ],
      "author": {
        "name": "YinZheng-Sun",
        "email": "57469177+YinZheng-Sun@users.noreply.github.com",
        "time": "Sat Oct 10 14:34:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 14:34:05 2026 +0800"
      },
      "message": "fix(parquet): accept Decimal32 and Decimal64 during schema projection (#992)"
    },
    {
      "commit": "66d7ef5c75db7fbdb710d115a5ad52fc12eb677c",
      "tree": "894b313ec30e6729d59f5dd56e3745afa363a1bc",
      "parents": [
        "39c04b908d4d02112d4bea7312ad10207e317562"
      ],
      "author": {
        "name": "advancedxy",
        "email": "807537+advancedxy@users.noreply.github.com",
        "time": "Sat Oct 10 13:51:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 13:51:50 2026 +0800"
      },
      "message": "fix: respect nullability in nested struct accessors (#967)"
    },
    {
      "commit": "39c04b908d4d02112d4bea7312ad10207e317562",
      "tree": "2fdfbd10cdafde68b233e817411db3af5731c854",
      "parents": [
        "5a9d91a399f00a691fb2498720414c0e455d967b"
      ],
      "author": {
        "name": "Zehua Zou",
        "email": "zehuazou2000@gmail.com",
        "time": "Sat Oct 10 10:49:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 10:49:23 2026 +0800"
      },
      "message": "refactor: simplify src/iceberg/manifest/manifest_group.cc (#952)"
    },
    {
      "commit": "5a9d91a399f00a691fb2498720414c0e455d967b",
      "tree": "6909682f01e855397df6aad93260049c6d549b71",
      "parents": [
        "70b2b6a1a8b256d15469760d077ebede631ce689"
      ],
      "author": {
        "name": "rohanjain101",
        "email": "38412262+rohanjain101@users.noreply.github.com",
        "time": "Fri Oct 09 07:28:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 22:28:30 2026 +0800"
      },
      "message": "fix: move int128_t and uint128_t aliases into the iceberg namespace (#972)\n\nThe aliases were declared at global scope in the public header iceberg/util/int128.h. Any consumer that includes an iceberg header then gets global int128_t and uint128_t names, which conflict with other libraries or application code that define the same names. All uses in the project are already inside namespace iceberg, so this change is source compatible within the project.\n\nCo-authored-by: Rohan Jain \u003crohanjain@microsoft.com\u003e"
    },
    {
      "commit": "70b2b6a1a8b256d15469760d077ebede631ce689",
      "tree": "32af712fc8e17f266b2259d1ff07af86178208c5",
      "parents": [
        "dab8664f8650bbe65f4081da7895dff487a8be41"
      ],
      "author": {
        "name": "liuxiaoyu",
        "email": "45345701+MisterRaindrop@users.noreply.github.com",
        "time": "Fri Oct 09 22:25:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 22:25:35 2026 +0800"
      },
      "message": "feat(hive): add Iceberg-to-HMS schema and record conversion helpers (#904)"
    },
    {
      "commit": "dab8664f8650bbe65f4081da7895dff487a8be41",
      "tree": "23e0108920d751e4b376fd022da6484231fc2683",
      "parents": [
        "fa29f665641703dd793553e174afdcf5529bd414"
      ],
      "author": {
        "name": "Ping Liu",
        "email": "155605620+PingLiuPing@users.noreply.github.com",
        "time": "Fri Oct 09 19:30:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 19:30:22 2026 +0800"
      },
      "message": "feat: make public headers consumable as C++20 in compat mode (#936)\n\nEnable C++20 consumers to include and use iceberg-cpp’s installed public headers when the library is built with ICEBERG_CXX20_COMPAT\u003dON, while keeping iceberg-cpp implementation code and internal workflows on C++23. C++23 remains the default public API.\n\nRestore the vendored iceberg::expected backport — brings back src/iceberg/compat/expected.h from #40 (removed by [#139](https://github.com/apache/iceberg-cpp/pull/139)), with its test and LICENSE entry. unexpected\u0027s comparison operators now go through error().\n\ncpp20_compatibility_test compiles all public headers as C++20, and the C++20 example links against an installed compatibility package.\n\nFix #928"
    },
    {
      "commit": "fa29f665641703dd793553e174afdcf5529bd414",
      "tree": "ead849ebf8bc6f912c79b2a6b3f65cdf3ba117e7",
      "parents": [
        "79fdb86853450397f64a4bc22ad93d1cf0eb44c9"
      ],
      "author": {
        "name": "rohanjain101",
        "email": "38412262+rohanjain101@users.noreply.github.com",
        "time": "Thu Oct 08 18:51:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:51:02 2026 +0800"
      },
      "message": "fix(cmake): record avro-cpp as system dependency in installed config (#987)\n\nThe installed iceberg-config.cmake called find_dependency(Avro), but the package found is avro-cpp, which does not provide an Avro package. Closes #973\n\nCo-authored-by: Rohan Jain \u003crohanjain@microsoft.com\u003e"
    },
    {
      "commit": "79fdb86853450397f64a4bc22ad93d1cf0eb44c9",
      "tree": "9d95caba9ef9e78e5586793a7785c8b1f5ed923b",
      "parents": [
        "85f8a840083e2c5123a365ee55533bb50c390f1c"
      ],
      "author": {
        "name": "Jiajia Li",
        "email": "plusplusjiajia@alibaba-inc.com",
        "time": "Thu Oct 08 23:46:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 23:46:13 2026 +0800"
      },
      "message": "feat(rest): load table credentials from the LoadCredentials endpoint (#899)"
    },
    {
      "commit": "85f8a840083e2c5123a365ee55533bb50c390f1c",
      "tree": "7692b6cded8c78650fca3183b3db443f77146788",
      "parents": [
        "d2a3112aab458ab506f810298c0f93f4e5ee7d66"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Oct 04 23:58:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 23:58:12 2026 +0800"
      },
      "message": "chore(deps): bump the codeql-action group with 2 updates (#984)\n\nBumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action/init` from 4.38.1 to 4.38.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/1c5b675653bb5c22dbe9b12b556ec555138e09fd...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2)\n\nUpdates `github/codeql-action/analyze` from 4.38.1 to 4.38.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/1c5b675653bb5c22dbe9b12b556ec555138e09fd...2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.38.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.38.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\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": "d2a3112aab458ab506f810298c0f93f4e5ee7d66",
      "tree": "b68a71092271407c60f1d09d546e066fa43780c1",
      "parents": [
        "3c5715c66fb4d4306c54eec4aac327e2897f800b"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Sun Oct 04 23:36:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 23:36:42 2026 +0800"
      },
      "message": "doc: add release history for release v0.4.0 (#969)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "3c5715c66fb4d4306c54eec4aac327e2897f800b",
      "tree": "45a0dc805c7e8a7cfa55d85f53a15857d190e31d",
      "parents": [
        "bdc52460329108001506c43632c177b104b38559"
      ],
      "author": {
        "name": "Jiajia Li",
        "email": "plusplusjiajia@alibaba-inc.com",
        "time": "Tue Sep 29 11:19:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 11:19:32 2026 +0800"
      },
      "message": "refactor(io): hand out S3 delegates by shared_ptr and build them off the lock (#898)\n\nResolvingFileIO::FileIOForPath held its mutex across FileIORegistry::Load and\nthe delegate\u0027s SetStorageCredentials, so building the first S3 client (which\ncan look up a bucket region) stalled every other operation on the resolver.\nIt now loads without the lock and caches the result only if no credential\ninstall happened meanwhile; otherwise it loads again with the new\ncredentials. Delegates retired by an install are torn down outside the lock.\n\nTests now exercise real IO where the old ones stopped short: the multi-prefix\nDeleteFiles test failed URI parsing before reaching any delegate, and the\nconcurrency test only built input-file wrappers. The replacements write,\ndelete and read through the test object store, and the stress test waits\nfor every worker to run before installing."
    },
    {
      "commit": "bdc52460329108001506c43632c177b104b38559",
      "tree": "f7c6a7bf77fad5b5c7d34822aabd508eadb96965",
      "parents": [
        "8a186fe3a9822107f2e9358ddd5f0c21bac6ce97"
      ],
      "author": {
        "name": "aryan9948",
        "email": "aryansinghthree@gmail.com",
        "time": "Tue Sep 29 08:35:49 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 11:05:49 2026 +0800"
      },
      "message": "fix: MurmurHash3 file paths in LICENSE (#971)"
    },
    {
      "commit": "8a186fe3a9822107f2e9358ddd5f0c21bac6ce97",
      "tree": "9234b008079d7200d91e3da389d6604c89c23c47",
      "parents": [
        "ddbd2eef3d16f6a4b111f8a1c7ac14b144d8b06d"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Sep 29 10:59:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 10:59:41 2026 +0800"
      },
      "message": "chore: bump version to 0.5.0-SNAPSHOT (#968)\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ddbd2eef3d16f6a4b111f8a1c7ac14b144d8b06d",
      "tree": "c7e43c1830336eaedd72dfa3226c95a6cfae8494",
      "parents": [
        "450863e776aa13d3ef3e71bf44af30f07405efc8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 29 10:58:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 10:58:01 2026 +0800"
      },
      "message": "chore(deps): bump the codeql-action group with 2 updates (#970)\n\nBumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action/init` from 4.38.0 to 4.38.1\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...1c5b675653bb5c22dbe9b12b556ec555138e09fd)\n\nUpdates `github/codeql-action/analyze` from 4.38.0 to 4.38.1\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/b96794f015dfd88f77b49b1c93e0fa7110f94c63...1c5b675653bb5c22dbe9b12b556ec555138e09fd)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.38.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.38.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\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": "450863e776aa13d3ef3e71bf44af30f07405efc8",
      "tree": "581458a56391830a356d2f125c2106148d762915",
      "parents": [
        "26303393ccf16e6d63ed08cef8a447c0d496e2c3"
      ],
      "author": {
        "name": "Sreesh Maheshwar",
        "email": "maheshwarsreesh@gmail.com",
        "time": "Fri Sep 25 03:01:56 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 19:01:56 2026 -0700"
      },
      "message": "ci: replace MinIO with RustFS in S3 tests (#962)\n\n* ci: replace MinIO with RustFS in S3 tests\n\nUse RustFS 1.0.0 for Docker and native test fixtures, and initialize the S3 bucket with the AWS CLI.\n\nGenerated-by: Codex\n\n* ci: improve RustFS startup diagnostics and readiness\n\nExpose server logs, retry bucket initialization, verify native downloads, and disable the unused console.\n\nGenerated-by: Codex\n\n* ci: use generic object store naming and improve startup diagnostics\n\n- Rename the CI step to \"Start Object Store\"\n- Enable shell tracing in start_object_store.sh\n- Print the native server log only when it was started natively\n- Replace MinIO-specific wording in S3 comments\n\nCo-authored-by: Copilot App \u003c223556219+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Kevin Liu \u003ckevin.jq.liu@gmail.com\u003e\nCo-authored-by: Copilot App \u003c223556219+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "26303393ccf16e6d63ed08cef8a447c0d496e2c3",
      "tree": "00bfc766546cefc252f9fc1b7da901d3259ba19c",
      "parents": [
        "64dc66f159bd62c9817a96d74cbce767268934d0"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Wed Sep 23 23:59:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 23:59:36 2026 +0800"
      },
      "message": "docs: link CLAUDE.md to AGENTS.md (#957)\n\nClaude Code reads CLAUDE.md, so it did not pick up the shared agent\ninstructions in AGENTS.md. Check in CLAUDE.md as a symlink to AGENTS.md.\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "64dc66f159bd62c9817a96d74cbce767268934d0",
      "tree": "bf2b7afe8897ea7e6ac658f49b5bc43b6849a35e",
      "parents": [
        "2aaea26d23e025791aadb4084bbfd76f8bc65321"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Sep 22 11:37:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 11:37:02 2026 +0800"
      },
      "message": "chore: bump avro to 209a373 to preserve adjust-to-utc on primitives (#954)\n\nMove the avro-cpp pin from 997d50d to 209a373 (current main, 74 commits).\nThe C++ changes in the range are a std::formatter fix for C++23 builds\n(#3815), a JSON decoder fix for the lone low surrogate U+DFFF (#3841),\nand AVRO-4351, which makes avro-cpp keep custom attributes on primitive\nschema nodes when parsing and printing schema JSON.\n\nAVRO-4351 is what matters here. `GetAdjustToUtc()` reads \"adjust-to-utc\"\noff the primitive node, and the reader takes its file schema from the Avro\nfile header. With the old pin the attribute was dropped both when the\nwriter printed the header and when the reader parsed it, so every\ntimestamp read from a file looked like it had no timezone and projecting\na `timestamptz` or `timestamptz_ns` column out of an Avro file failed with\n\"Cannot read Iceberg type\". No test wrote and re-read a timestamptz\ncolumn through a real file, so this went unnoticed.\n\nAdd schema-level projection tests that parse \"adjust-to-utc\" from JSON,\nand file-level round trips that write timestamptz columns, assert the\nattribute is present in the physical file schema, and read them back.\nAll of them fail on the old pin and pass on the new one.\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2aaea26d23e025791aadb4084bbfd76f8bc65321",
      "tree": "d5c1221baef129f59a85b3c39727b17c34d3acd5",
      "parents": [
        "ad83c1d97fb62634448481a12d1e6051657bd55b"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Sep 22 09:40:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 09:40:58 2026 +0800"
      },
      "message": "chore: prepare 0.4.0 release version (#953)"
    },
    {
      "commit": "ad83c1d97fb62634448481a12d1e6051657bd55b",
      "tree": "e0b8ca68e31efc90c0f1142eaa2eaedd592504e8",
      "parents": [
        "168cb52b90c279679c37f1c7cf481194a839148b"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Tue Sep 22 09:40:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 09:40:43 2026 +0800"
      },
      "message": "fix: align boolean parsing with Iceberg Java (#951)\n\nBoolean values were parsed ad hoc in four places, and not consistently:\n`arrow_s3_file_io.cc` rejected anything that was not \"true\" or \"false\",\nwhile `config.h`, `auth_managers.cc` and `rest_catalog.cc` read any\nunrecognized value as false. Each site spelled out the \"true\"/\"false\"\nliterals itself, and `StringUtils` covered only numbers.\n\nAdd `StringUtils::ParseBoolean()`, which mirrors Java\u0027s\nBoolean.parseBoolean, and `PropertyUtil::PropertyAsBoolean()` /\n`PropertyUtil::PropertyAsOptionalBoolean()`, which mirror Java\u0027s\nPropertyUtil.propertyAsBoolean and propertyAsNullableBoolean, and read\nevery boolean through them.\n\nThat settles the codebase on Java\u0027s contract: \"true\" ignoring case reads\nas true, and every other value reads as false. `s3.path-style-access` and\n`s3.ssl.enabled` change behavior accordingly: a malformed value used to\nfail the FileIO build and now reads as false, as it does in Java, whose\nS3FileIOProperties reads both with PropertyUtil.propertyAsBoolean. The\ntest that pinned the old behavior is rewritten to pin the new one.\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "168cb52b90c279679c37f1c7cf481194a839148b",
      "tree": "3321360c133135a8395faad6e55ffe60f030b3f8",
      "parents": [
        "b2f1fcd6ad335c7aa7ddf3cb7ec967b4fbefe424"
      ],
      "author": {
        "name": "Gang Wu",
        "email": "ustcwg@gmail.com",
        "time": "Sun Sep 20 17:43:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 17:43:12 2026 +0800"
      },
      "message": "fix(manifest): preserve snapshot ID inheritance semantics (#947)\n\nfix(manifest): preserve snapshot ID inheritance state\n\nRepresent ManifestFile::added_snapshot_id as optional to distinguish an\ninheritance-ready null ID from a literal -1.\n\nReuse manifests only when the ID is null, rewrite explicit -1 manifests\nwith the commit snapshot ID, and continue requiring the field when\nwriting manifest lists."
    },
    {
      "commit": "b2f1fcd6ad335c7aa7ddf3cb7ec967b4fbefe424",
      "tree": "907021cb6875e21bc81947efc31b9a667c93223b",
      "parents": [
        "7b344f12837942fe8efbc75d9c6ebb9697fb94d3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 20 16:26:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 16:26:29 2026 +0800"
      },
      "message": "chore(deps): bump zizmorcore/zizmor-action from 0.6.3 to 0.6.4 (#950)\n\nBumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.6.3 to 0.6.4.\n- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)\n- [Commits](https://github.com/zizmorcore/zizmor-action/compare/70fb788f84895a7701f5643d103d587e460b5c99...cc914d7f3750a2d13d75c7f184a1060aa0e9d482)\n\n---\nupdated-dependencies:\n- dependency-name: zizmorcore/zizmor-action\n  dependency-version: 0.6.4\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": "7b344f12837942fe8efbc75d9c6ebb9697fb94d3",
      "tree": "3dab73bf469dea130fc3324c78cd84a100ff72ae",
      "parents": [
        "48738fc64ab70ef2ebe5653faf91c88efe65c23d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Sep 20 16:26:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 16:26:14 2026 +0800"
      },
      "message": "chore(deps): bump the codeql-action group with 2 updates (#949)\n\nBumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action/init` from 4.37.9 to 4.38.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63)\n\nUpdates `github/codeql-action/analyze` from 4.37.9 to 4.38.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/cdf488f595d80d6e07e03d4674febd5ab45fa938...b96794f015dfd88f77b49b1c93e0fa7110f94c63)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.38.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: codeql-action\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.38.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: codeql-action\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": "48738fc64ab70ef2ebe5653faf91c88efe65c23d",
      "tree": "30e3e7680c667388da28ca1dc71741042bebb705",
      "parents": [
        "35c5df1f12ef16357cdac212d3bcfed7b364ba2a"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Sun Sep 20 16:23:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 16:23:39 2026 +0800"
      },
      "message": "refactor: rename SnapshotCache to SnapshotReader (#945)\n\nName the class after its role of reading a snapshot\u0027s manifests, and\ndocument that it loads and caches the manifest list on first access.\nUpdate call sites and local variable names to match, preserving behavior."
    },
    {
      "commit": "35c5df1f12ef16357cdac212d3bcfed7b364ba2a",
      "tree": "16268e6cfb1bca9939c89be00c820cb5ee5f6031",
      "parents": [
        "a1c947b9e6219976cb1560fdc7fdb7878c1b4bc6"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Sun Sep 20 10:25:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 10:25:34 2026 +0800"
      },
      "message": "docs: clarify contribution conventions for agents (#910)"
    },
    {
      "commit": "a1c947b9e6219976cb1560fdc7fdb7878c1b4bc6",
      "tree": "1a0a87e1214a75b3bd58834d787d300dea94329d",
      "parents": [
        "4475fa87268ac2edcb26a8f1e3db207bc03cc986"
      ],
      "author": {
        "name": "kamcheungting-db",
        "email": "91572897+kamcheungting-db@users.noreply.github.com",
        "time": "Sat Sep 19 08:06:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 19 23:06:43 2026 +0800"
      },
      "message": "feat(logging): add transaction commit lifecycle logging (#890)"
    },
    {
      "commit": "4475fa87268ac2edcb26a8f1e3db207bc03cc986",
      "tree": "cd8006fc2e964fcd74e57436880dadc8e7aa03d2",
      "parents": [
        "525d60f372c11226998f27c4d9f4e2ee063bbe2c"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Sat Sep 19 12:43:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 19 12:43:17 2026 +0800"
      },
      "message": "fix: make table updates retryable and cleanup-safe (#868)"
    },
    {
      "commit": "525d60f372c11226998f27c4d9f4e2ee063bbe2c",
      "tree": "58803de9b6d5cd506c9351691dacced9a8b02132",
      "parents": [
        "6988eb067a92e6ea5445f8810b2bbe5bc6b86e40"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Thu Sep 17 20:57:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 20:57:37 2026 +0800"
      },
      "message": "build: remove Meson build support (#935)"
    },
    {
      "commit": "6988eb067a92e6ea5445f8810b2bbe5bc6b86e40",
      "tree": "c8903df0545e05d11f4d2c11890bb976c1e23038",
      "parents": [
        "6361791d70d19f3638e7a929d8d4661aa8c26a46"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Wed Sep 16 22:28:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 22:28:38 2026 +0800"
      },
      "message": "feat: add lazy scan planning streams (#873)\n\nScan planning currently materializes manifest entries and file scan tasks before returning. This change adds fallible, single-pass streams so callers can consume entries and tasks incrementally or stop early.\n\n- Add `DataTableScan::PlanFilesStream()` and `ManifestGroup::PlanFilesStream()`. The eager `PlanFiles()` methods collect the stream into a vector.\n- Add `ManifestReader::EntriesStream()` and `LiveEntriesStream()` as the reader implementation extension points. `Entries()` and `LiveEntries()` collect these streams for eager callers.\n- Rename the pull utility from `Iterator\u003cT\u003e` to `Stream\u003cT\u003e`, with `ManifestEntryStream` and `FileScanTaskStream` aliases and corresponding owning `*Ptr` aliases. `Next()` returns `Result\u003cstd::optional\u003cT\u003e\u003e`; errors and exhaustion are terminal, and `ToVector()` collects the remaining values.\n- Distinguish explicit empty selections from default projections: `Select({})` selects no user columns, while `Select({\"*\"})` or omitting `Select()` selects all columns. Table projections still include fields required by filters, and an explicit empty selection conflicts with an explicit projection schema.\n- Preserve partition values needed for delete matching and residual evaluation under narrow projections. Read statistics needed for equality-delete matching, then drop statistics the caller did not request.\n- Report scan metrics on exhaustion or early stream destruction, without emitting a successful report after a planning error.\n\nStreams own their reader or planning resources and may outlive the object that created them. A configured executor is borrowed and must remain alive until the planning stream is destroyed. Serial planning opens one data manifest at a time; executor-backed planning opens at most 32 matching manifest streams per batch and consumes their entries incrementally. `DataTableScan` uses the configured executor when there is more than one data manifest or more than one delete manifest.\n\nSnapshot and manifest-list metadata remain materialized, and delete manifests are read eagerly to build the delete-file index before returning the planning stream.\n\nAPI changes: include `iceberg/util/stream.h` and use `Stream\u003cT\u003e` in place of `Iterator\u003cT\u003e`. `ManifestGroup::PlanFiles()` and `PlanFilesStream()` consume the group and require an rvalue, such as `std::move(*group).PlanFilesStream()`. Custom manifest readers implement `EntriesStream()` and `LiveEntriesStream()` and return streams that remain valid after reader destruction. `DataTableScan::PlanFiles()` retains its existing caller syntax and eager result type.\n\nValidation: built `manifest_test` and `scan_test` with CMake and ran `ctest --test-dir build --output-on-failure -R \u0027^(manifest_test|scan_test)$\u0027`; both suites passed. Coverage includes empty and wildcard projections, equality and position deletes, partition isolation, executor-backed planning, stream lifetimes, and scan reporting. `git diff --check` passed."
    },
    {
      "commit": "6361791d70d19f3638e7a929d8d4661aa8c26a46",
      "tree": "ce4fb95fb89a36a677fc084bb8d2d3ac8ad0b92c",
      "parents": [
        "bec0ceb6e644acafb09b2a0b16ca91bbff952265"
      ],
      "author": {
        "name": "wzhuo",
        "email": "wngzhuo@gmail.com",
        "time": "Wed Sep 16 17:09:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 17:09:59 2026 +0800"
      },
      "message": "feat(inspect): implement streaming SnapshotsTable scans (#801)\n\n- Add Scan() virtual method and Scan() convenience overload to MetadataTable\n- Add SnapshotSelection struct for time-travel snapshot resolution\n- Add supports_time_travel() concrete method driven by kind()\n- Implement SnapshotsTable::Scan() to materialize snapshot rows via ArrowRowBuilder"
    },
    {
      "commit": "bec0ceb6e644acafb09b2a0b16ca91bbff952265",
      "tree": "bc29cbb876442039d9317be2c9d85961ca9ec456",
      "parents": [
        "307adb1cc272f830fdbae1b1ee241acd92451657"
      ],
      "author": {
        "name": "Joey",
        "email": "1517874642@qq.com",
        "time": "Wed Sep 16 10:06:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 10:06:48 2026 +0800"
      },
      "message": "fix(manifest): write null instead of empty list/map for unset optional DataFile fields (#934)\n\nAppendIntList, AppendIntMap, and AppendBinaryMap in\nsrc/iceberg/arrow_row_builder.cc always call ArrowArrayFinishElement()\nafter appending entries, even when the input container is empty. This\nproduced an empty-but-non-null list/map element rather than a null\nelement whenever one of DataFile\u0027s optional list/map fields\n(split_offsets, equality_ids, column_sizes, value_counts,\nnull_value_counts, nan_value_counts, lower_bounds, upper_bounds) was\nunset.\n\nAdd an empty check to each of these helpers that delegates to the\nexisting AppendNull() instead of finishing an empty element.\nAppendStringMap (used for required properties-style maps) is\nintentionally left unchanged.\n\nAdd unit test coverage in arrow_row_builder_test.cc asserting that\nAppendIntList/AppendIntMap/AppendBinaryMap write a null element (not\nan empty one) for empty input, alongside existing non-empty-input\ncoverage.\n\nCo-authored-by: joeyyjwang \u003cjoeyyjwang@tencent.com\u003e"
    },
    {
      "commit": "307adb1cc272f830fdbae1b1ee241acd92451657",
      "tree": "7b57ec31196acf710497297712580b47f3198c10",
      "parents": [
        "4e4e10a2103dac18cbe4d531710e0c86ba340840"
      ],
      "author": {
        "name": "kid",
        "email": "19265318+u70b3@users.noreply.github.com",
        "time": "Sun Sep 13 23:13:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 23:13:40 2026 +0800"
      },
      "message": "fix: track batch position delete references (#842)"
    },
    {
      "commit": "4e4e10a2103dac18cbe4d531710e0c86ba340840",
      "tree": "8ed85087d0c33c21fc7b5adeaf7eeee3033045b0",
      "parents": [
        "a00387f12906b77fc62f943708632f7e6d767c0c"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Sun Sep 13 11:16:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 13 11:16:39 2026 +0800"
      },
      "message": "refactor: expose snapshot utilities in a public header (#932)"
    },
    {
      "commit": "a00387f12906b77fc62f943708632f7e6d767c0c",
      "tree": "6cd1110c16ab009522e1d4648458126eb80653a1",
      "parents": [
        "c136a1f924909675d0d9d95b10e91193696af3b9"
      ],
      "author": {
        "name": "Sreesh Maheshwar",
        "email": "maheshwarsreesh@gmail.com",
        "time": "Sat Sep 12 00:34:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 16:34:00 2026 -0700"
      },
      "message": "ci: use Quay and GitHub releases for MinIO (#933)\n\n* ci: pull MinIO image from Quay\n\nDocker Hub no longer serves the MinIO server repository. Use the corresponding Quay image so Docker-based S3 test setup can start on clean machines.\n\nGenerated-by: Codex\n\n* ci: fetch MinIO binaries from GitHub releases\n\nThe MinIO download host returns HTTP 410 for native binaries. Use pinned official GitHub release assets for the client and Windows server, and reject HTTP errors before executing downloads.\n\nGenerated-by: Codex"
    },
    {
      "commit": "c136a1f924909675d0d9d95b10e91193696af3b9",
      "tree": "acca125d3cb03828deed099a04a1888558bf9c90",
      "parents": [
        "ac6c0ba4d83abe80cfce9f6c1b3d6686b7811dcb"
      ],
      "author": {
        "name": "Kevin Liu",
        "email": "kevinjqliu@users.noreply.github.com",
        "time": "Thu Sep 10 08:25:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 08:25:45 2026 -0700"
      },
      "message": "chore(test): run REST fixture\u0027s SQLite backend in WAL mode (#931)\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "ac6c0ba4d83abe80cfce9f6c1b3d6686b7811dcb",
      "tree": "9c24795b938568ad94353d63c8f233cd2d50cded",
      "parents": [
        "b52568ce00c37bfcd763f4fa0bcfdcf8fef2b0f2"
      ],
      "author": {
        "name": "Rahul Shivu Mahadev",
        "email": "51690557+rahulsmahadev@users.noreply.github.com",
        "time": "Tue Sep 08 09:28:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 00:28:19 2026 +0800"
      },
      "message": "feat(parquet): support reading list columns as Arrow large_list (#714)"
    },
    {
      "commit": "b52568ce00c37bfcd763f4fa0bcfdcf8fef2b0f2",
      "tree": "0a3551accaa86ac346cccfae4629e117c9bc457b",
      "parents": [
        "811d500426190e2e5e6730da39cc59c0aacd37f3"
      ],
      "author": {
        "name": "Jiajia Li",
        "email": "plusplusjiajia@alibaba-inc.com",
        "time": "Tue Sep 08 22:40:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:40:33 2026 +0800"
      },
      "message": "build: install the public headers under iceberg/catalog (#927)\n\nrest_catalog.h is installed and includes iceberg/catalog/session_catalog.h,\nbut the CMake build never installs the headers directly under\nsrc/iceberg/catalog, so any downstream project that consumes the installed\npackage and uses the REST catalog fails to compile:\n\n  fatal error: iceberg/catalog/session_catalog.h: No such file or directory\n\nThe Meson build already installs these three headers; only CMake is missing\nthem, and every sibling directory (data, expression, manifest, ...) calls\niceberg_install_all_headers."
    },
    {
      "commit": "811d500426190e2e5e6730da39cc59c0aacd37f3",
      "tree": "339d6d466bf235c91672ce116f4e8698d06fd774",
      "parents": [
        "fb54f93a80b7c54e4d30bbe6607abf3d873439d0"
      ],
      "author": {
        "name": "Xinli Shang",
        "email": "shangx@uber.com",
        "time": "Tue Sep 08 07:16:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:16:16 2026 +0800"
      },
      "message": "feat: expose ReplacePartitions on Table and Transaction (#925)\n\nAdds NewReplacePartitions() to Table and Transaction, with the\nStaticTable override returning NotSupported. Routes the existing\nReplacePartitions tests through Table::NewReplacePartitions() and adds\na transaction-scoped test."
    },
    {
      "commit": "fb54f93a80b7c54e4d30bbe6607abf3d873439d0",
      "tree": "b55f112ec037474f14d243f4fd4b9d18bc7403d4",
      "parents": [
        "a9a2f63c8212620d6402c4cd27e2cdea929226b6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 22:14:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:14:25 2026 +0800"
      },
      "message": "chore(deps): bump apache/skywalking-eyes from 0.8.0 to 0.9.0 (#924)\n\nBumps [apache/skywalking-eyes](https://github.com/apache/skywalking-eyes) from 0.8.0 to 0.9.0.\n- [Release notes](https://github.com/apache/skywalking-eyes/releases)\n- [Changelog](https://github.com/apache/skywalking-eyes/blob/main/CHANGES.md)\n- [Commits](https://github.com/apache/skywalking-eyes/compare/61275cc80d0798a405cb070f7d3a8aaf7cf2c2c1...a196742f472feaffafea537ce5a2a4c3c53a8de4)\n\n---\nupdated-dependencies:\n- dependency-name: apache/skywalking-eyes\n  dependency-version: 0.9.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": "a9a2f63c8212620d6402c4cd27e2cdea929226b6",
      "tree": "9e9e8648c771f1c557c1a6fc063c95f5411278c6",
      "parents": [
        "775f8d3b6712f16b2a06863a1cdc352f90880283"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 22:14:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:14:10 2026 +0800"
      },
      "message": "chore(deps): bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3 (#923)\n\nBumps [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) from 0.6.2 to 0.6.3.\n- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)\n- [Commits](https://github.com/zizmorcore/zizmor-action/compare/3dc1ecc9bcb9e94e9b2c709687979e1298497054...70fb788f84895a7701f5643d103d587e460b5c99)\n\n---\nupdated-dependencies:\n- dependency-name: zizmorcore/zizmor-action\n  dependency-version: 0.6.3\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": "775f8d3b6712f16b2a06863a1cdc352f90880283",
      "tree": "d139d65bba9b492c1626f3a90362e1a3dec2de57",
      "parents": [
        "97ce6eb6eaf80d7c208613350dcb4b60adeed25f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 08 22:13:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 22:13:54 2026 +0800"
      },
      "message": "chore(deps): bump the codeql-action group with 2 updates (#922)\n\nBumps the codeql-action group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action/init` from 4.37.8 to 4.37.9\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28...cdf488f595d80d6e07e03d4674febd5ab45fa938)\n\nUpdates `github/codeql-action/analyze` from 4.37.8 to 4.37.9\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28...cdf488f595d80d6e07e03d4674febd5ab45fa938)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.37.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.37.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: codeql-action\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": "97ce6eb6eaf80d7c208613350dcb4b60adeed25f",
      "tree": "9605691125361b2baac0ab1c72858c12d3bc0da7",
      "parents": [
        "dcf92f560c93d6286ca05f922d3a2ba662ff134a"
      ],
      "author": {
        "name": "Junwang Zhao",
        "email": "zhjwpku@gmail.com",
        "time": "Mon Sep 07 11:30:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 11:30:29 2026 +0800"
      },
      "message": "fix: correct mismatched class and struct declarations (#911)\n\nKeep Projections and TableMetadataBuilder::Impl declarations consistent\nwith their definitions to avoid mismatched-tag diagnostics and potential\nlink failures under the Microsoft C++ ABI."
    },
    {
      "commit": "dcf92f560c93d6286ca05f922d3a2ba662ff134a",
      "tree": "9b66c10b4091f3b913f70849ff58bad44cba97e6",
      "parents": [
        "02779a708e1af698fde7fb28657b2efd297d5867"
      ],
      "author": {
        "name": "Manu Zhang",
        "email": "OwenZhang1990@gmail.com",
        "time": "Fri Sep 04 22:55:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 22:55:45 2026 +0800"
      },
      "message": "feat: add fallible iterator utility (#905)"
    },
    {
      "commit": "02779a708e1af698fde7fb28657b2efd297d5867",
      "tree": "d89f6fb64dcad4cbc179027176b508a8c069e662",
      "parents": [
        "b88b89360367932f372a5554fdf68e2b366f8ef9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 04 22:45:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 22:45:44 2026 +0800"
      },
      "message": "chore(deps): bump mkdocs-material from 9.6.22 to 9.7.7 (#908)\n\nBumps [mkdocs-material](https://github.com/squidfunk/mkdocs-material) from 9.6.22 to 9.7.7.\n- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)\n- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)\n- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.22...9.7.7)\n\n---\nupdated-dependencies:\n- dependency-name: mkdocs-material\n  dependency-version: 9.7.7\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    }
  ],
  "next": "b88b89360367932f372a5554fdf68e2b366f8ef9"
}
