)]}'
{
  "log": [
    {
      "commit": "666f8dc2ea470d69fc294ba1f850d04050fb5047",
      "tree": "f71160523c43712f57f20424eb07c9101b4b6800",
      "parents": [
        "5327f57c92ce2130509133f06e77c668ca576ae1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:08:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:08:22 2026 -0400"
      },
      "message": "fix(arrow/array): validate union child upper bound (#1043)\n\n## What changed\n\nReject a union child index equal to the number of children.\n\n## Why\n\nThe previous bounds check allowed `idx \u003d\u003d len(children)` through,\ncausing a generic runtime index panic instead of the intended Arrow\nvalidation panic.\n\nThe regression test covers both the negative and upper bounds for dense\nand sparse union builders.\n\n## Validation\n\n`go test ./arrow/array`"
    },
    {
      "commit": "5327f57c92ce2130509133f06e77c668ca576ae1",
      "tree": "5da15557c8dc35c7f108e147775535bce9e4a8ef",
      "parents": [
        "4b94a0b245cdb76b03ca812084c46b1988dcd6e7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:08:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:08:11 2026 -0400"
      },
      "message": "fix(arrow/scalar): use duration type for units (#1041)\n\n## What changed\n\nRead a duration scalar\u0027s unit from `arrow.DurationType` instead of\nasserting it is a timestamp type.\n\n## Why\n\nValid duration scalars carry `*arrow.DurationType`. The previous\nassertion to `*arrow.TimestampType` panicked whenever `Unit` was called,\nincluding through string formatting and duration unit conversion.\n\nThe regression test covers direct unit access, string formatting, and\nseconds-to-milliseconds conversion.\n\n## Validation\n\n`go test ./arrow/scalar`"
    },
    {
      "commit": "4b94a0b245cdb76b03ca812084c46b1988dcd6e7",
      "tree": "0220c9206da93ba5ccbdef05abfc99e5921335ea",
      "parents": [
        "4b93953082e2f5a9b6d68f5421b7d5d53e94f9b0"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:08:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:08:01 2026 -0400"
      },
      "message": "fix(arrow/scalar): support same-width time casts (#1040)\n\n## What changed\n\nExtract temporal scalar values according to the source width before\nconverting them to a destination `Time32` or `Time64` unit.\n\n## Why\n\nThe previous implementation chose the source value assertion from the\ndestination type. Same-width conversions therefore asserted `Time32`\nvalues as `Time64`, or vice versa, and panicked.\n\nThe regression matrix covers Time32-to-Time32, Time32-to-Time64,\nTime64-to-Time32, and Time64-to-Time64 conversions.\n\n## Validation\n\n`go test ./arrow/scalar`"
    },
    {
      "commit": "4b93953082e2f5a9b6d68f5421b7d5d53e94f9b0",
      "tree": "baffc466ef3fa840dcb147ab11a7096c1f101990",
      "parents": [
        "28ffdf090a9028d1a4188c3d6ed4206275fe2f09"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:50 2026 -0400"
      },
      "message": "fix(flight/flightsql/driver): convert Date32 values (#1039)\n\n## What changed\n\nConvert FlightSQL `Date32` array values to `time.Time`, matching the\nexisting `Date64` behavior.\n\n## Why\n\n`Date32` previously fell through to `ErrNotSupported`, preventing valid\nDate32 columns from being consumed through the database/sql driver.\n\nTests cover both a concrete Date32 value and a null value.\n\n## Validation\n\n`go test ./arrow/flight/flightsql/driver`"
    },
    {
      "commit": "28ffdf090a9028d1a4188c3d6ed4206275fe2f09",
      "tree": "c898515a60297e9d27bb9f48acf7396cfb9b6d0b",
      "parents": [
        "8c82d4e0ec56f52c5fbdfa4e6b860e5147f8c085"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:38 2026 -0400"
      },
      "message": "fix(arrow/array): propagate embedded pointer nullability (#1038)\n\n## What changed\n\nCarry nullability through anonymous embedded pointer paths while\ncollecting reflected struct fields.\n\n## Why\n\nA promoted non-pointer field beneath an embedded pointer can be absent\nwhen that pointer is nil. The array builder already emits a null in that\ncase, but schema inference marked the field non-nullable because it only\ninspected the leaf field type.\n\nThis change makes the inferred schema agree with the values produced by\nthe builder, including for multi-level embedded pointer paths.\n\n## Validation\n\n`go test ./arrow/array/arreflect`"
    },
    {
      "commit": "8c82d4e0ec56f52c5fbdfa4e6b860e5147f8c085",
      "tree": "f6e767685dd8344f6e8c330ab0c8a1ae2c852830",
      "parents": [
        "6d0e70cf73d2c403ba2a23e6778681e854f7abd9"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:27 2026 -0400"
      },
      "message": "fix(tmpl): report generated output write errors (#1037)\n\n## What changed\n\nCheck the final `os.WriteFile` result when generating template output\nand return the failure to `main` for reporting.\n\n## Why\n\nThe generator previously exited successfully when the output could not\nbe written, for example when the output path was a directory. That could\nleave stale generated files in place while making the generation step\nappear successful.\n\nThe new regression test uses a directory as the output target and\nverifies that `process` returns an error containing the failed path.\n\n## Validation\n\n`go test -vet\u003doff ./arrow/_tools/tmpl`"
    },
    {
      "commit": "6d0e70cf73d2c403ba2a23e6778681e854f7abd9",
      "tree": "d41b0ff001105228897b11401ddad5f827a9f547",
      "parents": [
        "47f989bc0bebf660c07bf49ebc8b08885f83d212"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:17 2026 -0400"
      },
      "message": "fix(parquet/metadata): validate adaptive bloom options (#1033)\n\n### Rationale for this change\n\nThe adaptive bloom filter constructor accepted invalid configuration\nvalues. A false-positive probability of one could loop indefinitely in\nnon-assertion builds, while a maximum size below the minimum could\ncreate a zero-byte filter that later panicked during insertion.\n\n### What changes are included in this PR?\n\n* Reject false-positive probabilities outside the open interval `(0,\n1)`, including NaN.\n* Clamp the maximum allocation to the supported bloom-filter size range.\n* Keep the existing constructor signature and small-size fallback\nbehavior.\n\n### Are these changes tested?\n\nYes. The tests cover invalid probabilities and a zero-byte requested\nmaximum, including insertion into the resulting minimum-sized filter.\nThe full `parquet/metadata` package passes."
    },
    {
      "commit": "47f989bc0bebf660c07bf49ebc8b08885f83d212",
      "tree": "17e7232bf7ec24b5120e0819b9d9fdb169bc592b",
      "parents": [
        "970a12b5ee93b67119b03bca22bcfc9635a27f0a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:06 2026 -0400"
      },
      "message": "fix(parquet/metadata): return page index decode errors (#1032)\n\n### Rationale for this change\n\n`RowGroupPageIndexReader` exposes error-returning methods, but malformed\nserialized column or offset indexes could panic inside the lower-level\nconstructors. A corrupt Parquet file could therefore terminate the\ncaller instead of producing a read error.\n\n### What changes are included in this PR?\n\n* Convert page-index deserialization panics into errors at the row-group\nreader boundary.\n* Wrap failures with `arrow.ErrInvalid` and identify the affected index\nkind.\n* Preserve the existing lower-level constructor signatures for\ncompatibility.\n\n### Are these changes tested?\n\nYes. Regression coverage exercises malformed serialized column and\noffset indexes. The full `parquet/metadata` package passes."
    },
    {
      "commit": "970a12b5ee93b67119b03bca22bcfc9635a27f0a",
      "tree": "e0292a5eb654daf11d0382788d4eb9b121934ae7",
      "parents": [
        "ecf655dda477573d000a6329c731c6b4f66c61f3"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 28 17:07:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 11:07:02 2026 -0400"
      },
      "message": "fix(parquet/encoding): reject truncated plain boolean data (#1031)\n\n### Rationale for this change\n\nThe plain Boolean decoder trusted that each requested physical value had\na corresponding payload bit. A truncated page could therefore panic\nduring `Decode`, `Discard`, or `DecodeToBitmap` when the decoder indexed\nbeyond the input buffer.\n\nThe value count passed to `SetData` is only an upper bound because it\nincludes null rows, so payload bounds must be checked when physical\nvalues are consumed.\n\n### What changes are included in this PR?\n\n* Reject negative Boolean value counts in `SetData`.\n* Bound `Decode`, `Discard`, and `DecodeToBitmap` against the payload\nbits currently available.\n* Return an error wrapping `io.ErrUnexpectedEOF` without consuming\ndecoder state.\n* Continue accepting nullable pages whose level count exceeds their\nphysical Boolean count.\n\n### Are these changes tested?\n\nYes. The regression test covers all three truncated consumption paths\nand a nullable-style page with 100 levels and four physical values. The\nfull `parquet/...` test tree passes, including the nullable V1/V2,\nspaced-bitmap, and Parquet-to-Arrow paths."
    },
    {
      "commit": "ecf655dda477573d000a6329c731c6b4f66c61f3",
      "tree": "acd26cbcb2daeef034de16eaae4bb7ed7d1977cd",
      "parents": [
        "46dd24fee70a3d23b99e879092949ad2f98f57ca"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 23:14:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:14:01 2026 -0400"
      },
      "message": "fix(parquet/schema): reject invalid fixed lengths (#1035)\n\n### Rationale for this change\n\nFixed-length byte-array constructors reject non-positive widths, but\n`PrimitiveNode.SetTypeLength` allowed an existing valid node to be\nmutated to zero or a negative width. The invalid node could then be\nserialized or passed to encoders.\n\n### What changes are included in this PR?\n\n* Reject non-positive widths when mutating fixed-length byte-array\nnodes.\n* Leave non-fixed-width primitive nodes unchanged, preserving the\nexisting no-op behavior.\n* Document the panic contract on the setter.\n\n### Are these changes tested?\n\nYes. The regression test covers zero and negative widths, verifies that\nfailed mutations preserve the previous width, and checks the existing\nno-op behavior for other physical types. The full `parquet/schema`\npackage passes."
    },
    {
      "commit": "46dd24fee70a3d23b99e879092949ad2f98f57ca",
      "tree": "766d30b2540b3ee19b7b3c1404ee208352001e5b",
      "parents": [
        "b1d20a373fc8a30152ad9cca78657882fa5b929a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 23:13:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:13:58 2026 -0400"
      },
      "message": "fix(parquet/pqarrow): calculate large decimal widths (#1034)\n\n### Rationale for this change\n\n`DecimalSize` uses a lookup table through precision 76 and a formula\nabove that range. The fallback applied `ceil` before multiplying by\n`log2(10)`, producing widths larger than the documented minimum. For\nexample, precision 77 returned 34 bytes instead of 33.\n\n### What changes are included in this PR?\n\nApply the documented two-complement width formula as `ceil((precision *\nlog2(10) + 1) / 8)` for precisions above 76, and correct the existing\nprecision-77 schema fixture.\n\n### Are these changes tested?\n\nYes. Regression cases cover precisions 77, 80, and 100. The full\n`parquet/pqarrow` package passes."
    },
    {
      "commit": "b1d20a373fc8a30152ad9cca78657882fa5b929a",
      "tree": "d02619fc7a870eea0fb88dea2f0e1bbe1d44002e",
      "parents": [
        "c69c0ecd5a4f701ed16c3cc30468217a7abc981f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 23:07:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:07:14 2026 -0400"
      },
      "message": "fix(arrow/array): validate fixed-size list child lengths (#1019)\n\n### Rationale for this change\n\n`FixedSizeListBuilder` can finalize an array when the child value count\ndoes not equal the parent length multiplied by the list size. Too few\nvalues produce an invalid array, while extra values become silently\ninaccessible.\n\n### What changes are included in this PR?\n\n* Require the exact child value count before finalizing a fixed-size\nlist array.\n* Preserve the builder state when validation fails.\n* Correct existing Arrow and Parquet null-list fixtures so every parent\nslot has the required physical child slots.\n\n### Are these changes tested?\n\nYes. The tests cover both missing and extra child values and verify\nvalid null-list layouts. The full `arrow/array` and `parquet/pqarrow`\npackages pass with assertion checks enabled."
    },
    {
      "commit": "c69c0ecd5a4f701ed16c3cc30468217a7abc981f",
      "tree": "6495ece31590ce7789a3bdf9a0f951a19c9c5d6b",
      "parents": [
        "2b2e5c7040e5c65b85fadb90284acad8508eed94"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:30:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:30:58 2026 -0400"
      },
      "message": "fix(arrow/scalar): reject negative array lengths (#1024)\n\n### Rationale for this change\n\n`MakeArrayFromScalar` accepts a signed length and returns an error, but\nnegative lengths are not rejected consistently. For valid scalars, a\nnegative length reaches buffer allocation and panics with a runtime\nslice-bounds error. For null scalars, it silently returns a corrupt\narray carrying a negative length.\n\n### What changes are included in this PR?\n\n* Reject negative lengths before either the null-scalar or valid-scalar\npath.\n* Return an error wrapping `arrow.ErrInvalid` before allocating any\nbuffers.\n\n### Are these changes tested?\n\nYes. The regression test covers both valid and null scalars with a\nnegative length and verifies that both return `arrow.ErrInvalid` without\nallocating memory."
    },
    {
      "commit": "2b2e5c7040e5c65b85fadb90284acad8508eed94",
      "tree": "70760f77d2f995a902a2c90a1ee94371913eff2e",
      "parents": [
        "f670881919035fa6a07ea10ac70ddf3330eba31c"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:30:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:30:48 2026 -0400"
      },
      "message": "fix(arrow/array): skip empty table chunks (#1023)\n\n### Rationale for this change\n\nTableReader treats an empty column chunk as the next batch boundary. A\nvalid table with an empty chunk therefore emits a zero-row record batch\nbefore returning its actual rows.\n\n### What changes are included in this PR?\n\n* Advance each column past empty chunks before calculating the next\nbatch size.\n* Keep chunk slots synchronized without exposing zero-row batches.\n\n### Are these changes tested?\n\nYes. The regression test builds a valid chunked column with empty chunks\nand verifies that only the non-empty batch is returned. The full\narrow/array package, assertion build, compute packages, and IPC package\nalso pass."
    },
    {
      "commit": "f670881919035fa6a07ea10ac70ddf3330eba31c",
      "tree": "1557aeafa23aef55f18257312f4dbf6d565c194e",
      "parents": [
        "2ff888415eb7626379f845f0eb9b0900af85f40f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:30:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:30:38 2026 -0400"
      },
      "message": "fix(parquet/metadata): reject malformed fixed-width statistics (#1010)\n\n### Rationale for this change\n\nFixed-width Parquet statistics must use the exact PLAIN-encoded physical\nwidth. Padding a shorter value invents a different bound, while\nformatting the raw bytes can panic. Variable-length BYTE_ARRAY bounds\nshould remain unchanged.\n\n### What changes are included in this PR?\n\n- Ignore min/max when a present fixed-width statistic does not match the\ndeclared physical width.\n- Preserve variable-length BYTE_ARRAY values exactly as encoded.\n- Return malformed scalar bytes unchanged from `GetStatValue` instead of\npadding or indexing past them.\n- Regenerate the typed statistics implementation from its template.\n\n### Are these changes tested?\n\nYes. Focused tests cover malformed numeric and FIXED_LEN_BYTE_ARRAY\nvalues, short scalar formatting, and BYTE_ARRAY preservation. The\nmetadata and Parquet file test suites pass."
    },
    {
      "commit": "2ff888415eb7626379f845f0eb9b0900af85f40f",
      "tree": "66e70a77695252a019e7fecfa95a421f2616ca11",
      "parents": [
        "d8b617079e80b195800da271536590077d4e3546"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:30:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:30:34 2026 -0400"
      },
      "message": "fix(parquet/file): count repeated skips in logical rows (#1002)\n\nRepeated-column skipping tracks logical rows and physical values\nseparately, but the remaining skip count was being reduced by physical\nvalues. Empty repeated rows could therefore make `Skip` move past the\nrequested row.\n\nThis keeps the remaining count in logical-row units and adds a\nregression with two empty rows followed by a non-null value.\n\nTests: `go test ./parquet/file -run\nTestSkipEmptyRepeatedRows\\|TestPrimitiveReader -count\u003d1`"
    },
    {
      "commit": "d8b617079e80b195800da271536590077d4e3546",
      "tree": "b6e16ac18b5a40d9fe71c85857991c17eb21a625",
      "parents": [
        "812c82996a07bebef551c34a1370bd607261cf63"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:01:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:01:44 2026 -0400"
      },
      "message": "fix(internal/utils): keep byteReader position after failed seeks (#1005)\n\n`byteReader` updated its cached position even when the underlying seek\nfailed, which could make `Peek` and `Read` disagree about where the\nreader was. `Discard` also returned `io.EOF` when it consumed exactly\nthe remaining bytes.\n\nThis only updates the cached position after a successful seek and treats\nexact exhaustion as a successful discard. Added focused regressions for\nboth behaviors.\n\nTests: `go test ./internal/utils`"
    },
    {
      "commit": "812c82996a07bebef551c34a1370bd607261cf63",
      "tree": "75e9cf06207e30415f4c285aa228e6165707e3f1",
      "parents": [
        "edc4921bf8cd908150d6a80aa28cb3255c87430b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:01:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:01:33 2026 -0400"
      },
      "message": "fix(parquet/compress): allocate uncompressed output for short destinations (#1004)\n\nThe codec contract allows a `nil` or undersized destination and expects\nthe codec to allocate when needed. The uncompressed codec was just\nreturning the unchanged destination, which could leave callers with\nempty or truncated output.\n\nThis switches `Encode`, `EncodeLevel`, and `Decode` to append-based\ncopying and adds coverage for `nil` and undersized destinations.\n\nTests: `go test ./parquet/compress`"
    },
    {
      "commit": "edc4921bf8cd908150d6a80aa28cb3255c87430b",
      "tree": "81add10f1f8e1bedad1c739f795f39e683580810",
      "parents": [
        "a163709505e7a430baac1ad5c87b513db65d97f7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:01:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:01:22 2026 -0400"
      },
      "message": "fix(parquet/compress): avoid closing caller streams for uncompressed wrappers (#1003)\n\nThe compressed streaming codecs close their own wrappers without taking\nownership of the caller stream. The uncompressed codec passed through\nexisting closers directly, so closing the wrapper also closed the\nunderlying reader or writer.\n\nThis always wraps uncompressed streams in no-op closers and adds\nregression tests for both read and write wrappers.\n\nTests: `go test ./parquet/compress`"
    },
    {
      "commit": "a163709505e7a430baac1ad5c87b513db65d97f7",
      "tree": "f2faaff7f4bc37bf5cec92d6d01171fd98383866",
      "parents": [
        "a2aa76770c34a1cdb12759f2de84c734ac5822f7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 22:01:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 16:01:07 2026 -0400"
      },
      "message": "fix(arrow/csv): respect timestamp timezones (#1025)\n\n### Rationale for this change\n\nTimestamp arrays can declare a timezone, but the CSV writer formats\nevery value directly in UTC. This produces the wrong local timestamp and\nalso lets invalid timezone declarations pass silently.\n\n### What changes are included in this PR?\n\n* Use the timestamp type conversion function so values are formatted in\nthe declared timezone.\n* Return invalid timezone errors from Writer.Write.\n* Propagate conversion errors from nested list values.\n\n### Are these changes tested?\n\nYes. The tests verify epoch formatting in America/New_York and rejection\nof an invalid timezone. All CSV tests and the assertion build pass with\nthe required Parquet test data."
    },
    {
      "commit": "a2aa76770c34a1cdb12759f2de84c734ac5822f7",
      "tree": "6767e1ce9501ca3947d3478968280b6860267f4b",
      "parents": [
        "1b1f82f5848cb84226e9bc502bb8ae764014add2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 27 15:54:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 15:54:31 2026 -0400"
      },
      "message": "chore: Bump docker/login-action from 4.4.0 to 4.5.1 (#1030)\n\nBumps [docker/login-action](https://github.com/docker/login-action) from\n4.4.0 to 4.5.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/docker/login-action/releases\"\u003edocker/login-action\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev4.5.1\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSupport \u003ccode\u003edhi.io\u003c/code\u003e as Docker Hub OIDC registry by \u003ca\nhref\u003d\"https://github.com/crazy-max\"\u003e\u003ccode\u003e@​crazy-max\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1054\"\u003edocker/login-action#1054\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/docker/login-action/compare/v4.5.0...v4.5.1\"\u003ehttps://github.com/docker/login-action/compare/v4.5.0...v4.5.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev4.5.0\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/docker/login-action#docker-hub\"\u003eDocker\nHub OIDC\u003c/a\u003e login support by \u003ca\nhref\u003d\"https://github.com/crazy-max\"\u003e\u003ccode\u003e@​crazy-max\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1048\"\u003edocker/login-action#1048\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump \u003ccode\u003e@​aws-sdk/client-ecr\u003c/code\u003e and\n\u003ccode\u003e@​aws-sdk/client-ecr-public\u003c/code\u003e to 3.1091.0 in \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1037\"\u003edocker/login-action#1037\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump \u003ccode\u003e@​docker/actions-toolkit\u003c/code\u003e from 0.92.0 to 0.94.0 in\n\u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1044\"\u003edocker/login-action#1044\u003c/a\u003e\n\u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1050\"\u003edocker/login-action#1050\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump brace-expansion from 1.1.13 to 1.1.16 in \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1046\"\u003edocker/login-action#1046\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump js-yaml from 5.2.0 to 5.2.1 in \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/pull/1038\"\u003edocker/login-action#1038\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/docker/login-action/compare/v4.4.0...v4.5.0\"\u003ehttps://github.com/docker/login-action/compare/v4.4.0...v4.5.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/abd2ef45e78c5afb21d64d4ca52ee8550d9572c7\"\u003e\u003ccode\u003eabd2ef4\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/issues/1055\"\u003e#1055\u003c/a\u003e\nfrom crazy-max/test-registry-auth-oidc\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/d49d3a9839fef51322fa44989a44fdc43fccfc22\"\u003e\u003ccode\u003ed49d3a9\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/issues/1054\"\u003e#1054\u003c/a\u003e\nfrom crazy-max/oidc-missing-dhi\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/b58b17c30b4db92a4ed049b213cae512b12e460b\"\u003e\u003ccode\u003eb58b17c\u003c/code\u003e\u003c/a\u003e\ntest: cover Docker Hub OIDC with registry-auth\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/be646c21cec26cea303e29290d5f6ba6fde8e606\"\u003e\u003ccode\u003ebe646c2\u003c/code\u003e\u003c/a\u003e\nchore: update generated content\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/d77c059cb9956cedaa427dc022d89f39acba678f\"\u003e\u003ccode\u003ed77c059\u003c/code\u003e\u003c/a\u003e\nsupport dhi.io as Docker Hub OIDC registry\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/06fb636fac595d6fb4b28a5dfcb21a6f5091859c\"\u003e\u003ccode\u003e06fb636\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/issues/1037\"\u003e#1037\u003c/a\u003e\nfrom docker/dependabot/npm_and_yarn/aws-sdk-dependen...\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/a8bc9539118a762b0e5788b53a50907977cc1b8d\"\u003e\u003ccode\u003ea8bc953\u003c/code\u003e\u003c/a\u003e\n[dependabot skip] chore: update generated content\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/f54b9019bf5074f6e3480a3ac4b834f5f4b90aab\"\u003e\u003ccode\u003ef54b901\u003c/code\u003e\u003c/a\u003e\nbuild(deps): bump the aws-sdk-dependencies group across 1 directory with\n2 up...\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/77f18f6713512f90ac35aaf21db0d3710f1b85a6\"\u003e\u003ccode\u003e77f18f6\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/issues/1049\"\u003e#1049\u003c/a\u003e\nfrom docker/dependabot/github_actions/codeql-actions...\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/docker/login-action/commit/ec0bf287fb1e2e051c56b2f6e6a3eed487b9fe52\"\u003e\u003ccode\u003eec0bf28\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/docker/login-action/issues/1050\"\u003e#1050\u003c/a\u003e\nfrom docker/dependabot/npm_and_yarn/docker/actions-t...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca\nhref\u003d\"https://github.com/docker/login-action/compare/af1e73f918a031802d376d3c8bbc3fe56130a9b0...abd2ef45e78c5afb21d64d4ca52ee8550d9572c7\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003ddocker/login-action\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d4.4.0\u0026new-version\u003d4.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "1b1f82f5848cb84226e9bc502bb8ae764014add2",
      "tree": "7efe13066a8c607bab13f511ba0e46996dbb2c41",
      "parents": [
        "8c72476df63df6d3d29b938ca528e1526985370b"
      ],
      "author": {
        "name": "Colton Loftus",
        "email": "70598503+C-Loftus@users.noreply.github.com",
        "time": "Mon Jul 27 15:17:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 15:17:39 2026 -0400"
      },
      "message": "fix(parquet/pqarrow): Change interface name for arrow type on read for extension types (#1028)\n\n### Rationale for this change\n\n#969 added an interface for a custom arrow type on read for arrow\nextension types. This allows a type like geometry to be resolved to the\nunderlying arrow physical type like byte array.\n\nHowever, I went to implement this in geoarrow-go today and upon further\ninvestigation I think the interface name is slightly confusing. The\ninterface `ExtensionParquetLogicalType` doesn\u0027t actually include the\n`ParquetLogicalType` method but rather it intended to be used to specify\nthe arrow type from parquet on read. As such I have renamed\n`ExtensionParquetLogicalType` to something more distinct.\n\nI figure it makes sense to solidify this before creating a new arrow-go\nrelease and adding it to iceberg-go whereupon it will be much harder to\nchange.\n\nI changed the interface name to indicate that it is one side of the\nread/write path for extension types. I think this is a bit more clear\nbut if I am misunderstanding and it might be used in both read and\nwrite, then maybe it doesn\u0027t make sense.\n\n### What changes are included in this PR?\n\nComments and a change in the name of an interface. This interface is not\nyet in a published release but is on main. Since its only been a few\ndays, I think it is reasonable to change this.\n\n### Are these changes tested?\n\nYes\n\n### Are there any user-facing changes?\n\nYes. Change in interface name. But no changes in behavior."
    },
    {
      "commit": "8c72476df63df6d3d29b938ca528e1526985370b",
      "tree": "8280a704b1b6fc14e3fe95a74fbb1ab118c12ab5",
      "parents": [
        "039d0e6251777f4deab0260fee21ff796e4616a7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 20:57:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:57:18 2026 -0400"
      },
      "message": "fix(parquet/pqarrow): preserve INT96 timestamps across units (#1006)\n\n### Rationale for this change\n\nINT96 timestamp conversion currently routes values through\n`time.Duration` and applies a nanoseconds-per-day modulus directly to\nthe source value. This produces incorrect results for second,\nmillisecond, and microsecond timestamps, overflows for timestamps\noutside the duration range, and leaves negative timestamps with a\nnegative time-of-day remainder.\n\n### What changes are included in this PR?\n\n- Convert each Arrow timestamp unit using integer units-per-day and\nnanoseconds-per-unit constants.\n- Normalize negative remainders onto the preceding Julian day.\n- Add focused coverage for every timestamp unit on both sides of the\nUnix epoch.\n\n### Are these changes tested?\n\nYes. The focused pqarrow tests pass."
    },
    {
      "commit": "039d0e6251777f4deab0260fee21ff796e4616a7",
      "tree": "9e62cf78ad6f3a28df3a2655eae823ea4495aa2d",
      "parents": [
        "c806e6fc6ecf3f5c7d4ff724301dd172c06bb572"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 20:56:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:56:52 2026 -0400"
      },
      "message": "fix(parquet/encoding): reject invalid delta length payloads (#1013)\n\n### Rationale for this change\n\nThe DELTA_LENGTH_BYTE_ARRAY decoder slices payload data using unchecked\nlengths and keeps the logical page count after decoding fewer physical\nvalues. Invalid lengths can panic, and valid nullable pages can index\npast the physical length table.\n\n### What changes are included in this PR?\n\n- Propagate errors and short reads from delta prefix and length streams.\n- Reject negative lengths and cumulative lengths beyond the suffix\npayload.\n- Track the encoded physical length count in the byte-array decoder\nwhile retaining logical page-count validation.\n- Require DELTA_BYTE_ARRAY prefix and suffix streams to contain the same\nnumber of physical values.\n\n### Are these changes tested?\n\nYes. Focused tests cover negative and oversized lengths plus a nullable\npage with fewer physical values than logical positions. The full\nencoding and Parquet file suites pass."
    },
    {
      "commit": "c806e6fc6ecf3f5c7d4ff724301dd172c06bb572",
      "tree": "6d10143d04a89d8436820885d4b147ed03d5c670",
      "parents": [
        "d1c5c07b7eeba34753f9419fd553b11445b6208b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 20:56:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:56:47 2026 -0400"
      },
      "message": "fix(parquet/encoding): validate delta binary packed headers (#1012)\n\n### Rationale for this change\n\nThe delta binary packed decoder accepts header combinations that do not\nsatisfy the Parquet encoding rules. Some combinations narrow into\nsmaller Go fields or reach decoding with invalid miniblock geometry or\ninteger widths.\n\n### What changes are included in this PR?\n\n- Validate block size, miniblock divisibility, values per miniblock, and\nencoded value count before narrowing them.\n- Enforce INT32 ranges for the first value and minimum delta.\n- Reject used bit widths above 32 bits for INT32 and 64 bits for INT64.\n- Keep bit-width validation at use time so unused padding miniblocks\nremain compatible.\n\n### Are these changes tested?\n\nYes. Focused tests cover every header invariant, integer range, and\nper-type width. The full encoding and Parquet file suites pass.\n\n### Are there any user-facing changes?\n\nINT32 files written by older arrow-go versions with non-conformant\n33-bit miniblocks will now fail to read. This is intentional because\nthose files violate the Parquet encoding rules and are also rejected by\nother Parquet implementations."
    },
    {
      "commit": "d1c5c07b7eeba34753f9419fd553b11445b6208b",
      "tree": "935a2f44f7c0103acc51bcdf46c3caf6b71a5c30",
      "parents": [
        "382eb55255ecb52cf14f66ea657fab738e7a3a14"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:34:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:34:07 2026 -0400"
      },
      "message": "fix(parquet/encoding): respect declared RLE payload lengths (#1015)\n\n### Rationale for this change\n\nRLE level and boolean decoders validate their declared byte length but\nthen give the decoder every remaining byte in the page. A short declared\npayload can therefore consume bytes belonging to the next encoded\nsection instead of reporting a truncated run.\n\n### What changes are included in this PR?\n\n- Limit Data Page V1 level decoding to its four-byte-length-prefixed\npayload.\n- Limit Data Page V2 level decoding to its explicit byte count.\n- Apply the same boundary to RLE boolean values.\n- Validate the Data Page V2 length against the supplied data.\n\n### Are these changes tested?\n\nYes. Focused tests verify that bytes after each declared RLE interval\nare not consumed."
    },
    {
      "commit": "382eb55255ecb52cf14f66ea657fab738e7a3a14",
      "tree": "73c5273959a829a4a225c9d6737cd40f9b410c4b",
      "parents": [
        "c0be13fcf8e39579cf10f705c84b2a28d29eca38"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:22:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:22:05 2026 -0400"
      },
      "message": "fix(parquet/encoding): bound lazy dictionary growth (#1011)\n\n### Rationale for this change\n\nThe lazy dictionary converter sizes its backing slice from the requested\ndictionary index before checking whether that index exists. A bad index\ncan therefore trigger a much larger allocation than the dictionary\nitself. Removing the initial capacity also needs to preserve the\ndeclared dictionary length for Arrow dictionary insertion.\n\n### What changes are included in this PR?\n\n- Store the declared dictionary length separately from the lazy backing\nslice.\n- Reject out-of-range indexes before allocating or decoding.\n- Grow only by the values required for a valid index and reject short\ndictionary streams.\n- Materialize the full declared dictionary when inserting it into an\nArrow builder.\n\n### Are these changes tested?\n\nYes. Focused tests cover bounded growth and declared length tracking.\nThe encoding and pqarrow suites, including dictionary insertion paths,\npass."
    },
    {
      "commit": "c0be13fcf8e39579cf10f705c84b2a28d29eca38",
      "tree": "ab99958950c70cdbff275f3eaa77b1ff85cf36e9",
      "parents": [
        "03ce2f462dab8fb3b45e4c18f38db36f26381127"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:21:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:21:53 2026 -0400"
      },
      "message": "fix(parquet/metadata): preserve infinite floating-point statistics (#1007)\n\n### Rationale for this change\n\nFloating-point statistics use the largest finite values as their initial\nmin/max bounds. Those are not identity values when a column contains\nonly positive or negative infinity, so the writer records a finite bound\nthat was not present in the data.\n\n### What changes are included in this PR?\n\n- Seed FLOAT, DOUBLE, and FLOAT16 statistics with positive and negative\ninfinity.\n- Treat an inverted min/max pair as the empty or all-NaN sentinel.\n- Cover all-positive-infinity and all-negative-infinity inputs for all\nthree types.\n\n### Are these changes tested?\n\nYes. The focused statistics tests, including the existing NaN and\nsigned-zero coverage, pass."
    },
    {
      "commit": "03ce2f462dab8fb3b45e4c18f38db36f26381127",
      "tree": "46158abbc83bd0338ff136da91de02d246883a1d",
      "parents": [
        "7b3abb64dba8a9a2b6366600894d06b2eaeda925"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:09:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:09:10 2026 -0400"
      },
      "message": "fix(parquet/encoding): reject invalid delta byte prefixes (#1014)\n\n### Rationale for this change\n\nDELTA_BYTE_ARRAY prefix lengths are used directly as slice bounds.\nNegative prefixes or prefixes longer than the previous value therefore\npanic. The decoder also retains its previous value when reused for a new\npage, even though each page starts an independent delta sequence.\n\n### What changes are included in this PR?\n\n- Reset the previous value in `SetData`.\n- Propagate prefix stream decode errors and short reads.\n- Require the first prefix to be zero and validate later prefixes before\nslicing.\n- Apply the same validation to decode and discard paths.\n\n### Are these changes tested?\n\nYes. Focused tests cover decoder reuse, negative prefixes, and prefixes\nlonger than the previous value."
    },
    {
      "commit": "7b3abb64dba8a9a2b6366600894d06b2eaeda925",
      "tree": "5cd45765026b1811cc8f5de6dfe983a47d19d468",
      "parents": [
        "a73034c642aeb33c91980b457d66e394df52d5fa"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:08:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:08:59 2026 -0400"
      },
      "message": "fix(parquet/variant): reject truncated scalar values (#1017)\n\n### Rationale for this change\n\nNewWithMetadata only checks that a variant value is non-empty. Truncated\nor unknown scalar encodings can therefore be accepted and later panic or\nread invalid data when their type or value is accessed.\n\n### What changes are included in this PR?\n\n* Validate the encoded width of fixed-size primitive values and short\nstrings.\n* Validate binary and string length prefixes and their payload sizes.\n* Reject unknown primitive type codes while keeping compound values\nlazily decoded.\n\n### Are these changes tested?\n\nYes. The tests cover unknown primitive types, truncated fixed-width\nvalues, truncated binary prefixes and payloads, and truncated short\nstrings. The parquet/variant and parquet/pqarrow packages pass,\nincluding the assertion build for parquet/variant."
    },
    {
      "commit": "a73034c642aeb33c91980b457d66e394df52d5fa",
      "tree": "b5fb6b86dea711a4f8fe883d7ce6490bfbd5eafb",
      "parents": [
        "0151136ae8ae1b879b639459b4c862ac3cb19e08"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:08:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:08:47 2026 -0400"
      },
      "message": "fix(parquet/file): reject records starting with nonzero repetition levels (#1009)\n\n### Rationale for this change\n\nA repeated column must start each logical record at repetition level\nzero. The record reader currently accepts a nonzero first repetition\nlevel and silently treats it as part of a record, which can miscount\nrecord boundaries.\n\n### What changes are included in this PR?\n\n- Return an error when record delimiting begins on a nonzero repetition\nlevel.\n- Propagate that error through `ReadRecordData`.\n- Add a focused test that also verifies the invalid level is not\nconsumed.\n\n### Are these changes tested?\n\nYes. The focused parquet/file test passes."
    },
    {
      "commit": "0151136ae8ae1b879b639459b4c862ac3cb19e08",
      "tree": "b5f4f8afbf55e75a62c0c07e973e366c1315880f",
      "parents": [
        "bb3f980016d3cabee782cb4768568db666876ed1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:08:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:08:21 2026 -0400"
      },
      "message": "fix(parquet/pqarrow): reject timestamp coercion overflow (#1008)\n\n### Rationale for this change\n\nTimestamp coercion to a finer unit multiplies int64 values without\nchecking whether the result fits. Values near the int64 limits can\ntherefore wrap and be written as a different timestamp.\n\n### What changes are included in this PR?\n\n- Check the int64 range before multiplying a valid timestamp.\n- Return `arrow.ErrInvalid` when coercion would overflow.\n- Ignore the stored value in null slots, matching the existing\ntruncation checks.\n\n### Are these changes tested?\n\nYes. Focused tests cover positive and negative overflow as well as an\noverflowing value in a null slot."
    },
    {
      "commit": "bb3f980016d3cabee782cb4768568db666876ed1",
      "tree": "a6c85cb6c6c4124a5fd3fc94ac3747e70a1f43a3",
      "parents": [
        "d08c7b299a2e9d6156e6065de1d084cc0c84ff2e"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:08:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:08:10 2026 -0400"
      },
      "message": "fix(parquet/metadata): compare bloom filter caps in bits (#996)\n\nThe bloom filter sizing path computes `m` in bits, but the cap check\ncompared it to the byte limit shifted the wrong way. In practice that\ncan send a moderate-sized filter straight to the 128 MiB cap.\n\nThis switches the comparison to bits and adds a regression that covers\nboth the capped case and a case that should stay in the low-megabyte\nrange.\n\nTests: `go test ./parquet/metadata`"
    },
    {
      "commit": "d08c7b299a2e9d6156e6065de1d084cc0c84ff2e",
      "tree": "0cc5520aade0c6d0fedabc31bb021f795108b3c2",
      "parents": [
        "736b184ac715b8a2042139c4f495edfbd3065efe"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:07:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:07:59 2026 -0400"
      },
      "message": "fix(arrow/csv): preserve decimal precision (#1022)\n\n### Rationale for this change\n\nThe CSV writer converts decimal values through math.Pow10 and big.Float.\nThat changes valid Decimal128 and Decimal256 values for many scales and\ndrops significant trailing zeros from fixed-scale output.\n\n### What changes are included in this PR?\n\n* Format Decimal128 and Decimal256 values directly with their exact\nToString implementations.\n* Preserve the declared scale, including trailing zeros and negative\nscales.\n* Update existing zero-value expectations to retain their two decimal\nplaces.\n\n### Are these changes tested?\n\nYes. The regression test covers a high-precision Decimal128 with a\npositive scale and a Decimal256 with a negative scale. All CSV tests and\nthe assertion build pass with the required Parquet test data."
    },
    {
      "commit": "736b184ac715b8a2042139c4f495edfbd3065efe",
      "tree": "c6516585fa2ddd23f54d7b37e0f0e621186f8a57",
      "parents": [
        "abf9187bb9d2bbbb6806782bcc7f07c877148fea"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:07:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:07:29 2026 -0400"
      },
      "message": "fix(arrow/array): ignore zero-count union appends (#1026)\n\n### Rationale for this change\n\nDenseUnionBuilder.AppendNulls(0) and AppendEmptyValues(0) still append a\nchild value even though they add no union entries. That hidden mutation\nshifts the offset of the next real value and leaves inaccessible child\ndata behind.\n\n### What changes are included in this PR?\n\n* Make non-positive bulk null and empty appends no-ops.\n* Preserve the existing shared-child optimization for positive counts.\n\n### Are these changes tested?\n\nYes. The regression test verifies that both zero-count calls leave the\nunion and child builders empty, then confirms the next real value uses\noffset zero. The full arrow/array package, assertion build, compute\npackages, and IPC package also pass."
    },
    {
      "commit": "abf9187bb9d2bbbb6806782bcc7f07c877148fea",
      "tree": "936acfd126f6d534f0914fbad8d571a856a95ef8",
      "parents": [
        "825b3f338296685943e8820e690617e37b5fbf49"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:07:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:07:18 2026 -0400"
      },
      "message": "fix(arrow/scalar): handle nil child values in run-end scalars (#1001)\n\n`MakeNullScalar` creates a null run-end encoded scalar without a child\nvalue. `RunEndEncoded.Validate` dereferenced that value before checking\nnullness, so validation could panic.\n\nThis handles the missing child explicitly: null scalars are accepted,\nmalformed non-null scalars still fail, and both paths are covered by\ntests.\n\nTests: `go test ./arrow/scalar`"
    },
    {
      "commit": "825b3f338296685943e8820e690617e37b5fbf49",
      "tree": "23720147b6c9d34fe9b77e99f7ca9a3b1f04caf2",
      "parents": [
        "e05b7ea49e2a61bb41e97a90255e7372f64fdcd4"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:07:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:07:07 2026 -0400"
      },
      "message": "fix(arrow/scalar): allow null extension scalars to keep null storage (#1000)\n\n`MakeNullScalar` represents a null extension scalar with a null storage\nscalar. `Extension.Validate` rejected that factory-created shape even\nthough it is the natural null representation.\n\nThis allows validated null storage for null extension scalars, still\nrejects non-null storage, and adds regression coverage for both cases.\n\nTests: `go test ./arrow/scalar`"
    },
    {
      "commit": "e05b7ea49e2a61bb41e97a90255e7372f64fdcd4",
      "tree": "28171159538c045043cb5f50d6af4c63ccf8f846",
      "parents": [
        "7cbcfb92d101bd1de29aa98c61295409837b9ff6"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:06:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:06:56 2026 -0400"
      },
      "message": "fix(arrow/tensor): default nil dimension names to empty strings (#999)\n\nThe tensor constructors document that `nil` dimension names are treated\nas empty strings, but the shared constructor left the slice nil. That\nmakes `DimName` panic on an otherwise valid tensor.\n\nThis fills in one empty name per dimension and adds coverage for both\n`DimNames` and `DimName`.\n\nTests: `go test ./arrow/tensor`"
    },
    {
      "commit": "7cbcfb92d101bd1de29aa98c61295409837b9ff6",
      "tree": "2283a8f0805d03bbc508c7c1d86273528bb78c18",
      "parents": [
        "50921da952353c13fdfcb81a019dd575f5dffa54"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:06:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:06:35 2026 -0400"
      },
      "message": "fix(arrow/ipc): reject NaN minSpaceSavings values (#998)\n\n`WithMinSpaceSavings` documents the accepted range as `[0, 1]`, but\n`NaN` slipped through because both comparisons against `NaN` are false.\n\nThis rejects `NaN` alongside the existing range checks and extends the\nvalidation test with that input.\n\nTests: `go test ./arrow/ipc`"
    },
    {
      "commit": "50921da952353c13fdfcb81a019dd575f5dffa54",
      "tree": "1a7a9f439337a089a5d3d3f953da65b8083df6c9",
      "parents": [
        "1683b276c1dbad9d2ec306efae535d89d3d7dcdd"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 27 19:06:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:06:31 2026 -0400"
      },
      "message": "fix(arrow/compute): use is_null/is_not_null in expressions (#997)\n\n`IsNull` was building a unary `less` call, so even formatting or\nserializing the expression could go sideways. `IsValid` was also using\n`is_valid`, but the registered kernel name here is `is_not_null`.\n\nThis points both helpers at the registered names and adds regression\ncoverage for string formatting plus expression round-tripping.\n\nTests: `go test ./arrow/compute`"
    },
    {
      "commit": "1683b276c1dbad9d2ec306efae535d89d3d7dcdd",
      "tree": "ffd7cf9257a23275157051c00ec08f36f0e3c7b5",
      "parents": [
        "69c2fd50fa2fc1f122b7abce66c6863e4302a6e8"
      ],
      "author": {
        "name": "Tom Frank",
        "email": "tom@eon.io",
        "time": "Mon Jul 27 18:56:04 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 11:56:04 2026 -0400"
      },
      "message": "fix(parquet): wrap DELTA_BINARY_PACKED deltas at the physical type width (#1027)\n\n### Rationale for this change\n\nThe Parquet spec requires DELTA_BINARY_PACKED delta arithmetic to wrap\nin two\u0027s complement at the physical type\u0027s width\n([Encodings.md](https://github.com/apache/parquet-format/blob/master/Encodings.md#delta-encoding-delta_binary_packed--5)).\nThe encoder computed INT32 deltas in `int64`, so wide-range int32\ncolumns (e.g. values spanning most of the int32 range) produced deltas\noutside the int32 range and miniblock bit-widths up to 34.\nparquet-cpp/pyarrow reject such pages as corrupt (`Unexpected end of\nstream: InitBlock EOF`), as does arrow-rs (`\u0027min_delta\u0027 is too large`) —\nonly arrow-go itself could read them back, because its decoder uses the\nsame widened arithmetic. parquet-cpp explicitly declined to accept\n\u003e32-bit INT32 miniblocks (apache/arrow#20374), so the writer must not\nemit them.\n\n### What changes are included in this PR?\n\n`deltaBitPackEncoder[T].Put` now computes each delta at the physical\ntype\u0027s width (`int64(in[idx] - T(enc.currentVal))`) so overflow wraps in\ntwo\u0027s complement as the spec requires, bounding miniblock bit-widths at\n32 for INT32. INT64 encoding is unchanged (the arithmetic was already at\ntype width). The decoder needs no change: its int64 accumulation with a\nfinal cast to `T` decodes wrapped deltas correctly, and it still reads\npreviously written out-of-spec files.\n\n### Are these changes tested?\n\nYes. New `TestDeltaBitPackedDeltaOverflow` covers alternating\n`MinInt32`/`MaxInt32`, hand-crafted pathological cases for int32, a\ngolden-bytes case for wrapped-delta encoding, and an int64 no-regression\ncase. A new `checkDeltaBitPackedWidths` helper parses the encoded stream\nand asserts every miniblock bit-width is within the physical type\u0027s\nwidth — round-trip tests alone cannot catch this, since arrow-go\ntolerates its own out-of-spec output. The test fails on the previous\nencoder and passes with the fix. Also verified end-to-end: a file\nwritten via `pqarrow` with a wide-range int32 DELTA_BINARY_PACKED column\nis now read correctly by pyarrow, where it previously failed with\n`InitBlock EOF`.\n\n### Are there any user-facing changes?\n\nDELTA_BINARY_PACKED INT32 pages written for wide-value-range columns are\nnow spec-compliant and readable by parquet-cpp/pyarrow, arrow-rs, and\nother strict readers. Files previously written with the out-of-spec\nwidths remain readable by arrow-go."
    },
    {
      "commit": "69c2fd50fa2fc1f122b7abce66c6863e4302a6e8",
      "tree": "1cf41da76852e8af251cd55d627a122a1b53aa97",
      "parents": [
        "22bec19f17a1311eba76797a1516b1eeeed79e7f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Fri Jul 24 20:16:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 14:16:44 2026 -0400"
      },
      "message": "fix(array): validate binary_view and string_view payloads (#994)\n\n## Summary\n- add BinaryView and StringView validators\n- validate view header ranges, referenced buffers, prefixes, and inline\npadding during ValidateFull\n- validate UTF-8 for StringView payloads and add regressions for\nmalformed headers\n\n## Why\nBinaryView and StringView accessors currently trust header metadata\ndirectly. Malformed view headers can pass validation today even when\nthey reference missing data or carry invalid payload metadata.\n\n## Validation\n- go test ./arrow/array\n- go test ./arrow/compute/..."
    },
    {
      "commit": "22bec19f17a1311eba76797a1516b1eeeed79e7f",
      "tree": "545a12400c37514fda980766505540b3d6025506",
      "parents": [
        "51bb2726df38befb8418b590fc63719f834adcae"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Fri Jul 24 19:44:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 13:44:23 2026 -0400"
      },
      "message": "fix(array): validate run-end encoded invariants (#992)\n\n## Summary\n- add RunEndEncoded Validate and ValidateFull implementations\n- validate parent and child invariants, logical coverage, and strict\nrun-end monotonicity\n- add regression tests for short coverage and duplicate run ends\n\n## Why\nRun-end encoded helpers already assume that run ends are strictly\nincreasing and cover the logical range. Today malformed arrays can pass\nvalidation even when those invariants do not hold.\n\n## Validation\n- go test ./arrow/array ./arrow/encoded"
    },
    {
      "commit": "51bb2726df38befb8418b590fc63719f834adcae",
      "tree": "11ae9d894931aa660ecd081d84de88e6b0327ef1",
      "parents": [
        "3886c0a0162d17b9852b4bb8dc1872b4a0ee21c5"
      ],
      "author": {
        "name": "Colton Loftus",
        "email": "70598503+C-Loftus@users.noreply.github.com",
        "time": "Fri Jul 24 13:16:22 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 13:16:22 2026 -0400"
      },
      "message": "feat(parquet/pqarrow): Read support for extension types / geo (#969)\n\n### Rationale for this change\n\nIn https://github.com/apache/arrow-go/pull/960 I implemented write\nsupport for extension types by mapping a logical type to its underlying\nprimitive/arrow type. In the case of geometry this allows the logical\ngeometry type to be mapped to byte array for storage.\n\nThis PR implements the read path for that by adding the parquet type to\narrow type functionality. For example, a user can read a parquet with a\ngeometry column and with this change, the reader will try to map it to\nthe designated associated arrow extension type.\n\n### What changes are included in this PR?\n\nAn extension type can implement this interface to designate which arrow\ntype should be used when reading it from parquet.\n\n```go\ntype ExtensionParquetLogicalType interface {\n\tArrowTypeFromParquet(logical schema.LogicalType, storageType arrow.DataType) (arrow.ExtensionType, error)\n}\n```\n\nThe read path will try to iterate through all the extension types, see\nif there are any matches where the type implements\n`ArrowTypeFromParquet` and gives us something to map it to in arrow. If\nso we use that for reading.\n\n### Are these changes tested?\n\nYes\n\n### Are there any user-facing changes?\n\nYes. Readers can now support arbitrary extension types as long as they\nare registered properly in the extension type registry."
    },
    {
      "commit": "3886c0a0162d17b9852b4bb8dc1872b4a0ee21c5",
      "tree": "35cd04e8844a09920f2f7410a79e108f6e9c39cf",
      "parents": [
        "05a1ee07871928f5b80135a87d39f046f672e665"
      ],
      "author": {
        "name": "Lucas Valente",
        "email": "serramatutu@users.noreply.github.com",
        "time": "Fri Jul 24 18:11:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 12:11:11 2026 -0400"
      },
      "message": "fix(arrow/array): `Resize(0)` on non-empty builder causes memory leak (#995)\n\n### Rationale for this change\n\nI found a memory leak while working on the [JSON nullable parity\nPR](https://github.com/apache/arrow-go/pull/833). It\u0027s triggered\nwhenever a non-empty builder gets resized to zero.\n\nThis memory leak can be achieved with public APIs only (`Append` and\n`Resize`), meaning it\u0027s an actual bug in the public API and not a misuse\nof internal APIs where I didn\u0027t check for an invariant.\n\nIn the specific case of the JSON PR, whenever we found an error in the\nfirst row that would call `Resize(-1)`, which in turn calls `Resize(0)`\non all the previous fields, and the bug gets triggered.\n\nYou can checkout to each commit to see the test failing then passing\nafter the fix.\n\n\n### What changes are included in this PR?\n\n- A new unit test to repro the memory leak.\n- The fix: always respect `minBuilderCapacity` when calling `Resize()`\n\n\n### Are these changes tested?\n\nYes.\n\n\n### Are there any user-facing changes?\n\nNo."
    },
    {
      "commit": "05a1ee07871928f5b80135a87d39f046f672e665",
      "tree": "863b2fcace746d4f02fbefa0fedbb0762a14e337",
      "parents": [
        "8957d76120907bca2c07e3a475868de3a595a5d1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Fri Jul 24 18:05:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 12:05:00 2026 -0400"
      },
      "message": "fix(array): reject mismatched known null counts during full validation (#993)\n\n## Summary\n- validate known null counts against the validity bitmap during\nValidateFull\n- add a regression test for arrays whose metadata null count disagrees\nwith the bitmap\n\n## Why\nValidateFull currently bounds-checks a known null count but does not\nverify that it matches the actual bitmap. That lets malformed arrays\npass validation even though downstream code can observe contradictory\nnull metadata.\n\n## Validation\n- go test ./arrow/array\n- go test ./arrow/compute/exec"
    },
    {
      "commit": "8957d76120907bca2c07e3a475868de3a595a5d1",
      "tree": "fbcdbd0a2c2a25c71b4cfe8aad6ceaf3c66383dc",
      "parents": [
        "5327234c4d0949b9e08da7f47fe3cb5f96e63f47"
      ],
      "author": {
        "name": "Colton Loftus",
        "email": "70598503+C-Loftus@users.noreply.github.com",
        "time": "Thu Jul 23 16:11:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:11:12 2026 -0400"
      },
      "message": "docs(parquet): Add thrift generation contribution info (#971)\n\n### Rationale for this change\n\nWhen making changes to parquet-related logic sometimes contributors need\nto regenerate thrift generated files. I did this for\nhttps://github.com/apache/arrow-go/pull/960 However since the thrift\ndefinitions don\u0027t live in this repo, it might be worth documenting for\nnew users.\n\nThese docs are based on my understanding from discussions with\nmaintainers in the iceberg go slack.\n\nFeel free to close or propose / make direct edits as you see fit\n\n### What changes are included in this PR?\n\nJust documentation\n\n### Are these changes tested?\n\nNo since they are just docs\n\n### Are there any user-facing changes?\n\nNo"
    },
    {
      "commit": "5327234c4d0949b9e08da7f47fe3cb5f96e63f47",
      "tree": "951987822f64ba13588237fdec547d02072dbd8d",
      "parents": [
        "7f19ac5583c11002186caa0a4c518f2533320c72"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 22:10:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:10:30 2026 -0400"
      },
      "message": "fix(arrow/array): support zero-column tables (#988)\n\n### Rationale for this change\n\nArrow schemas and record batches may have zero fields while still\ncarrying a logical row count. `NewTableFromSlice` indexed the first\ncolumn unconditionally and panicked for an empty schema.\n`NewTableFromRecords` inferred rows from columns, so zero-column record\nbatches lost their row counts.\n\n### What changes are included in this PR?\n\nHandle the empty column slice without indexing `cols[0]`. When the\nschema has no fields, sum `RecordBatch.NumRows` to preserve the logical\nrow count. Tables with columns keep the existing column-based row\ninference. Regression tests cover both constructors.\n\n### Are these changes tested?\n\nYes:\n\n- `go test ./arrow/array`\n- `go test -race -count\u003d1 ./arrow/array`\n\n### Are there any user-facing changes?\n\nZero-column table construction no longer panics, and zero-column record\nbatches retain their logical row counts. Existing behavior for tables\nwith columns is unchanged."
    },
    {
      "commit": "7f19ac5583c11002186caa0a4c518f2533320c72",
      "tree": "3840b5fdaf2df983f7b30a8927d81377280edb9d",
      "parents": [
        "e25ccd31e1175889681557761136eb8157854c04"
      ],
      "author": {
        "name": "Nick Ripley",
        "email": "nick.ripley@datadoghq.com",
        "time": "Thu Jul 23 16:09:08 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:09:08 2026 -0400"
      },
      "message": "fix: Fix arm64 assembly stack frame manipulation (#984)\n\n### Rationale for this change\n\nThe arm64 NEON assembly code in this library incorrectly manipulates the\nstack pointer. In the mechanically-translated portion of the code, there\nare instructions to set up and restore a call frame for the function,\ne.g.\n\n\tWORD $0xa9bf7bfd // stp    x29, x30, [sp, #-16]!\n\nBut the assembler doesn\u0027t decode WORD directives and thus doesn\u0027t see\nthe stack pointer manipulation. As a result, the spdelta table entries\nfor these functions are incorrect. This table is used by the Go runtime\nfor stack unwinding, to find the next frame based on the program counter\nand current stack pointer. In typical cases this means that the CPU\nprofiler will just stop unwinding when it hits this function, and in\nsome cases we can get non-truncated but incorrect tracebacks.\n\nSee #983\n\n### What changes are included in this PR?\n\nFix this by removing the unnecssary frame setup for functions which\ndon\u0027t otherwise use the stack, and by changing functions which do need a\nstack frame to include their frame size in the function declaration,\nwhich the assembler takes into account.\n\nNote that this PR removes the `SUB/ADD $16, RSP` instructions added in\n#170. Those were added because the functions were overwriting values\nsaved on the stack, but after this PR most of the modified functions\ndon\u0027t save anything on the stack, and the one that does properly\ndeclares its frame size and makes the fix unnecessary. This does mean\nthat the modified functions with no frames don\u0027t set up a frame pointer,\nbut in practice that\u0027s probably fine. If we really want frame pointers\nfor all these functions, we can give them a small non-zero frame size\nand the assembler will add the appropriate frame pointer setup/tearndown\ncode.\n\n### Are these changes tested?\n\nYes, by the existing unit tests, and manually by running the CPU\nprofiler as described in #983\n\n### Are there any user-facing changes?\n\nNo"
    },
    {
      "commit": "e25ccd31e1175889681557761136eb8157854c04",
      "tree": "cdce1338a4b50cc4613b6966d329e25e4c63e3c8",
      "parents": [
        "7082f4d4343406bec54567740de1516521b7faa0"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 21:41:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:41:55 2026 -0400"
      },
      "message": "fix(parquet): reject truncated scalar bit reads (#944)\n\nBitReader.fillbuffer padded short reads with zeros without tracking how many bits were valid, so scalar and trailing reads could treat missing input as encoded zero values.\n\n- Track valid bits per buffer and reject scalar reads that extend beyond them.\n- Keep boolean batches on the bulk path, checking availability once per byte.\n- Decode scalar dictionary indexes in validated buffer-sized chunks.\n- Propagate seek and refill failures, and validate bulk discards.\n- Preserve zero-width reads without requiring input.\n\nTruncated scalar bit streams now return short-input errors rather than decoding missing data as zeros."
    },
    {
      "commit": "7082f4d4343406bec54567740de1516521b7faa0",
      "tree": "87e033551f6b9b34e57c99ec455997c2665a5b60",
      "parents": [
        "2bc506ad7db7138e012001f4897629de543d8879"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 20:12:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 14:12:42 2026 -0400"
      },
      "message": "fix(flight/flightsql/example): propagate row iteration errors (#990)\n\n### Rationale for this change\n\n`database/sql` reports errors encountered while advancing through a\nresult set through `Rows.Err()` after `Rows.Next()` returns false.\n`SqlBatchReader.Next()` did not check that error, so a driver failure\nafter one or more rows could be returned as a successful partial batch\nwhile `SqlBatchReader.Err()` stayed nil.\n\n### What changes are included in this PR?\n\nCheck `Rows.Err()` after the iteration loop and return the error before\nconstructing a record batch.\n\nAdd a regression test with a small database driver that returns one row\nand then fails during iteration.\n\n### Are these changes tested?\n\nYes. `go test ./arrow/flight/flightsql/example` and the focused race\ntest pass.\n\n### Are there any user-facing changes?\n\nFlight SQL example servers now propagate database row iteration failures\ninstead of returning partial results as successful batches. Successful\nqueries are unchanged."
    },
    {
      "commit": "2bc506ad7db7138e012001f4897629de543d8879",
      "tree": "b5c05e04a8e907befabecabd3beb86a3ceb023f4",
      "parents": [
        "bab58105e336430c782bba4a04ecfc1a4915f58b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 20:12:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 14:12:21 2026 -0400"
      },
      "message": "fix(parquet/variant): handle empty metadata keys (#985)\n\n### Rationale for this change\n\nVariant metadata may contain an empty object key. `Metadata.KeyAt`\nvalidates the dictionary index, then previously took the address of the\nkey\u0027s first byte. That panics when the key is empty.\n\n### What changes are included in this PR?\n\nUse `unsafe.SliceData` for the existing zero-copy byte-to-string\nconversion so zero-length keys are handled safely. Add a builder-based\nregression covering both `KeyAt` and `IdFor`.\n\n### Are these changes tested?\n\nYes:\n\n- `go test ./parquet/variant`\n- `go test -race -count\u003d1 ./parquet/variant`\n\n### Are there any user-facing changes?\n\n`Metadata.KeyAt` now returns an empty string for a valid empty key\ninstead of panicking. There is no API change."
    },
    {
      "commit": "bab58105e336430c782bba4a04ecfc1a4915f58b",
      "tree": "205c54a98f4c98243a8a2c74d378110ff57ea191",
      "parents": [
        "e63018eb7266599e5e1af166111e79d0ab1e2cd0"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 18:09:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:09:43 2026 -0400"
      },
      "message": "fix(arrow/flight): avoid blocking after stream cancellation (#989)\n\n### Rationale for this change\n\n`StreamChunksFromReader` observes context cancellation while sending\nrecord batches, but its final reader-error send still wrote directly to\nthe output channel. If the consumer stopped receiving after\ncancellation, that send could block forever, preventing reader release\nand channel closure. This is a follow-up to the cancellation handling\nadded in #615.\n\n### What changes are included in this PR?\n\nRace final error delivery against context cancellation, matching the\nexisting record-batch send behavior. Capture the reader error once\nbefore delivery. Add a regression with an already-canceled context, an\nunbuffered channel, and a reader that fails immediately.\n\n### Are these changes tested?\n\nYes:\n\n- `go test ./arrow/flight`\n- `go test -race -count\u003d1 ./arrow/flight`\n\n### Are there any user-facing changes?\n\n`StreamChunksFromReader` now returns promptly and releases its reader\nwhen cancellation prevents final error delivery. Error delivery is\nunchanged while the context remains active."
    },
    {
      "commit": "e63018eb7266599e5e1af166111e79d0ab1e2cd0",
      "tree": "ca9cd277ec7610150ecc82d2eac25297c8a68995",
      "parents": [
        "5dd4b01c4e2b985289073aa8491a402718147ac4"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 18:09:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:09:31 2026 -0400"
      },
      "message": "fix(arrow/ipc): propagate CLI stream errors (#986)\n\n### Rationale for this change\n\n`arrow-cat` and `arrow-ls` stopped when `Reader.Next` returned false but\ndid not inspect `Reader.Err`. A record read failure could therefore be\nreported as a successful end of stream. `arrow-cat` could exit\nsuccessfully after partial output, while `arrow-ls` could print a record\ncount for an incomplete stream.\n\n### What changes are included in this PR?\n\nCheck `Reader.Err` after iteration in both commands and return it after\nreleasing the reader. `arrow-ls` now prints the record count only after\nthe stream completes successfully. Regression tests use a valid schema\nfollowed by truncated record metadata.\n\n### Are these changes tested?\n\nYes:\n\n- `go test ./arrow/ipc/cmd/arrow-cat ./arrow/ipc/cmd/arrow-ls`\n- `go test -race -count\u003d1 ./arrow/ipc/cmd/arrow-cat\n./arrow/ipc/cmd/arrow-ls`\n\n### Are there any user-facing changes?\n\nBoth command-line tools now return an error for a failed record read\ninstead of reporting success. Valid stream output is unchanged."
    },
    {
      "commit": "5dd4b01c4e2b985289073aa8491a402718147ac4",
      "tree": "9cf6759226f93c3266185e1e0872b75d92a0b240",
      "parents": [
        "16ac2bc3bb0ec332b482c5327db874b2442d0694"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 18:06:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:06:27 2026 -0400"
      },
      "message": "fix(internal/utils): handle reader reset and short peeks (#987)\n\n### Rationale for this change\n\nThe internal buffered reader can retain a deferred error when an\nunderlying `Read` returns data and an error together. `Reset` replaced\nthe underlying reader but left that error pending, so the next read\ncould return the old error without touching the new input.\n\n`Peek` also returned the requested-length slice when input ended early,\nexposing unused buffer bytes instead of only the bytes that were read.\n\n### What changes are included in this PR?\n\nClear pending read errors in `Reset`, and clamp short `Peek` results to\nthe number of buffered bytes. Regression tests cover reuse after a\ndata-plus-error read and a partial peek at EOF.\n\n### Are these changes tested?\n\nYes:\n\n- `go test ./internal/utils`\n- `go test -race -count\u003d1 ./internal/utils`\n\n### Are there any user-facing changes?\n\nBuffered Parquet reads no longer carry an error across reader reuse or\nexpose unused bytes from a short peek. There is no public API change."
    },
    {
      "commit": "16ac2bc3bb0ec332b482c5327db874b2442d0694",
      "tree": "3e9a967aa2859fe9417df266100cafdf21a0766a",
      "parents": [
        "94f73abe159436f84211fb57ff982fb14cd1a955"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 23 18:03:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:03:35 2026 -0400"
      },
      "message": "fix(ipc): reject truncated message frames (#991)\n\n### Rationale for this change\n\nOnce an IPC message has started, a missing length, metadata block, or\nbody is a truncated frame rather than a clean end of stream.\n`io.ReadFull` returns an error matching `io.EOF` when none of the\nrequested bytes are available, and the IPC stream reader treats errors\nmatching `io.EOF` as normal completion. As a result, some truncated\nmessages were silently accepted.\n\n### What changes are included in this PR?\n\nNormalize errors matching `io.EOF` to `io.ErrUnexpectedEOF` when a\nrequired message component is missing after framing has begun. EOF\nbefore the next continuation indicator and explicit EOS markers keep\ntheir existing behavior.\n\nAdd coverage for truncation at the message length, metadata, and body,\nincluding wrapped EOF errors, plus a stream-level regression test that\nverifies the error reaches `Reader.Err()`.\n\n### Are these changes tested?\n\nYes. `go test ./arrow/ipc` and focused race tests pass.\n\n### Are there any user-facing changes?\n\nMalformed IPC streams now report an unexpected EOF instead of appearing\nto end successfully. Valid streams are unchanged."
    },
    {
      "commit": "94f73abe159436f84211fb57ff982fb14cd1a955",
      "tree": "4140797de52a1cf667e3327dab8320ddc8138b66",
      "parents": [
        "619a368a516aa76b76d0019d3682e01e38e9e1ae"
      ],
      "author": {
        "name": "Willem Jan",
        "email": "51120533+Willem-J-an@users.noreply.github.com",
        "time": "Wed Jul 22 18:26:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 12:26:09 2026 -0400"
      },
      "message": "fix: remove superfluous struct field index compare (#970)\n\nThe check is superfluous because:\n- Length is verified to equal\n- Next step iterates over fields \u0026 asserts the names are equal for each index.\n\nThese 2 steps essentially check the same thing, without needing expensive DeepEqual of 2 maps."
    },
    {
      "commit": "619a368a516aa76b76d0019d3682e01e38e9e1ae",
      "tree": "feac1145da682d76f927d150d96bacfdc94e5c60",
      "parents": [
        "477eb633d828ae4b29f74554d5948ea42390f30b"
      ],
      "author": {
        "name": "Matt Topol",
        "email": "zotthewizard@gmail.com",
        "time": "Wed Jul 22 10:56:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:56:35 2026 -0400"
      },
      "message": "ci: fix lint on release workflow (#982)"
    },
    {
      "commit": "477eb633d828ae4b29f74554d5948ea42390f30b",
      "tree": "a586358afa5cb17c157c66420d60291c22664780",
      "parents": [
        "6bd5c6e179fbb66814ba26f0fd5ec663bf603471"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 22 10:46:27 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:46:27 2026 -0400"
      },
      "message": "chore: Bump actions/setup-python from 6.3.0 to 7.0.0 (#962)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python)\nfrom 6.3.0 to 7.0.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/setup-python/releases\"\u003eactions/setup-python\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev7.0.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003ch3\u003eEnhancements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMigrate to ESM and upgrade dependencies by \u003ca\nhref\u003d\"https://github.com/priyagupta108\"\u003e\u003ccode\u003e@​priyagupta108\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1330\"\u003eactions/setup-python#1330\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePin SHA commits and update docs with latest versions by \u003ca\nhref\u003d\"https://github.com/HarithaVattikuti\"\u003e\u003ccode\u003e@​HarithaVattikuti\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1338\"\u003eactions/setup-python#1338\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove the pip-install input by \u003ca\nhref\u003d\"https://github.com/gowridurgad\"\u003e\u003ccode\u003e@​gowridurgad\u003c/code\u003e\u003c/a\u003e in\n\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1336\"\u003eactions/setup-python#1336\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fix\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix to Classify stderr warning messages as warnings instead of\nerrors in annotations by \u003ca\nhref\u003d\"https://github.com/lmvysakh\"\u003e\u003ccode\u003e@​lmvysakh\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1335\"\u003eactions/setup-python#1335\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eValidate and retry manifest fetch to prevent silent failures by \u003ca\nhref\u003d\"https://github.com/priyagupta108\"\u003e\u003ccode\u003e@​priyagupta108\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1332\"\u003eactions/setup-python#1332\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eDependency Upgrade\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump certifi from 2020.6.20 to 2024.7.4 in\n/\u003cstrong\u003etests\u003c/strong\u003e/data by \u003ca\nhref\u003d\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1328\"\u003eactions/setup-python#1328\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRemove EOL Python versions and Bumps numpy text fixture by \u003ca\nhref\u003d\"https://github.com/priya-kinthali\"\u003e\u003ccode\u003e@​priya-kinthali\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1333\"\u003eactions/setup-python#1333\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpgrade \u003ccode\u003e@​actions/cache\u003c/code\u003e to 6.2.0 by \u003ca\nhref\u003d\"https://github.com/philip-gai\"\u003e\u003ccode\u003e@​philip-gai\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1337\"\u003eactions/setup-python#1337\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/lmvysakh\"\u003e\u003ccode\u003e@​lmvysakh\u003c/code\u003e\u003c/a\u003e\nmade their first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1335\"\u003eactions/setup-python#1335\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/philip-gai\"\u003e\u003ccode\u003e@​philip-gai\u003c/code\u003e\u003c/a\u003e made\ntheir first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/pull/1337\"\u003eactions/setup-python#1337\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/setup-python/compare/v6...v7.0.0\"\u003ehttps://github.com/actions/setup-python/compare/v6...v7.0.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/5fda3b95a4ea91299a34e894583c3862153e4b97\"\u003e\u003ccode\u003e5fda3b9\u003c/code\u003e\u003c/a\u003e\nPin SHA commits and update docs with latest versions (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1338\"\u003e#1338\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/4ab7e95f05e168b4356aebde89dd84f59c283d8e\"\u003e\u003ccode\u003e4ab7e95\u003c/code\u003e\u003c/a\u003e\nMerge pull request \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1337\"\u003e#1337\u003c/a\u003e\nfrom actions/philip-gai/bump-actions-cache-6-2-0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/0f3a009f475dbea83c0371cd85d099690fee8c5c\"\u003e\u003ccode\u003e0f3a009\u003c/code\u003e\u003c/a\u003e\nRemove the pip-install input (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1336\"\u003e#1336\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/f8cf4291c8b8e273ddd26e569454615c7315d932\"\u003e\u003ccode\u003ef8cf429\u003c/code\u003e\u003c/a\u003e\nMigrate to ESM and upgrade dependencies (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1330\"\u003e#1330\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/54baeea5b34417d10a7479663a23cca53ea209b5\"\u003e\u003ccode\u003e54baeea\u003c/code\u003e\u003c/a\u003e\nValidate and retry manifest fetch to prevent silent failures (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1332\"\u003e#1332\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/c7092773a316760f4ecfe498e4af668a4dafeac5\"\u003e\u003ccode\u003ec709277\u003c/code\u003e\u003c/a\u003e\nAnnotation code fix (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1335\"\u003e#1335\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/6849080452e69b330395e8a6d23cf90f56d76a1a\"\u003e\u003ccode\u003e6849080\u003c/code\u003e\u003c/a\u003e\nremove EOL Python versions and Bumps numpy text fixture (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1333\"\u003e#1333\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-python/commit/0903b469fbf4441aadfe4f4b249dc5b1fba3a73e\"\u003e\u003ccode\u003e0903b46\u003c/code\u003e\u003c/a\u003e\nBump certifi from 2020.6.20 to 2024.7.4 in /\u003cstrong\u003etests\u003c/strong\u003e/data\n(\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-python/issues/1328\"\u003e#1328\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/actions/setup-python/compare/ece7cb06caefa5fff74198d8649806c4678c61a1...5fda3b95a4ea91299a34e894583c3862153e4b97\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "6bd5c6e179fbb66814ba26f0fd5ec663bf603471",
      "tree": "f1bd063b9bcd08c99c6f00d47fe88c8eae2bbc64",
      "parents": [
        "03c07797c37751601151fa9184a245aaadff1640"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 22 10:46:12 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:46:12 2026 -0400"
      },
      "message": "chore: Bump github.com/klauspost/compress from 1.19.0 to 1.19.1 (#966)\n\nBumps\n[github.com/klauspost/compress](https://github.com/klauspost/compress)\nfrom 1.19.0 to 1.19.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/klauspost/compress/releases\"\u003egithub.com/klauspost/compress\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.19.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ezstd: Validate SnappyConverter literal copies by \u003ca\nhref\u003d\"https://github.com/klauspost\"\u003e\u003ccode\u003e@​klauspost\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/pull/1170\"\u003eklauspost/compress#1170\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eflate: use \u003ccode\u003ePeek\u003c/code\u003e instead of \u003ccode\u003eReadByte\u003c/code\u003e for\nthe \u003ccode\u003ebufio.Reader\u003c/code\u003e decode path by \u003ca\nhref\u003d\"https://github.com/joechenrh\"\u003e\u003ccode\u003e@​joechenrh\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/pull/1169\"\u003eklauspost/compress#1169\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ezstd: bump avo pin, regenerate arm64 asm by \u003ca\nhref\u003d\"https://github.com/lizthegrey\"\u003e\u003ccode\u003e@​lizthegrey\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/pull/1167\"\u003eklauspost/compress#1167\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href\u003d\"https://github.com/joechenrh\"\u003e\u003ccode\u003e@​joechenrh\u003c/code\u003e\u003c/a\u003e\nmade their first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/pull/1169\"\u003eklauspost/compress#1169\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/klauspost/compress/compare/v1.19.0...v1.19.1\"\u003ehttps://github.com/klauspost/compress/compare/v1.19.0...v1.19.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/2602f4afea09fe72f2b58d4ed04d43a6047a0131\"\u003e\u003ccode\u003e2602f4a\u003c/code\u003e\u003c/a\u003e\nUpdate changelog for version 1.19.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/983acec6dacb98c0d721ca53eb5a904c3c6bec67\"\u003e\u003ccode\u003e983acec\u003c/code\u003e\u003c/a\u003e\nadd defensive checks\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/9960386c58450bc4ae5fd67411c394b6a7f23c4c\"\u003e\u003ccode\u003e9960386\u003c/code\u003e\u003c/a\u003e\nzstd: Validate SnappyConverter literal copies (\u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/issues/1170\"\u003e#1170\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/e29d4d389f0e7806e1e84392d0c43453a5048a0f\"\u003e\u003ccode\u003ee29d4d3\u003c/code\u003e\u003c/a\u003e\nflate: use \u003ccode\u003ePeek\u003c/code\u003e instead of \u003ccode\u003eReadByte\u003c/code\u003e for the\n\u003ccode\u003ebufio.Reader\u003c/code\u003e decode path (#...\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/c0bbc84762b7d178fe7b1e3a75140793179e9e37\"\u003e\u003ccode\u003ec0bbc84\u003c/code\u003e\u003c/a\u003e\nzstd: bump avo pin, regenerate arm64 asm (\u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/issues/1167\"\u003e#1167\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/klauspost/compress/commit/efdb6ed96c4b5d23f9bd6c3e739414789c871a9d\"\u003e\u003ccode\u003eefdb6ed\u003c/code\u003e\u003c/a\u003e\nbuild(deps): bump the github-actions group with 6 updates (\u003ca\nhref\u003d\"https://redirect.github.com/klauspost/compress/issues/1166\"\u003e#1166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/klauspost/compress/compare/v1.19.0...v1.19.1\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dgithub.com/klauspost/compress\u0026package-manager\u003dgo_modules\u0026previous-version\u003d1.19.0\u0026new-version\u003d1.19.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "03c07797c37751601151fa9184a245aaadff1640",
      "tree": "d44cc02ed4b1d651bf86e9a4d1e42a6ad499d6ac",
      "parents": [
        "9fcf02e1bb249eeaa1f21333e5afe6f72e4b7f9a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 22 10:45:42 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:45:42 2026 -0400"
      },
      "message": "chore: Bump google.golang.org/grpc from 1.82.0 to 1.82.1 (#965)\n\nBumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from\n1.82.0 to 1.82.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/grpc/grpc-go/releases\"\u003egoogle.golang.org/grpc\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eRelease 1.82.1\u003c/h2\u003e\n\u003ch1\u003eSecurity\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003eserver: Stop reading from the connection when flooded by HTTP/2\nframes. The default value for this limit is 100 frames, excluding DATA\nand HEADERS, and may be changed by setting environment variable\n\u003ccode\u003eGRPC_GO_EXPERIMENTAL_CONTROL_BUFFER_THROTTLE_LIMIT\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003exds/rbac: Support \u003ccode\u003eMetadata\u003c/code\u003e and\n\u003ccode\u003eRequestedServerName\u003c/code\u003e permissions matcher fields. If present\nin a DENY rule, previously these would be ignored and fail-open.\u003c/li\u003e\n\u003cli\u003exds/rbac: Fix panic when parsing unsupported fields in\n\u003ccode\u003eNotRule\u003c/code\u003e/\u003ccode\u003eNotId\u003c/code\u003e permissions.\u003c/li\u003e\n\u003cli\u003exds/rbac: Support the deprecated \u003ccode\u003esource_ip\u003c/code\u003e principal\nidentifier by treating it as equivalent to\n\u003ccode\u003edirect_remote_ip\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/grpc/grpc-go/commit/ebd8f06a09426fbece97157c95c3917abff28f4e\"\u003e\u003ccode\u003eebd8f06\u003c/code\u003e\u003c/a\u003e\nChange version to 1.82.1 (\u003ca\nhref\u003d\"https://redirect.github.com/grpc/grpc-go/issues/9238\"\u003e#9238\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/grpc/grpc-go/commit/4ea465d4ab98013f72a142fe0fc89c19770b2935\"\u003e\u003ccode\u003e4ea465d\u003c/code\u003e\u003c/a\u003e\nCherry-pick commits (\u003ca\nhref\u003d\"https://redirect.github.com/grpc/grpc-go/issues/9236\"\u003e#9236\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/grpc/grpc-go/commit/9494a2cf32a0ec9d35420af401445ef3c9f66f05\"\u003e\u003ccode\u003e9494a2c\u003c/code\u003e\u003c/a\u003e\nChange version to 1.82.1-dev (\u003ca\nhref\u003d\"https://redirect.github.com/grpc/grpc-go/issues/9171\"\u003e#9171\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/grpc/grpc-go/compare/v1.82.0...v1.82.1\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dgoogle.golang.org/grpc\u0026package-manager\u003dgo_modules\u0026previous-version\u003d1.82.0\u0026new-version\u003d1.82.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9fcf02e1bb249eeaa1f21333e5afe6f72e4b7f9a",
      "tree": "8b8cc8a2925f5385a8f6915097f2c883d8807878",
      "parents": [
        "7902dc4155c7fcd41c78424e8e8b12d5326a84bb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 22 10:45:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:45:31 2026 -0400"
      },
      "message": "chore: Bump modernc.org/sqlite from 1.53.0 to 1.54.0 (#964)\n\nBumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.53.0\nto 1.54.0.\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/blob/master/CHANGELOG.md\"\u003emodernc.org/sqlite\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e2026-07-20 v1.55.0:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003egithub.com/mattn/go-sqlite3\u003c/code\u003e-compatible shorthand\nDSN query parameters to ease migration from that driver:\n\u003ccode\u003e_busy_timeout\u003c/code\u003e/\u003ccode\u003e_timeout\u003c/code\u003e,\n\u003ccode\u003e_foreign_keys\u003c/code\u003e/\u003ccode\u003e_fk\u003c/code\u003e,\n\u003ccode\u003e_journal_mode\u003c/code\u003e/\u003ccode\u003e_journal\u003c/code\u003e,\n\u003ccode\u003e_synchronous\u003c/code\u003e/\u003ccode\u003e_sync\u003c/code\u003e,\n\u003ccode\u003e_auto_vacuum\u003c/code\u003e/\u003ccode\u003e_vacuum\u003c/code\u003e, and\n\u003ccode\u003e_query_only\u003c/code\u003e, each setting the correspondingly named PRAGMA.\nValues are validated against the same set \u003ccode\u003emattn/go-sqlite3\u003c/code\u003e\naccepts (case-insensitive) and an unrecognized value fails the\nconnection with an error, so a typo such as\n\u003ccode\u003e_synchronous\u003dfu1l\u003c/code\u003e or \u003ccode\u003e_foreign_keys\u003dyes_please\u003c/code\u003e\nis reported rather than silently downgrading durability or dropping\nforeign-key enforcement. The keys are applied in a fixed order\nindependent of their order in the DSN — \u003ccode\u003e_busy_timeout\u003c/code\u003e and\n\u003ccode\u003e_auto_vacuum\u003c/code\u003e before any \u003ccode\u003e_pragma\u003c/code\u003e values\n(\u003ccode\u003eauto_vacuum\u003c/code\u003e must be set before the database is first\nwritten), the rest after, and \u003ccode\u003e_query_only\u003c/code\u003e last — and where\na key and its alias are both supplied the alias wins, matching\n\u003ccode\u003emattn/go-sqlite3\u003c/code\u003e. Behavior change to note: prior releases\nignored these keys entirely, so a DSN carried over from a\n\u003ccode\u003emattn/go-sqlite3\u003c/code\u003e setup changes in two ways. A recognized\nkey that previously did nothing now takes effect —\n\u003ccode\u003e_foreign_keys\u003don\u003c/code\u003e begins enforcing constraints against data\nthat may already violate them, \u003ccode\u003e_journal_mode\u003dwal\u003c/code\u003e\npersistently converts the database file, and \u003ccode\u003e_query_only\u003d1\u003c/code\u003e\nmakes the connection read-only. And a value outside the accepted set now\nfails the connection with an error where the same DSN previously opened\nsuccessfully — for example a duration-style\n\u003ccode\u003e_busy_timeout\u003d5s\u003c/code\u003e or \u003ccode\u003e_timeout\u003d5000ms\u003c/code\u003e, neither\nof which is the integer that key requires. Review such DSNs before\nupgrading. \u003ccode\u003e_pragma\u003c/code\u003e and all other existing parameters are\nunchanged.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/134\"\u003e#134\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/134\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/134\u003c/a\u003e),\nthanks Toni Spets (\u003ca\nhref\u003d\"https://github.com/beeper-hifi\"\u003e\u003ccode\u003e@​beeper-hifi\u003c/code\u003e\u003c/a\u003e)\nand Ian Chechin!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2026-07-15 v1.54.0:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade to \u003ca\nhref\u003d\"https://sqlite.org/releaselog/3_53_3.html\"\u003eSQLite 3.53.3\u003c/a\u003e. This\nalso bumps the pinned \u003ccode\u003emodernc.org/libc\u003c/code\u003e to v1.74.1; as\nalways, downstream modules must pin the exact same\n\u003ccode\u003emodernc.org/libc\u003c/code\u003e version this module\u0027s \u003ccode\u003ego.mod\u003c/code\u003e\npins (see [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/177\"\u003e#177\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/177\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/177\u003c/a\u003e)).\u003c/li\u003e\n\u003cli\u003eUnder the opt-in \u003ccode\u003e_texttotime\u003c/code\u003e DSN parameter, best-effort\nparse date-shaped TEXT values from columns SQLite reports with an empty\ndeclared type — aggregates and expressions over a date column\n(\u003ccode\u003eMAX(d)\u003c/code\u003e, \u003ccode\u003eCOALESCE(d, ...)\u003c/code\u003e,\n\u003ccode\u003eupper(d)\u003c/code\u003e, \u003ccode\u003ed || \u0027\u0027\u003c/code\u003e), subqueries, and typeless\nreal columns (\u003ccode\u003eCREATE TABLE t(x)\u003c/code\u003e) — into\n\u003ccode\u003etime.Time\u003c/code\u003e, instead of delivering them as a raw string that\n\u003ccode\u003eScan\u003c/code\u003e cannot store into a \u003ccode\u003e*time.Time\u003c/code\u003e. The\nexisting declared\n\u003ccode\u003eDATE\u003c/code\u003e/\u003ccode\u003eDATETIME\u003c/code\u003e/\u003ccode\u003eTIME\u003c/code\u003e/\u003ccode\u003eTIMESTAMP\u003c/code\u003e\npath is unchanged; this only adds the empty-decltype case. The\nconversion is strictly best-effort: a value that does not parse as a\ntime falls through to the original string, so no \u003ccode\u003eScan\u003c/code\u003e that\nworked before can newly fail. \u003ccode\u003eColumnTypeScanType\u003c/code\u003e continues\nto report \u003ccode\u003estring\u003c/code\u003e for empty-decltype columns, since the\ndeclared type cannot prove the column is temporal. Without\n\u003ccode\u003e_texttotime\u003c/code\u003e the behavior is byte-for-byte unchanged.\nResolves [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/248\"\u003e#248\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/248\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/248\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/133\"\u003e#133\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/133\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/133\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2026-06-21 v1.53.0:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003cstrong\u003eexperimental\u003c/strong\u003e \u003ccode\u003enetbsd/amd64\u003c/code\u003e support,\nresolving the long-standing build break in [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/246\"\u003e#246\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/246\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/246\u003c/a\u003e).\nThis target is intentionally \u003cstrong\u003enot yet listed among the supported\nplatforms\u003c/strong\u003e in the package documentation: the port had been\nbroken for years and is only now revived, and there is as yet no\nreal-world experience running it under production workloads. Green CI is\nnot the same as battle-tested — so while the full test suite (including\nthe \u003ccode\u003epcache\u003c/code\u003e and \u003ccode\u003evec\u003c/code\u003e packages and the\n\u003ccode\u003e-race\u003c/code\u003e concurrency test) passes on NetBSD 10.1 / Go 1.26.3,\nand the entire upstream toolchain (\u003ccode\u003elibc\u003c/code\u003e, \u003ccode\u003ecc\u003c/code\u003e,\n\u003ccode\u003eccgo\u003c/code\u003e, \u003ccode\u003elibz\u003c/code\u003e, \u003ccode\u003elibtcl8.6\u003c/code\u003e,\n\u003ccode\u003elibsqlite3\u003c/code\u003e, \u003ccode\u003elibsqlite_vec\u003c/code\u003e) is green on the\nNetBSD CI builder, the target is offered for evaluation only. If you run\nNetBSD, please exercise it with your own workloads and report back via\n\u003ca href\u003d\"https://gitlab.com/cznic/sqlite/issues/246\"\u003e#246\u003c/a\u003e; the\nintent is to promote it to a fully supported platform after a period of\nbroader real-world testing (on the order of a month) elapses without\nsurprises.\u003c/li\u003e\n\u003cli\u003eImplementation notes: the previously shipped\n\u003ccode\u003elib/sqlite_netbsd_amd64.go\u003c/code\u003e was a stale old-generator\ntranspile that no longer compiled (the\n\u003ccode\u003emu.enter\u003c/code\u003e/\u003ccode\u003emu.leave\u003c/code\u003e break in \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/246\"\u003e#246\u003c/a\u003e); it is\nreplaced by a fresh new-generator transpile consistent with every other\nplatform, and \u003ccode\u003emodernc.org/sqlite/vec\u003c/code\u003e (sqlite-vec) is\nvendored and auto-registers on netbsd. Correct operation requires the\nmatching pinned \u003ccode\u003emodernc.org/libc\u003c/code\u003e, which carries two\nNetBSD-specific fixes found during this work: the \u003ccode\u003emmap(2)\u003c/code\u003e\n\u003ccode\u003ePAD\u003c/code\u003e-argument ABI (without it, concurrent WAL access faults\nwith SIGBUS in the WAL-index shared memory) and a working\n\u003ccode\u003eabort(3)\u003c/code\u003e (the prior stub left SQLite\u0027s crash-recovery\n\u003ccode\u003ewritecrash\u003c/code\u003e test unable to terminate by signal). As usual,\ndownstream modules must pin the exact \u003ccode\u003emodernc.org/libc\u003c/code\u003e\nversion this module\u0027s \u003ccode\u003ego.mod\u003c/code\u003e pins.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/82\"\u003e#82\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/82\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/82\u003c/a\u003e),\nthanks Leonardo Taccari (\u003ca\nhref\u003d\"https://github.com/iamleot\"\u003e\u003ccode\u003e@​iamleot\u003c/code\u003e\u003c/a\u003e) and Thomas\nKlausner (@\u003cem\u003ewiz\u003c/em\u003e)!\u003c/li\u003e\n\u003cli\u003eAdd \u003cstrong\u003eexperimental\u003c/strong\u003e \u003ccode\u003efreebsd/386\u003c/code\u003e and\n\u003ccode\u003efreebsd/arm\u003c/code\u003e support. As with the \u003ccode\u003enetbsd/amd64\u003c/code\u003e\ntarget above, these two 32-bit FreeBSD ports are intentionally\n\u003cstrong\u003enot yet listed among the supported platforms\u003c/strong\u003e in the\npackage documentation: \u003ccode\u003efreebsd/386\u003c/code\u003e previously shipped a\nstale, effectively untested SQLite 3.41 transpile, and\n\u003ccode\u003efreebsd/arm\u003c/code\u003e is entirely new, so neither has real-world\nproduction mileage yet. Both are now freshly transpiled at SQLite 3.53.2\nconsistent with every other platform, build cleanly, and pass the full\ntest suite (core, WAL/concurrency, and the \u003ccode\u003evec\u003c/code\u003e package) on\nthe FreeBSD CI builders; they are offered for evaluation only. If you\nrun 32-bit FreeBSD, please exercise these targets with your own\nworkloads and report back — the intent is to promote\n\u003ccode\u003efreebsd/386\u003c/code\u003e, \u003ccode\u003efreebsd/arm\u003c/code\u003e, and\n\u003ccode\u003enetbsd/amd64\u003c/code\u003e to fully supported platforms in a future\nrelease cycle, once a period of broader real-world testing elapses\nwithout surprises.\u003c/li\u003e\n\u003cli\u003eImplementation notes: correct operation on \u003ccode\u003efreebsd/arm\u003c/code\u003e\nrequires the matching pinned \u003ccode\u003emodernc.org/libc\u003c/code\u003e (v1.73.4),\nwhich fixes the per-arch \u003ccode\u003emmap(2)\u003c/code\u003e \u003ccode\u003eoff_t\u003c/code\u003e\nencoding for 32-bit FreeBSD; without it the WAL shared-memory mapping\nfaults with SIGBUS under concurrent access, the same class of bug found\non the netbsd port. As usual, downstream modules must pin the exact\n\u003ccode\u003emodernc.org/libc\u003c/code\u003e version this module\u0027s \u003ccode\u003ego.mod\u003c/code\u003e\npins.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/119\"\u003e#119\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/119\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/119\u003c/a\u003e),\nthanks Olivier Cochard-Labbé (\u003ca\nhref\u003d\"https://github.com/ocochard\"\u003e\u003ccode\u003e@​ocochard\u003c/code\u003e\u003c/a\u003e)!\u003c/li\u003e\n\u003cli\u003eAdd a Go-facing wrapper for \u003ccode\u003eSQLITE_CONFIG_PCACHE2\u003c/code\u003e.\n\u003ccode\u003ePageCache\u003c/code\u003e is the factory and \u003ccode\u003eCache\u003c/code\u003e the\nper-database instance, both idiomatic Go interfaces; \u003ccode\u003ePage\u003c/code\u003e\nexposes the raw \u003ccode\u003eBuf\u003c/code\u003e and \u003ccode\u003eExtra\u003c/code\u003e pointers that\nSQLite reads through the C pcache contract.\n\u003ccode\u003eRegisterPageCache\u003c/code\u003e and \u003ccode\u003eMustRegisterPageCache\u003c/code\u003e\ninstall the module process-globally before the first\n\u003ccode\u003esql.Open\u003c/code\u003e; subsequent Open calls are gated through a\none-shot \u003ccode\u003eXsqlite3_config(SQLITE_CONFIG_PCACHE2)\u003c/code\u003e so a\ntoo-late Register returns \u003ccode\u003eErrPageCacheTooLate\u003c/code\u003e rather than\nsilently falling through to the built-in pcache1. The binding owns the\n\u003ccode\u003esqlite3_pcache_page\u003c/code\u003e stub and re-consults the implementation\non every Fetch, reusing the stub only when the returned\n\u003ccode\u003ePage\u003c/code\u003e value is unchanged, which keeps a bounded/evicting\npurgeable cache safe by construction.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/126\"\u003e#126\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/126\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/126\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003emodernc.org/sqlite/pcache\u003c/code\u003e, the reference page-cache\nimplementation that accompanies the \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/126\"\u003e#126\u003c/a\u003e\n\u003ccode\u003eSQLITE_CONFIG_PCACHE2\u003c/code\u003e wrapper. \u003ccode\u003epcache.New\u003c/code\u003e\nreturns a \u003ccode\u003e*Pool\u003c/code\u003e satisfying the \u003ccode\u003ePageCache\u003c/code\u003e\ninterface; register it once with\n\u003ccode\u003esqlite.MustRegisterPageCache(pcache.New())\u003c/code\u003e and every\nconnection opened afterwards draws its pages from it. Each\n\u003ccode\u003ePool.Create\u003c/code\u003e mints a fresh per-database \u003ccode\u003eCache\u003c/code\u003e:\na bounded, LRU-evicting page store that honours the \u003ccode\u003ePRAGMA\ncache_size\u003c/code\u003e soft cap and releases the least-recently-unpinned page\nwhen it must make room. Page memory — the \u003ccode\u003eBuf\u003c/code\u003e and\n\u003ccode\u003eExtra\u003c/code\u003e buffers SQLite reads through — is allocated with\n\u003ccode\u003elibc.Xmalloc\u003c/code\u003e/\u003ccode\u003elibc.Xcalloc\u003c/code\u003e and therefore lives\noff the Go heap, which keeps SQLite\u0027s interior pointer arithmetic on the\npage extras from tripping the race detector\u0027s checkptr enforcement.\n\u003ccode\u003ePool.Stats\u003c/code\u003e reports aggregate lifetime counters (hits,\nmisses, allocs, evictions, rekeys, truncates, caches) across every cache\na Pool has created, so hit/miss/eviction behaviour is observable without\ninstrumenting individual caches. Cross-connection page sharing is out of\nscope for now; each \u003ccode\u003eCreate\u003c/code\u003e returns an independent\nper-database cache.\u003c/li\u003e\n\u003cli\u003eValidated end-to-end against the \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/126\"\u003e#126\u003c/a\u003e stress\nworkload (\u003ccode\u003ecache_size\u003d16\u003c/code\u003e, 4000 BLOB rows with DELETE and\n\u003ccode\u003eincremental_vacuum\u003c/code\u003e, \u003ccode\u003eintegrity_check\u003c/code\u003e clean\nunder \u003ccode\u003e-race\u003c/code\u003e) and benchmarked for the memory-utilization\ngoal tracked in [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/204\"\u003e#204\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/204\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/204\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/127\"\u003e#127\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/127\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/127\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eTighten the \u003ccode\u003emodernc.org/sqlite/pcache\u003c/code\u003e reference\nimplementation per cznic\u0027s !127 review follow-ups. Adds\n\u003ccode\u003eStats.EasyRefusals\u003c/code\u003e, a per-Pool counter for the cases where\n\u003ccode\u003eFetchCreateEasy\u003c/code\u003e returns nil at cap; SQLite reacts to a\nrefusal by spilling dirty pages and retrying with\n\u003ccode\u003eFetchCreateForce\u003c/code\u003e, so the new field is a direct proxy for\nthe I/O pressure the strict Easy contract imposes vs pcache1\u0027s\nrecycle-without-spill behavior. \u003ccode\u003eBenchmarkPoolEvictionChurn\u003c/code\u003e\nwas reworked to drive a rotating-residue DELETE (\u003ccode\u003ek % 3 \u003d i %\n3\u003c/code\u003e) and re-insert a matching batch each cycle so the spill\npressure recurs and \u003ccode\u003eeasy-refusals/op\u003c/code\u003e scales with\n\u003ccode\u003eb.N\u003c/code\u003e instead of capping at the seed\u0027s one-time first-cycle\ncost; both existing benchmarks now report \u003ccode\u003eeasy-refusals/op\u003c/code\u003e\nalongside the page-allocs/evictions metrics.\n\u003ccode\u003eStats.Evictions\u003c/code\u003e documentation was tightened to match the\nactual behavior (counts LRU eviction, \u003ccode\u003eUnpin(discard\u003dtrue)\u003c/code\u003e,\n\u003ccode\u003eShrink\u003c/code\u003e releases, and \u003ccode\u003eUnpin(discard\u003dfalse)\u003c/code\u003e\ntrimming back to target after a \u003ccode\u003eFetchCreateForce\u003c/code\u003e\novercommit; bulk frees from \u003ccode\u003eTruncate\u003c/code\u003e, \u003ccode\u003eRekey\u003c/code\u003e\ncollisions, and \u003ccode\u003eDestroy\u003c/code\u003e are not counted). The\n\u003ccode\u003eTestPoolRoundTripIntegrity\u003c/code\u003e comment claiming the workload\nexercises \u003ccode\u003exRekey\u003c/code\u003e ~15 times has been corrected; the SQL\nsurface does not reliably emit xRekey here, and that codepath is covered\nby the unit tests instead.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/130\"\u003e#130\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/130\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/130\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eMake \u003ccode\u003emodernc.org/sqlite/pcache\u003c/code\u003e \u003ccode\u003e-race\u003c/code\u003e-clean\nunder SQLite\u0027s \u003ccode\u003ecache\u003dshared\u003c/code\u003e mode. The pool already runs\ncorrectly under shared-cache because every callback into a given\n\u003ccode\u003eCache\u003c/code\u003e is serialised internally by SQLite\u0027s\n\u003ccode\u003esqlite3BtreeEnter\u003c/code\u003e on the \u003ccode\u003eBtShared\u003c/code\u003e mutex;\nverified empirically with a lock-free in-flight probe (max-in-flight \u003d 1\non the canonical two-connection workload, 4 on a positive control with\ngoroutines hitting the cache directly). However the Go race detector\ndoes not recognise SQLite\u0027s libc mutex as a happens-before edge and\nreports false-positive races on \u003ccode\u003eFetch\u003c/code\u003e vs \u003ccode\u003eUnpin\u003c/code\u003e\nreads/writes of the per-cache state, which surfaces as \u003ccode\u003eDATA\nRACE\u003c/code\u003e failures for any user who registers the pool and runs their\nsuite under \u003ccode\u003e-race\u003c/code\u003e. A \u003ccode\u003esync.Mutex\u003c/code\u003e on the\n\u003ccode\u003ecache\u003c/code\u003e type is now taken on every public method\n(\u003ccode\u003eSetSize\u003c/code\u003e, \u003ccode\u003ePageCount\u003c/code\u003e, \u003ccode\u003eFetch\u003c/code\u003e,\n\u003ccode\u003eUnpin\u003c/code\u003e, \u003ccode\u003eRekey\u003c/code\u003e, \u003ccode\u003eTruncate\u003c/code\u003e,\n\u003ccode\u003eDestroy\u003c/code\u003e, \u003ccode\u003eShrink\u003c/code\u003e), always. On the common\nnon-shared-cache path the lock is uncontended (one atomic CAS per\nLock/Unlock pair, negligible next to the SQLite work it bookends); on\nthe shared-cache path it just rubber-stamps the order SQLite\u0027s\n\u003ccode\u003eBtShared\u003c/code\u003e mutex already established. A new\n\u003ccode\u003ee2e_test.go\u003c/code\u003e \u003ccode\u003eTestSharedCacheTwoConns_Integrity\u003c/code\u003e\ndrives two \u003ccode\u003esql.Conn\u003c/code\u003e against the same\n\u003ccode\u003ecache\u003dshared\u003c/code\u003e URI with concurrent writers and asserts\n\u003ccode\u003ePRAGMA integrity_check \u003d ok\u003c/code\u003e under \u003ccode\u003e-race\u003c/code\u003e;\npasses cleanly with the lock, would surface the false-positive without\nit. Design notes live in \u003ccode\u003epcache/sharing.go\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/131\"\u003e#131\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/131\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/131\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eAdd a Go wrapper for \u003ccode\u003esqlite3_db_status\u003c/code\u003e, the\nper-connection runtime counters (cache hit/miss/write/spill rates,\nschema and prepared-statement memory, lookaside usage, deferred foreign\nkeys). \u003ccode\u003eDBStatus\u003c/code\u003e is an interface implemented by the driver\nconnection and reached through the \u003ccode\u003edatabase/sql\u003c/code\u003e escape\nhatch \u003ccode\u003e(*sql.Conn).Raw()\u003c/code\u003e, mirroring the existing\n\u003ccode\u003eFileControl\u003c/code\u003e surface; \u003ccode\u003eDBStatusOp\u003c/code\u003e is a distinct\ntyped enum of the \u003ccode\u003eSQLITE_DBSTATUS_*\u003c/code\u003e verbs so a counter from\na different op family will not compile in its place. \u003ccode\u003eStatus(op,\nreset)\u003c/code\u003e returns the \u003ccode\u003e(current, high)\u003c/code\u003e pair and\noptionally resets the counter. This also lets\n\u003ccode\u003emodernc.org/sqlite/pcache\u003c/code\u003e measure real I/O instead of the\n\u003ccode\u003eEasyRefusals\u003c/code\u003e proxy: the new\n\u003ccode\u003eBenchmarkPoolSpillIO\u003c/code\u003e reads the pager-level\n\u003ccode\u003eSQLITE_DBSTATUS_CACHE_SPILL\u003c/code\u003e/\u003ccode\u003e_CACHE_WRITE\u003c/code\u003e\ncounters, which the pager maintains identically for pcache1 and the\npool, making the pcache1-vs-pool comparison cznic raised on the !127\nreview a genuine apples-to-apples measurement. On the rotating-residue\neviction-churn workload at \u003ccode\u003ecache_size\u003d16\u003c/code\u003e the pool spills\n~3.5x more than pcache1 (cache-spill/op 31.96 vs 8.96) for ~3% more page\nwrites (cache-write/op 450 vs 436) at identical hit/miss, quantifying\nthe I/O cost of the strict Easy contract that \u003ccode\u003eEasyRefusals\u003c/code\u003e\nonly proxied.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/132\"\u003e#132\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/132\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/132\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eAdd an opt-in \u003ccode\u003e_dqs\u003c/code\u003e DSN query parameter that disables\nSQLite\u0027s double-quoted string literal compatibility quirk on a\nper-connection basis. When \u003ccode\u003e_dqs\u003d0\u003c/code\u003e (or any\n\u003ccode\u003estrconv.ParseBool\u003c/code\u003e false value) is supplied, the driver\ncalls \u003ccode\u003esqlite3_db_config\u003c/code\u003e with\n\u003ccode\u003eSQLITE_DBCONFIG_DQS_DDL\u003c/code\u003e and\n\u003ccode\u003eSQLITE_DBCONFIG_DQS_DML\u003c/code\u003e set to off before any statement is\nprepared, so a double-quoted identifier that fails to resolve raises a\nparse error instead of silently falling back to a string literal.\nAbsence of the parameter, or \u003ccode\u003e_dqs\u003d1\u003c/code\u003e, leaves SQLite\u0027s\ndefault behavior unchanged; existing DSNs continue to work\nbyte-for-byte. Resolves [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/61\"\u003e#61\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/61\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/61\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/128\"\u003e#128\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/128\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/128\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eAdd an opt-in \u003ccode\u003e_error_rc\u003c/code\u003e DSN query parameter for clearer\nerror reporting on open-time failures. When \u003ccode\u003e_error_rc\u003d1\u003c/code\u003e (or\nany \u003ccode\u003estrconv.ParseBool\u003c/code\u003e true value) is supplied, error\nstrings synthesised from a \u003ccode\u003e(rc, db)\u003c/code\u003e pair only append\n\u003ccode\u003esqlite3_errmsg(db)\u003c/code\u003e when\n\u003ccode\u003esqlite3_extended_errcode(db)\u003c/code\u003e is consistent with the\noperation rc (full match first, primary code \u003ccode\u003e\u0026amp;0xff\u003c/code\u003e as\nfallback). On mismatch the canonical \u003ccode\u003esqlite3_errstr(rc)\u003c/code\u003e is\nused alone, so an open-time \u003ccode\u003eSQLITE_CANTOPEN\u003c/code\u003e no longer\ncarries the temporary handle\u0027s stale \u0026quot;out of memory\u0026quot; errmsg.\nAbsence of the parameter, or \u003ccode\u003e_error_rc\u003d0\u003c/code\u003e, preserves the\nlegacy \u0026quot;errstr: errmsg\u0026quot; form byte-for-byte; existing callers\nthat parse error strings are unaffected. The driver\u0027s\n\u003ccode\u003e*Error.Code()\u003c/code\u003e returns the same SQLite result code in both\nmodes. Parsed before \u003ccode\u003esqlite3_open_v2\u003c/code\u003e so open-time errors\nare covered. Resolves [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/230\"\u003e#230\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/230\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/230\u003c/a\u003e).\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/129\"\u003e#129\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/129\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/129\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2026-06-06 v1.52.0:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUpgrade to \u003ca\nhref\u003d\"https://sqlite.org/releaselog/3_53_2.html\"\u003eSQLite 3.53.2\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eBackup.Remaining\u003c/code\u003e and \u003ccode\u003eBackup.PageCount\u003c/code\u003e,\nthin wrappers around the existing \u003ccode\u003esqlite3_backup_remaining\u003c/code\u003e\nand \u003ccode\u003esqlite3_backup_pagecount\u003c/code\u003e C symbols. Together they\nexpose the per-\u003ccode\u003eStep\u003c/code\u003e progress counters that the underlying\nbackup object already maintains, enabling progress reporting during\nonline backups without dropping to \u003ccode\u003emodernc.org/sqlite/lib\u003c/code\u003e\ndirectly.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/122\"\u003e#122\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/122\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/122\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eDrop the redundant second copy in \u003ccode\u003e(*conn).columnText\u003c/code\u003e,\nthe path that backs every \u003ccode\u003eRows.Scan\u003c/code\u003e into a Go\n\u003ccode\u003estring\u003c/code\u003e for a TEXT column. The value\u0027s bytes are still\ncopied once out of SQLite-owned memory into a fresh Go buffer; that\nbuffer is then reinterpreted as the result string with\n\u003ccode\u003eunsafe.String\u003c/code\u003e rather than copied a second time by the\nimplicit \u003ccode\u003estring([]byte)\u003c/code\u003e conversion. This removes one\nallocation per TEXT value per row and roughly halves the bytes allocated\non that path; on the new \u003ccode\u003eBenchmarkColumnTextScan\u003c/code\u003e cases it\nis ~13–20% faster for payloads of 256 B and larger, with no measurable\nchange for very short strings. Purely internal: no API or behavioral\nchange, and the returned string never aliases SQLite\u0027s buffer.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/123\"\u003e#123\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/123\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/123\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eCache each result column\u0027s declared type once per result set in\n\u003ccode\u003enewRows\u003c/code\u003e instead of recomputing it on every row. The TEXT\nbranch of \u003ccode\u003eRows.Next\u003c/code\u003e calls\n\u003ccode\u003eColumnTypeDatabaseTypeName\u003c/code\u003e for every TEXT column on every\nrow (independent of any DSN flag), which previously did a\n\u003ccode\u003elibc.GoString\u003c/code\u003e + \u003ccode\u003estrings.ToUpper\u003c/code\u003e each time;\nthat lookup is now a single index into a cached, pre-uppercased\n\u003ccode\u003e[]string\u003c/code\u003e, and \u003ccode\u003eColumnTypeScanType\u003c/code\u003e reads the\nsame cache and drops its per-call \u003ccode\u003estrings.ToLower\u003c/code\u003e. The\ndeclared type is fixed for the lifetime of a prepared statement, so the\nC round-trip is paid once per column rather than once per column per\nrow, removing exactly 1 alloc + 8 B per TEXT column per row from the\n\u003ccode\u003eNext\u003c/code\u003e hot path. The new \u003ccode\u003eBenchmarkTextToTimeScan\u003c/code\u003e\ncases show ~7% faster on a 1000-row DATETIME SELECT under\n\u003ccode\u003e_texttotime\u003d1\u003c/code\u003e. Purely internal:\n\u003ccode\u003eColumnTypeDatabaseTypeName\u003c/code\u003e and\n\u003ccode\u003eColumnTypeScanType\u003c/code\u003e return identical values, no API or\nbehavioral change.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/124\"\u003e#124\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/124\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/124\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eCache, per result column, the \u003ccode\u003eparseTimeFormats\u003c/code\u003e index\nthat first parsed a TEXT-stored DATE/DATETIME/TIMESTAMP value, and try\nthat format first on later rows instead of re-walking the list from the\ntop. \u003ccode\u003e(*conn).parseTime\u003c/code\u003e previously ran\n\u003ccode\u003etime.Parse\u003c/code\u003e down the format list on every such row; for the\ncanonical SQLite TEXT datetime format every row paid two failed\n\u003ccode\u003etime.Parse\u003c/code\u003e attempts — each allocating a\n\u003ccode\u003e*time.ParseError\u003c/code\u003e — before the match. On a 1000-row DATETIME\nTEXT SELECT this cuts ~50% of allocs/op and ~57% of B/op and is ~37%\nfaster. The fall-through chain is preserved exactly: the seven formats\nare mutually exclusive, so the cached hint can never select a different\nmatch than the in-order scan, and the parsed \u003ccode\u003edriver.Value\u003c/code\u003e\nis identical to before. Purely internal: no API or behavioral\nchange.\u003c/li\u003e\n\u003cli\u003eSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/125\"\u003e#125\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/125\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/125\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e2026-05-28 v1.51.0:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePool the \u003ccode\u003e[]driver.Value\u003c/code\u003e slice passed to\nscalar/aggregate UDF callbacks and to vtab\n\u003ccode\u003eFilter\u003c/code\u003e/\u003ccode\u003eInsert\u003c/code\u003e/\u003ccode\u003eUpdate\u003c/code\u003e callbacks,\neliminating the dominant per-row allocation on UDF-heavy queries.\nBenchmarks on a 1000-row, 3-arg noop scalar UDF show ~40% fewer bytes/op\nand ~15% fewer allocs/op.\u003c/li\u003e\n\u003cli\u003eDocument the matching \u0026quot;arguments are not valid past\nreturn\u0026quot; contract on \u003ccode\u003evtab.Cursor.Filter\u003c/code\u003e and\n\u003ccode\u003evtab.Updater.Insert\u003c/code\u003e/\u003ccode\u003eUpdate\u003c/code\u003e, consistent with\nthe existing rule for \u003ccode\u003eFunctionImpl.Scalar\u003c/code\u003e /\n\u003ccode\u003eAggregateFunction.Step\u003c/code\u003e / \u003ccode\u003eWindowInverse\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eResolves [GitLab issue \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/226\"\u003e#226\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/issues/226\"\u003ehttps://gitlab.com/cznic/sqlite/-/issues/226\u003c/a\u003e).\nSee [GitLab merge request \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/114\"\u003e#114\u003c/a\u003e](\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/-/merge_requests/114\"\u003ehttps://gitlab.com/cznic/sqlite/-/merge_requests/114\u003c/a\u003e),\nthanks Ian Chechin!\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eFileControl.FileControlDataVersion\u003c/code\u003e, a wrapper\naround \u003ccode\u003eSQLITE_FCNTL_DATA_VERSION\u003c/code\u003e for observing pager-cache\ndata-version changes, including those made on the same connection.\nUseful as a primitive for application-level cache invalidation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/commit/693ff386c68d2964fe40d2f3c0b6cd06630660c4\"\u003e\u003ccode\u003e693ff38\u003c/code\u003e\u003c/a\u003e\nupgrade to SQLite 3.53.3\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/commit/5d243466fa05e8c49a870ead00b79bd4a423f712\"\u003e\u003ccode\u003e5d24346\u003c/code\u003e\u003c/a\u003e\nMerge branch \u0027texttotime-aggregates\u0027 into \u0027master\u0027\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/commit/892d8477d4fc7e4e699437936393e5bc20fea071\"\u003e\u003ccode\u003e892d847\u003c/code\u003e\u003c/a\u003e\nsqlite: document _texttotime empty-decltype upgrade, widen \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/issues/248\"\u003e#248\u003c/a\u003e comment, add\n...\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/commit/f2c8758475043b7d5be68e9159121718f2ef49e1\"\u003e\u003ccode\u003ef2c8758\u003c/code\u003e\u003c/a\u003e\nsqlite: _texttotime best-effort parse for empty-decltype TEXT columns\n(\u003ca href\u003d\"https://gitlab.com/cznic/sqlite/issues/248\"\u003e#248\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://gitlab.com/cznic/sqlite/compare/v1.53.0...v1.54.0\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMost Recent Ignore Conditions Applied to This Pull\nRequest\u003c/summary\u003e\n\n| Dependency Name | Ignore Conditions |\n| --- | --- |\n| modernc.org/sqlite | [\u003e\u003d 1.34.a, \u003c 1.35] |\n\u003c/details\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dmodernc.org/sqlite\u0026package-manager\u003dgo_modules\u0026previous-version\u003d1.53.0\u0026new-version\u003d1.54.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7902dc4155c7fcd41c78424e8e8b12d5326a84bb",
      "tree": "090d1761e67bea6321c73fd59c0d6ee040abbba4",
      "parents": [
        "950ed41903b75fe842b6e255625f375df405953d"
      ],
      "author": {
        "name": "Matt Topol",
        "email": "zotthewizard@gmail.com",
        "time": "Tue Jul 21 12:49:29 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 12:49:29 2026 -0400"
      },
      "message": "ci: fix release workflow discussions (#980)"
    },
    {
      "commit": "950ed41903b75fe842b6e255625f375df405953d",
      "tree": "8e029e6de5c88380816b53814a860081c9e76eaf",
      "parents": [
        "237de00e04e89e49eb618e8303aaa8dc791ee267"
      ],
      "author": {
        "name": "Raúl Cumplido",
        "email": "raulcumplido@gmail.com",
        "time": "Tue Jul 21 17:39:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:39:52 2026 -0400"
      },
      "message": "chore(dev/release): filter out non numeric go releases (rc\u0027s and beta\u0027s) when finding latest go (#968)\n\n### Rationale for this change\n\nWhen running the release verification script without a local go version\nit currently might download RC or Beta releases. We should test\nverification with Released go versions.\n\n### What changes are included in this PR?\n\nAdd a filter to force only numeric releases. Filtering releases for go\nwith rc or beta suffixes.\n\n### Are these changes tested?\n\nYes I tested this locally, prior to the issue it downloaded `+\ngo_version\u003d1.27rc2` after the fix it downloaded `+ go_version\u003d1.26.5`\n\n### Are there any user-facing changes?\n\nNo\n\nCloses https://github.com/apache/arrow-go/issues/967"
    },
    {
      "commit": "237de00e04e89e49eb618e8303aaa8dc791ee267",
      "tree": "f013a5271ea42f5ceb67d2c3bbad39c00c51a9c1",
      "parents": [
        "ca0762e1fae411ab2f8f98edd5938df115bc9d27"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 15:35:50 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 15:35:50 2026 -0400"
      },
      "message": "chore: Bump actions/checkout from 7.0.0 to 7.0.1 (#963)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0\nto 7.0.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/checkout/releases\"\u003eactions/checkout\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev7.0.1\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eskip running unsafe pr check if input is default by \u003ca\nhref\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/checkout/pull/2518\"\u003eactions/checkout#2518\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etrim only ascii whitespace for branch by \u003ca\nhref\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/checkout/pull/2521\"\u003eactions/checkout#2521\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eescape values passed to --unset by \u003ca\nhref\u003d\"https://github.com/aiqiaoy\"\u003e\u003ccode\u003e@​aiqiaoy\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/checkout/pull/2530\"\u003eactions/checkout#2530\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVarious dependency updates\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/checkout/compare/v7...v7.0.1\"\u003ehttps://github.com/actions/checkout/compare/v7...v7.0.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/actions/checkout/compare/v7...v7.0.1\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/checkout\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d7.0.0\u0026new-version\u003d7.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ca0762e1fae411ab2f8f98edd5938df115bc9d27",
      "tree": "68e97cbf578d4ef0b80a2d215cb95f0216a65563",
      "parents": [
        "c3151ade7001dd4524f6fc5cf6e0e420bb1647c9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 15:35:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 15:35:26 2026 -0400"
      },
      "message": "chore: Bump actions/setup-go from 6.5.0 to 7.0.0 (#961)\n\nBumps [actions/setup-go](https://github.com/actions/setup-go) from 6.5.0\nto 7.0.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/actions/setup-go/releases\"\u003eactions/setup-go\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev7.0.0\u003c/h2\u003e\n\u003ch2\u003eWhat\u0027s Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMigrate to ESM and upgrade dependencies by \u003ca\nhref\u003d\"https://github.com/priyagupta108\"\u003e\u003ccode\u003e@​priyagupta108\u003c/code\u003e\u003c/a\u003e\nin \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-go/pull/763\"\u003eactions/setup-go#763\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): bump \u003ccode\u003e@​actions/cache\u003c/code\u003e to 6.2.0 by \u003ca\nhref\u003d\"https://github.com/philip-gai\"\u003e\u003ccode\u003e@​philip-gai\u003c/code\u003e\u003c/a\u003e in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-go/pull/771\"\u003eactions/setup-go#771\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/philip-gai\"\u003e\u003ccode\u003e@​philip-gai\u003c/code\u003e\u003c/a\u003e made\ntheir first contribution in \u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-go/pull/771\"\u003eactions/setup-go#771\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca\nhref\u003d\"https://github.com/actions/setup-go/compare/v6...v7.0.0\"\u003ehttps://github.com/actions/setup-go/compare/v6...v7.0.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-go/commit/b7ad1dad31e06c5925ef5d2fc7ad053ef454303e\"\u003e\u003ccode\u003eb7ad1da\u003c/code\u003e\u003c/a\u003e\nchore(deps): bump \u003ccode\u003e@​actions/cache\u003c/code\u003e to 6.2.0 (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-go/issues/771\"\u003e#771\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/actions/setup-go/commit/0778a10ce47b5d450cf60fb94fafad4330008a35\"\u003e\u003ccode\u003e0778a10\u003c/code\u003e\u003c/a\u003e\nMigrate to ESM and upgrade dependencies (\u003ca\nhref\u003d\"https://redirect.github.com/actions/setup-go/issues/763\"\u003e#763\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/actions/setup-go/compare/v6.5.0...v7\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dactions/setup-go\u0026package-manager\u003dgithub_actions\u0026previous-version\u003d6.5.0\u0026new-version\u003d7.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "c3151ade7001dd4524f6fc5cf6e0e420bb1647c9",
      "tree": "1b263b0419b2abd9a038e3acc5055f01dbd36d52",
      "parents": [
        "0716bc64bc48e7322fcae137e14cf74cd94747fe"
      ],
      "author": {
        "name": "Colton Loftus",
        "email": "70598503+C-Loftus@users.noreply.github.com",
        "time": "Mon Jul 20 14:28:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 14:28:11 2026 -0400"
      },
      "message": "feat(parquet/schema): Wire up logical type functionality for writing geo types (#960)\n\nImplement the LogicalType interface for Geometry and Geography so the Parquet write path emits proper geospatial metadata instead of plain byte-array blobs."
    },
    {
      "commit": "0716bc64bc48e7322fcae137e14cf74cd94747fe",
      "tree": "ee609b0b29f3cb712b659d4b9f7e515646a16d2c",
      "parents": [
        "c9791ae4041f3b06bda6bb893baa3382474048cd"
      ],
      "author": {
        "name": "Matt Topol",
        "email": "zotthewizard@gmail.com",
        "time": "Sun Jul 19 15:30:19 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 15:30:19 2026 -0400"
      },
      "message": "chore: bump version number (#959)\n\nbumping for next release"
    },
    {
      "commit": "c9791ae4041f3b06bda6bb893baa3382474048cd",
      "tree": "f870e8acbd48d0b171c247131468c78261038cab",
      "parents": [
        "621a4ed1efb013b48dca30eecfaf4490178f9022"
      ],
      "author": {
        "name": "Lucas Valente",
        "email": "serramatutu@users.noreply.github.com",
        "time": "Sun Jul 19 03:36:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 21:36:35 2026 -0400"
      },
      "message": "Add `TimestampWithOffset` canonical extension type (#558)\n\n# Which issue does this PR close?\n\nImplements the new `arrow.timestamp_with_offset` canonical extension\ntype for arrow-go.\n\n# Rationale for this change\n\nBe compatible with the Arrow columnar spec\u0027s\n`arrow.timestamp_with_offset` canonical extension type.\n\n# What changes are included in this PR?\n\nAdds a `TimestampWithOffset` extension type. This type represents a\ntimestamp column that stores a potentially different timezone offset per\nvalue: the timestamp is stored in UTC alongside the original timezone\noffset in minutes. The offset-in-minutes field can be primitive-,\ndictionary-, or run-end-encoded.\n\n**This PR has been decoupled from the inner-nullability parity work it\nwas previously based on.** Those comparison / JSON-marshaling changes\nnow live in #918 and can be reviewed and merged independently. This PR\nis now scoped to just the extension type and touches only:\n\n- `arrow/extensions/timestamp_with_offset.go` (new)\n- `arrow/extensions/timestamp_with_offset_test.go` (new)\n- `arrow/extensions/extensions.go` (register the canonical type)\n\nTo keep this PR self-contained, the JSON round-trip test asserts the\nvalues the type guarantees (per-row instant, timezone offset, and\nvalidity) rather than `array.RecordEqual`, which would compare inner\nnon-nullable struct child validity bitmaps — the parity concern tracked\nseparately in #918.\n\n# Are these changes tested?\n\nYes — primitive/dictionary/run-end offset encodings, JSON marshal +\nround-trip, and IPC round-trip.\n\n# Are there any user-facing changes?\n\nYes, this is a new canonical extension type.\n\n---------\n\nCo-authored-by: Matt Topol \u003czotthewizard@gmail.com\u003e\nCo-authored-by: Matt Topol \u003cmatt@columnar.tech\u003e"
    },
    {
      "commit": "621a4ed1efb013b48dca30eecfaf4490178f9022",
      "tree": "513db4e3d7a98c9ad046662c9c8569319fa87300",
      "parents": [
        "ad2fe2b481177d70d9fec687d766ab1fe17731d3"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Sat Jul 18 19:09:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 13:09:59 2026 -0400"
      },
      "message": "fix(array): validate map builder entry lengths (#957)\n\nMapBuilder sized its child struct from the key builder without checking the item builder, so unequal key/item counts could create malformed map data or defer the failure to later array access. Validate before array construction: reject unequal key and item builder lengths, reject a child struct length exceeding the entry count, require the offset count to match the map count (or map count plus one), and validate any explicitly supplied final offset against the available entries. Invariant failures panic wrapping arrow.ErrInvalid, consistent with the builder API. Valid builder usage is unchanged."
    },
    {
      "commit": "ad2fe2b481177d70d9fec687d766ab1fe17731d3",
      "tree": "e0fd5ff510ff98d2726f9f57b468d021bed86c28",
      "parents": [
        "8a09b917bcb4f76153259c1ce0ef39a947f4aaf3"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Sat Jul 18 19:00:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 13:00:46 2026 -0400"
      },
      "message": "fix(compute): release temporary arrays in binary view casts (#898)\n\nCastBinaryToBinaryView and CastBinaryViewToBinary transferred their temporary result\u0027s buffers via ArraySpan.TakeOwnership (which retains) but never released the temporary array, leaking a reference on every cast. Release each temporary after the ownership transfer; the output keeps its retained ownership, so cast behavior is unchanged."
    },
    {
      "commit": "8a09b917bcb4f76153259c1ce0ef39a947f4aaf3",
      "tree": "c1428a11f8cf2df032d82752d32373394985e513",
      "parents": [
        "76109bec77e36523479c283c44f06e3abf5d77b6"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Sat Jul 18 18:54:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 12:54:56 2026 -0400"
      },
      "message": "fix(array): avoid allocating for ReserveData(0) (#895)\n\nBinaryViewBuilder.ReserveData always delegated to the block builder, so ReserveData(0) created a full default data block even when every value remained inline. Return early on zero-length reservations so no unused variadic data buffer is allocated; positive reservations and the public API are unchanged. Integration JSON expectations are updated accordingly."
    },
    {
      "commit": "76109bec77e36523479c283c44f06e3abf5d77b6",
      "tree": "24fee903b49f69929a696db50c707e800c2b3655",
      "parents": [
        "1476769ecda35b4527f2d8f1adc276257a9f19f4"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Sat Jul 18 18:39:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 12:39:14 2026 -0400"
      },
      "message": "fix(compute): handle comparison output offsets (#956)\n\nPrimitive comparison kernels mishandled a non-byte-aligned output offset: batch counts were derived from the original length and the leading partial byte was not clamped to the available values, so short inputs could over-read the input or corrupt bits outside the output span. This affected both the pure-Go path and the generated amd64 SIMD kernels.\n\nClamp the prefix to the available value count, recompute batches/tail after consuming the prefix, apply the same fix to _lib/scalar_comparison.cc, and regenerate the AVX2/SSE4 assembly. Adds a kernel-level regression covering offsets 0-7 and lengths through 65 across all operations and operand shapes, exercising both the pure-Go implementation and the runtime SIMD dispatcher."
    },
    {
      "commit": "1476769ecda35b4527f2d8f1adc276257a9f19f4",
      "tree": "4cfec0549385f5dbe9cc4757f1dd386a0754a5d0",
      "parents": [
        "f228f0a8042a9af5149a4e0e9e5a2df8cc685bd7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 16 20:20:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:20:20 2026 -0400"
      },
      "message": "fix(parquet): reject truncated bit-packed batches (#943)"
    },
    {
      "commit": "f228f0a8042a9af5149a4e0e9e5a2df8cc685bd7",
      "tree": "138ab11d99b2b07e3606c78e266086052777f8d7",
      "parents": [
        "936ca0b87637a90d4e6fdd30031ac0cab2054b0a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 16 20:03:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:03:43 2026 -0400"
      },
      "message": "fix(ipc): validate message framing bounds (#955)"
    },
    {
      "commit": "936ca0b87637a90d4e6fdd30031ac0cab2054b0a",
      "tree": "9b2753931a2b20cc266c4a1c0b5e971e5d5d6c02",
      "parents": [
        "6e39220357d602687fc6398d9c04f49cb0615982"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 16 20:03:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:03:38 2026 -0400"
      },
      "message": "fix(arrow): validate timestamp timezones (#952)"
    },
    {
      "commit": "6e39220357d602687fc6398d9c04f49cb0615982",
      "tree": "d63dde3afad10d4d0c0f198edd8ae4576cb03299",
      "parents": [
        "f7bacb41a611786f0989dbf0fdb104a518213ea2"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Jul 16 20:03:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:03:33 2026 -0400"
      },
      "message": "fix(parquet): handle short input in GetBatchBools (#946)"
    },
    {
      "commit": "f7bacb41a611786f0989dbf0fdb104a518213ea2",
      "tree": "9e278a73fa6784575a87112ce101f0a7580a80d0",
      "parents": [
        "038c0b444b70547ceecd230d1e019fe176407d4e"
      ],
      "author": {
        "name": "Matt Topol",
        "email": "zotthewizard@gmail.com",
        "time": "Wed Jul 15 12:32:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:32:47 2026 -0400"
      },
      "message": "fix: repair failing benchmarks and stop bench.sh masking failures (#938)"
    },
    {
      "commit": "038c0b444b70547ceecd230d1e019fe176407d4e",
      "tree": "b24f1be07b2a21545b51e45d3cdfdea3152ac75e",
      "parents": [
        "86f155c2cb0b023f0909f2c63b9f63c4d5f7ff3b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 18:16:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:16:05 2026 -0400"
      },
      "message": "fix(parquet): return errors for malformed encrypted payloads (#945)"
    },
    {
      "commit": "86f155c2cb0b023f0909f2c63b9f63c4d5f7ff3b",
      "tree": "cf98bf078c78c67ee456403afc4335fe35ed8a79",
      "parents": [
        "4cc24d2999de42b2299effa4c312c782de2b3588"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 18:15:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:15:59 2026 -0400"
      },
      "message": "fix(parquet): return decompression errors (#954)"
    },
    {
      "commit": "4cc24d2999de42b2299effa4c312c782de2b3588",
      "tree": "dde6e4bcedbd1019bd392b9a6322b120c337317b",
      "parents": [
        "52e43fe9b555061218fa58d890711bf0ed46fe76"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 18:15:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:15:54 2026 -0400"
      },
      "message": "fix(parquet): limit page allocations (#953)"
    },
    {
      "commit": "52e43fe9b555061218fa58d890711bf0ed46fe76",
      "tree": "001c2e90858aed6b289c8119027b3b53c0167f13",
      "parents": [
        "9a69c7a3dc0983c0fdf41eccc07a9c6f2872c956"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 17:59:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:55 2026 -0400"
      },
      "message": "fix(memory): keep allocator ownership across Buffer.Reset (#947)"
    },
    {
      "commit": "9a69c7a3dc0983c0fdf41eccc07a9c6f2872c956",
      "tree": "6ff91ceaf8848fabc6a75641cb28045b258408f1",
      "parents": [
        "1394c6e08da0499b00a862072825f944bf3cc24a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 17:59:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:51 2026 -0400"
      },
      "message": "fix(flight): reject Basic credentials without a separator (#942)"
    },
    {
      "commit": "1394c6e08da0499b00a862072825f944bf3cc24a",
      "tree": "db1901cc3d684d71be6be2d3d02e4db60cba49e1",
      "parents": [
        "5813406cb900351fd8c1f6a22608a30c14b38f9a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 17:59:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:46 2026 -0400"
      },
      "message": "fix(flight): reject malformed unary bearer headers (#941)"
    },
    {
      "commit": "5813406cb900351fd8c1f6a22608a30c14b38f9a",
      "tree": "b5a7d526cad8d4dcf91296f797c07c90cf4cf77a",
      "parents": [
        "6dc3676e07a95f5336e76b450517bae1bb92d364"
      ],
      "author": {
        "name": "Fredrik Fornwall",
        "email": "fredrik@fornwall.net",
        "time": "Wed Jul 15 17:59:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:41 2026 -0400"
      },
      "message": "fix(arrow/scalar): reject negative indices in GetScalar (#940)"
    },
    {
      "commit": "6dc3676e07a95f5336e76b450517bae1bb92d364",
      "tree": "d2338eeebef06c2894f8349613e507ca925548b2",
      "parents": [
        "bc675781027c5fb00f487231b8df79f286bf0673"
      ],
      "author": {
        "name": "Fredrik Fornwall",
        "email": "fredrik@fornwall.net",
        "time": "Wed Jul 15 17:59:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:37 2026 -0400"
      },
      "message": "fix(flight/flightsql/example): support dictionary-encoded parameter columns (#936)"
    },
    {
      "commit": "bc675781027c5fb00f487231b8df79f286bf0673",
      "tree": "a15439eaa3c2440cd8174b8d127f1177b1e65fa4",
      "parents": [
        "818c813c9c1f6692c5d2212fdb26549dd68212d2"
      ],
      "author": {
        "name": "abir",
        "email": "abir@eon.io",
        "time": "Wed Jul 15 18:59:32 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:32 2026 -0400"
      },
      "message": "fix(avro): decode nullable logical timestamps (#935)"
    },
    {
      "commit": "818c813c9c1f6692c5d2212fdb26549dd68212d2",
      "tree": "20b8795077955aa4dcbd4608635a07fadd1d810a",
      "parents": [
        "0cd579447b8c1a56e67e9ae1bd766d5c84e20c04"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Jul 15 17:59:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:59:27 2026 -0400"
      },
      "message": "fix(cdata): validate imported array sizes (#931)"
    },
    {
      "commit": "0cd579447b8c1a56e67e9ae1bd766d5c84e20c04",
      "tree": "47ce798425ff40a127454205cb06846918096179",
      "parents": [
        "750586710988bc18f7af64fd29af8e0acdb252ac"
      ],
      "author": {
        "name": "Neelesh Salian",
        "email": "nssalian@users.noreply.github.com",
        "time": "Wed Jul 15 08:17:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 11:17:22 2026 -0400"
      },
      "message": "feat(parquet/variant): add Metadata.SizeBytes to split a concatenated variant (#939)\n\n### Rationale for this change\n\nA variant bound is stored on disk as the variant metadata bytes\nconcatenated with the value bytes (metadata ++ value), as Iceberg does\nfor variant `lower_bound` / `upper_bound`. `Metadata.Bytes()` returns\nthe backing slice as-is, so a caller that reads such a concatenated\nbuffer has no way to know where the metadata ends and the\nvalue begins. `NewMetadata` accepts a buffer with trailing bytes but\ndoes not expose the metadata\u0027s own length.\n\niceberg-go needs this to read variant bounds back for scan pruning\n(apache/iceberg-go#1016): it must split a stored bound into metadata and\nvalue to reconstruct the variant. Filing it now so it is released ahead\nof that work.\n\n### What changes are included in this PR?\n\n- Adds `Metadata.SizeBytes()`, which computes the metadata\u0027s own byte\nlength from its header and offset table (the final offset gives the\nstring-region length past `valuesStart`). A caller can then split a\nbuffer at `data[m.SizeBytes():]`.\n\n### Are these changes tested?\n\nYes. `TestMetadataSizeBytes` covers empty metadata, a keyed object, and\nsplitting a concatenated metadata++value buffer with a round-trip\nthrough `New`.`TestMetadataSizeBytesMultiByteOffset` covers the\nmulti-byte offset-width path.\n\n### Are there any user-facing changes?\n\nOne new exported method. No change to existing behavior."
    },
    {
      "commit": "750586710988bc18f7af64fd29af8e0acdb252ac",
      "tree": "1835ae584e99352a31cff4c0447d7fd2948ee622",
      "parents": [
        "8da7a2c045e9aad03da9f632a0ca8b9692840750"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 14 18:06:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:06:28 2026 -0400"
      },
      "message": "fix(array): recursively validate nested arrays (#930)"
    },
    {
      "commit": "8da7a2c045e9aad03da9f632a0ca8b9692840750",
      "tree": "ec24d40e36b5a19dbd566d8ef748dad477af3c7e",
      "parents": [
        "adbc4cf0ad1b52095643952e418a9b9865b4a24d"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 14 18:06:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:06:23 2026 -0400"
      },
      "message": "fix(scalar): hash list values logically (#928)"
    },
    {
      "commit": "adbc4cf0ad1b52095643952e418a9b9865b4a24d",
      "tree": "d5210bd31d6afa80623610353057679a15b8c0c8",
      "parents": [
        "c58f7a6e4f000fe68629092da9ea010bf68d22bf"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 14 18:06:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:06:19 2026 -0400"
      },
      "message": "fix(parquet): make column reader cleanup idempotent (#924)"
    },
    {
      "commit": "c58f7a6e4f000fe68629092da9ea010bf68d22bf",
      "tree": "d4c921df29541e2e9042e5d484aee02f52975113",
      "parents": [
        "0b04f3396007f850730cb0a5ac530758aae6bc66"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 14 18:06:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:06:15 2026 -0400"
      },
      "message": "fix(array): honor struct offsets in constructors and validity masks (#922)"
    },
    {
      "commit": "0b04f3396007f850730cb0a5ac530758aae6bc66",
      "tree": "8686aad89ab81b2c16b0b97dae24afecfd3f9373",
      "parents": [
        "efc145c067b63cb2a831751e34bf9c0b19c9af41"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Jul 14 18:06:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 12:06:11 2026 -0400"
      },
      "message": "fix(parquet): propagate row-group and page-index write errors (#921)"
    },
    {
      "commit": "efc145c067b63cb2a831751e34bf9c0b19c9af41",
      "tree": "93f05a4925fc6c0243b97de8547725891875e06c",
      "parents": [
        "804218833c2f3e2418f5352e4025e34429b807c3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 17:09:06 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 17:09:06 2026 -0400"
      },
      "message": "chore: Bump golang.org/x/sys from 0.46.0 to 0.47.0 (#933)\n\nBumps [golang.org/x/sys](https://github.com/golang/sys) from 0.46.0 to\n0.47.0.\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sys/commit/9e7e939dcafac07e8ab4cffa6e5fc74908413f00\"\u003e\u003ccode\u003e9e7e939\u003c/code\u003e\u003c/a\u003e\ncpu: handle vendor suffixes in parseRelease\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sys/commit/f6fb8a1e42b1731ca8f87ace29c3307429ecdb5a\"\u003e\u003ccode\u003ef6fb8a1\u003c/code\u003e\u003c/a\u003e\nunix: use epoll_pwait rather than epoll_wait\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sys/commit/f3eeabfcab6a9a0585ddee7337d5ccfeebe576ed\"\u003e\u003ccode\u003ef3eeabf\u003c/code\u003e\u003c/a\u003e\nwindows: avoid length overflow in NewNTString\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sys/commit/3cb66475f895724679601e2580be904c8aaa5f7a\"\u003e\u003ccode\u003e3cb6647\u003c/code\u003e\u003c/a\u003e\nunix: update glibc to 2.43\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sys/commit/c507910bb52510a2ae06048a4246ad0fe210a872\"\u003e\u003ccode\u003ec507910\u003c/code\u003e\u003c/a\u003e\nwindows: document safe usage of TrusteeValue\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/golang/sys/compare/v0.46.0...v0.47.0\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "804218833c2f3e2418f5352e4025e34429b807c3",
      "tree": "b1ff389aea2797732b0d881bf1939aa803d556b0",
      "parents": [
        "591a9db6eb9d1ae199783c98f59371eb72f14652"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 16:44:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 16:44:03 2026 -0400"
      },
      "message": "chore: Bump github.com/apache/thrift from 0.22.0 to 0.24.0 (#932)\n\nBumps [github.com/apache/thrift](https://github.com/apache/thrift) from\n0.22.0 to 0.24.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/apache/thrift/releases\"\u003egithub.com/apache/thrift\u0027s\nreleases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eVersion 0.24.0\u003c/h2\u003e\n\u003cp\u003ePlease head over to the official release download source:\n\u003ca\nhref\u003d\"http://thrift.apache.org/download\"\u003ehttp://thrift.apache.org/download\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe assets listed below are added by Github based on the release tag\nand they will therefore not match the checkums published on the Thrift\nproject website.\u003c/p\u003e\n\u003ch2\u003eVersion 0.23.0\u003c/h2\u003e\n\u003cp\u003ePlease head over to the official release download source:\n\u003ca\nhref\u003d\"http://thrift.apache.org/download\"\u003ehttp://thrift.apache.org/download\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe assets listed below are added by Github based on the release tag\nand they will therefore not match the checkums published on the Thrift\nproject website.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca\nhref\u003d\"https://github.com/apache/thrift/blob/master/CHANGES.md\"\u003egithub.com/apache/thrift\u0027s\nchangelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e0.24.0\u003c/h2\u003e\n\u003ch3\u003eBuild Process\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5000\"\u003eTHRIFT-5000\u003c/a\u003e\n- Thrift docker image publish on releases\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5855\"\u003eTHRIFT-5855\u003c/a\u003e\n- Improve fuzzing support\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5952\"\u003eTHRIFT-5952\u003c/a\u003e\n- Optimize MSVC Docker image to reduce size and speed up CI\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5965\"\u003eTHRIFT-5965\u003c/a\u003e\n- Add zizmor for GitHub Actions workflows security analysis\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5967\"\u003eTHRIFT-5967\u003c/a\u003e\n- Refactor SCA GitHub workflow for better extensibility\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-5973\"\u003eTHRIFT-5973\u003c/a\u003e\n- Automated CHANGELOG creation\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-6002\"\u003eTHRIFT-6002\u003c/a\u003e\n- Add netstd codegen test script and GitHub Actions CI matrix job (.NET\n8/9/10)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-6003\"\u003eTHRIFT-6003\u003c/a\u003e\n- Add Haxe codegen test script and GitHub Actions CI job\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://issues.apache.org/jira/browse/THRIFT-6077\"\u003eTHRIFT-6077\u003c/a\u003e\n- improve CHANGES.md generator section assignment\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3613\"\u003e#3613\u003c/a\u003e -\nBump rubygems/release-gem from 1.2.0 to 1.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3616\"\u003e#3616\u003c/a\u003e -\nBump ruby/setup-ruby from 1.310.0 to 1.314.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3617\"\u003e#3617\u003c/a\u003e -\nBump rust-lang/crates-io-auth-action from 1.0.4 to 1.0.5\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3618\"\u003e#3618\u003c/a\u003e -\nBump jvm from 2.3.21 to 2.4.0 in /lib/kotlin\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3619\"\u003e#3619\u003c/a\u003e -\nBump com.diffplug.spotless from 8.5.1 to 8.7.0 in /lib/kotlin\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3615\"\u003e#3615\u003c/a\u003e -\nBump actions/setup-go from 6.4.0 to 6.5.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3597\"\u003e#3597\u003c/a\u003e -\nfix off-by-ten header bounds check in readHeaderFormat\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3593\"\u003e#3593\u003c/a\u003e -\nBump shell-quote from 1.7.3 to 1.8.4 in /lib/js\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3591\"\u003e#3591\u003c/a\u003e -\nBump shell-quote from 1.7.3 to 1.8.4 in /lib/ts\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3589\"\u003e#3589\u003c/a\u003e -\nUpdate MSVC CI to windows-2025-vs2026 runner and start Docker service\nexplicitly\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3581\"\u003e#3581\u003c/a\u003e -\nRun the Haxe library unit tests (neko) in CI\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3576\"\u003e#3576\u003c/a\u003e -\nBump ruby/setup-ruby from 1.306.0 to 1.310.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3575\"\u003e#3575\u003c/a\u003e -\nBump zizmorcore/zizmor-action from 0.5.3 to 0.5.6\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3577\"\u003e#3577\u003c/a\u003e -\nBump actions/setup-dotnet from 4.3.1 to 5.2.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3574\"\u003e#3574\u003c/a\u003e -\nBump com.diffplug.spotless from 8.4.0 to 8.5.1 in /lib/kotlin\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3572\"\u003e#3572\u003c/a\u003e -\nBump org.jetbrains.kotlinx:kotlinx-coroutines-jdk8 in /lib/kotlin\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3578\"\u003e#3578\u003c/a\u003e -\nHarden the MSVC build workflow against transient Docker daemon\nunavailability\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3564\"\u003e#3564\u003c/a\u003e -\nEnable Copilot reviews\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3565\"\u003e#3565\u003c/a\u003e -\nAllow CI to fail on ruby-head\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3517\"\u003e#3517\u003c/a\u003e -\nBump uuid and nyc\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3513\"\u003e#3513\u003c/a\u003e -\nRemove Ruby known failures from cross-test list\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3501\"\u003e#3501\u003c/a\u003e -\nFix netstd CI .NET SDK setup\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3496\"\u003e#3496\u003c/a\u003e -\nAdd generator paths to mergeable labels\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3430\"\u003e#3430\u003c/a\u003e -\nUpdated projects settings in .asf.yaml (features, merge buttons, Jira\nautolinking)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3487\"\u003e#3487\u003c/a\u003e -\nUpdate to setup-php 2.37.1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3471\"\u003e#3471\u003c/a\u003e -\nUpdate build.yml\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3461\"\u003e#3461\u003c/a\u003e -\nMigration *.sln to *.slnx (except c++ libs)\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3454\"\u003e#3454\u003c/a\u003e -\nFixing bundler on ruby-head build\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3440\"\u003e#3440\u003c/a\u003e -\nRemoved deprecated \u0027publish\u0027 workflow\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3439\"\u003e#3439\u003c/a\u003e -\nPin all actions to a specific SHA consistently\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3437\"\u003e#3437\u003c/a\u003e -\nValidate GitHub workflows against the ASF allowlist\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3433\"\u003e#3433\u003c/a\u003e -\nPin actions/upload-artifact to a specific SHA consistently\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3433\"\u003e#3433\u003c/a\u003e -\nBump actions/upload-artifact from 7.0.0 to 7.0.1\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3434\"\u003e#3434\u003c/a\u003e -\nBump jvm from 2.3.20 to 2.3.21 in /lib/kotlin\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3423\"\u003e#3423\u003c/a\u003e -\nBump uuid from 13.0.0 to 14.0.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3424\"\u003e#3424\u003c/a\u003e -\nBump json from 2.18.1 to 2.19.2 in /lib/rb\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://redirect.github.com/apache/thrift/pull/3404\"\u003e#3404\u003c/a\u003e -\nCleanup Adobe Flex SDK installation following AS3 library removal\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/6d2ec95f450b4ce404afb8929ff479e68770141a\"\u003e\u003ccode\u003e6d2ec95\u003c/code\u003e\u003c/a\u003e\nTune make dist: drop generated/build artifacts, add missing sources\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/4f303a2413c9f6b0116a0714c55a7686579109e6\"\u003e\u003ccode\u003e4f303a2\u003c/code\u003e\u003c/a\u003e\nStrip node_modules from dist to fix make dist symlink recursion\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/270b81edfb343546a6ed1dbc03d9d82633c91af2\"\u003e\u003ccode\u003e270b81e\u003c/code\u003e\u003c/a\u003e\nFix stale EXTRA_DIST references that broke make dist\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/c1df044f2eb290c7e51cc99ddb547e34fdbf0430\"\u003e\u003ccode\u003ec1df044\u003c/code\u003e\u003c/a\u003e\nFix Go and Rust version detection for multi-digit version numbers\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/342a80320e959ced1956a70fd5fd2624f0e01398\"\u003e\u003ccode\u003e342a803\u003c/code\u003e\u003c/a\u003e\nupdated CHANGES.md\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/0d66913b703d48156bec6530d8f3bc478d501f27\"\u003e\u003ccode\u003e0d66913\u003c/code\u003e\u003c/a\u003e\nbump doap \u0026amp; debian changelog\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/f961cdb44249c293fcce6a840ffa1f7419fd88d0\"\u003e\u003ccode\u003ef961cdb\u003c/code\u003e\u003c/a\u003e\nfix info-header string bound check in THeaderTransport::readString\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/0ab16e3a83637711f4e0f788c205f66576fd0a55\"\u003e\u003ccode\u003e0ab16e3\u003c/code\u003e\u003c/a\u003e\nenforce max_string_size on non-strict binary message name\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/817e0f17a84264f894dad62e8fcbb146070790e0\"\u003e\u003ccode\u003e817e0f1\u003c/code\u003e\u003c/a\u003e\nBump rubygems/release-gem from 1.2.0 to 1.4.0\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/apache/thrift/commit/6dfb0b26ea6b9ab9c114e0ef4c0f6e7b8110b242\"\u003e\u003ccode\u003e6dfb0b2\u003c/code\u003e\u003c/a\u003e\nTHRIFT-6073: Allow injecting external SSL_CTX into C++ SSLContext\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca\nhref\u003d\"https://github.com/apache/thrift/compare/v0.22.0...v0.24.0\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dgithub.com/apache/thrift\u0026package-manager\u003dgo_modules\u0026previous-version\u003d0.22.0\u0026new-version\u003d0.24.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "591a9db6eb9d1ae199783c98f59371eb72f14652",
      "tree": "20048c19055f3d77f96956162dc31fed13c9f550",
      "parents": [
        "53a747fe62f61d6be986dfaa9cf8d1bc90f750dc"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 16:43:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 16:43:49 2026 -0400"
      },
      "message": "chore: Bump golang.org/x/sync from 0.21.0 to 0.22.0 (#934)\n\nBumps [golang.org/x/sync](https://github.com/golang/sync) from 0.21.0 to\n0.22.0.\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\nhref\u003d\"https://github.com/golang/sync/commit/1eb64d4bc0cde6da1bb8ebc7f178bb577508e5d0\"\u003e\u003ccode\u003e1eb64d4\u003c/code\u003e\u003c/a\u003e\nsemaphore: panic on negative weights\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca\nhref\u003d\"https://github.com/golang/sync/compare/v0.21.0...v0.22.0\"\u003ecompare\nview\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility\nscore](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name\u003dgolang.org/x/sync\u0026package-manager\u003dgo_modules\u0026previous-version\u003d0.21.0\u0026new-version\u003d0.22.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don\u0027t\nalter it yourself. You can also trigger a rebase manually by commenting\n`@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits\nthat have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all\nof the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop\nDependabot creating any more for this major version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop\nDependabot creating any more for this minor version (unless you reopen\nthe PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop\nDependabot creating any more for this dependency (unless you reopen the\nPR or upgrade to it yourself)\n\n\n\u003c/details\u003e\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "53a747fe62f61d6be986dfaa9cf8d1bc90f750dc",
      "tree": "2ca43b1de73d902fd4d1b91973c52903c6f8b964",
      "parents": [
        "168951e287b98456611fac4dc1de021bc52e95f8"
      ],
      "author": {
        "name": "Ruihao Chen",
        "email": "ruihao.chen@pingcap.cn",
        "time": "Tue Jul 14 03:09:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 15:09:38 2026 -0400"
      },
      "message": "feat(parquet): opt-in streaming reads for large data pages (#880)\n\n### Rationale for this change\n\nAddresses #865. Today the reader materializes each full uncompressed data page before decoding, so peak memory scales with the page\u0027s uncompressed size — a problem for files with very large data pages (e.g. a 1 GB compressed / 1.4 GB uncompressed page). This adds an **opt-in** path that keeps peak memory near the requested batch size for the common large-page shape.\n\nApproach was discussed and agreed on the issue.\n\n### What changes are included in this PR\n\nOpt-in via `ReaderProperties.PageStreamingEnabled` (default **false**, no behavior change). When set, **eligible** data pages skip full-page decompression and decode their values incrementally; every ineligible page falls back to the existing materialized path.\n\n**Scope (first cut):**\n- Data Page **V1 + V2**, **PLAIN** encoding\n- Physical types **`byte_array`** and **`fixed_len_byte_array`**\n- Codecs **`UNCOMPRESSED` / `GZIP` / `BROTLI` / `ZSTD`** (explicit allowlist — Snappy is a raw block whereas its `NewReader` is the framed format, and LZ4_RAW has no streaming reader)\n\n**Design:**\n- `parquet/internal/encoding/streaming`: a small `ValueBuffer` — an incremental byte source that reads from an `io.Reader`, slides as values are consumed, grows to fit a single oversized value, and owns the page\u0027s stream (drained + closed on release).\n- The materialized `PlainByteArrayDecoder` / `PlainFixedLenByteArrayDecoder` keep their `[]byte` logic byte-for-byte, gaining only a `src` field + a one-line guard in `Decode`/`Discard`. Streaming decode lives beside them; `SetData` resets `src`, so a cached decoder reused for a materialized page reverts. Other decoders are untouched.\n- Page reader: for eligible pages, V2 levels are read raw (uncompressed, header byte-lengths) and V1 levels are peeled off the decompressed stream using the same length rules as `LevelDecoder.SetData`; values become a `ValueBuffer` over the compressed region. On page release the underlying stream is drained + closed so the reader lands on the next page header even if values were skipped.\n- Column reader: the same cached PLAIN decoder is fed via `SetSource` (streaming) or `SetData` (materialized). `Page`/`DataPage` already return internal types (e.g. `format.Encoding`), so they can\u0027t be implemented outside `parquet/`; the added **unexported** `valueBuffer`/`valueClip` accessors are internal plumbing invisible to external consumers.\n\n### Are these changes tested?\n\nYes.\n- All existing encoding tests pass unchanged (materialized parity); the streaming decoders are additionally exercised with a one-byte-at-a-time reader and oversized values.\n- End-to-end round-trip (`parquet/file/streaming_page_test.go`): streaming vs materialized reads are asserted identical across V1/V2 and each codec, for **required** and **nullable** columns (the nullable case covers the V1 def-level peel + streaming `DecodeSpaced`), including values larger than a page and the stream buffer.\n\n### Are there any user-facing changes?\n\nOne new opt-in field, `ReaderProperties.PageStreamingEnabled` (default false). No behavior change to decoded values; the only interface change is two unexported accessor methods on `DataPage` (see above).\n\nFollow-ups (out of scope here): fixed-width numeric PLAIN types, raw-Snappy and LZ4_RAW streaming, and a memory benchmark."
    },
    {
      "commit": "168951e287b98456611fac4dc1de021bc52e95f8",
      "tree": "c2d676d8a4de16ed8e7cc6b261faafb3b5d725a9",
      "parents": [
        "950bc29a777515b03f6b1a16349e06c7bdd9d935"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 13 21:09:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 15:09:35 2026 -0400"
      },
      "message": "fix(array): retain dictionary before replacement (#926)\n\nData.SetDictionary released the existing dictionary before retaining the replacement. Replacing a dictionary with the same pointer while the parent held the final reference could therefore clear the dictionary before resurrecting its reference.\n\nThis retains the validated replacement first, swaps it into the Data object, then releases the previous dictionary. It also handles nil input and reports an explicit panic for an invalid dictionary data implementation.\n\nTests:\n- go test ./arrow/array -run \u0027TestData(SetDictionaryWithSamePointerRetainsDictionary|ResetClearsDictionary)\u0027\n- go test ./arrow/array\n- go test ./arrow/... -run \u0027^$\u0027"
    },
    {
      "commit": "950bc29a777515b03f6b1a16349e06c7bdd9d935",
      "tree": "e4b81d09ad4a1899ab050d675e7a000a3ad851a3",
      "parents": [
        "6a73da687e7830d6a82bac1cd06ed23f71e80387"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Jul 13 21:09:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 15:09:31 2026 -0400"
      },
      "message": "fix(scalar): validate dictionary indices before conversion (#927)\n\n### What\n\nValidate dictionary indices in their native signed or unsigned domain before converting them to int. Use the checked physical index for GetEncodedValue as well, so malformed scalars return an error instead of wrapping on 32-bit or 64-bit platforms.\n\n### Tests\n\n- `go test ./arrow/scalar`\n- `GOOS\u003dlinux GOARCH\u003d386 go test -c -o /dev/null ./arrow/scalar`\n- `pre-commit run golangci-lint-full --all-files`\n\nThe broader `go test ./arrow/...` run is otherwise green for the reached packages but the checkout lacks the CSV/parquet fixture directories."
    }
  ],
  "next": "6a73da687e7830d6a82bac1cd06ed23f71e80387"
}
