)]}'
{
  "log": [
    {
      "commit": "f2a71ef2546aae53972d236b6857c5f081a74628",
      "tree": "7820e1d6442ac594299c171b1bc9fe13fdef18fb",
      "parents": [
        "0d42092cd51993dc82ab3f390d7866d6404d11a1"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 29 20:44:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 20:44:22 2026 +0800"
      },
      "message": "[C++] Bound aligned batch decodes by remaining TsBlock capacity (#1045)\n\n* [C++] Bound aligned batch decodes by remaining TsBlock capacity\n\nAn aligned table query could hang forever in the first ResultSet::next()\nwhen the internal TsBlock could not hold the decoder\u0027s fixed 129-row batch.\ndecode_tv_batch() required a full batch before consuming any input, so a\nsmall block never filled, E_OVERFLOW was reported as an empty success, and\nthe scan iterator retried the same decode without progress.\n\nCap each pass at min(BATCH, remaining) as the multi-column path and\nChunkReader already do, and stop reporting an empty E_OVERFLOW as success:\na block that cannot hold a single row now surfaces E_INVALID_ARG instead of\nspinning silently.\n\nCloses #1035\n\n* [C++] Free zero-sized ByteBuffer allocations\n\nByteBuffer::init(0) still goes through mem_alloc, which allocates an\n8-byte header block, but the destructor only released the buffer when\nreserved_size_ was non-zero. A TsBlock built with a capacity below one\nrow therefore leaked one block per column, which LeakSanitizer reported\nas a failure of the new small-capacity regression test on Ubuntu.\n\nFree whenever the pointer is set; data_ is only ever assigned by\nmem_alloc/mem_realloc, so this cannot release foreign memory.\n\n* [C++] Free zero-sized BitMap allocations\n\nSame defect as the ByteBuffer fix: BitMap::init(0) rounds its bitmap size\nto zero but still allocates an 8-byte header block, and the destructor\nonly released it when size_ was non-zero. A TsBlock built with a capacity\nbelow one row leaked the null bitmap of every column, which LeakSanitizer\nreported on the new small-capacity regression test.\n\nFree on the pointer instead of the size, matching ByteBuffer."
    },
    {
      "commit": "0d42092cd51993dc82ab3f390d7866d6404d11a1",
      "tree": "d6e71825f5489cdcdd02f155b8d405f5afcb4ccb",
      "parents": [
        "9a518f8a3efc21fac0aa30e205984697a6ed2146"
      ],
      "author": {
        "name": "HUANG Xiangdong",
        "email": "hxd@apache.org",
        "time": "Tue Oct 27 14:28:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 14:28:00 2026 +0800"
      },
      "message": "[C++] Apply field predicates to aligned table query rows (#1026)\n\n* [C++] Apply field predicates to aligned table query rows\n\n* Preserve aligned NULL rows in table FIELD filtering\n\n* Preserve aligned NULL rows outside value statistics\n\nA FIELD predicate must see rows whose timestamps lie in the selected\ntime range even when the column\u0027s non-NULL values all lie outside it.\nReplace the all-values-NULL check in the empty-context shortcut with an\naligned-source check so such devices fall through to the time-only\ncontext instead of returning an empty result.\n\n* Remove unused per-value i32 decode in AlignedChunkReader\n\ndecode_tv_batch\u003cint32_t\u003e replaced this loop in #823, leaving the function\nuncalled. Its NULL branch also predates the time-filter fix applied to\nthe other decode paths in this series.\n\n* [C++] Batch-evaluate FIELD predicates on aligned table rows\n\nAdd AlignedFieldFilter (a columnar predicate tree) and SelectionMask\n(a row bitmask), and thread them through the aligned chunk/block readers.\n\nSingle-threaded flow: page statistics (may_match/all_match) prune pages\nthat cannot match or mark pages that fully match; only filter-referenced\ncolumns are decoded first; output columns are decoded lazily and only for\npages with at least one matching row; the predicate is evaluated once per\npage into a bitmask, and the scatter loop only tests bits.\n\nNOT is pushed down to leaf comparisons so NULL rows keep SQL three-valued\nsemantics, get_data_type_size is no longer called on string columns, and\nquery() error paths free the field filter.\n\n* [C++] Bulk-copy aligned FIELD selections and fix edge cases\n\nCopy selected bitmap runs with dense fixed-width bulk appends while preserving NULL/string fallbacks, duplicate projections, post-filter row ranges, and source-block cursor ownership.\n\nKeep page-plan decode mode stable across TsBlocks, retain NaN rows when floating statistics cannot prove a match, and evaluate missing aligned columns as NULL. Add focused and integration regression coverage.\n\n* [C++] Fix floating NOT, malformed predicates, and reader teardown\n\nNegating an ordered FLOAT/DOUBLE comparison flipped the operator\n(NOT (x \u003c 5) -\u003e x \u003e\u003d 5). NaN makes every ordered comparison false, so the\nnegation must be true for NaN rows while the flipped form is false and\ndropped them; when the literal itself was NaN, every non-NULL row was lost.\nOrdered floating-point leaves now keep the operator and record the negation,\nand evaluation computes !(value \u003cop\u003e literal) for non-NULL rows. Page\nstatistics no longer prove a full-page match or a skip for such leaves.\n\nA composite node missing an operand could be classified as a full-page match\nthrough its remaining operand. Page statistics then skipped evaluation, so a\nmalformed OR silently returned rows (and did not terminate in batch mode).\nall_match() now requires both operands, and build_page_plan() rejects a\nstructurally invalid filter with E_INVALID_ARG before classifying pages.\n\nAlignedChunkReader is placement-new\u0027d and torn down through destroy() without\nrunning its destructor, so the page-plan filter state added for FIELD\nfiltering leaked its backing buffers. destroy() now releases\nfilter_column_mask_ and the current page mask.\n\nTests cover NOT over all six operators and five literals (including NaN and\nboth infinities) for FLOAT and DOUBLE, with NULL rows from a device that\nlacks the float columns; and a malformed OR that was previously accepted.\n\n* [CI] Pin C++ and Python Linux tests to Ubuntu 24.04\n\n* [C++] Validate field filters and restore aligned query fast paths\n\n* [C++] Release aligned chunk header names during reader teardown\n\n* [C++] Align field predicate literals with Java numeric conversions\n\n* [C++] Reject missing NOT operands before query execution\n\n* [C++] Evaluate FIELD predicates on non-aligned table rows\n\n* Harden FIELD reader cleanup and error state\n\nClear borrowed contexts before deletion, make close idempotent, and publish multi-index ownership before fallible lookup. Keep multi-column read failures terminal until reset, validate page and value-view bounds, and reject residual NOT nodes instead of inverting nullable masks.\n\nAdd real-file fault injection, malformed page and buffer tests, repeated-close and partial-lookup coverage. Validate reset recovery across output blocks and failures after a result prefix.\n\n* Isolate reader failure fixtures for parallel CTest\n\nGive each test case and invocation a separate TsFile path so CTest workers cannot truncate or remove one another\u0027s input. Reproduce the shared-name failure with four parallel workers, then verify 100 repetitions of every case after isolation.\n\n* Give parallel time decode tasks independent state\n\nUse each strided task\u0027s index for its decoder and compressor slot instead of header-inline worker TLS, which can differ between a caller executable and the reader DLL. This prevents concurrent tasks from sharing slot zero and corrupting timestamps. Complete partially initialized pools when retrying after reset.\n\nValidate with the same hidden-symbol caller executable: the old code fails in the first iteration; the fix passes 1000 iterations (2000 fault/recovery tests). Full four-worker CTest also passes with no failures.\n\n---------\n\nCo-authored-by: HUANG Xiangdong \u003c1021782+jixuan1989@users.noreply.github.com\u003e\nCo-authored-by: ColinLee \u003cshuolin_l@163.com\u003e"
    },
    {
      "commit": "9a518f8a3efc21fac0aa30e205984697a6ed2146",
      "tree": "54576506d248390c0841c154c94180c10fb46471",
      "parents": [
        "ef1107d1fc681066cdd99e6f2c55fa2ec67393fe"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Oct 25 23:36:28 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 11:36:28 2026 +0800"
      },
      "message": "[C++] Preserve TableSchema state during moves (#1032)\n\n* [C++] Preserve TableSchema state in moves\n\nDefault the move constructor to retain the column lookup index,\nvirtual-table flag and pending tree depth along with the other members.\n\nCover writer registration and readback after a move, duplicate-column\nrejection, virtual lookups and tree-level finalization.\n\n* [C++] Move schema members explicitly on v141\n\nUse a complete initializer list for the supported legacy MSVC toolset\ninstead of a defaulted noexcept move constructor. Preserve the index,\nvirtual-table flag and pending tree depth along with the other members.\n\nCheck measurement ownership in the move regression so that a deep-copy\nfallback cannot satisfy the column-index assertion.\n\n* Provision pinned clang-format for Linux CI jobs\n\nInstall clang-format 17.0.6 in a runner-local virtual environment rather than assuming /usr/bin/clang-format-17 exists. Keep the Python 3.9 Linux job on Ubuntu 22.04, where setup-python provides its binary, while retaining all nine Python matrix combinations.\n\nGenerated-by: OpenAI Codex"
    },
    {
      "commit": "ef1107d1fc681066cdd99e6f2c55fa2ec67393fe",
      "tree": "54612ea66dc24b59f8b537405edcf1c02b72e253",
      "parents": [
        "d3147797e1f08e9018947a52f167b31786db49dd"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Oct 25 23:01:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 11:01:23 2026 +0800"
      },
      "message": "[C++] Initialize oversized PageArena allocation metadata (#1033)\n\n* [C++] Initialize oversized PageArena allocation metadata\n\nRepresent a dedicated oversized block as a fully consumed page. Its\nnull cursor previously broke used-byte accounting and triggered UBSan\nwhen a later small allocation tried to reuse the block.\n\nCover used-byte totals, successive oversized blocks, retained data and\nreset. Preserve the existing payload address and alignment.\n\n* Provision pinned clang-format for Linux CI jobs\n\nInstall clang-format 17.0.6 in a runner-local virtual environment rather than assuming /usr/bin/clang-format-17 exists. Keep the Python 3.9 Linux job on Ubuntu 22.04, where setup-python provides its binary, while retaining all nine Python matrix combinations.\n\nGenerated-by: OpenAI Codex"
    },
    {
      "commit": "d3147797e1f08e9018947a52f167b31786db49dd",
      "tree": "cb8effaee3062f77dd655d925202ebce0474b10f",
      "parents": [
        "eb733133b9eee0b1eb74f7671d809ecd730cedc3"
      ],
      "author": {
        "name": "Xinyao Zhang",
        "email": "43081360+zhangxinyao88@users.noreply.github.com",
        "time": "Sun Oct 25 22:46:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 10:46:20 2026 +0800"
      },
      "message": "[C++] Bound retained memory during hot-device metadata lookups (#1030)\n\n* Fix retained arena growth during hot-device metadata lookup\n\nCopy measurement index lookup results into the iterator/query arena,\nincluding intermediate nodes during multi-level traversal. Preserve the\nexisting lookup entry point and keep cached node arenas unchanged.\n\nCover repeated hot-device lookups, result-copy lifetime and an active\niterator surviving cache eviction.\n\nGenerated-by: OpenAI Codex\n\n* Destroy eviction-test column iterators before releasing their block\n\nKeep column iterator destructors inside the block lifetime. MSVC ASan\ncaught their reset_offset writes after revert_tsblock freed the vectors.\nThe production metadata ownership fix remains unchanged.\n\nGenerated-by: OpenAI Codex\n\n* Provision pinned clang-format for Linux CI jobs\n\nInstall clang-format 17.0.6 in a runner-local virtual environment rather than assuming /usr/bin/clang-format-17 exists. Keep the Python 3.9 Linux job on Ubuntu 22.04, where setup-python provides its binary, while retaining all nine Python matrix combinations.\n\nGenerated-by: OpenAI Codex"
    },
    {
      "commit": "eb733133b9eee0b1eb74f7671d809ecd730cedc3",
      "tree": "1c80674d4d50554605e81ecb47b4637e0473f545",
      "parents": [
        "963b55237f84224a958504dd31693dfcef0afb63"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Oct 23 12:17:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 12:17:18 2026 +0800"
      },
      "message": "[Java] Add pluggable page-level AEAD encryption support (#866)\n\nCo-authored-by: JackieTien97 \u003cjackietien97@gmail.com\u003e"
    },
    {
      "commit": "963b55237f84224a958504dd31693dfcef0afb63",
      "tree": "f734e1b847b506e88cb5d9d76d36d3d7d417ebad",
      "parents": [
        "1180b13675e11a0230708af2cc70d037e0e12623"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sun Oct 18 17:10:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 17:10:50 2026 +0800"
      },
      "message": "fix(cpp): preserve embedded NUL bytes in dictionary strings (#1022)"
    },
    {
      "commit": "1180b13675e11a0230708af2cc70d037e0e12623",
      "tree": "899e47a95871832efa84b493458f7ca2e408a421",
      "parents": [
        "12e39fe9d9dace63cc0ad39664aa0fbf5e29f52f"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 17 18:49:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 18:49:01 2026 +0800"
      },
      "message": "fix(cpp): read BOOLEAN RLE written with Java defaults (#1019)"
    },
    {
      "commit": "12e39fe9d9dace63cc0ad39664aa0fbf5e29f52f",
      "tree": "13abfd60ff83f53c8139e9e9982e72c06a78c186",
      "parents": [
        "d22008bcfa6ddaa6102ed63d3ae4f4debcb0b7ce"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Oct 16 19:10:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 19:10:15 2026 +0800"
      },
      "message": "Add bundled native release packages and installed artifact tests (#1016)\n\n* Fix portable C++ builds and installed SDK consumption\n\nFix MSVC language feature detection, runtime selection, native ARM64 builds, dependency downloads and relocatable library paths. Export headers, CMake and pkg-config metadata, static dependencies and native package components. Record the resolved CRT and runtime filename in build-tree and installed SDK metadata so independent consumers can select matching compiler options. Allow existing API tests to consume an installed SDK and include dependency-download regression tests. Inherit the selected compiler in isolated ANTLR4 dependency test configurations.\n\n* Add complete multi-platform native release workflow\n\nBuild native SDKs, DEB/RPM packages, Windows ZIPs, Homebrew bottles and Python 3.9-3.14 wheels. Reuse SDKs and automatically read their MSVC runtime configuration. Ship runtime-only wheels with one native library, stripped Unix binaries and license texts; reject build-only files, duplicate libraries and ELF debug sections. Test every installed package, wheel and relocated SDK in fresh jobs using existing C++ and Go tests, CLI operations on Python resources and the full pytest suite. Gate checksummed bundle assembly on all test matrices and retire the separate wheel workflow.\n\n* Bundle third-party dependencies in every native release package\n\n* Build native release artifacts with release publication metadata\n\n* Make release-version tests independent of the checkout version\n\n* Fix native SDK linkage and CLI runtime paths\n\nInclude bundled and system link dependencies in static pkg-config metadata, with per-configuration archive paths and C++ runtime flags. Preserve CMake\u0027s build-tree CLI RPATH while keeping relocated installations working in lib64 and multiarch layouts.\n\nAlign exported path-parser macros with the library\u0027s object targets to resolve Linux Debug UTF-8 failures. Exercise installed C and C++ consumers with real codec round trips and run the installation regressions in CI."
    },
    {
      "commit": "d22008bcfa6ddaa6102ed63d3ae4f4debcb0b7ce",
      "tree": "2c604ad87122f9df34b640a3428d0ec28b57d77b",
      "parents": [
        "6434ef4225eb846282e5bd2c4799843953ed5dd9"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 15 08:23:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 08:23:31 2026 +0800"
      },
      "message": "chore: record 2.5.0 release and prepare 2.5.1-SNAPSHOT (#1014)"
    },
    {
      "commit": "6434ef4225eb846282e5bd2c4799843953ed5dd9",
      "tree": "bb026a5144379eb5f4e8e568ab4ba29932fba0a8",
      "parents": [
        "795d3b41d831bcc1cc33f3e7abfd9b6296037672"
      ],
      "author": {
        "name": "Caideyipi",
        "email": "87789683+Caideyipi@users.noreply.github.com",
        "time": "Wed Oct 14 15:21:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 15:21:40 2026 +0800"
      },
      "message": "[Fix] Validate ByteBuffer payload lengths before allocation (#1008)"
    },
    {
      "commit": "795d3b41d831bcc1cc33f3e7abfd9b6296037672",
      "tree": "792b8f6ac3c5d30a3ab7ddf1c084293cc197a5f6",
      "parents": [
        "51b04eb743b6dcad3a6edb0829859154257c5452"
      ],
      "author": {
        "name": "Rayan-and-beyond",
        "email": "2220000455@iau.edu.sa",
        "time": "Mon Oct 12 14:37:19 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 19:37:19 2026 +0800"
      },
      "message": "fix(cpp): complete and adopt bounded lru cache (#967)\n\n* fix(cpp): complete and adopt bounded LRU cache\n\n* style(cpp): apply spotless formatting\n\n* test: read cache allocation stats within libtsfile\n\n* fix(cpp): address cache API and mem-stat review feedback\n\n---------\n\nCo-authored-by: Rayan-and-beyond \u003c263488867+Rayan-and-beyond@users.noreply.github.com\u003e"
    },
    {
      "commit": "51b04eb743b6dcad3a6edb0829859154257c5452",
      "tree": "d34d11488d42455380d1a4b093335bb634a8e11a",
      "parents": [
        "dfcb04760782bfed5512d15f849fdda5c2a98e39"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 17:15:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 17:15:04 2026 +0800"
      },
      "message": "fix(cpp): apply residual row offsets in non-aligned page decoding (#1007)"
    },
    {
      "commit": "dfcb04760782bfed5512d15f849fdda5c2a98e39",
      "tree": "089699262718c68ae5d6d9b58c888f10399ac118",
      "parents": [
        "01c3fe329d4c32eff03d3cf155133dbd2dbe6b47"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 16:57:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 16:57:35 2026 +0800"
      },
      "message": "[Python] Trust dataset indexes and expose bounded read caches (#1004)"
    },
    {
      "commit": "01c3fe329d4c32eff03d3cf155133dbd2dbe6b47",
      "tree": "c92bc8b0237e4979b3770363e87f2a51be874842",
      "parents": [
        "e0f736699a44ab502ee310d16d8ba5f19be92d60"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 16:02:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 16:02:22 2026 +0800"
      },
      "message": "fix(cpp): reject UTF-8 name collisions before CLI output (#1002)"
    },
    {
      "commit": "e0f736699a44ab502ee310d16d8ba5f19be92d60",
      "tree": "87b2053b5147cb4377b92da61af1540b799962ce",
      "parents": [
        "bd2b86acee0bad9b923670673171a12e8236c120"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 15:05:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 15:05:30 2026 +0800"
      },
      "message": "fix(cpp): correct aligned all-null pages and page advancement (#1001)\n\n* fix: continue aligned queries past all-null pages\n\n* fix(cpp): write canonical all-null pages and revert Java changes\n\n* test(cpp): refresh CLI goldens for compact all-null pages\n\n* test(cpp): focus null-page coverage on canonical format"
    },
    {
      "commit": "bd2b86acee0bad9b923670673171a12e8236c120",
      "tree": "8edc0821553c71e78f82be5f9c8bf62d63137d57",
      "parents": [
        "51a114b1ab7a51f1d8e91d2163da9ebcb2de6c27"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 10:43:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 10:43:37 2026 +0800"
      },
      "message": "fix(cpp): preserve quoted CSV line endings in tsfile-cli (#996)\n\n* fix(cpp): preserve quoted CSV line endings in tsfile-cli\n\n* test(cpp): write embedded-newline CSV fixture in binary mode"
    },
    {
      "commit": "51a114b1ab7a51f1d8e91d2163da9ebcb2de6c27",
      "tree": "638462d9f783733c00a871fa24d247b3dc85d204",
      "parents": [
        "2cf14711a5c1d7ba161551d1c43c21f34555bd10"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 10:35:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 10:35:50 2026 +0800"
      },
      "message": "fix(cpp): keep aligned value columns row-aligned when a record omits measurements (#968)"
    },
    {
      "commit": "2cf14711a5c1d7ba161551d1c43c21f34555bd10",
      "tree": "51aa6b34015919644d7e4ddd5049bb57991aca30",
      "parents": [
        "1d87fe0b0636bf07f40e63167303c5e6208755fb"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sat Oct 10 09:41:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 09:41:12 2026 +0800"
      },
      "message": "fix(cpp): propagate table read failures without silent data loss (#970)"
    },
    {
      "commit": "1d87fe0b0636bf07f40e63167303c5e6208755fb",
      "tree": "efd96bf68c280f2e41db233ea4108528caf003f8",
      "parents": [
        "d33e640d32791253aa8a09c2c0d7a2ba9c58059c"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Fri Oct 09 19:57:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 19:57:42 2026 +0800"
      },
      "message": "refactor: remove IDeviceID.isTableModel (#998)"
    },
    {
      "commit": "d33e640d32791253aa8a09c2c0d7a2ba9c58059c",
      "tree": "55f023975d7cb1e7de1e66239f1ecc52949224af",
      "parents": [
        "0e2ceed74e19616b5dbf8089f965ceac7a55ebb4"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Oct 09 12:13:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 12:13:07 2026 +0800"
      },
      "message": "fix(python): guard dataset index reads after close (#999)"
    },
    {
      "commit": "0e2ceed74e19616b5dbf8089f965ceac7a55ebb4",
      "tree": "d14648dc12eb05f70ce3958261f47a7d4e4c78dd",
      "parents": [
        "3f722859066d866f375e31f94a6bd544b28a5ec8"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Oct 09 11:30:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 11:30:16 2026 +0800"
      },
      "message": "fix(cpp): emit bare measurement names for tree-model result columns (#993)\n\nTree-model head/cat/export emitted fully-qualified \"device.measurement\"\ncolumn names (and NDJSON keys), but the CLI requirement specifies bare\nmeasurement names: e.g. `head -d root.factory.d1 -m temp -m status`\nshould print `time temp status`, and `head -m temp -f ndjson` should\nemit {\"time\":\"...\",\"temp\":...}.\n\nStrip the device prefix at the output layer only for tree-model row\nqueries, leaving the reader\u0027s get_column_name contract and the table\nmodel untouched."
    },
    {
      "commit": "3f722859066d866f375e31f94a6bd544b28a5ec8",
      "tree": "83dc0cdc0c42cd6ddd92d6d5a1b153aeae4133cf",
      "parents": [
        "9f35d7613d519c39e21d7800f9b0b95bed29af00"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 09 10:27:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 10:27:03 2026 +0800"
      },
      "message": "build(deps): bump at.yawk.lz4:lz4-java from 1.11.1 to 1.11.4 in /java (#991)\n\nBumps [at.yawk.lz4:lz4-java](https://github.com/yawkat/lz4-java) from 1.11.1 to 1.11.4.\n- [Release notes](https://github.com/yawkat/lz4-java/releases)\n- [Changelog](https://github.com/yawkat/lz4-java/blob/main/CHANGES.md)\n- [Commits](https://github.com/yawkat/lz4-java/compare/v1.11.1...v1.11.4)\n\n---\nupdated-dependencies:\n- dependency-name: at.yawk.lz4:lz4-java\n  dependency-version: 1.11.4\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9f35d7613d519c39e21d7800f9b0b95bed29af00",
      "tree": "ad72389fdf65a37a7e049fd3e056c439c0f8bfd3",
      "parents": [
        "133c9b63ba52fd4fcbdad0a30f17fd188ddb5895"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Oct 09 09:44:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:44:09 2026 +0800"
      },
      "message": "fix(cpp): preserve leading backslashes in tsfile-cli CSV round trips (#994)\n\n* fix(cpp): preserve leading backslashes in CLI CSV round trips\n\n* fix(cpp): clarify CLI CSV backslash prefix encoding\n\n* fix(cpp): clarify CSV help and check test writes"
    },
    {
      "commit": "133c9b63ba52fd4fcbdad0a30f17fd188ddb5895",
      "tree": "0925cfb1939720cfc19146223c6da9920ad1819e",
      "parents": [
        "617b24004ddca731a8c830450c27926c5f3cad32"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 08 23:01:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 23:01:38 2026 +0800"
      },
      "message": "fix(cpp): replace malformed UTF-8 in CLI text output (#997)\n\n* fix(cpp): replace malformed UTF-8 in CLI text output\n\n* fix(cpp): reject colliding JSON keys after UTF-8 replacement"
    },
    {
      "commit": "617b24004ddca731a8c830450c27926c5f3cad32",
      "tree": "7aa71eb4bf7fc872fabbe243eedf313f6c90f7f5",
      "parents": [
        "47c0ec4e9aee7ba58797f2f0a15b0408be801bd2"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 08 16:07:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 16:07:10 2026 +0800"
      },
      "message": "docs: align root tsfile-cli skill with current CLI (#995)"
    },
    {
      "commit": "47c0ec4e9aee7ba58797f2f0a15b0408be801bd2",
      "tree": "3c50289935ad0da1e1d948a1881555ae115f604f",
      "parents": [
        "fce6c421e1efa9b8462e7d9beb262f818a8cba71"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 08 15:37:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 15:37:22 2026 +0800"
      },
      "message": "fix(cpp): restore reader test file cleanup (#992)"
    },
    {
      "commit": "fce6c421e1efa9b8462e7d9beb262f818a8cba71",
      "tree": "b2ce1084b7de589feed301b81b7bee1e29e73ca9",
      "parents": [
        "fc5e1cfc30f35f2e0cc7af672a842f89546ecfe9"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Oct 08 14:13:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 14:13:35 2026 +0800"
      },
      "message": "fix(cpp): escape control characters in tsfile-cli table output (#974)"
    },
    {
      "commit": "fc5e1cfc30f35f2e0cc7af672a842f89546ecfe9",
      "tree": "d4c89b19489504e2d3dd9aad7958735bf9aeba49",
      "parents": [
        "9cd767df599cfab3042e272e8aaad069b126f5af"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Thu Oct 08 05:59:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:59:17 2026 +0800"
      },
      "message": "Remove the unused maven-dependency-tree enforcer dependency (#990)\n\nextra-enforcer-rules no longer uses maven-dependency-tree since 1.8.0, so no rule loads it."
    },
    {
      "commit": "9cd767df599cfab3042e272e8aaad069b126f5af",
      "tree": "4e5d590f2b1a6a631436d2ce95633d3550aafeef",
      "parents": [
        "b9a9cfa321dd7b1d0a2ee1edec7e03ae029216fd"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Thu Oct 08 11:56:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 11:56:55 2026 +0800"
      },
      "message": "fix: add scanning patch (#975)\n\n* fix: add scanning patch\n\n* test(cpp): cover empty pages within aligned chunks\n\n---------\n\nCo-authored-by: ColinLee \u003cshuolin_l@163.com\u003e"
    },
    {
      "commit": "b9a9cfa321dd7b1d0a2ee1edec7e03ae029216fd",
      "tree": "164782ead22cdd8079930e082c639449af2e3184",
      "parents": [
        "a2b9369ffe8f670d465132e26b2b9c8794d548b7"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Oct 06 16:51:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 16:51:59 2026 +0800"
      },
      "message": "fix(cpp): preserve table time statistics in filtered metadata (#989)"
    },
    {
      "commit": "a2b9369ffe8f670d465132e26b2b9c8794d548b7",
      "tree": "43e3bccbacc894faa3b0ac3530e185b673767347",
      "parents": [
        "c00145b2260f5003ea7f721f8f7213c698c3071b"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Oct 05 16:44:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 16:44:46 2026 +0800"
      },
      "message": "fix(cpp): reject special input files before open to avoid FIFO hang (#977)"
    },
    {
      "commit": "c00145b2260f5003ea7f721f8f7213c698c3071b",
      "tree": "c452070f2c6d66de2d0deb3890248b7f6a9cae9a",
      "parents": [
        "7042e3f8b89a5156f17400100eb789b8416e47ec"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Oct 02 20:57:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 20:57:16 2026 +0800"
      },
      "message": "Remove unavailable OSS Index vulnerability check (#988)"
    },
    {
      "commit": "7042e3f8b89a5156f17400100eb789b8416e47ec",
      "tree": "043a32ffa0fffc7385518a534ecadc3724ee4597",
      "parents": [
        "f4691f0418913f35e096ddbb735c317c254138af"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Oct 02 20:43:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 20:43:26 2026 +0800"
      },
      "message": "Change vulnerability-checks fail configuration to false in pom.xml (#987)"
    },
    {
      "commit": "f4691f0418913f35e096ddbb735c317c254138af",
      "tree": "644a8c0fdf9b02c5024f7f142e660f70c303dde6",
      "parents": [
        "e704c475b1c72e03c1992fe8fab6eaaf675a647f"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Oct 02 20:14:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 20:14:31 2026 +0800"
      },
      "message": "Update develocity-maven-extension version to 2.6.0 (#986)"
    },
    {
      "commit": "e704c475b1c72e03c1992fe8fab6eaaf675a647f",
      "tree": "161d205f9e347e320d9626a6d965c889690e5d36",
      "parents": [
        "9ed0f9400d3f3679cb935cb110f452feaa5c9134"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 19:48:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:48:44 2026 +0800"
      },
      "message": "Bump com.gradle:develocity-maven-extension from 1.23.1 to 2.4.1 (#828)\n\nBumps com.gradle:develocity-maven-extension from 1.23.1 to 2.4.1.\n\n---\nupdated-dependencies:\n- dependency-name: com.gradle:develocity-maven-extension\n  dependency-version: 2.4.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9ed0f9400d3f3679cb935cb110f452feaa5c9134",
      "tree": "401ab094a8314ee60a640a268711c32b776af2cd",
      "parents": [
        "7b1c127b7ef470d8fbb2bec44b39448dc967ad0e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 19:07:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:07:19 2026 +0800"
      },
      "message": "build(deps): bump com.fasterxml.jackson.core:jackson-databind in /java (#984)\n\nBumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson-databind) from 2.18.9 to 2.18.11.\n- [Commits](https://github.com/FasterXML/jackson-databind/compare/jackson-databind-2.18.9...jackson-databind-2.18.11)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.18.11\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7b1c127b7ef470d8fbb2bec44b39448dc967ad0e",
      "tree": "aecf1e9847f855ee8289de812fd63028a50be04b",
      "parents": [
        "4e41a7b005da3a63148ba54176d69cca089567b1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 19:07:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:07:05 2026 +0800"
      },
      "message": "build(deps): bump com.fasterxml.jackson.core:jackson-core in /java (#985)\n\nBumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.8 to 2.18.11.\n- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.18.8...jackson-core-2.18.11)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-core\n  dependency-version: 2.18.11\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4e41a7b005da3a63148ba54176d69cca089567b1",
      "tree": "e01a319e457dc961a79065ae0261ecaa9c57fc12",
      "parents": [
        "4177a89dd9f5eb29a6490a9cae8fb842307017fb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 18:55:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 18:55:09 2026 +0800"
      },
      "message": "build(deps): bump actions/setup-go from 6 to 7 (#983)\n\nBumps [actions/setup-go](https://github.com/actions/setup-go) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-go\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4177a89dd9f5eb29a6490a9cae8fb842307017fb",
      "tree": "02649842668935addce1313015f71e9fc2fad8bd",
      "parents": [
        "4cabc26ea711465447663250b67cd7ee037cd5a6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 18:54:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 18:54:56 2026 +0800"
      },
      "message": "build(deps): bump github/codeql-action from 4.37.9 to 4.38.2 (#982)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.9 to 4.38.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.37.9...v4.38.2)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.38.2\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4cabc26ea711465447663250b67cd7ee037cd5a6",
      "tree": "db735584bc7535fb78be3b3c1fe1a4968493e5d8",
      "parents": [
        "05b5d939c5e69f3b9ad83afdfbb200d6bc50df42"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 18:54:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 18:54:39 2026 +0800"
      },
      "message": "build(deps): bump actions/setup-java from 5.6.0 to 6.0.1 (#981)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.6.0 to 6.0.1.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v5.6.0...v6.0.1)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "05b5d939c5e69f3b9ad83afdfbb200d6bc50df42",
      "tree": "e1bb91e874fe34594a0381878e463a41f55f2d31",
      "parents": [
        "3cf7a0f6342359b0b8118956cb171f775fa2a9ad"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Sep 30 17:44:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 17:44:57 2026 +0800"
      },
      "message": "fix(cpp): stop misreading pages after an empty value page (#976)\n\n* fix(cpp): read empty value page headers without consuming the next page (#971)\n\nJava writes an all-null value page as a single zero varint and omits the\ncompressed size and statistics (ValueChunkWriter.writeEmptyPageToPageBuffer).\nThe C++ PageHeader::deserialize_from always read a second varint and, when\nrequested, a statistic, so after an empty page it consumed the following\npage\u0027s bytes as the empty page\u0027s header and misread every later page.\n\nReturn early when uncompressed_size_ \u003d\u003d 0, matching the Java format. The\naligned readers already treat compressed_size_ \u003d\u003d 0 as an all-null page, so\nthe fix is localized to PageHeader deserialization.\n\nAdd PageHeader unit tests covering an empty page followed by a non-empty\npage, for both deserialize_stat values, asserting it consumes exactly one\nvarint and leaves the following page intact.\n\n* test: cover empty pages in cross-language fixtures"
    },
    {
      "commit": "3cf7a0f6342359b0b8118956cb171f775fa2a9ad",
      "tree": "7f081c3dec9fe36c54a5a47b3a8aaf68aca3ee69",
      "parents": [
        "09899a0c101b216d264e1e1c1186d07150c4a20a"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Wed Sep 30 15:52:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 15:52:19 2026 +0800"
      },
      "message": "fix: update sketch layout (#978)"
    },
    {
      "commit": "09899a0c101b216d264e1e1c1186d07150c4a20a",
      "tree": "cdd09cb2b244a78005c60a2f575cbbbb65b0cde8",
      "parents": [
        "83fe5594f605678174327811e9f5e6459b75afbe"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Wed Sep 30 10:05:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 10:05:20 2026 +0800"
      },
      "message": "Add sketch command in tsfile-cli from `TsFileSketchTool` (#838)"
    },
    {
      "commit": "83fe5594f605678174327811e9f5e6459b75afbe",
      "tree": "06a536f234891056ac574c53dc0e8a7b65f768d8",
      "parents": [
        "e3ecbddca7c08eed120d4d934ee12f45cd3034b0"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Sep 24 08:30:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 08:30:35 2026 +0800"
      },
      "message": "fix(cpp): flush pending data on writer close (#969)"
    },
    {
      "commit": "e3ecbddca7c08eed120d4d934ee12f45cd3034b0",
      "tree": "acc97bcbb249920e4f468ef3396b58d8b57b5e11",
      "parents": [
        "9b40e40c0e530f367a942e36b2adcceba2748298"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Tue Sep 22 15:36:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 22 15:36:59 2026 +0800"
      },
      "message": "Move type dispatch outside batch read and write loops (#963)\n\n* optimze\n\n* tmp\n\n* tmp\n\n* tmp"
    },
    {
      "commit": "9b40e40c0e530f367a942e36b2adcceba2748298",
      "tree": "2a0d576a65cc68b8cb769204408cb7694da4d8b9",
      "parents": [
        "9391fc1601e65bef05f06af5f31b73fd012b6759"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Sep 17 17:46:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 17:46:44 2026 +0800"
      },
      "message": "perf(python): accelerate Dataset Index metadata lookups (#959)\n\n* perf(python): accelerate Dataset Index metadata lookups\n\n* build(python): require Dataset Index Cython extension\n\n* fix(python): bound Dataset Index lookups against corrupt ranges\n\nThe Cython fast paths indexed the mmap with child ranges read from the index\nrecords without validating them, so a corrupt or hand-crafted .tsidx could\nread past the mapping and crash the interpreter (SIGSEGV/SIGBUS) instead of\nraising, which the previous pure-Python path did via record().  Validate the\ndevice/column/series child ranges the same way describe_series and\nfind_series_span already do, and take ids as signed values so negative ids\nkeep raising IndexError instead of OverflowError.\n\nAlso drop the now-unused pure-Python _find_child, retarget the hash-collision\ntest at the production Cython lookup (the old test only exercised that dead\nhelper), and skip the dataclass-slots assertion on Python 3.9 where\ndataclasses do not support slots.\n\n* refactor(python): drop Dataset Index descriptor cache env knobs\n\nThe descriptor cache size and its hit/miss counters were exposed through\nTSFILE_DATAFRAME_DESCRIPTOR_CACHE_SIZE / _STATS, adding process-wide\nconfiguration surface plus a stats branch on every lookup for a bounded\nprocess-local cache that already has a sane budget.  Keep the historical\n4096-entry default and restore the unconditional cache reads."
    },
    {
      "commit": "9391fc1601e65bef05f06af5f31b73fd012b6759",
      "tree": "f3d17e2e46a407a25ca549f4586cb42c88fcd140",
      "parents": [
        "8fdbc49bc80eb4a4d6cf6e46cdf0cabd1a1c0837"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Sep 17 17:24:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 17:24:01 2026 +0800"
      },
      "message": "fix(cpp): align the ANTLR4 compatibility bound with the enforced range (#965)"
    },
    {
      "commit": "8fdbc49bc80eb4a4d6cf6e46cdf0cabd1a1c0837",
      "tree": "d3ac2125575a80b67c6e5a5f19dfaaf92dc7bfe5",
      "parents": [
        "98335815e185dca630ef00e3f144c402ac8405e4"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Tue Sep 15 18:22:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 18:22:03 2026 +0800"
      },
      "message": "Complete TimeColumn accessors and fix dictionary primitive lookup (#961)\n\n* enhance compatibility of TimeColumn\n\n* Fix dictionary primitive type lookup and add column tests"
    },
    {
      "commit": "98335815e185dca630ef00e3f144c402ac8405e4",
      "tree": "2d2c6ccd1307680d306b390ebf3b189bd19329ac",
      "parents": [
        "901c24ad01876bb32bcb7081df81e64dc45c9cf0"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Sep 14 17:52:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 17:52:55 2026 +0800"
      },
      "message": "Add CodeQL analysis for Go code (#957)\n\n* Add codeql for golang code\n\n* Fix Go CodeQL analysis with manual CGO build"
    },
    {
      "commit": "901c24ad01876bb32bcb7081df81e64dc45c9cf0",
      "tree": "22cde6c6ba4a048f9240749cc465c61fce694ac8",
      "parents": [
        "5e207cd028010b032c5ca95ce6295ae73ae68f36"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Sep 11 15:32:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 15:32:15 2026 +0800"
      },
      "message": "Restore custom encryption implementation compatibility (#956)"
    },
    {
      "commit": "5e207cd028010b032c5ca95ce6295ae73ae68f36",
      "tree": "0f09bb51fec6f4148b8cbeee13abe4cb13c0d96d",
      "parents": [
        "e6d09dd73ee2e247e8849a2d7d66669f269976d1"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Fri Sep 11 15:13:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 15:13:51 2026 +0800"
      },
      "message": "Cache type service readers in page readers (#955)"
    },
    {
      "commit": "e6d09dd73ee2e247e8849a2d7d66669f269976d1",
      "tree": "d23f8ce2bf41aec29815c26d5d77972f9e878ab3",
      "parents": [
        "c9b92431c091ee9182af6dac2a5922985d9b100e"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Sep 11 12:10:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 12:10:05 2026 +0800"
      },
      "message": "fix(query): restore empty results for inverted time ranges (#954)"
    },
    {
      "commit": "c9b92431c091ee9182af6dac2a5922985d9b100e",
      "tree": "703aaaef7cc528b5913ea7d3aee04f716e33e52d",
      "parents": [
        "2c2d416e2764460cdee8aabbeb80b1afbe639e1c"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Sep 10 17:54:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 17:54:46 2026 +0800"
      },
      "message": "Feat/go table model api (#949)"
    },
    {
      "commit": "2c2d416e2764460cdee8aabbeb80b1afbe639e1c",
      "tree": "6ba9a724a7e48da0344f3c5a934adfcb411dfd60",
      "parents": [
        "b924b1b2ff793c275091e6d6002623abe1fd634e"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Sep 10 00:26:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 00:26:01 2026 +0800"
      },
      "message": "[Feature][C++][Python] Support seekable random-access TsFile sources (#939)"
    },
    {
      "commit": "b924b1b2ff793c275091e6d6002623abe1fd634e",
      "tree": "5f0a4c01af86ac9443f98f1ea5ea2a397369c700",
      "parents": [
        "e00a1e43969efb9f3a9725fbd8e6d75595fd7e5d"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Sep 09 15:35:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 15:35:55 2026 +0800"
      },
      "message": "fix(cpp): correct wide INT64 decoding and SIMD statistic reductions (#947)"
    },
    {
      "commit": "e00a1e43969efb9f3a9725fbd8e6d75595fd7e5d",
      "tree": "c6f7d15fa71c3d6583ff8215d20d0ccb9b338f92",
      "parents": [
        "60b71949a741d72e3482fe18347171a99a8dc043"
      ],
      "author": {
        "name": "Tian Jiang",
        "email": "jt2594838@163.com",
        "time": "Wed Sep 09 11:51:43 2026 +0800"
      },
      "committer": {
        "name": "Tian Jiang",
        "email": "jt2594838@163.com",
        "time": "Wed Sep 09 11:51:43 2026 +0800"
      },
      "message": "add TsPrimitiveType getByType back temporarily for compatibility.\n"
    },
    {
      "commit": "60b71949a741d72e3482fe18347171a99a8dc043",
      "tree": "ea6c94ea4b7051b550d9c6f3e1f2da138821ab1d",
      "parents": [
        "1f5f06837db6022c3aca8457ccf16700b352f859"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Sep 09 11:10:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 11:10:28 2026 +0800"
      },
      "message": "Enable GitHub Discussions (#951)"
    },
    {
      "commit": "1f5f06837db6022c3aca8457ccf16700b352f859",
      "tree": "ad257c9b4610e3f8a8050415d29087d7e961e471",
      "parents": [
        "b760c33a15a437fbb7a7bd6dc7c2b375c68f7050"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Wed Sep 09 09:27:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 09:27:16 2026 +0800"
      },
      "message": "Add batched null and bitmap-offset writes to ValuePageWriter (#948)\n\n* add ValuePageWriter.writeNull\n\n* add ValuePageWriter.write with Bitmap"
    },
    {
      "commit": "b760c33a15a437fbb7a7bd6dc7c2b375c68f7050",
      "tree": "08b0955ad996967b0b01b36ecd361db3d5d31433",
      "parents": [
        "02b503b92416a04fcfb360f446c08ef3e0978ed2"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Sep 08 19:01:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 19:01:51 2026 +0800"
      },
      "message": "fix(python): preserve shared readers when closing dataframe subsets (#946)\n\n* fix(python): preserve shared readers when closing dataframe subsets\n\n* style(python): keep lifecycle tests compatible with Black 25 and 26"
    },
    {
      "commit": "02b503b92416a04fcfb360f446c08ef3e0978ed2",
      "tree": "42b5cdf51225be8340fd065f6873c4bb7cdf4cef",
      "parents": [
        "9be35b9bea2c95dd6f0201aeb8f04255775f2a9f"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Tue Sep 08 18:55:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 18:55:03 2026 +0800"
      },
      "message": "Refactor data type handling with type interfaces (#872)\n\n* add interface for addValueOfDataType\n\n* add interface for createValueColumnOfDataType\n\n* add interface for serializeColumn\n\n* add interface for readvaluesFromBuffer\n\n* add interface for equals\n\n* add interface for getValue\n\n* add interface for ramBytesUsed\n\n* add interface for ramBytesUsed\n\n* add interface for createColumn\n\n* Add TypeServices\n\n* Add TypeServices\n\n* Add getTsPrimitiveType\n\n* Add arePositionsEqual\n\n* Add arePositionsEqual\n\n* Add getDefaultEncoding\n\n* Add toBytes\n\n* Add getCompressor\n\n* Add calcTypeSize\n\n* Add getDecoder\n\n* Add getOneItemMaxSize\n\n* Add updateStatistics\n\n* Add getCurrentValue\n\n* refactor calcTypeSize\n\n* refactor calcTypeSize\n\n* refactor currentTsPrimitiveType\n\n* refactor BatchData.init\n\n* refactor BatchData.putAnObject\n\n* refactor BatchData.serializeData\n\n* refactor DescReadWriteBatchData.new\n\n* refactor DescReadWriteBatchData.serializeData\n\n* refactor Field.getStringValue\n\n* add Type.estimateArraySize\n\n* add Type.estimateArraySize\n\n* add Type.estimateValueSize\n\n* add Field.getObjectValue\n\n* add Field.getField\n\n* add Field.setTsPrimitiveValue\n\n* add Type.deserializeColumn\n\n* add Type.deserializeColumn\n\n* add Column.serializeWithoutNulls\n\n* add Type.createNullColumn\n\n* add Type.addPoint\n\n* add READ_PAGE_VALUE_TO_BATCHDATA_SERVICE\n\n* add READ_PAGE_VALUE_TO_TSBLOCK_SERVICE\n\n* refactor nextBatch\n\n* refactor nextValue\n\n* refactor nextValueBatch\n\n* refactor writeColumnBuilderWithNextBatch\n\n* refactor writeColumnBuilderWithNextBatch\n\n* refactor writeColumnBuilderWithNextBatch\n\n* refactor writeEmptyDataInOneRow\n\n* refactor getDataPoint\n\n* refactor write\n\n* refactor write\n\n* refactor write\n\n* refactor write\n\n* refactor write\n\n* refactor batchWrite\n\n* refactor writeWithTsRecord\n\n* refactor getEncoder\n\n* refactor getEncoder\n\n* add Type.copyArrayElement\n\n* add Type.arrayCopyOf\n\n* remove Type.copyArrayElement\n\n* refactor getEncoder\n\n* add Type.setTo\n\n* add      REGULAR_ENCODER_SERVICE\n\n* add GORILLA_V2_ENCODER_SERVICE\n\n* add estimateArraySize\n\n* refactor addValue\n\n* add Date compatibility\n\n* add Date compatibility\n\n* refactor putValueToField\n\n* add Type.serializeValue\n\n* refactor fetchRecords\n\n* add Type.serializeValue\n\n* refactor copy\n\n* add Type.deserialize\n\n* refactor fillSingleMeasurementColumn\n\n* refactor setTo\n\n* refactor fillIdColumn\n\n* add Type.serializeArray\n\n* refactor updateWithoutTimeColumn\n\n* refactor rewrite\n\n* enhance type check\n\n* add Type.serializedSize\n\n* refactor rewrite\n\n* refactor TsBlockBuilder\n\n* refactor buildValueColumnBuilders\n\n* refactor buildValueColumnBuilders\n\n* add createStatistics\n\n* add getValueAsTsPrimitiveType\n\n* refactor getSizeByType\n\n* refactor ValueFilterApi\n\n* refactor generate\n\n* refactor TsFileSequenceRead\n\n* refactor ValueConverter\n\n* refactor ValueConverter\n\n* refactor TSEncodingBuilder\n\n* refactor StatisticsTest\n\n* refactor StatisticsTest\n\n* add write\n\n* refactor BatchDataTest\n\n* refactor BatchDataTest\n\n* refactor TsBlockFilterTest\n\n* refactor PageReaderTest\n\n* refactor TsFileLastReaderTest\n\n* refactor TableViewTest\n\n* refactor TabletTest\n\n* refactor TypeCastTest\n\n* refactor RecordUtils\n\n* refactor castFromSingleValue\n\n* refactor castFromArray\n\n* refactor getDataTypeSize\n\n* refactor isNumeric\n\n* refactor   public boolean isComparable() {\n\n* add update\n\n* fix null binary conversion\n\n* add write\n\n* return serialized size\n\n* add TsPrimitiveType.copy\n\n* add Type.deserializeArray\n\n* spotless\n\n* add Column.writeTo\n\n* add Type.write\n\n* add Type.write\n\n* add Type.write\n\n* add Type.write\n\n* add Type.write\n\n* add Type.write\n\n* add Column.convertTo\n\n* add Type.deserialize\n\n* spotless\n\n* add Type.serialize\n\n* add Type.deserialize\n\n* bump version\n\n* Fix descending batch data value list initialization"
    },
    {
      "commit": "9be35b9bea2c95dd6f0201aeb8f04255775f2a9f",
      "tree": "929605b41a981a4f8d692e24bfb235343a519c13",
      "parents": [
        "9b310908a91745f007fc0bb56c2915dbe5650847"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Sep 07 18:27:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 18:27:43 2026 +0800"
      },
      "message": "fix(python): preserve null dataset field values (#942)"
    },
    {
      "commit": "9b310908a91745f007fc0bb56c2915dbe5650847",
      "tree": "90cb5c0408b3dffcc52a64ddc367877dc6349ed8",
      "parents": [
        "a8a908867dce315807862067a13584c1f7e2462e"
      ],
      "author": {
        "name": "kkzi",
        "email": "34122458+kkzi@users.noreply.github.com",
        "time": "Fri Sep 04 19:30:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 19:30:42 2026 +0800"
      },
      "message": "fix(cpp): report the stored codec in reader schema, not library defaults (#926)\n\n* test(cpp): add failing repro for reader-reported codecs\n\nTsFileReader::get_timeseries_schema() builds every MeasurementSchema with\nthe two-argument constructor, so the encoding and the compressor it\nreports are the library defaults for the data type rather than the codecs\nactually stored in the chunk headers.\n\nEvery series here is registered with codecs that differ from those\ndefaults (PLAIN on INT32, TS_2DIFF on FLOAT, UNCOMPRESSED throughout).\nThe four tests cover the non-aligned and the aligned write paths, a\ndevice mixing two different compressors so that hard-coding UNCOMPRESSED\ncannot pass, and a 600-character measurement name - the name sits between\nthe chunk type byte and the codec bytes in the chunk header, so reading\nthe header into a fixed-size buffer would truncate it and silently fall\nback to the defaults.\n\n* fix(cpp): report the stored codec in reader schema, not library defaults\n\nTsFileReader::get_timeseries_schema() built every MeasurementSchema with\nthe 2-arg constructor, so encoding_/compression_type_ always came from\nget_value_encoder(data_type) / get_default_compressor(). A series written\nas PLAIN/UNCOMPRESSED was reported as TS_2DIFF/LZ4 - the schema described\nthe library defaults rather than the file.\n\nEncoding and compression are per-chunk properties that live only in the\nchunk header on disk: ChunkMeta::deserialize_from() reads nothing but\noffset_of_chunk_header_, so a ChunkMeta from the metadata index cannot\nsupply them (its encoding_/compression_type_ fields are never assigned).\nRead the chunk header back at that offset and deserialize it instead,\nfalling back to the defaults when the header cannot be read so schema\nintrospection never fails outright.\n\nAdds TsFileIOReader::get_read_file() for the raw byte access.\n\n* fix(cpp): use the latest chunk codec for schema metadata\n\nRead encoding and compression from the final chunk header so C++ schema metadata matches Java for valid files with per-chunk codec changes. Preserve the latest recovered codec during append recovery and add regression coverage.\n\n🤖 Generated with Codebuff\nCo-Authored-By: Codebuff \u003cnoreply@codebuff.com\u003e\n\n* refactor(cpp): remove duplicated read_chunk_header_codec\n\nCommit aadeec5 left a second, unreferenced copy of\nread_chunk_header_codec() in the file-scope anonymous namespace while\nthe version inside namespace storage (the one actually called by\nget_timeseries_schema()) was updated. Drop the dead copy; no behavior\nchange.\n\n---------\n\nCo-authored-by: gx \u003cxuan.guo@atomdatatech.com\u003e\nCo-authored-by: Codebuff \u003cnoreply@codebuff.com\u003e"
    },
    {
      "commit": "a8a908867dce315807862067a13584c1f7e2462e",
      "tree": "ce319752c95682662c30b4d532774ac6dba4366c",
      "parents": [
        "c373649335b7925bb46b94593813931c29e3f160"
      ],
      "author": {
        "name": "kkzi",
        "email": "34122458+kkzi@users.noreply.github.com",
        "time": "Fri Sep 04 18:53:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 18:53:22 2026 +0800"
      },
      "message": "fix(cpp): open non-ASCII file paths through the wide CRT on Windows (#927)\n\n* test(cpp): add failing repro for non-ASCII file paths on Windows\n\nWriteFile, ReadFile and RestorableTsFileIOWriter\u0027s self-check reader all\npass a UTF-8 std::string straight to the narrow CRT open(). On Windows\nthe CRT interprets those bytes in the active code page, so a path with\nnon-ASCII characters resolves to a different name than the caller asked\nfor.\n\nThe four tests here spell the path as explicit UTF-8 byte escapes and\nverify the result through the wide Win32 API, so they cannot be fooled\nby the same conversion they are testing. All four fail on this commit:\n\n  WriteFileCreatesUtf8Path              file created under a mojibake name\n  ReadFileOpensUtf8Path                 existing file not found (errno 2)\n  Utf8PathRoundTripsBetweenWriteAndRead round trip used the wrong name\n  RestorableWriterSelfChecksUtf8Path    complete file reported as crashed\n                                        and writable, i.e. silent data loss\n\n* fix(cpp): open non-ASCII file paths through the wide CRT on Windows\n\nReadFile, WriteFile and the RestorableTsFileIOWriter self-check reader all\nhanded their path straight to the narrow CRT open(). On Windows that\ninterprets the bytes in the active code page, so a UTF-8 path with\nnon-ASCII characters resolves to a mojibake name: writes land under the\nwrong name and reads of an existing file fail outright.\n\nRoute all three through file_internal::open_utf8(), which converts the\nUTF-8 bytes to UTF-16 with MB_ERR_INVALID_CHARS and calls _wopen(). Paths\nthat are empty, hold an embedded NUL, or are not valid UTF-8 are rejected\nwith errno set rather than silently mangled. On POSIX the helper forwards\nto open() unchanged.\n\nThe self-check reader had the same defect on both branches of its\nplatform switch, so its Windows branch is converted too -- that is the\npath where a mangled name made the writer report a crashed file that\ncould be rewritten from scratch, discarding existing data.\n\n* test(cpp): give each Utf8Path test its own file name\n\ngtest_discover_tests registers every gtest case as its own ctest entry,\nso ctest --parallel N runs several cases of the same binary as separate\nprocesses in one shared working directory.  The four file-based tests\nshared a single fixed name and unlinked it unconditionally in\nSetUp/TearDown, so a concurrently starting case deleted the file\nanother case had just created - flaky \"stat/open failed\" on the\nubuntu and macos CI legs (the exact interleave decides which case\nloses).\n\nDerive the name from the current gtest case name (ASCII, appended to\nthe non-ASCII stem in both the UTF-8 and UTF-16 spellings), so each\nprocess only ever touches its own file.  Verified by running the four\ncases as four concurrent processes in one directory, five rounds, all\ngreen.\n\n* fix(cpp): use POSIX unlink in utf8_path_test on non-Windows\n\n_unlink is a Windows CRT extension and does not exist on Linux/macOS,\nwhich broke the build there. \u003cunistd.h\u003e is already included on that\nbranch.\n\n* fix(cpp): reject existing UTF-8 paths atomically\n\n* fix(cpp): clean up failed TsFileWriter opens\n\n---------\n\nCo-authored-by: gx \u003cxuan.guo@atomdatatech.com\u003e"
    },
    {
      "commit": "c373649335b7925bb46b94593813931c29e3f160",
      "tree": "285588b675bd0d8609b8a2ea8ac4543b925579e5",
      "parents": [
        "4ea5ed5ae90d45357802ba7d40ab56f4b890dae3"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Fri Sep 04 15:57:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 15:57:52 2026 +0800"
      },
      "message": "Fix VectorMeasurementSchema stream deserialization (#941)"
    },
    {
      "commit": "4ea5ed5ae90d45357802ba7d40ab56f4b890dae3",
      "tree": "4918a58cde0de26c3d6afb16e1c396fb805b3877",
      "parents": [
        "b6ed43c3d137dace4c8dab4e6e7381f8e47cfe91"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Sep 04 11:54:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 11:54:27 2026 +0800"
      },
      "message": "docs: clarify security issue classification (#937)"
    },
    {
      "commit": "b6ed43c3d137dace4c8dab4e6e7381f8e47cfe91",
      "tree": "3f0ea1cb888089e6221cd393c427ac58fd550c4b",
      "parents": [
        "21138057c4fd678eea8d687b584b247e3c7e9465"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Thu Sep 03 18:51:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 18:51:14 2026 +0800"
      },
      "message": "Update C++ tsfile-cli command surface and data workflows (#915)\n\n* test: capture tsfile cli v0.7 contracts\n\n* feat: align tsfile cli surface with v0.7 contract\n\n* docs: refresh tsfile cli usage reference\n\n* fix: tighten tsfile cli contract edge cases\n\n* fix: align cli machine value serialization\n\n* style: format cli tests for spotless\n\n* fix: support cli file checks on windows\n\n* fix: require standalone cli help and version\n\n* fix: reject repeated cli singleton options\n\n* fix: align stats and count output contracts\n\n* fix: handle windows cli output paths\n\n* fix: align write csv contract\n\n* fix: document cli command contracts\n\n* test: stabilize cli skill reference check\n\n* test: remove version label from cli requirement tests\n\n* style: format cli requirement test suite name\n\n* fix(cpp): address tsfile cli review findings\n\n* test(cpp): expand tsfile cli requirement coverage\n\n* fix(cpp): address tsfile cli ci failures\n\n* fix(cpp): satisfy cli cppcheck bounds warning\n\n* test(cpp): add exact tsfile cli model coverage\n\n* fix(cpp): use portable timestamp types in stats\n\n* test(cpp): isolate concurrent model fixtures\n\n* build: exclude exact-output fixtures from RAT\n\n* test(cpp): compare model outputs byte for byte\n\n* fix(cpp): remove legacy write column encoding\n\n* style: normalize Maven XML formatting\n\n* refactor(cpp): remove unnecessary reader rewrites\n\n* refactor(cpp): minimize unrelated formatting changes\n\n---------\n\nCo-authored-by: ColinLee \u003cshuolin_l@163.com\u003e"
    },
    {
      "commit": "21138057c4fd678eea8d687b584b247e3c7e9465",
      "tree": "e53fbf8419167114eec1e37ebdd21275c13d58c2",
      "parents": [
        "a3695c6584f293e06f787cc9bed426ce5e51461c"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Thu Sep 03 18:08:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 18:08:42 2026 +0800"
      },
      "message": "docs: add security policy (#936)"
    },
    {
      "commit": "a3695c6584f293e06f787cc9bed426ce5e51461c",
      "tree": "c6058b35fe8c318d4a2e0242e07be0a5168585fd",
      "parents": [
        "ff29555bb9272dffdde0e68df4c87f4cdb25323d"
      ],
      "author": {
        "name": "Le Yang",
        "email": "562593859@qq.com",
        "time": "Thu Sep 03 16:40:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 16:40:12 2026 +0800"
      },
      "message": "[Feature][C++] Support mmap as an optional local file read backend (#920)\n\n* feat: add optional mmap local file read backend\n\nAdd AUTO, MMAP, and PREAD configuration across the C++, C, and Python APIs. Implement Windows and POSIX mappings with fallback and explicit errors, plus lifecycle tests, documentation, and comparison benchmarks for issue #903.\n\n* fix: address mmap backend review feedback\n\n* fix(cpp): preserve pread default and release mmap fd"
    },
    {
      "commit": "ff29555bb9272dffdde0e68df4c87f4cdb25323d",
      "tree": "105df3d857cdc131a87fdd2e74220adf8937415d",
      "parents": [
        "b0f9285c92890167bcece2b9f230fa4769dcc00a"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Sep 02 15:02:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 15:02:46 2026 +0800"
      },
      "message": "Add initial Go API bindings (#929)"
    },
    {
      "commit": "b0f9285c92890167bcece2b9f230fa4769dcc00a",
      "tree": "b037690c71e29032a3630f3bb00ec9cb3fd485d5",
      "parents": [
        "e783f480b57374a1d37adbcf9e5e79e83100c930"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Sep 02 11:43:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 11:43:33 2026 +0800"
      },
      "message": "fix(python): expose boolean and timestamp dataset fields (#935)\n\n* fix(python): expose boolean and timestamp dataset fields\n\n* Potential fix for pull request finding\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "e783f480b57374a1d37adbcf9e5e79e83100c930",
      "tree": "921e563db4bd95b437ac872d2aaf9f3fc7e82e86",
      "parents": [
        "c2d235c0bc099815d832ca4238635144ddaeeb28"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 17:52:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:52:32 2026 +0800"
      },
      "message": "build(deps): bump github/codeql-action from 4.37.3 to 4.37.9 (#932)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.37.3 to 4.37.9.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.37.3...v4.37.9)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.37.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "c2d235c0bc099815d832ca4238635144ddaeeb28",
      "tree": "be49db81776e9a7d6f33fd17cde502f4e54cab66",
      "parents": [
        "f1cf7397b59cd22eda73f4378e9d34e9f083606b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 01 17:52:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 17:52:12 2026 +0800"
      },
      "message": "build(deps): bump actions/setup-java from 5.6.0 to 6.0.0 (#933)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5.6.0 to 6.0.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v5.6.0...v6.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f1cf7397b59cd22eda73f4378e9d34e9f083606b",
      "tree": "a254f2efd58cf50adb9b9603280c59733794cfcf",
      "parents": [
        "52eb36f1ebafa953c907a1dbf2c4a0ad96306bae"
      ],
      "author": {
        "name": "kkzi",
        "email": "34122458+kkzi@users.noreply.github.com",
        "time": "Tue Sep 01 10:30:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 10:30:50 2026 +0800"
      },
      "message": "fix(cpp): TS_2DIFF float/double maxPointNumber once per page (fixes #910) (#901)\n\n* fix(cpp): handle TS2DIFF float prefixes in batch decode\n\n* fix(cpp): make TS2DIFF float/double prefix detection unambiguous\n\nThe per-block heuristic that distinguished Java-compatible\nmaxPointNumber prefixes from legacy raw delta blocks could\nmisclassify a valid raw header (wi \u003d 0 or bit_width \u003d 0 blocks), which\ndesynced the stream and could spin at end-of-input in batch reads.\n\nDecide the page layout once per page instead: parse the whole\nremaining stream with the Java segment grammar (prefix + overflow\nbitmaps + block run, validated field ranges and exact exhaustion) and\ncache the segment prefix offsets. A legacy raw page fails this parse\nbecause its first misaligned write_index probe reads \u003e\u003d 0x100.\n\n- Legacy raw pages keep the integer SIMD batch decode path with\n  bit-cast semantics (parent-commit behavior).\n- Java pages consume prefixes only at recorded offsets and take the\n  segment-aware scalar path; this also fixes value semantics across\n  blocks inside one Java segment, which the per-block heuristic could\n  not represent.\n- Bail out of read_long() when the stream is exhausted with bits still\n  owed, so no residual misconfiguration can loop forever.\n\nAlso fix ByteStream::check_space(): after set_read_pos() parks the\ncursor at a page boundary, blindly following read_page_-\u003enext_ skipped\nthe boundary page and failed reads with E_OUT_OF_RANGE. Recompute the\npage from the head instead; page chains are short so the walk is cheap.\n\nAdd legacy raw batch/scalar/mixed regression tests for FLOAT and\nDOUBLE (PR #901 review).\n\n* fix(cpp): write maxPointNumber once per page in TS_2DIFF float/double (apache/tsfile#910)\n\nRoot cause of #910: the C++ FloatTS2DIFFEncoder/DoubleTS2DIFFEncoder\nwrote the maxPointNumber field (fixed value 2) at every segment\nboundary, while Java FloatEncoder/DoubleEncoder write it only once at\nthe start of each page.  Files written with an empty/short first\nsegment could then be misparsed by Java readers (e.g. TsFileSketchTool\ncrashing on the trailing maxPointNumber).\n\nThis change aligns the C++ encoder with the Java layout:\n\n- Encoder: the maxPointNumber var_uint is now emitted exactly once per\n  page (on reset, before segment 1).  Segment boundaries only carry the\n  overflow/underflow FLAG when needed, matching Java\u0027s segment grammar.\n- Decoder: forward-only, prefix-aware parsing that accepts all three\n  page layouts — legacy raw pages (no prefix at all), the new Java\n  format (maxPointNumber only on the first segment), and old C++\n  per-segment format (backward compatible).  The old peek-and-rewind\n  scheme is gone; the segment header of a prefix-free segment is\n  preloaded so decode() never needs to re-read the stream.\n- Tests: new gtest cases assert the maxPointNumber-once-per-page byte\n  layout for multi-segment pages, scaled-overflow pages (the #910 crash\n  scenario), reset() page boundaries, and legacy per-segment backward\n  compatibility.\n\nVerified: full C++ test suite passes; Java TsFileSketchTool reads files\nwritten by the fixed encoder; tsfile_cli round-trips the data.\n\n* style(cpp): fix spotless clang-format violations in ts2diff files\n\n* test(compat): extend matrix with FLOAT/DOUBLE TS_2DIFF and 300-row fixtures\n\nExtend the Java and C++ encoding/compression compatibility matrices with\nFLOAT + TS_2DIFF and DOUBLE + TS_2DIFF cases and raise every case to 300\nrows so pages cross the 129-value TS_2DIFF block boundary (129+129+42),\nper review feedback on apache/tsfile#901.\n\nThe TS_2DIFF value set covers all page layouts the writers can produce:\nscaled integers, scale-overflow values (reachable at maxPointNumber 2,\nthe C++ writer), and raw IEEE bit patterns (NaN/Infinity, two page-wide\nbitmaps). Every chosen value restores identically whether the writer used\nmaxPointNumber 0 (Java builder default) or 2 (historical C++ default), so\nthe validating reader never needs to know which writer produced a file;\nNaN expectations use the canonical Java floatToIntBits pattern.\n\nExpected values are computed by applying the writer\u0027s tri-state\nconversion rules, not by reusing the input bits, so non-integer inputs\nwould not round-trip exactly and are excluded.\n\nAlso add a wire-format contract document derived from the Java\nFloatEncoder/FloatDecoder/DeltaBinaryEncoder reference implementations\n(cpp/docs/ts2diff-float-double-wire-format.md), which the upcoming\nencoder/decoder rework will be validated against.\n\nCurrent state: the six new TS_2DIFF float/double cases fail on the C++\nside (write_table returns E_INVALID_ARG and decoded values are\nmisaligned), which is the acceptance baseline the rework must turn green.\n\n* fix(cpp): emit page-wide TS_2DIFF float metadata and per-delta bit width\n\nAlign the C++ FLOAT/DOUBLE TS_2DIFF page layout with the Java canonical\nformat (apache/tsfile#901 review):\n\n- The integer encoder\u0027s automatic 129-value block flush now emits a\n  plain integer block into an internal page buffer; overflow flags and\n  buffered blocks survive across the boundary.  The page-seal flush\n  emits the page metadata once ([overflow marker][pageValueCount]\n  [page-wide bitmap(s)][maxPointNumber]) followed by all buffered\n  blocks, replacing the per-block wrapper metadata.\n\n- Bit width is now the maximum width over the raw deltas rebased by\n  min, mirroring Java calculateBitWidthsForDeltaBlockBuffer, instead of\n  the width of (max - min).  When raw deltas wrap the signed type\n  (e.g. adjacent raw IEEE bit patterns), (max - min) wrapped negative\n  and the block was silently written with bit width 0, discarding every\n  delta.\n\n- The integer flush now calls the base reset() explicitly so the float\n  wrapper\u0027s page-scoped state is not cleared by the virtual dispatch\n  during mid-page block flushes.\n\nVerified: Java reads all 30 non-LZMA2 C++ fixtures (including\nFLOAT/DOUBLE TS_2DIFF at 300 rows across the block boundary with\nNaN/Infinity raw-bit and scale-overflow pages) bit-exactly; the C++\nJava-hex golden tests pass.  The 15 remaining generate failures are the\nLZMA2 compression path failing on this MSVC Debug build regardless of\nencoding (also reproducible with CHIMP + LZMA2 on develop), tracked\nseparately.\n\n* fix(cpp): decode FLOAT/DOUBLE TS_2DIFF pages with page-wide state only\n\nReplace the multi-layout sniffing decoder with a single Java-grammar\nstate machine (apache/tsfile#901 review):\n\n- Page metadata ([overflow marker][pageValueCount][page-wide bitmap(s)]\n  [maxPointNumber], or bare [maxPointNumber]) is parsed exactly once per\n  page and the bitmaps plus page position survive block transitions, so\n  Java multi-block overflow pages decode correctly.\n- maxPointNumber \u003d 0 (page starting with 0x00, the Java Ts2Diff builder\n  default) is a valid Form 1 page, no longer misdetected as a legacy raw\n  payload.\n- The raw bit-cast layout and the pre-#910 per-segment maxPointNumber\n  layout are rejected as format errors instead of being decoded by\n  heuristic detection; legacy tests now assert fail-fast behavior.\n- Block headers are validated (write_index in [0,128], bit_width in\n  range) and a truncated header now fails instead of silently reusing\n  stale state, which previously let batch readers spin forever on\n  out-of-format input.\n\nFLOAT/DOUBLE batch reads reuse the integer batch decoder (SIMD fast\npath) and apply the page-wide bitmaps afterwards per page position.\n\nVerified all four compatibility directions on the extended matrix\n(30 non-LZMA2 cases each): C++/Java readers on C++/Java writers,\nincluding FLOAT/DOUBLE TS_2DIFF at 300 rows across the block boundary\nwith scaled-overflow and raw-bit pages.\n\n* fix(cpp): align default float TS_2DIFF maxPointNumber with Java (0)\n\nThe Java Ts2Diff TSEncodingBuilder hard-codes maxPointNumber \u003d 0 for\nFLOAT/DOUBLE, so the C++ FloatTS2DIFFEncoder/DoubleTS2DIFFEncoder now\ndefault to the same value instead of 2.  The wire value is\nself-describing, but with both writers sharing the default the pages are\nbyte-identical and the C++ writer can no longer produce the\nscale-overflow form (Form 2), which is unreachable at maxPointNumber 0 -\nany overflow is a value overflow and takes the raw-bits path.\n\nFollow-ups in the same commit:\n- Java hex goldens regenerated with maxPointNumber 0.\n- The 0x02-byte-counting assertions are replaced by a structural page\n  walker (metadata once, then a continuous well-formed block stream);\n  byte counting cannot distinguish the 0x00 mpn byte from block-header\n  high bytes.\n- Ramp data in round-trip tests integerized so expectations hold under\n  the default mpv \u003d 1.\n- Compatibility-test constants and the wire-format doc updated, with a\n  note that Form 2 pages can only originate from writers configured\n  with mpn \u003e 0.\n\nVerified: full C++ suite 784/787 pass; all four compatibility directions\ngreen on the 30 non-LZMA2 cases.\n\n* fix(cpp): address 8/27 review of FLOAT/DOUBLE TS_2DIFF (#901)\n\nFive inline review comments plus hardening found while re-auditing\nthe fixes.\n\nReview item 1 - ByteStream::check_space() revert: the TS_2DIFF decoder\nis forward-only now, so the page-boundary recomputation is no longer\nneeded and its O(pages) walk per boundary made sequential traversal\nquadratic. Restored next_-advance; the codec test hex helper no longer\nrewinds via set_read_pos.\n\nReview items 2+3 - maxPointNumber default: TSEncodingBuilder.Ts2Diff\ninitializes 0, but the standard schema write path calls initFromProps(),\nwhich substitutes TSFileConfig.floatPrecision (default 2) when the\nmax_point_number property is absent. Restored the C++ encoder default\nto 2, corrected the wire-format doc, restored the mpn\u003d2 test shapes\n(hex goldens, ramp data, Form 2 overflow), and kept mpn\u003d0 as an\nexplicit fixture: a set_max_point_number() encoder path, an\nMaxPointNumberZeroPagePrefix test, and \"*.mpn0\" Java fixtures that\ncarry max_point_number\u003d0 props and exercise the canonical 0x00 page\nprefix in both readers.\n\nWhile validating the mpn0 fixture, found and fixed a pre-existing\nMeasurementSchema::deserialize_from bug: the props loop iterated over\nprops_.size() (always 0 at that point) instead of the deserialized\ncount, so Java-written (key, value) props pairs were never consumed\nand desynced the TsFileMeta bloom filter (E_TSFILE_CORRUPTED).\n\nReview item 4 - maxPointNumber bound: no format-level basis for\nrejecting mpn \u003e 100; Java accepts any varint the stream carries\n(Math.pow overflow yields +inf, values then take the raw-bits form).\nRemoved both \u003e 100 checks; MaxPointNumberAboveLegacyBoundDecodes covers\nmpn \u003d 1000.\n\nReview item 5 - writeIndex bound: 128 is DeltaBinaryEncoder\u0027s\nBLOCK_DEFAULT_SIZE, not a wire limit; Java exposes block-size\nconstructors. read_header now validates writeIndex against availability\n(int64 arithmetic) instead of the encoder default; the skip paths gained\nthe same bound plus a grouped header-read check (truncated headers used\nto act on stale stack values); peek_next_block_range_int64 returns\nfalse instead of an error code that converted to bool true;\nskip_peeked_block_int64 widened its byte computation to int64;\nLargeBlockBeyondDefaultSizeDecodes covers a 200-value block through\nscalar and batch paths.\n\nRounding - convert_float_to_int/convert_double_to_long now use Java\nMath.round semantics (floor(x + 0.5), ties towards +infinity) instead\nof std::lround (ties away from zero): -0.125 * 100 \u003d -12.5 stores as\n-12, not -13, matching the Java writer byte for byte. The conversion\nsaturates at the integer limits (2^63 boundary included, where a plain\nstatic_cast is UB); JavaRoundNegativeHalfTies* cover the behavior.\n\nHardening from self-review: restored the read_long end-of-input bailout\nthat 67ab361 dropped - with the writeIndex bound gone, a truncated page\nwhose header passes the availability check could spin the scalar path\nforever (reproduced with a 17-byte page under a watchdog;\nScalarReadTerminatesOnTruncatedBlock pins it); SkipRejectsTruncated\nBlockHeader pins the grouped skip check.\n\nVerified: full C++ suite 803 passed / 3 skipped (env-gated compat);\ncompat matrix green in all four directions (Java\u003c-\u003eC++, including the\nmpn0 fixtures); clang-format 17.0.6 clean. LZMA2 cases excluded locally\ndue to the known separate Windows/MSVC issue on develop.\n\n* fix(cpp): propagate TS_2DIFF read errors and close two int32 overflows\n\nFollow-up to the 8/27 review fixes, found while re-auditing them.\n\nPage-value-count bound overflowed int32. read_header compares\nwriteIndex + 1 against the page value count supplied by the float/double\npage metadata; a zero-width block occupies no packed bytes, so the\navailability check alone cannot bound writeIndex and this is the only\nbound that applies. For writeIndex \u003d\u003d INT32_MAX the addition wrapped\nnegative and silently passed the compare, so the bound never fired on\nexactly the input it was added for. Now computed in int64.\nRejectsBlockBeyondPageValueCount pins it.\n\npeek_next_block_range_int64 still computed packed_bytes in int32 while\nthe skip paths had already been widened. writeIndex * bitWidth exceeds\nINT32_MAX on a large page, and the result is used as a raw-pointer\noffset for the look-ahead read. Widened to int64 to match skip.\n\nError propagation: the scalar and batch paths discarded the return of\nread_i32/read_i64 for delta_min/first_value and handed back whatever\ndecode() produced, and read_int32/read_int64/read_float/read_double\nreturned E_OK unconditionally. A truncated page therefore surfaced as\nplausible-looking values instead of an error. Failures now latch into\nread_error_ and propagate out of the read_* entry points, and\nread_page_meta returns E_TSFILE_CORRUPTED on a short varint instead of\nthe raw read code. ScalarReadRejectsTruncatedFixedFields covers it.\n\nLegacyPerSegmentMaxPNRejected asserted the old poison-value behavior\n(counting mismatches), which no longer occurs now that the decoder\nreturns an error instead. Rewritten to assert the invariant directly:\nsegment 1 still decodes, and the out-of-format continuation is never\nhanded back as valid data.\n\nVerified: full C++ suite 805 passed / 3 skipped of 808 (the 3 skips are\nenv-gated: 2 compat fixtures plus the external dataset index); TS_2DIFF\nsuites 40/40; clang-format 17.0.6 clean. LZMA2 compat cases could not be\ncovered locally (this build has ENABLE_LZMA2\u003dOFF, the known separate\nWindows/MSVC issue on develop) and are left to CI.\n\n* fix(cpp): harden TS_2DIFF decoder validation and error reporting\n\nAddress the remaining review findings on the float/double TS_2DIFF work:\n\n- read_page_meta: fix the bitmap-length guard inequality; the bytes the\n  page can supply bound each bitmap at remaining/bitmap_count, not\n  bitmap_count*remaining (4x too loose before).\n- read_header / skip paths: compute the packed-block byte count in\n  int64 and fall back to per-value decoding when it exceeds INT32_MAX,\n  instead of narrowing through int32 arithmetic.\n- Format violations now return E_DECODE_ERR (matching the RLE/Sprintz/\n  RLBE convention); short reads propagate the underlying stream error\n  (E_PARTIAL_READ) instead of being rebranded as E_TSFILE_CORRUPTED.\n- Remove the write-only header_error_ member and the unused\n  cal_bit_width(); converge the duplicated FLAG_* overflow-marker\n  constants into ts2diff_wire_format.h.\n- Drop iteration-trace comments; describe current behavior instead.\n- Tests updated to the new error codes.\n\n---------\n\nCo-authored-by: gx \u003cxuan.guo@atomdatatech.com\u003e"
    },
    {
      "commit": "52eb36f1ebafa953c907a1dbf2c4a0ad96306bae",
      "tree": "2a6c4c5786882b4d4ae707e3da6a8ebc81339fa9",
      "parents": [
        "e6c0ddd237df5f00068a5da2beb12fb40763f2fb"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Fri Aug 28 17:16:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 17:16:00 2026 +0800"
      },
      "message": "Improve encryption metadata validation (#925)"
    },
    {
      "commit": "e6c0ddd237df5f00068a5da2beb12fb40763f2fb",
      "tree": "60067ea2b98a683891d31f501464830baf206208",
      "parents": [
        "27655ab772910a9f4237f913c71a4c882bbb2c62"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Aug 27 09:07:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 27 09:07:35 2026 +0800"
      },
      "message": "fix(python): make dataframe index opt-in (#919)\n\n* fix(python): make dataframe index opt-in\n\n* test(python): cover dataframe index modes"
    },
    {
      "commit": "27655ab772910a9f4237f913c71a4c882bbb2c62",
      "tree": "a18a9cd7e5dde24cc2df4f64f6e99d5bba0ce0e9",
      "parents": [
        "bf36d80460c6ef73649b2ea2e57e30ad2b5c42fc"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Aug 26 22:20:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 22:20:13 2026 +0800"
      },
      "message": "Fix/relax pyarrow constraint (#922)\n\n* fix(python): relax pyarrow version constraints\n\n* fix(python): align numpy and pandas constraints"
    },
    {
      "commit": "bf36d80460c6ef73649b2ea2e57e30ad2b5c42fc",
      "tree": "2ee82a3062141bf265dc81e14159d29185124d62",
      "parents": [
        "b4b40c0b43ae7e9434e03fc12df9d24465c3b569"
      ],
      "author": {
        "name": "kkzi",
        "email": "34122458+kkzi@users.noreply.github.com",
        "time": "Wed Aug 26 14:59:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 14:59:39 2026 +0800"
      },
      "message": "fix(cpp): never seal empty chunks and fix dangling ref in parallel tablet write (#909)\n\n* fix(cpp): never seal empty chunks and fix dangling ref in parallel tablet write\n\nTwo fixes in TsFileWriter:\n\n1. flush_chunk_group / flush_chunk_group_encoded: skip registered-but-empty\n   measurement columns. A measurement that received no data in a window used\n   to be sealed as an EMPTY chunk (count\u003d0, dataSize\u003d0). Java readers\n   (TsFileSequenceReader self-check) treat such a file as crashed and refuse\n   to load it. Mirror the aligned branch\u0027s existing hasData() check so empty\n   columns never produce a chunk.\n\n2. write_table (aligned parallel path): the submitted tasks run asynchronously\n   on the thread pool, but the lambdas captured the loop variables (ctx, vt)\n   by reference. Once the loop advances, every queued task reads the same /\n   already-destroyed loop variable. Capture the per-iteration addresses by\n   value instead.\n\n* style(cpp): fix spotless clang-format violations in parallel tablet write\n\n* test(cpp): add regression tests for empty-chunk seal and parallel tablet write\n\nCovers the two fixes in this PR (issue #908):\n\n1. Never seal registered-but-empty measurements as count\u003d0 chunks\n   (non-aligned flush path). Seven tests drive write_tablet,\n   write_record, multi-window flush, empty-window-then-write,\n   sibling devices, and mixed aligned/non-aligned devices, asserting\n   via TsFileReader timeseries metadata that an unwritten measurement\n   is absent from the file while surviving columns carry real\n   statistics.\n\n2. Parallel aligned tablet write capture-by-value. Five tests drive\n   the thread-pool path in write_table() through TsFileTableWriter\n   with multiple devices x columns x rows crossing page boundaries,\n   and verify every cell round-trips (row completeness, per-cell\n   values, tag correctness).\n\nVerified: with both fixes temporarily reverted, the empty-chunk\ntests fail (empty column sealed, meta.size()\u003d\u003d3); with the fixes in\nplace all 12 tests pass (10 consecutive runs) and the full TsFile_Test\nsuite (762 tests) passes.\n\n* test(cpp): adversarial additions to empty-chunk and parallel-write regressions\n\nFix 1 coverage:\n- memory-threshold auto-flush path: check_memory_size_and_may_flush_chunks()\n  is a second entry into flush_chunk_group that the explicit-flush tests\n  never drive; drive it via a shrunk chunk_group_size_threshold_.\n- partially-null column counter-check: the hasData() guard must not skip\n  columns with some nulls (null-bitmap fallback path) — only fully empty\n  ones.\n- TEXT column variant: empty TEXT takes the string write path, distinct\n  from the fixed-width paths used before.\n\nFix 2 coverage:\n- tiny page size (8 points) so pool-thread tasks seal pages repeatedly and\n  exercise the initial_page_points continuation across batches.\n- thread-pool boundary configs: 1-thread pool (serialized workers, worst\n  case for slot aliasing) and 8-thread pool, via set_thread_count().\n\nVerified: auto-flush and TEXT tests fail with the hasData() guard\nreverted; all 17 tests pass with the fixes (and the full TsFile_Test\nsuite, 767 tests).\n\n* test(cpp): address review — completeness check and comment rewording\n\nPer review feedback on PR #909:\n\n- TinyPageBoundaryRoundTrip now asserts completeness: every row of every\n  batch must appear in the query results, so a dropped row on the\n  page-boundary path fails the test instead of going unnoticed.\n- Reword the parallel-write comments (source and tests): the old\n  by-reference captures were lifetime-safe in the current code shape\n  (device_ctxs outlives all future.get() calls), so the change is a\n  defensive cleanup, not a dangling-reference fix. Comments now say\n  exactly that.\n\n* docs(cpp): correct lifetime claim in parallel-write comments\n\nPer Copilot\u0027s review on PR #909: the by-value pointer capture is\nequivalent in lifetime to the old by-reference captures (each referred\nto its own vector element, and the vectors outlive all future.get()\ncalls), so the previous wording overclaimed that the by-value form\nwould stay safe if the get() loop were moved out of scope. Task-owned\nlifetime would require copying the task inputs. Comments (source and\ntests) now state the equivalence instead.\n\n---------\n\nCo-authored-by: gx \u003cxuan.guo@atomdatatech.com\u003e"
    },
    {
      "commit": "b4b40c0b43ae7e9434e03fc12df9d24465c3b569",
      "tree": "1c585bd1cabed7ba91a6a8a934a032045f13e471",
      "parents": [
        "9755a42a23275fe3eefeeee6ab7ca8b306511ada"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Tue Aug 25 09:56:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 09:56:45 2026 +0800"
      },
      "message": "fix(skills): update tsfile skills to follow current version (#916)"
    },
    {
      "commit": "9755a42a23275fe3eefeeee6ab7ca8b306511ada",
      "tree": "3ca78e8866ef4cdcddbb3d08bf9c44ac34f9ae87",
      "parents": [
        "89129a33bc9beb6deb77bc139a53e1b45ad781d0"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Aug 24 14:29:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 14:29:08 2026 +0800"
      },
      "message": "fix: validate RLBE decoder run lengths (#913)"
    },
    {
      "commit": "89129a33bc9beb6deb77bc139a53e1b45ad781d0",
      "tree": "e9873216f6be7003f0b65d7b540db847148b47c3",
      "parents": [
        "769aa6d440999489f245223f33b3a26c2dc212ab"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Aug 21 11:29:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:29:25 2026 +0800"
      },
      "message": "Feature/tsfile dataframe runtime (#911)\n\n* feature: implement dataframe runtime index\n\n* fix: resolve C++ CI failures\n\n* fix(dataset): unify numeric field whitelist and union-align non-aligned loc reads"
    },
    {
      "commit": "769aa6d440999489f245223f33b3a26c2dc212ab",
      "tree": "b9d7f3c0c69a1e08623a4d853777d8b8eeba4d09",
      "parents": [
        "d4c3c94690cf9af819bc26bec7114a0de7900359"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Thu Aug 20 18:34:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 18:34:46 2026 +0800"
      },
      "message": "feat: add tsfile skills (#907)"
    },
    {
      "commit": "d4c3c94690cf9af819bc26bec7114a0de7900359",
      "tree": "67a72b173c61fffedbbc24fcb4d536799e6a2c30",
      "parents": [
        "7798b1035edcbcc16b7baa2287d8b487971d3e30"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Aug 18 16:49:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 16:49:57 2026 +0800"
      },
      "message": "feat(cpp): refactor dependency sourcing and extend codec compatibility (#905)\n\n* fix(cpp): audit third-party dependency metadata\n\n* feat(cpp): add dependency source selection framework\n\n* feat(cpp): support system and bundled LZ4\n\n* feat(cpp): migrate zlib dependency sourcing\n\n* feat(cpp): migrate lzokay dependency sourcing\n\n* feat(cpp): migrate Snappy dependency sourcing\n\n* feat(cpp): migrate SIMDe dependency sourcing\n\n* feat(cpp): migrate ANTLR4 dependency sourcing\n\n* feat(cpp): migrate Zstandard dependency sourcing\n\n* feat(cpp): migrate liblzma dependency sourcing\n\n* feat(cpp): add Zstandard and LZMA2 compression\n\n* feat(cpp): add CHIMP RLBE and CAMEL encoding\n\n* test: add Java and C++ codec compatibility coverage\n\n* build(cpp): upgrade bundled Snappy to 1.2.2\n\n* ci(cpp): validate dependency source modes\n\n* ci(cpp): make dependency builds deterministic\n\n* fix(cpp): normalize ANTLR patch hashes on Windows\n\n* fix(ci): address remote C++ workflow failures\n\n* fix(cpp): resolve system ANTLR utf8cpp target\n\n* fix(cpp): inherit generator in dependency tests\n\n* fix(cpp): preserve legacy CMake compatibility\n\n* fix(ci): tolerate wrapped CMake errors"
    },
    {
      "commit": "7798b1035edcbcc16b7baa2287d8b487971d3e30",
      "tree": "e42b5f4f9da64466d1b8771cccfd3dbf67b3e7b7",
      "parents": [
        "5681978b84a0d9ee26e1eab94f78afaccf93607a"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Aug 17 16:33:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 16:33:17 2026 +0800"
      },
      "message": "Optimize DataSetWithoutTimeGenerator with primitive long heap/set (#906)\n\n* Optimize DataSetWithoutTimeGenerator with primitive long heap/set\n\nReplace PriorityQueue\u003cLong\u003e/HashSet\u003cLong\u003e with fastutil-derived\nLongHeapPriorityQueue/LongOpenHashSet to avoid boxing on the\nmulti-way merge hot path. Update NOTICE and add regression tests.\n\n* Fix spotless formatting for LongOpenHashSet and LongHeapPriorityQueue\n\n* Address review: use Set.add return value and gate perf test\n\n* Add fastutil license attribution for derived heap and hash set\n\n* Remove fastutil attribution from NOTICE"
    },
    {
      "commit": "5681978b84a0d9ee26e1eab94f78afaccf93607a",
      "tree": "67dc1ed22bd65621e52e3d05900e3861dcc1bdd6",
      "parents": [
        "709c5f58f289fe1dc1ca8071fdd37d916c2e077e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Aug 12 09:31:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 09:31:00 2026 +0800"
      },
      "message": "Bump actions/setup-node from 6 to 7 (#892)\n\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "709c5f58f289fe1dc1ca8071fdd37d916c2e077e",
      "tree": "9158ec7a7f400fe188a257dee0c5b32efe236cf0",
      "parents": [
        "24655420704749cbb4289d1aca8a007127a6fc42"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Aug 12 09:30:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 09:30:15 2026 +0800"
      },
      "message": "Bump github/codeql-action from 4 to 4.37.3 (#891)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4 to 4.37.3.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4...v4.37.3)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.37.3\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "24655420704749cbb4289d1aca8a007127a6fc42",
      "tree": "39c5b3c76fa01c36bc6e7da89e784f049e9884f4",
      "parents": [
        "9ec0abf57835ec38873e9e7e4e84e70fd745eeb3"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Thu Aug 06 16:33:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 16:33:03 2026 +0800"
      },
      "message": "fix(tsfile): propagate IOException on writer close instead of swallowing it (#899)"
    },
    {
      "commit": "9ec0abf57835ec38873e9e7e4e84e70fd745eeb3",
      "tree": "a10db14b9770d67f00e428eefd3b50d6781bf434",
      "parents": [
        "585125b12621251410b86c916dc292cfda24d402"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Aug 06 12:31:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 12:31:50 2026 +0800"
      },
      "message": "Add C++ and Python TsFile properties support (#897)\n\n* Add C++ and Python TsFile properties support\n\n* Fix TsFile properties metadata compatibility\n\n* Fix Windows TsFile binary file mode\n\n* Preserve legacy empty BloomFilter metadata"
    },
    {
      "commit": "585125b12621251410b86c916dc292cfda24d402",
      "tree": "5d2c7fa573fafabb250b17d1a8bb5d61897d4a3f",
      "parents": [
        "705c971beb65dd937bf2187f2050e9d693a1b9a7"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Aug 06 10:54:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 10:54:12 2026 +0800"
      },
      "message": "Optimize C++ batch decode and output fast paths (#898)\n\n* Optimize C++ batch decode fast paths\n\n* Fix reader test iterator lifetime"
    },
    {
      "commit": "705c971beb65dd937bf2187f2050e9d693a1b9a7",
      "tree": "10aa3b3116a60d99b859fe6a3ffcd0e86620fab2",
      "parents": [
        "7ca2e79fbdd9a36ef9dde5e522b7c23020536aeb"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Aug 04 17:13:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 17:13:45 2026 +0800"
      },
      "message": "Add standalone Cppcheck CI (#895)\n\n* Add standalone Cppcheck CI\n\n* Fix existing Cppcheck findings\n\n* Avoid goto in C example cleanup"
    },
    {
      "commit": "7ca2e79fbdd9a36ef9dde5e522b7c23020536aeb",
      "tree": "156402b65f2357de5586cbfd475b50e7af32cb46",
      "parents": [
        "ea0945935a9bee5154072a8349bd4df7c9a04143"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Aug 04 14:50:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 14:50:59 2026 +0800"
      },
      "message": "Support static libtsfile builds (#894)"
    },
    {
      "commit": "ea0945935a9bee5154072a8349bd4df7c9a04143",
      "tree": "de1de41bb0909a539ee3be21c71cdf7b22f426b7",
      "parents": [
        "ac496ba05c26e4fc0e88bcbd8f864e430a000e83"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Tue Aug 04 12:19:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 12:19:14 2026 +0800"
      },
      "message": "Support TsFile properties and optional table point counting (#882)\n\n* add property read-write interface\n\n* May record table point count\n\n* Add perf test\n\n* Add table point count repair tool\n\n* add point-count tool\n\n* add point-count tool\n\n* supplement usage for other os\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* supplement usage for other os\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* use byte[] for properties\n\n* use byte[8] for table point count\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac496ba05c26e4fc0e88bcbd8f864e430a000e83",
      "tree": "4404f7d1f4f6788d88d630f71e476d5763fd1adb",
      "parents": [
        "f64be113f2ed29b96965733dbea2750dc874dcb1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 04 10:03:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 10:03:04 2026 +0800"
      },
      "message": "Bump actions/setup-java from 5 to 5.6.0 (#889)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 5 to 5.6.0.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v5...v5.6.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: 5.6.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f64be113f2ed29b96965733dbea2750dc874dcb1",
      "tree": "e1e1f267545221158c4e9eb5c6ed439dbdd9f44e",
      "parents": [
        "218bbdf7652ab79d806f53f6fa86111d99618d99"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 04 10:01:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 10:01:34 2026 +0800"
      },
      "message": "Bump actions/setup-python from 6 to 7 (#890)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "218bbdf7652ab79d806f53f6fa86111d99618d99",
      "tree": "f48f7753000e3e0238fcd49b8506783d04052816",
      "parents": [
        "1af4fa9e2a450e75d429fc5c35f377198300b262"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Aug 03 09:52:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 09:52:03 2026 +0800"
      },
      "message": "fix(cpp): preserve Gorilla sentinel values in batch reads (#883)\n\n* fix(cpp): preserve Gorilla sentinel values in aligned reads\n\n* fix(cpp): handle Gorilla sentinels across chunk readers"
    },
    {
      "commit": "1af4fa9e2a450e75d429fc5c35f377198300b262",
      "tree": "e80daf1f11db293feeff64d0cec1ffc83eb172c9",
      "parents": [
        "3c831b779999b5be905255b018ac3a5858dabc84"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Mon Aug 03 09:00:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 09:00:43 2026 +0800"
      },
      "message": "Document website pull request target (#887)"
    },
    {
      "commit": "3c831b779999b5be905255b018ac3a5858dabc84",
      "tree": "660e8d7936a786df387c172ca571eead526670b3",
      "parents": [
        "46cf0a126548e7d9292fa5953a0adb53a7eeff26"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Fri Jul 31 12:02:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 12:02:35 2026 +0800"
      },
      "message": "Add range mark query APIs to BitMap (#884)\n\n* add range test interface\n\n* push-down implementation"
    },
    {
      "commit": "46cf0a126548e7d9292fa5953a0adb53a7eeff26",
      "tree": "2ab2d1d33a47fd2afcf650d656e8cc43ed8436bb",
      "parents": [
        "94f6dacfba5eadad4afe1d9a3495797e9a56bd54"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jul 30 09:44:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 09:44:30 2026 +0800"
      },
      "message": "Fix remaining C++ memory leak paths (#881)\n\n* fix(cpp): close remaining memory leak paths\n\n* test(cpp): make reader leak tests MSVC-safe"
    },
    {
      "commit": "94f6dacfba5eadad4afe1d9a3495797e9a56bd54",
      "tree": "6ffce3e68b7ad80cdf89c4837f9cbeb01e6e7ff4",
      "parents": [
        "5e2bb01bc49458396690d6edeb6f49eb69c9ea41"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Jul 29 10:07:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 10:07:50 2026 +0800"
      },
      "message": "fix(cpp): fix memory leaks and null dereference crashes (#879)\n\n- ChunkReader::reset() now clears wrapped buffer pointer after free to\n  prevent double-free in subsequent destroy()\n- ChunkReader::load_by_meta() now frees allocated buffer and returns\n  early on read failure, preventing memory leak\n- LZ4Compressor::compress() now frees compressed_buf_ on both\n  LZ4_compress_default failure and mem_realloc failure paths\n- C wrapper string getters (by_name/by_index) now null-check the\n  return value of get_value\u003cString*\u003e() before dereferencing,\n  preventing crash on non-STRING/TEXT/BLOB column types"
    },
    {
      "commit": "5e2bb01bc49458396690d6edeb6f49eb69c9ea41",
      "tree": "33b20cb3a6103ea1a52311d686359bebc77e3298",
      "parents": [
        "a2fdf71161790af959a4311f49a88ff0c46abc4a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 29 09:22:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:22:32 2026 +0800"
      },
      "message": "Bump at.yawk.lz4:lz4-java from 1.10.1 to 1.11.1 in /java (#880)\n\nBumps [at.yawk.lz4:lz4-java](https://github.com/yawkat/lz4-java) from 1.10.1 to 1.11.1.\n- [Release notes](https://github.com/yawkat/lz4-java/releases)\n- [Changelog](https://github.com/yawkat/lz4-java/blob/main/CHANGES.md)\n- [Commits](https://github.com/yawkat/lz4-java/compare/v1.10.1...v1.11.1)\n\n---\nupdated-dependencies:\n- dependency-name: at.yawk.lz4:lz4-java\n  dependency-version: 1.11.1\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    }
  ],
  "next": "a2fdf71161790af959a4311f49a88ff0c46abc4a"
}
