)]}'
{
  "log": [
    {
      "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"
    },
    {
      "commit": "a2fdf71161790af959a4311f49a88ff0c46abc4a",
      "tree": "51db757a83fc61275be6aa1f2abbe408c5ed6f7f",
      "parents": [
        "c7615f756cc29ff9e37e3d47f714581714414d75"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Jul 27 15:40:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 15:40:11 2026 +0800"
      },
      "message": "Python error code alignment (#870)"
    },
    {
      "commit": "c7615f756cc29ff9e37e3d47f714581714414d75",
      "tree": "5f57f7aaf8a1d444a8d8dd9be8edf343ffc8ee98",
      "parents": [
        "7d44338c1d6ec1906bae52522276d666a5ec9bea"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 24 09:31:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 09:31:02 2026 +0800"
      },
      "message": "Bump com.fasterxml.jackson.core:jackson-core in /java (#877)\n\nBumps [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) from 2.18.6 to 2.18.8.\n- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.18.6...jackson-core-2.18.8)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-core\n  dependency-version: 2.18.8\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": "7d44338c1d6ec1906bae52522276d666a5ec9bea",
      "tree": "210a145b54cc9e3cb588ff73a601302141d509bc",
      "parents": [
        "608955c8ffd4132a5a91b8e5587ad9249d2c4210"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jul 23 20:15:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 20:15:41 2026 +0800"
      },
      "message": "Optimize Gorilla batch floating-point decoding (#873)"
    },
    {
      "commit": "608955c8ffd4132a5a91b8e5587ad9249d2c4210",
      "tree": "8a7cb693ec4a786587dbf2b0d6afb5c9f93e5a6e",
      "parents": [
        "23787f82aeebf7760f0376db754b4e6910adcad1"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jul 23 16:57:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:57:26 2026 +0800"
      },
      "message": "Fix Python wheel test skipping and dependencies (#876)"
    },
    {
      "commit": "23787f82aeebf7760f0376db754b4e6910adcad1",
      "tree": "840b945be75d5fc3dfa6eb02c73e06010a1f6640",
      "parents": [
        "928ca94122060dabc7cc76c38f3d9c240b0722da"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jul 23 13:57:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:57:07 2026 +0800"
      },
      "message": "Update release information for TsFile 2.4.0 (#874)"
    },
    {
      "commit": "928ca94122060dabc7cc76c38f3d9c240b0722da",
      "tree": "4bc49e8ccb692388157fb2535cf2842a5f7b8f39",
      "parents": [
        "7a7d7f96e1015de2774ec936f498df4e05bce293"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Tue Jul 21 11:24:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:24:41 2026 +0800"
      },
      "message": "Optimize small BitMap with long-backed implementation (#871)\n\n* Add BitMapLongImpl\n\n* Refine BitMapLongImpl\n\n* Add BitMap performance test report\n\n* Remove BitMap performance report file\n\n* fix review comment\n\n* refine memory calculation"
    },
    {
      "commit": "7a7d7f96e1015de2774ec936f498df4e05bce293",
      "tree": "b2a0d362913d0201e8ccc3305c372a78a92a1fa5",
      "parents": [
        "5b4cad25f6e744ab88a46d50328e7144b1edff11"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Jul 21 09:46:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 09:46:26 2026 +0800"
      },
      "message": "perf(cpp): push down multi-value aligned offsets (#863)"
    },
    {
      "commit": "5b4cad25f6e744ab88a46d50328e7144b1edff11",
      "tree": "7c05c45f14fc987ca6d2ff9aaf3662653ec9d4fd",
      "parents": [
        "b8825b18ce296b6af31aabd1c7727f9007b72652"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Mon Jul 20 19:15:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 19:15:13 2026 +0800"
      },
      "message": "Add configurable TsFileInput reader constructor (#869)"
    },
    {
      "commit": "b8825b18ce296b6af31aabd1c7727f9007b72652",
      "tree": "b1f8df34d075c4d21d0b9d36883dcb06e8a94099",
      "parents": [
        "4668950997e57bf76a5914f4b1f8fd7a826010bb"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Mon Jul 20 12:26:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 12:26:54 2026 +0800"
      },
      "message": "Add buffered TsFile input (#868)\n\n* Add buffered TsFile input\n\n* add a Constructor for PublicBAOS"
    },
    {
      "commit": "4668950997e57bf76a5914f4b1f8fd7a826010bb",
      "tree": "91dd5064a9cd0fb070974998fccd8260511d9b26",
      "parents": [
        "e5e4cccfd192d35207747e0458767dcf5a3908d9"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Jul 17 09:23:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:23:12 2026 +0800"
      },
      "message": "C++: enable SIMD by default (#867)"
    },
    {
      "commit": "e5e4cccfd192d35207747e0458767dcf5a3908d9",
      "tree": "0260ae91f752dc5ca0e0c25c062cb438a937be0d",
      "parents": [
        "0ae3e7526138794b6243b44d50777e2bb5579ec0"
      ],
      "author": {
        "name": "Le Yang",
        "email": "562593859@qq.com",
        "time": "Thu Jul 16 14:43:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:43:07 2026 +0800"
      },
      "message": "[Python][C++] Fix tree-model TsFileDataFrame returning empty data on reused readers and uppercase names (#862)\n\n* fix: correct tree-model TsFileDataFrame reads on reused readers and uppercase names\n\nTwo related fixes for reading tree-model TsFiles through TsFileDataFrame, which together caused \u0027read one series OK, then reading another series returns empty\u0027 on a reused reader.\n\nC++: make StringArrayDeviceID::split_table_name()/init_prefix_segments() idempotent. Device IDs are cached and reused across queries; the previous code appended to prefix_segments_ on every call, so prefixes accumulated (and leaked) across successive queries and corrupted per-device path columns, making a second series read match nothing. Now it clears/frees existing prefixes before rebuilding. Adds DeviceIdTest.SplitTableNameIsIdempotent.\n\nPython: read series with uppercase measurement/path names. query_table_on_tree synthesizes a case-insensitive table schema, so the native layer lower-cases column names and path segments, while the dataset catalog keeps the original casing. The tree read paths matched field columns and device paths case-sensitively and returned empty for uppercase names. _read_series_by_row_tree and _read_arrow_tree now match case-insensitively. Adds a regression test.\n\n* style(python): apply spotless (black) formatting to tree-model regression test\n\n* revert(python): drop case-insensitive tree-model matching; add case-collision regression test\n\nRevert the .lower() case-insensitive column/path matching in the tree read paths (from d13cd236). It let single-variant uppercase measurements read, but conflated case-distinct measurements (e.g. temperature vs Temperature) into one series. Restore case-sensitive matching (native still lower-cases names, so uppercase reads are empty for now) and add a regression test asserting case-distinct measurements do not collide. Two tree-model tests are intentionally red pending the C++ root fix (TableSchema for tree queries must not lower-case names).\n\n* fix(cpp): preserve case for tree-derived (virtual) table schemas\n\nTree-model device paths and measurement names are case-sensitive, but the\n\nvirtual TableSchema synthesized in query_on_tree lower-cased them via the\n\nTableSchema constructor. This collapsed case-distinct series (e.g.\n\n\"temperature\" vs \"Temperature\") into one column, so reads returned empty\n\nor mixed data.\n\n- TableSchema: add virtual_table flag; skip lower-casing table/measurement\n\n  names and keep column_pos_index_ in original case for virtual tables.\n\n- find_column_index/find_id_column_order: match case-sensitively for\n\n  virtual tables, unchanged (lower-cased) for real tables.\n\n- query_on_tree: build the synthesized schema with virtual_table\u003dtrue.\n\n* docs(cpp): trim case-sensitivity comments in TableSchema\n\n* spotless"
    },
    {
      "commit": "0ae3e7526138794b6243b44d50777e2bb5579ec0",
      "tree": "e586038c8b25e8d7b9e3b3fe2f0dc5961d4e6dae",
      "parents": [
        "4b72bd04cb470e497189bf8e54001304b20a986f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 14:28:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 14:28:17 2026 +0800"
      },
      "message": "Bump pnpm/action-setup from 4 to 6 (#852)\n\nBumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.\n- [Release notes](https://github.com/pnpm/action-setup/releases)\n- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: pnpm/action-setup\n  dependency-version: \u00276\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": "4b72bd04cb470e497189bf8e54001304b20a986f",
      "tree": "016cca4b5f1d5ba753a4d0517609acaa327070c8",
      "parents": [
        "2a33490343b0b7a0e39f100dcff44506a314e6b9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 14:27:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 14:27:29 2026 +0800"
      },
      "message": "Bump actions/checkout from 4 to 7 (#856)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2a33490343b0b7a0e39f100dcff44506a314e6b9",
      "tree": "002e6b0d6e8942b60a252965f36069e4d60a4d07",
      "parents": [
        "51fe8bb8f39d8c62852a89605818a74da961aac9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 10:36:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 10:36:00 2026 +0800"
      },
      "message": "Bump com.fasterxml.jackson.core:jackson-databind in /java (#865)\n\nBumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.18.6 to 2.18.9.\n- [Commits](https://github.com/FasterXML/jackson/commits)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.18.9\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": "51fe8bb8f39d8c62852a89605818a74da961aac9",
      "tree": "49e9824aa4f2caa0ffa488780806b7b4fdd68fed",
      "parents": [
        "d34ac0015ad71bd11083b68d58bd8d3a8c76052b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:53:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:53:45 2026 +0800"
      },
      "message": "Bump codecov/codecov-action from 6 to 7 (#853)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\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": "d34ac0015ad71bd11083b68d58bd8d3a8c76052b",
      "tree": "3f0fbe8a29df0908d7448b3eb03b743b2ca93d30",
      "parents": [
        "1f38d11c92e57ba01c969189ac278ceb98726393"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:53:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:53:00 2026 +0800"
      },
      "message": "Bump actions/setup-node from 4 to 6 (#854)\n\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: \u00276\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": "1f38d11c92e57ba01c969189ac278ceb98726393",
      "tree": "7edf9090a3adce5db7c216ab3b043d4238ca885a",
      "parents": [
        "b4646b62a29c2731272d9985186d1e184fa47892"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:52:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:52:02 2026 +0800"
      },
      "message": "Bump actions/cache from 5 to 6 (#855)\n\nBumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: \u00276\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": "b4646b62a29c2731272d9985186d1e184fa47892",
      "tree": "723102c005e5bd2b82af9e65caa3ef76cc3093fb",
      "parents": [
        "86252e512e2ce1003ae5c38ac3c1218172638274"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Jul 13 14:35:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:35:40 2026 +0800"
      },
      "message": "fix invalid datatype. (#864)"
    },
    {
      "commit": "86252e512e2ce1003ae5c38ac3c1218172638274",
      "tree": "953810d5835423d15326ad37789182d0ffa2e04d",
      "parents": [
        "3010c3de84b3ac1271a06e9f3b59882184cfd848"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Jul 03 10:39:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 10:39:18 2026 +0800"
      },
      "message": "C++: optimize batch read/write paths and aligned table null handling (#823)\n\n* TsFile C++: batch + SIMD + parallel read/write optimization\n\nBatch decode/encode APIs (PLAIN / TS2DIFF / Gorilla) with single-pass\nTsBlock decode, AVX2/NEON SIMD paths, a single process-wide worker pool\nfor chunk-level parallel read and column-parallel write, and batched\nNEON statistics. On-disk format unchanged; interoperable with Java/Python.\n\n* fix memory leak.\n\n* fix err.\n\n* fix comment.\n\n* format.\n\n* fix some ut err.\n\n* fix heap-use-after-free in multi-value aligned reader tests\n\nMultiValueAlignedSkipsBatchPreservesValueAlignment and\nMultiValueAlignedWideChunkParallelDecode constructed ColIterator locals\ninside the read loop and called ssi-\u003erevert_tsblock() (which frees the\nTsBlock and its column vectors) while those iterators were still in\nscope. ~ColIterator() calls vec_-\u003ereset_offset(), writing back into the\njust-freed vector at the closing brace of the loop body — a real\nuse-after-free that Linux Release+ASan flags and whose heap corruption\nthen cascaded into spurious SprintzCodec/CRelease failures later in the\nsame single-process run.\n\nScope the ColIterators in a nested block so they are destroyed before\nrevert_tsblock(). Verified on Linux x86_64 Release+ASan+UBSan: full\nsuite 701/701 pass, 0 ASan/UBSan reports.\n\n* fix device-node cache aliasing null tag with literal string \"null\"\n\nTsFileIOReader::get_cached_device_node keyed device_node_cache_ by\nIDeviceID::get_device_name(), which renders a null tag segment as the\nliteral text \"null\".  A device with a real null tag (e.g. tags\n(null, b, c)) and a device whose tag value is the string \"null\"\n((\"null\", b, c)) therefore produce the identical name \"a.null.b.c\" and\ncollide in the cache: whichever device is queried first populates the\nentry, and every later query for the other device on the same reused\nreader gets the first device\u0027s cached MetaIndexNode and silently reads\nits chunks.\n\nThis surfaced through the Python dataset API, where one long-lived\nTsFileReader answers many per-device queries: the pytest\ntest_dataset_null_tag_positions_and_string_null_are_distinct read\n(null,b,c)\u0027s data for the (\"null\",b,c) device.  The device metadata\nbinary search (DeviceIDComparable, segment-based) was always correct;\nonly the string cache key was lossy.\n\nKey the cache by a collision-free, length-prefixed encoding of the\nsegment vector that flags null segments explicitly, so a null tag can\nnever alias the string \"null\".  Add a device_id unit test pinning the\ninvariant (names collide, segment equality distinguishes them).\n\nVerified: C++ suite 707/707 (Release+ASan+UBSan), Python suite 150/150.\n\n* build: don\u0027t use -march\u003dnative by default; gate it behind an option\n\nRelease builds unconditionally added -march\u003dnative on Linux/macOS. Two\nproblems for artifacts that leave the build host:\n\n1. Portability: a wheel/binary built on a newer CPU can fault with an\n   illegal instruction on an older target machine.\n2. On virtualized macOS arm64 CI runners, -march\u003dnative mis-detects the\n   feature set and drops +crc, while snappy\u0027s CRC32 feature probe (run\n   without -march) still reports crc available and defines\n   SNAPPY_HAVE_NEON_CRC32\u003d1.  snappy.cc then calls the always_inline\n   __crc32cw intrinsic in a TU compiled without crc support:\n     error: always_inline function \u0027__crc32cw\u0027 requires target feature\n     \u0027crc\u0027, but would be inlined into a function compiled without \u0027crc\u0027\n   The default (portable) target for macOS arm64 keeps +crc, so snappy\u0027s\n   fast path stays available while the binary stays portable.\n\nDefault Release flags are now -O3 -flto (LTO stays off on MinGW/Windows\nas before). -march\u003dnative is opt-in via -DTSFILE_ENABLE_NATIVE_ARCH\u003dON\nfor local-only builds that never ship. Applies uniformly to CI, wheels,\nand manual local builds.\n\nVerified: non-ASan Release (CI config) builds snappy cleanly and passes\n705/705; -DTSFILE_ENABLE_NATIVE_ARCH\u003dON restores -march\u003dnative.\n\n* fix comment.\n\n* fix simde.\n\n* fix memory leaks in TsFileSeriesScanIterator teardown\n\nThe SSI is placement-new\u0027d into mem_alloc\u0027d memory and torn down with\ndestroy() + mem_free() (TsFileIOReader::revert_ssi / alloc_ssi /\nalloc_multi_ssi), so ~TsFileSeriesScanIterator() never runs. Every\nheap-owning member therefore leaked its backing storage on each query;\ndestroy() only released some of them (itimeseries_index_, chunk_reader_,\ntsblock_). LeakSanitizer on Linux (Debug+ASan and Release+ASan) reported\nhundreds of Direct/Indirect leaks routed through the multi-value read\npath; macOS ASan has no LSan so it stayed hidden locally.\n\nRelease the remaining members explicitly in destroy():\n- tuple_desc_ (std::vector\u003cColumnSchema\u003e) — add TupleDesc::release()\n  since reset() only clear()s and keeps capacity\n- value_chunk_meta_cursors_ (std::vector\u003c...::Iterator\u003e)\n- device_id_ (shared_ptr\u003cIDeviceID\u003e) — the leaked StringArrayDeviceID\n- measurement_name_ (std::string)\n\nVerified on Linux: Debug+ASan and Release+ASan both 705/705 with\n0 Direct / 0 Indirect leaks and 0 UBSan reports.\n\n* refine tablet."
    },
    {
      "commit": "3010c3de84b3ac1271a06e9f3b59882184cfd848",
      "tree": "5354f7ae1b9af1ff9b764d570c513d871715fee1",
      "parents": [
        "4f26e925fe447a6dc991a02dc57e11acf944c00e"
      ],
      "author": {
        "name": "Le Yang",
        "email": "562593859@qq.com",
        "time": "Thu Jul 02 10:06:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 10:06:04 2026 +0800"
      },
      "message": "[Python] Support tree-model TsFiles in TsFileDataFrame (#816)\n\n* [Python] Support tree-model TsFiles in TsFileDataFrame\n\nSquash of the tsdf-tree branch: tree-model support plus dataset catalog memory and indexing improvements.\n\n- support tree-model TsFiles in TsFileDataFrame\n- shrink the dataframe catalog memory footprint\n- drop table-model phantom cells\n- inline iter_owned_series_refs\n- rename _LogicalIndex to _DataFrameCatalog\n- dedup repeated series specifiers in tsdf.loc\n\n* Fix tree-model metadata segments\n\n* [Python] Dedupe dataset model constants and harden tree-model reads\n\n- metadata: define MODEL_TABLE/MODEL_TREE once and import them in reader\n  and dataframe instead of redefining the same literals in both modules,\n  removing the drift risk between duplicate definitions.\n- metadata: MetadataCatalog.series_count now returns the count of\n  physically-present series (len(series_stats_by_ref)) instead of the\n  device x declared-field cross-product, so it matches len(tsdf) and the\n  reader property for sparse schemas; TsFileSeriesReader.series_count\n  delegates to it as the single source of truth.\n- reader: document why _metadata_field_stats gates on the value\n  statistic\u0027s non-null row_count (not the timeline) and why the\n  timeline_statistic reads below cannot raise.\n- reader: mark the tree-model full-scan reads as O(total_rows) per device\n  (cwrapper per-device pushdown limitation) so the hot path is easy to\n  locate when profiling.\n- reader: fail fast with an assertion if the cwrapper stale col_ leak\n  pattern changes, instead of silently slicing the wrong path columns and\n  returning wrong-device data.\n- tests: add a sparse-schema regression assertion locking series_count to\n  the physically-present count.\n\n* [Python] Support unioning multiple tree-model TsFiles in TsFileDataFrame\n\n- Tree TsFiles synthesize their schema per file, so loading several into one\n  TsFileDataFrame previously raised \"Incompatible schema\" whenever the files\n  differed in measurement subset or device depth. Widen the dataframe-level\n  synthetic table to the union instead: _merge_tree_table_entries unions the\n  field columns (existing order first) and grows the tag columns to the\n  deepest file\u0027s depth so shallower devices pad with nulls.\n- Key each logical series by the global field index resolved by measurement\n  name against the merged table, while each shard keeps its reader-local\n  field index for the read path. This keeps per-(device, field) ownership\n  exact and avoids mis-mapping measurements across files. For table model the\n  global and local indices always coincide, so behavior is unchanged\n  (incompatible table schemas are still rejected).\n- tests: add multi-file tree coverage -- identical-structure merge (shards and\n  time bounds), field union across files, and differing-depth union with tag\n  padding.\n\n* [Python] Filter non-numeric measurements in tree-model TsFileDataFrame\n\nThe dataset surface is numeric (values are read as float64), and table mode\nalready drops non-numeric (STRING/TEXT) fields from its schema. Tree mode did\nnot, so a string/text measurement was surfaced as a series that then crashed on\nread (float() on a string). Apply the numeric-type filter once in\n_metadata_field_stats so both models behave consistently -- this also makes the\nexisting tree-model \"measurements that pass the numeric filter\" comment accurate.\n\n- reader: skip measurements whose data_type is not numeric in\n  _metadata_field_stats (shared by table and tree paths); table mode is\n  unaffected since it already filters at the schema level.\n- tests: add a tree-model regression test asserting a STRING measurement is\n  dropped (not listed, raises KeyError) while the numeric one reads back."
    },
    {
      "commit": "4f26e925fe447a6dc991a02dc57e11acf944c00e",
      "tree": "03e98901142bc3ef94f12fe372034985d1935ad5",
      "parents": [
        "9e929f0f0a72e4ed8fc91970efbbfb9e683d4dbc"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jun 25 16:10:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 16:10:03 2026 +0800"
      },
      "message": "fix tag null segsegv. (#848)\n\n* fix tag null segsegv.\n\n* Python: represent null tags with SeriesPath and position-preserving paths\n\nThe dataset layer flattened a table device into a \"table.tag.field\" string and\ndropped null tags entirely, which lost the tag position and made two devices\nwith nulls in different positions collide (e.g. a.\u003cnull\u003e.b.c vs a.b.\u003cnull\u003e.c),\nso they became unaddressable. Reading them by the auto-generated name also could\nnot distinguish a real null tag from the literal string \"null\".\n\nIntroduce a SeriesPath (str subclass): its string value is the escaped path\nform with a collision-proof \\N marker for null tags, and it also exposes the\nstructured table / tags / field components (a None entry in tags \u003d null). A real\nvalue can never escape to \\N because escaping doubles backslashes, so \\N is\nunambiguous against the literal string \"null\".\n\n- metadata.py: add SeriesPath; build/split/resolve now keep every tag position\n  and mark null with \\N / None. Every device maps to a unique path, so the\n  sparse/compressed lookup and the \"ambiguous path\" fallback are removed in\n  favor of a single direct lookup.\n- dataframe.py: list_timeseries() returns SeriesPath; loc[...] and resolution\n  accept a SeriesPath or a path string (with \\N); drop the sparse-tag index.\n- tsfile_py_cpp.pyx: key the timeseries-metadata map by the device segment tuple\n  instead of the device-name string. The name renders null as \"null\", so keying\n  by it collided a real null tag with the literal \"null\" and silently dropped\n  one device.\n- Export SeriesPath from the package; update/extend tests (null position\n  preservation, real-null vs string \"null\", SeriesPath round-trip and escaping).\n\n* fix parse null.\n\n* fix tag parser.\n\n* fix some comment."
    },
    {
      "commit": "9e929f0f0a72e4ed8fc91970efbbfb9e683d4dbc",
      "tree": "6fb0f0056da33b4329e5f9049a75b0c3edd46a37",
      "parents": [
        "c1dae0e093b7600a4b76ffb548eaf4f62483d15b"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Jun 16 17:19:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 17:19:15 2026 +0800"
      },
      "message": "Fix C++ TsFile writer flush offsets for multi-GB files. (#839)\n\n* Fix C++ TsFile writer flush offsets for multi-GB files.\n\nSync file_base_offset after flush, reset the write stream and consumer,\nand add tree/table 4GB regression tests.\n\n* Add Python 4GB large-file tests and fix MSVC test includes.\n\nMirror C++ tree/table ~4GB regression coverage in pytest and drop POSIX-only headers from large-file gtests.\n\n* Merge large-file test helpers into conftest.py.\n\nKeep shared constants and utilities in one pytest entry point for tree/table 4GB tests.\n\n* Fix Windows large-file truncate and stat handling in C++.\n\n* fix msvc compilation\n\n* removed unused test"
    },
    {
      "commit": "c1dae0e093b7600a4b76ffb548eaf4f62483d15b",
      "tree": "86190478c3f54c8d9d89f846d7fc8cf2e688802b",
      "parents": [
        "dfd328469213197cdd6d44644a904088e56cb532"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Jun 16 15:33:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 15:33:26 2026 +0800"
      },
      "message": "add cli readme (#844)"
    },
    {
      "commit": "dfd328469213197cdd6d44644a904088e56cb532",
      "tree": "5171941a7617cff304090541abaf0e1ac9f3156e",
      "parents": [
        "719f80a6bcb251a3e13525696c62311a76d93f42"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Tue Jun 16 14:58:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 14:58:52 2026 +0800"
      },
      "message": "Optimize timeseries metadata read and fix table size accounting (#840)"
    },
    {
      "commit": "719f80a6bcb251a3e13525696c62311a76d93f42",
      "tree": "ea29c6e63557d102c506fefb34ae25d2bb422dd7",
      "parents": [
        "0963453456c41b5d5b118359176fef6565011053"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Thu Jun 11 11:37:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 11:37:13 2026 +0800"
      },
      "message": "Fix several bugs in tsfile-cli and add tag filter commands (#837)\n\n* fix(tsfile-cli): fix the case inconsistency in TABLE names\n\n* fix(tsfile-cli): fix `build.sh` command\n\n* fix(tsfile-cli): add `reader.queryByRow(...)` to `head/cat` cammand\n\n* fix(tsfile-cli): add `TagFilterBuilder` predicate variable\n\n* fix(tsfile-cli): format code\n\n* fix(tsfile-cli): rename `table_filter` as `target_table_name`"
    },
    {
      "commit": "0963453456c41b5d5b118359176fef6565011053",
      "tree": "9efb8f4f1f441b2d1ce5b8600490ff53be662342",
      "parents": [
        "5123d6e30e1cb8f8fa80116f2df4d1defa9c4772"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Wed Jun 10 18:47:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:47:10 2026 +0800"
      },
      "message": "Fix tsfile-cli clean-build race and harden CLI validation (#836)\n\nBuild: tsfile_cli_obj compiled against the staged include tree without\ndepending on the copy_* targets that populate it, so a clean parallel\nbuild could fail with \"\u0027common/db_common.h\u0027 file not found\"\n(deterministic via `make tsfile_cli_obj` in a fresh build dir). Add the\nmissing add_dependencies edge.\n\nCLI hardening:\n- reject --offset on non-row commands and --model on write; name each\n  read-only flag rejected by write instead of a lumped message\n- error when -d/-t does not match the file\u0027s data model in\n  head/cat/sample/schema instead of silently ignoring the filter\n- include the storage error code in open/create failure messages\n- detect numeric flag overflow (ERANGE) in -n/--offset/--start/--end/--seed\n- cap the sample reservoir pre-allocation so a huge -n cannot abort via\n  std::length_error; add a last-resort exception handler in main\n- emit null for non-finite FLOAT/DOUBLE cells in JSON output (bare\n  nan/inf is not valid JSON)\n- docs: -m also applies to stats/count, count covers all tables, note\n  that the table format buffers rows in memory"
    },
    {
      "commit": "5123d6e30e1cb8f8fa80116f2df4d1defa9c4772",
      "tree": "6fcf9089d042fc67e19ddd6ff0901d6e69131815",
      "parents": [
        "594a68f356b0d6d1c69fb053993a261e97f0dae2"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Wed Jun 10 18:41:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:41:33 2026 +0800"
      },
      "message": "update CMakeFile (#835)"
    },
    {
      "commit": "594a68f356b0d6d1c69fb053993a261e97f0dae2",
      "tree": "c856f720c60d813ebf081770e5a44232221df05d",
      "parents": [
        "be3c5bf31bb2488d99079339d75ea5b335aabdf8"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Wed Jun 10 12:27:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 12:27:39 2026 +0800"
      },
      "message": "Fix/windows ci python wheel build (#833)\n\n* Fix Windows CI failures for the Python wheel build. (#831)\n\n* fix(cpp): remove FORCE_INLINE from AndFilter/OrFilter for MinGW build\n\nGCC on Windows CI fails when always_inline virtual methods exceed the max-inline-insns-single limit during expression.cc compilation.\n\n* fix(python): preload MinGW runtime DLLs on Windows wheel import\n\nRestore MinGW runtime preloading in __init__.py removed during MSVC support. Improve setup.py to locate MinGW DLLs via MSYSTEM_PREFIX and harden wheels.yml Windows build/verify steps.\n\n* fix(python): fix MinGW .pyd linking and skip tests during wheel build\n\nLink gcc_s/stdc++ before libtsfile on MinGW so _Unwind_Resume is not imported from libtsfile.dll (WinError 127). Honor -DskipTests in exec-maven-plugin for pytest, and add -Dmaven.test.skip\u003dtrue in wheels CI.\n\n* Fix Windows wheel MinGW runtime packaging\n\n* Remove unrelated setup.py version bump\n\n* Fix cpp formatting and sync Python version\n\n* Fix MinGW filter inlining for rc build\n\n* Avoid forced inline for nested time filters\n\n* Avoid forced inline for nested statistic filters\n\n* Sync C++/Python version to 2.3.2.dev with Maven 2.3.2-SNAPSHOT\n\n* Fix C example string duplication for Linux wheels"
    },
    {
      "commit": "be3c5bf31bb2488d99079339d75ea5b335aabdf8",
      "tree": "35d8705450cb7902db54059755936f70ff0be3e1",
      "parents": [
        "9a78cda867c92eb83c4ee095096638a08646f397"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Tue Jun 09 19:46:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 19:46:03 2026 +0800"
      },
      "message": "Add GitHub Actions workflow for site build and deploy"
    },
    {
      "commit": "9a78cda867c92eb83c4ee095096638a08646f397",
      "tree": "9f1b9590f35c67f765c423329d7693f33521e736",
      "parents": [
        "d78fd5154718b8931c1f022d6f4731df4ab248c6"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Jun 09 19:40:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 19:40:20 2026 +0800"
      },
      "message": "Remove GitHub Actions workflow configuration to remove document build (#834)"
    },
    {
      "commit": "d78fd5154718b8931c1f022d6f4731df4ab248c6",
      "tree": "6914b2b7961a511ef1bd28bd54927d8b8d5debad",
      "parents": [
        "3c60194c6bfd0d8ec6129e98dadbd3e28d57408f"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Tue Jun 09 18:43:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 18:43:11 2026 +0800"
      },
      "message": "Add tsfile-cli: inspect and import .tsfile from the command line (#829)\n\n* docs: add design spec for TsFile Unix-philosophy C++ CLI\n\nRead-only inspect/export verbs (ls/schema/stats/head/cat/select) as a\nsingle multi-call `tsfile` binary, backed by the existing C++ reader API.\n\n* docs: add implementation plan for TsFile Unix CLI; refine spec\n\n9 TDD tasks (CMake scaffold -\u003e arg parser -\u003e formatters -\u003e ResultSet pump\n-\u003e ls/schema/stats/head/cat/select -\u003e install/verify). Spec tweaked to\nmatch confirmed C++ APIs (table-model schema blanks encoding/compression;\nstats \u003d count + time range).\n\n* Update TsFile CLI redesign spec\n\n* Add TsFile CLI redesign implementation plan\n\n* Update tsfile CLI command surface\n\n* Route ReadFile::open errors to stderr\n\n* Add tsfile CLI commands, formatters, build, and tests\n\n* Consolidate TsFile CLI spec and plan\n\n* Extend tsfile stats with value summaries and shared stat helpers\n\n* Add tsfile meta command\n\n* Add tsfile count command\n\n* Add deterministic tsfile sample command\n\n* Format tsfile CLI sources with clang-format\n\n* Document CMake 4.x/ANTLR4 build constraint in CLI plan\n\n* Simplify sampled writer: trust caller-normalized limit\n\n* Add tsfile-cli usage skill for inspecting .tsfile from the CLI\n\n* Rename CLI binary from tsfile to tsfile-cli\n\n* Add tsfile CLI write (CSV/TSV import) design spec\n\n* Refine write spec: silent-by-default (-v summary) and opt-in --header-match\n\n* Add tsfile CLI write implementation plan\n\n* Add tsfile CLI input_format parsing layer\n\n* Add tsfile CLI write argument parsing\n\n* Add tsfile CLI write command (CSV/TSV import)\n\n* Treat \u0027-\u0027 as stdin positional, not an unknown flag\n\n* Format tsfile CLI write sources with clang-format\n\n* Update tsfile-cli skill to document the write command\n\n* Condense tsfile-cli skill with formal notation\n\n* Ignore .codegraph and cpp/root test-run artifacts\n\n* Add QA learning log for tsfile CLI work\n\n* Move tsfile-cli skill to cpp/tools/skills; stop tracking .claude\n\n* Stop tracking docs/superpowers and QA_Log.md (keep local, out of PR)\n\n* Add Apache license header to tsfile-cli skill doc (fix RAT check)\n\n* Fix CLI test race: unique per-process temp filenames for parallel ctest\n\n* Simplify CLI test fixture: drop unused path param and atomic counter\n\n* Add tsfile-cli tool README\n\n* Expand tsfile-cli README: build-from-source and skill install\n\n* Address PR #829 review feedback for tsfile-cli\n\n- row_query/sample: translate storage error codes to readable phrases\n  instead of emitting a bare numeric code\n- read_file: drop the always -1 fd_ value from open() diagnostic; keep\n  strerror(errno)\n- run_cli: honor --help even with a positional file; correct the stats\n  usage text (min/max/first/last/sum)\n- meta: remove the always-empty version/bloom_filter columns (the public\n  reader API exposes neither); update README and SKILL accordingly\n- write: stream rows into fixed 1024-row Tablet batches so memory stays\n  bounded regardless of input size\n- write: reject numeric overflow (ERANGE for int/float/double, plus an\n  INT32 range check)\n- tools CMake: remove the noisy unconditional configure message\n- test CMake: drop the no-op SYSTEM target property and force the vendored\n  GTest headers ahead on TsFile_Test where header resolution matters\n\n* Harden tsfile-cli writes, errors, and input validation\n\nStrict-review follow-up to PR #829:\n- write: reject non-strictly-increasing timestamps per device (tag tuple)\n  with a located message; refuse --output equal to the input file; remove\n  the partial output on any failure so no corrupt .tsfile is left behind\n- write/query/sample failures now print a human-readable cause via\n  error_code_message() instead of a bare numeric code; the helper lives in\n  the output_format layer so read and write share it\n- schema: report real encoding/compression for table-model columns instead\n  of always-empty cells\n- columns spec: reject duplicate column names\n- reject flags that do not apply to a command (write-only flags on read\n  commands, row/range flags on metadata commands, --header-match with\n  --no-header), and give a clear error when an option precedes the command\n- rename the read-output helpers to emit_result_set* and the JSON predicate\n  to emits_json_bare so the names match what they do\n- docs: document the per-device timestamp ordering rule and drop the\n  unimplemented \"help \u003ccommand\u003e\" form\n\n* Rename tsfile-cli stat_table.{h,cc} to statistics.{h,cc}\n\nThe file holds generic statistics helpers (collect_series_stats,\ncollect_file_summary, statistic_value_cells) used by stats/count/meta for\nboth the tree and table models. \"table\" wrongly implied the table model;\n\"statistics\" describes what it actually provides.\n\n* Add tests for tsfile-cli review hardening\n\nCovers per-device timestamp-order rejection (including across batch\nflushes), --output anti-alias and unlink-on-failure, large streaming\nround-trip, numeric overflow detection, duplicate-column rejection,\nflag-applicability errors, the leading-option error, error_code_message\nmapping, --help with a positional file, and table-model schema\nencoding/compression.\n\n* Simplify scoped-command check in tsfile-cli flag validation\n\nDerive the scoped flag from is_row instead of re-listing the\nhead/cat/sample command names, so the row-command set lives in one place.\n\n* Address PR #829 round 2 review feedback for tsfile-cli\n\n- write: support quoted CSV fields that span multiple physical lines by\n  joining continuation lines until the opening double-quote closes, via a\n  new read_record() helper shared by the header and data read paths\n- read: print FLOAT/DOUBLE with max_digits10 precision so values\n  round-trip losslessly through a pipe instead of the default 6 sig digits\n- tools CMake: include library headers from the staged LIBRARY_INCLUDE_DIR\n  and THIRD_PARTY_INCLUDE instead of reaching into ${PROJECT_SOURCE_DIR}/src,\n  matching the convention the test target already uses\n- tests: cover read_record (multi-line quoted, CR strip, TSV, unterminated\n  quote) and add e2e float/double lossless and embedded-newline import cases\n\n* Address PR #829 round 3 review feedback for tsfile-cli\n\nImplements jt2594838\u0027s review on develop\u0027s tsfile-cli:\n\n- write: accept TIMESTAMP/DATE/BLOB columns and store each column with the\n  engine\u0027s default encoding/compression for its type (via get_value_encoder /\n  get_default_compressor) instead of hard-coded PLAIN/UNCOMPRESSED.\n- sample/row_query: when no device is given, build query paths from one\n  whole-file get_timeseries_metadata() call via a shared collect_tree_query_paths\n  helper instead of a per-device schema loop.\n- Sink CSV split/escape into common/csv_utils.{h,cc} and the datatype-name parser\n  into common::parse_data_type_name; the CLI now delegates to them.\n- write: case-insensitive column category, verbose echo of the resolved config,\n  header-match errors that name the offending column/position, error codes\n  appended to writer failures, and result_code naming.\n- Documented the table-model \"first table only\" caveat and the extended write\n  types in README/SKILL; added struct comments and clearer usage text.\n- Tests: extended-type/category parsing, TIMESTAMP/DATE/BLOB round-trip, verbose\n  echo, header-match position, and common csv/type-name helpers.\n\n* Show short-flag aliases in tsfile-cli write/validation error messages\n\nError strings for flags that have a short form now mention it, matching the\nusage text: -t/--table, -d/--device, -n/--limit. Flags without a short alias\n(--columns, --offset, --seed, --start/--end, --header-match) stay long-only.\n\n* Clarify intent of RowWriter::emits_json_bare predicate\n\nAdd a comment explaining that BOOLEAN is grouped with the numeric types because\ntrue/false are bare JSON literals (not because BOOLEAN is numeric); strings,\nblobs, and dates are quoted. The misleadingly-named is_numeric was already\nrenamed to emits_json_bare in a prior round.\n\n* Avoid per-cell copies in tsfile-cli write import hot loop\n\n- Move (not copy) each fully-built DataRow into the batch vector; the row owns a\n  vector\u003cstring\u003e of cells, so the lvalue push_back copied every cell per row.\n- Add values to the Tablet by column index instead of by name. The by-name\n  add_value lowercases the measurement name and does a map lookup per cell;\n  the column-\u003eindex order is fixed at schema-build time, so the index is known.\n  String/text/blob use the c-string by-index overload to keep the same path.\n\n* Strengthen tsfile-cli write tests; reject impossible DATE cells\n\nNew e2e tests:\n- per-column value mapping via JSON output (guards the by-index add_value path:\n  any cross-column write would surface as a wrong key/value pair)\n- multi-type import across \u003e2 batches, spot-checking a last-batch row\n- RFC 4180 round-trip of a quoted STRING with comma + embedded quotes\n- TIMESTAMP overflow / non-numeric, empty-cell-as-null\n- DATE boundary (leap day) and impossible-date rejection\n\nThe impossible-date test exposed a bug: parse_date_cell only checked the\nYYYY-MM-DD shape, and the writer silently drops an invalid std::tm rather than\nerroring, so e.g. 2024-13-40 imported as success. parse_date_cell now validates\nvia DateConverter::date_to_int and reports \"bad DATE\".\n\n* Filter single-device tree query paths through the device schema\n\nResolve the device\u0027s real series and build query paths directly from\nthem, keeping only measurements that match the projection. A provided\nmeasurement that doesn\u0027t exist on the device is now dropped instead of\nqueried blindly, matching the no-device path.\n\n* Use set::find for the known-command membership check\n\nExpresses the existence test directly instead of counting; equivalent\nfor a std::set and C++11-compatible (no contains())."
    },
    {
      "commit": "3c60194c6bfd0d8ec6129e98dadbd3e28d57408f",
      "tree": "2d44b6111e2911b17019f54899175a9c5d7fcd34",
      "parents": [
        "2a864c58740e99f35be037f0548f84231a928b6a"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Jun 08 14:24:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 14:24:48 2026 +0800"
      },
      "message": "Upgrade minimum JDK to 17 and refresh dependencies (#830)\n\n* Upgrade minimum JDK to 17\n\n* Address Dependabot Maven alerts"
    },
    {
      "commit": "2a864c58740e99f35be037f0548f84231a928b6a",
      "tree": "8c85d8e50cedd029fc90cb58236e57ca8518bf3d",
      "parents": [
        "324acba9b9f4c844577a5c8d9ef20f9ee24bf654"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Thu Jun 04 16:47:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 16:47:06 2026 +0800"
      },
      "message": "Fix TS_2DIFF float/double page compatibility (#796)\n\n* Fix TS_2DIFF float/double page compatibility and harden gtest zip validation.\n\nAlign C++ float/double TS_2DIFF flush/read behavior with Java overflow-page layout, and prevent 0-byte/corrupt googletest archives from being treated as successful downloads during test configuration.\n\n* Make tsfile-cpp optimization flags inherit from caller by default.\n\nAdd optional TSFILE_OPTIMIZATION_FLAGS overrides in project/examples CMake while removing hardcoded optimization settings so library builds follow common CMake integration behavior.\n\n* Align C++ float/double TS_2DIFF default semantics with Java.\n\nUse Java-compatible default maxPoint handling for float/double TS_2DIFF encode/decode while preserving legacy raw-block compatibility, and add a byte-level regression test for the documented float/NaN hex sequence.\n\n* Fix table time decoder selection for chunk readers.\n\nUse the actual time chunk encoding instead of global default when building time decoders in table read paths, preventing wrong TS_2DIFF decoding on PLAIN time chunks.\n\n* Trim redundant comments and remove dead time decoder field.\n\nDrop nonessential explanatory comments in TS_2DIFF codec changes and remove unused defaultTimeDecoder from AbstractChunkReader to keep the PR focused for review.\n\n* Add Java baseline hex test for double TS_2DIFF encoding.\n\nMirror TestFloatJavaDefaultHexCompatibility with the same overflow-page\ninputs so C++ double encoder output stays byte-for-byte compatible with Java.\n\n* Rename TS_2DIFF Java overflow flags and align bitmap naming.\n\nApply review feedback: FLAG_SCALED_VALUE_OVERFLOW /\nFLAG_ORIGINAL_VALUE_OVERFLOW, and consistent underflow/overflow bitmap\nnames in encoder and decoder."
    },
    {
      "commit": "324acba9b9f4c844577a5c8d9ef20f9ee24bf654",
      "tree": "c1543145231f20fcaf850086ec928c288e534651",
      "parents": [
        "86ec4b992b8b14e73daed915b90c8da8528a9213"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Wed Jun 03 17:10:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 17:10:56 2026 +0800"
      },
      "message": "Optimize get_timeseries_metadata() to eliminate N+1 I/O (~94x speedup) (#815)\n\n* optimize get_timeseries_metadata() to eliminate N+1 I/O\n\n- Add get_device_timeseries_meta_by_offset() that accepts pre-resolved\n  offsets, skipping redundant load_device_index_entry() tree search and\n  reusing the deserialized measurement index node via get_all_leaf()\n  instead of re-reading the same bytes through\n  load_all_measurement_index_entry()\n- Add get_all_device_entries() to collect device IDs with their\n  (start_offset, end_offset) in a single index tree traversal\n- Rewrite get_timeseries_metadata() to use the above two methods\n- Remove redundant PageArena::init() call in get_timeseries_metadata_impl\n\n* fix int64_t truncation and error handling in get_all_device_entries\n\n* optimize queryByRow with exact tag filter via B-tree direct lookup\n\nWhen DeviceMetaIterator receives a single TagEq filter (exact match on\none tag column), construct the target device ID and use\nload_device_index_entry() for O(log N) B-tree binary search instead of\ntraversing all internal nodes and scanning all leaf devices.\n\nFor ecg_dataset (53040 devices), this reduces queryByRow\u0027s\nDeviceTaskIterator::next() from ~117ms to ~0.5ms per query (~230x).\n\nAlso adds bench_read.cpp for standalone C++ read path benchmarking\nand makes load_device_index_entry() public for reuse.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style: clang-format\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Updae C++ CLAUDE.md to persist format way\n\n* fix direct lookup for multi-tag-column devices\n\nThe TagEq direct B-tree lookup constructed a device ID with only\ncol_idx_+1 segments, but devices with multiple tag columns have more.\nThe segment count mismatch caused operator\u003d\u003d to always return false,\nso queries returned 0 rows. Guard the optimization to only activate\nwhen the filter fully specifies the device ID (single tag column).\n\n* add unit tests for timeseries metadata and direct B-tree lookup\n\n- GetTimeseriesMetadataTableModel: test get_timeseries_metadata()\n  with table model, covering get_all_device_entries (LEAF_DEVICE\n  path) and get_device_timeseries_meta_by_offset\n- GetTimeseriesMetadataMultiTable: test with two tables, covering\n  the multi-table iteration in get_timeseries_metadata\n- DirectLookupSingleTagColumn: test the TagEq direct B-tree lookup\n  optimization with a single-tag-column table, covering\n  try_setup_direct_lookup and load_results_direct\n- DirectLookupNonExistDevice: test direct lookup returns 0 rows\n  when the device does not exist\n\n* delete examples/bench_read.cpp\n\n* fix direct lookup guard for multi-tag-column tables\n\nThe previous guard (actual_segment_count !\u003d eq-\u003ecol_idx_ + 1) still\nallowed direct lookup when filtering on the last tag column in a\nmulti-tag table (e.g., 2 tags: segment_count\u003d3, col_idx\u003d2, 2+1\u003d3).\nThe constructed device ID had empty segments for unfiltered tags,\ncausing B-tree lookup to find nothing. Restrict direct lookup to\nsingle-tag tables only (segment_count \u003d\u003d 2).\n\n* style: clang-format\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "86ec4b992b8b14e73daed915b90c8da8528a9213",
      "tree": "ef0e303812e94510fab886416095a3a82ca0c976",
      "parents": [
        "e7b0d695738c6ec0446c1c004ff017dfe1295d4c"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Wed Jun 03 15:17:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 15:17:43 2026 +0800"
      },
      "message": "Add Tablet.serializedSize() and comprehensive size validation tests. (#824)\n\n* Add Tablet.serializedSize() and comprehensive size validation tests.\n\nPre-allocate serialization buffer using exact size estimation, support OBJECT\ntype in tablet serialize/deserialize path, and consolidate serializedSize tests.\n\n* Fix serialized size charset and overflow handling\n\n* Avoid bitmap copy when sizing tablet serialization"
    },
    {
      "commit": "e7b0d695738c6ec0446c1c004ff017dfe1295d4c",
      "tree": "63911b394edaa2e0bb85cafe3042ea56d32c28aa",
      "parents": [
        "aacd0d7f42aa17a9335c9a29295e5a1421c1156c"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Jun 01 10:42:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 10:42:26 2026 +0800"
      },
      "message": "Update RELEASE_NOTES.md for version 2.3.1\n\nAdded new features and bug fixes for version 2.3.1."
    },
    {
      "commit": "aacd0d7f42aa17a9335c9a29295e5a1421c1156c",
      "tree": "cb3608985a64d1dcc34ddf109f2b4eeee44f1479",
      "parents": [
        "21988e7365cb274ffe8283551939e3f1055a1dc6"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Jun 01 10:40:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 10:40:48 2026 +0800"
      },
      "message": "Add new release version 2.3.1 for Apache TsFile"
    },
    {
      "commit": "21988e7365cb274ffe8283551939e3f1055a1dc6",
      "tree": "aa2d30898cfdde86c2cf7662c47a18067d062970",
      "parents": [
        "3436b4f93fb05e511d95293ab543014d45bfbe15"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Sun May 31 14:27:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 14:27:10 2026 +0800"
      },
      "message": "Fix typos in comments, docs, build scripts, and i18n messages (#826)\n\n* fix(cpp): correct typos in comments, build scripts, and debug output\n\nSpelling fixes only; no behavioral change. Touches code comments,\nCMake/`build.sh` messages, the `increament` local parameter in\nbyte_stream.h, a debug `std::cout` string, and grammar-file comments\n(Arithmetics-\u003eArithmetic, Comparation-\u003eComparison).\n\n* fix(java): correct typos in comments, javadoc, and i18n log messages\n\nSpelling fixes only. Includes code comments and Javadoc across the\nencoding, file, and read packages, and the English i18n message values\n(occured-\u003eoccurred, and a duplicated \"with with\"). Message keys are\nunchanged, so the en/zh key-set alignment enforced by MessagesTest is\npreserved. The intentionally-preserved \"supproted\"/\"greather\" strings\n(documented inline for backward compatibility) are left untouched.\n\n* fix(docs): correct typos in documentation\n\nSpelling fixes in README/QuickStart/release notes (aquisition-\u003eacquisition,\nseverval-\u003eseveral, Paritial-\u003ePartial, wirh-\u003ewith, memroy-\u003ememory). In the\nChinese committers doc, \"Committe\" is corrected to \"Committer\" (the Apache\nrole), which also repairs a broken anchor: it now points to About.md#committer\nto match the existing \"### Committer\" heading.\n\n* fix(build): correct typos in pom.xml coverage-check comments\n\nSpelling fixes in JaCoCo limit comments (methodes-\u003emethods, swtich-\u003eswitch).\nComment-only change; no build behavior affected."
    },
    {
      "commit": "3436b4f93fb05e511d95293ab543014d45bfbe15",
      "tree": "f35b49fbc2cb6c05c31d7f6b1da83b49b8699493",
      "parents": [
        "ce011faeaed11ffc3f1d7e97df092cfe361004d1"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:11 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:11 2026 +0800"
      },
      "message": "[maven-release-plugin] prepare for next development iteration\n"
    },
    {
      "commit": "ce011faeaed11ffc3f1d7e97df092cfe361004d1",
      "tree": "028700f012943bcbbae18a9bdc887f9cb4fc3f37",
      "parents": [
        "e3cdf879c907e3fbe351e1bf278c5d2ce3963dda"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:02 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:02 2026 +0800"
      },
      "message": "[maven-release-plugin] prepare release v2.3.1\n"
    },
    {
      "commit": "e3cdf879c907e3fbe351e1bf278c5d2ce3963dda",
      "tree": "ba8353e8482fd94e619f769d1c84ba239c284319",
      "parents": [
        "543c4440cf2c31a8c385ee756081b2cd0ee43a90"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Thu May 28 14:34:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 14:34:55 2026 +0800"
      },
      "message": "fix(tools): unbreak bat for paren paths and silence library INFO noise (#825)\n\n* Fix tools import edge cases\n\n* fix(tools): tighten Parquet/Arrow schema validation and tag column handling\n\n- Parquet/Arrow schema mode: validate source_columns against the source file by count and name; reject unnamed SKIP (name-based matching cannot resolve it). Previously mismatches silently produced all-null columns.\n\n- TabletBuilder: lowercase the keys of tagDefaults and sourceColumnIndex to match the lowercase names returned by TableSchema.getColumnSchemas, match the time column case-insensitively, and use STRING (not TEXT) for tag MeasurementSchema.\n\n- Document the new validation rules and clarify auto-mode time-column requirements, type-promotion conditions, and table-name sanitization in both README versions; add a note above the Schema Example that duplicate (device, timestamp) rows are not supported.\n\n- Add SchemaValidationTest covering positive case plus column-count mismatches, unknown column name, and unnamed SKIP for both formats.\n\n- Add four regression tests in TabletBuilderTest for mixed-case tag / source / time columns, mixed-case tag default values, and virtual tag DEFAULT values landing in the device id.\n\n* fix(tools): read import.schema as UTF-8 instead of platform default\n\nImportSchemaParser.parse used FileReader, which decodes with the JVM default charset. On Chinese Windows running JDK \u003c18 the  default is GBK (Java 18+ defaults to UTF-8 per JEP 400), so a UTF-8 import.schema containing Chinese table or column names was  mis-decoded and the garbled text propagated into the resulting TsFile.\n\nReplace FileReader with InputStreamReader explicitly bound to StandardCharsets.UTF_8 so the file is read correctly regardless   of JDK version or platform locale, mirroring how CsvSourceReader already opens its input.\n\n* fix(tools): unbreak bat for paren paths and silence library INFO noise\n\nDrop the start /B /WAIT wrapper in csv/arrow/parquet bats so paths like events(1).csv no longer get truncated by cmd parenthesis grouping; pass Java exit code through explicitly.\n\nSilence Arrow allocator and Parquet/Hadoop CodecPool INFO logs in logback-cvs2tsfile.xml.\n\nAdd BatScriptTest covering normal filename, paren filename, and absence of suppressed INFO noise.\n\n---------\n\nCo-authored-by: ziyangeng \u003cziyan.geng@intern.timecho.com\u003e"
    },
    {
      "commit": "543c4440cf2c31a8c385ee756081b2cd0ee43a90",
      "tree": "4f43cb9d78e70be245d67cccca44f8e5787624d2",
      "parents": [
        "6ccc9d7e69e816cc7babb40a9b924fc6151a6c55"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Mon May 25 09:50:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 09:50:19 2026 +0800"
      },
      "message": "Fix import edge cases for DATE/TIMESTAMP, INT96, CSV quotes and format filtering (#819)\n\n* Fix tools import edge cases\n\n* fix(tools): tighten Parquet/Arrow schema validation and tag column handling\n\n- Parquet/Arrow schema mode: validate source_columns against the source file by count and name; reject unnamed SKIP (name-based matching cannot resolve it). Previously mismatches silently produced all-null columns.\n\n- TabletBuilder: lowercase the keys of tagDefaults and sourceColumnIndex to match the lowercase names returned by TableSchema.getColumnSchemas, match the time column case-insensitively, and use STRING (not TEXT) for tag MeasurementSchema.\n\n- Document the new validation rules and clarify auto-mode time-column requirements, type-promotion conditions, and table-name sanitization in both README versions; add a note above the Schema Example that duplicate (device, timestamp) rows are not supported.\n\n- Add SchemaValidationTest covering positive case plus column-count mismatches, unknown column name, and unnamed SKIP for both formats.\n\n- Add four regression tests in TabletBuilderTest for mixed-case tag / source / time columns, mixed-case tag default values, and virtual tag DEFAULT values landing in the device id.\n\n* fix(tools): read import.schema as UTF-8 instead of platform default\n\nImportSchemaParser.parse used FileReader, which decodes with the JVM default charset. On Chinese Windows running JDK \u003c18 the  default is GBK (Java 18+ defaults to UTF-8 per JEP 400), so a UTF-8 import.schema containing Chinese table or column names was  mis-decoded and the garbled text propagated into the resulting TsFile.\n\nReplace FileReader with InputStreamReader explicitly bound to StandardCharsets.UTF_8 so the file is read correctly regardless   of JDK version or platform locale, mirroring how CsvSourceReader already opens its input.\n\n---------\n\nCo-authored-by: ziyangeng \u003cziyan.geng@intern.timecho.com\u003e"
    },
    {
      "commit": "6ccc9d7e69e816cc7babb40a9b924fc6151a6c55",
      "tree": "44753375f4585fd420203720aaf45f0318996532",
      "parents": [
        "edbef480090b1900aee5e6d474003d16015c9668"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu May 21 19:19:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 19:19:39 2026 +0800"
      },
      "message": "support msvc 2017. (#817)"
    },
    {
      "commit": "edbef480090b1900aee5e6d474003d16015c9668",
      "tree": "e45c63fc847f2d018edd5aa5808bf411c91bfe88",
      "parents": [
        "d666d0198c800bad3e95fe2f5cd34c6d88589d2b"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Thu May 21 14:25:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:25:06 2026 +0800"
      },
      "message": "exclude AGENTS.md from rat (#822)"
    },
    {
      "commit": "d666d0198c800bad3e95fe2f5cd34c6d88589d2b",
      "tree": "6372d4c01b6e2c503df5b7cf20c8d96fe301f1cc",
      "parents": [
        "8fced479ed20c505b12c619ff735d6bfbdf13c95"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Wed May 20 18:48:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 18:48:41 2026 +0800"
      },
      "message": "Fix OBJECT last-point fallback in TsFileLastReader (#821)"
    },
    {
      "commit": "8fced479ed20c505b12c619ff735d6bfbdf13c95",
      "tree": "0dfec7f0f1a1dc08a243cd783b70937aa1562139",
      "parents": [
        "1c0efe4db8d8333ac01ddadd013c0a1e899664c3"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Tue May 19 14:29:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 14:29:20 2026 +0800"
      },
      "message": "feat: i18n support for log and exception messages (#820)"
    },
    {
      "commit": "1c0efe4db8d8333ac01ddadd013c0a1e899664c3",
      "tree": "b68933acb25630fbd9baaa3d0fcef23915e83081",
      "parents": [
        "f7041d8221c802f4842431eb4d453fcb66c4a6be"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon May 18 14:44:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 14:44:53 2026 +0800"
      },
      "message": "Add AGENTS.md symlinks (#818)"
    },
    {
      "commit": "f7041d8221c802f4842431eb4d453fcb66c4a6be",
      "tree": "0319c2d4476d98b2e1ecddbe8dc23db4b98ff2c6",
      "parents": [
        "8923b11888d74eb53c0963c2cb271d561dea9e0c"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Thu May 07 11:11:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 11:11:22 2026 +0800"
      },
      "message": "feat(tools): support Parquet and Arrow import with schema/auto modes (#793)"
    },
    {
      "commit": "8923b11888d74eb53c0963c2cb271d561dea9e0c",
      "tree": "51d96e43043f6bb9487d5d807d1f0ee56b0e8dfc",
      "parents": [
        "03abc3e87e673e4d62e0c342df9088e4f7b63134"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue May 05 10:46:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 10:46:25 2026 +0800"
      },
      "message": "Bump actions/checkout from 4 to 6 (#800)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00276\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": "03abc3e87e673e4d62e0c342df9088e4f7b63134",
      "tree": "3fda63f23d40331c878f9a97f275fb6a9e5dcf56",
      "parents": [
        "f46c7a9e02b25e7623c97131a2e6726f7f60730e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:05:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:05:01 2026 +0800"
      },
      "message": "Bump actions/github-script from 8.0.0 to 9.0.0 (#802)\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v8.0.0...v9.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: 9.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": "f46c7a9e02b25e7623c97131a2e6726f7f60730e",
      "tree": "45bcc91920580ea60933250e1802a6913f38da75",
      "parents": [
        "d5628a1c06ea57494b1837ea5c0d67d2b4f878f5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:04:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:04:37 2026 +0800"
      },
      "message": "Bump pnpm/action-setup from 4 to 6 (#801)\n\nBumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.\n- [Release notes](https://github.com/pnpm/action-setup/releases)\n- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: pnpm/action-setup\n  dependency-version: \u00276\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": "d5628a1c06ea57494b1837ea5c0d67d2b4f878f5",
      "tree": "3a4cd1c054b9bb511dd020ddec5f76c9f89f52d1",
      "parents": [
        "659196beca8170280653b91f12045635a14782e4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:04:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:04:08 2026 +0800"
      },
      "message": "Bump actions/download-artifact from 4 to 8 (#804)\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/download-artifact\n  dependency-version: \u00278\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": "659196beca8170280653b91f12045635a14782e4",
      "tree": "661919d0ed1285a4cbd25c2177b1b8c0ebe7fce3",
      "parents": [
        "5e2130f7b715f422edf504ccb9c6380a415aa891"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:03:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:03:52 2026 +0800"
      },
      "message": "Bump codecov/codecov-action from 5 to 6 (#803)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: \u00276\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": "5e2130f7b715f422edf504ccb9c6380a415aa891",
      "tree": "cfb84b97d702e9f8b3f9ce23a4d45b50122b9dba",
      "parents": [
        "781f8094ddba6094aa06871e0f9a1df0e0360f93"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 27 10:28:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 10:28:27 2026 +0800"
      },
      "message": "Add release information for version 2.3.0"
    },
    {
      "commit": "781f8094ddba6094aa06871e0f9a1df0e0360f93",
      "tree": "81f2120dafa342393cf845b59d16de6c57958d45",
      "parents": [
        "3557b81dc47a71d72c3e72093f3fc18e1faf0a17"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Sun Apr 26 17:40:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 26 17:40:17 2026 +0800"
      },
      "message": "RELEASE_NOTES for Apache TsFile 2.3.0"
    },
    {
      "commit": "3557b81dc47a71d72c3e72093f3fc18e1faf0a17",
      "tree": "a2d77660d628cfafa9fb7074540c3a5f5c11b630",
      "parents": [
        "3fa28f52b5cfd372ee8caea8062a97b57f35f9cc"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 23 10:04:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 23 10:04:24 2026 +0800"
      },
      "message": "Bump actions/setup-node from 4 to 6 (#622)\n\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: \u00276\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": "3fa28f52b5cfd372ee8caea8062a97b57f35f9cc",
      "tree": "9bab5adafc7ca9ff8138d3ceb82ea7d4d686ef9b",
      "parents": [
        "56adf773d4d1fbe09b5c58e12b3af1f789828ba7"
      ],
      "author": {
        "name": "Caideyipi",
        "email": "87789683+Caideyipi@users.noreply.github.com",
        "time": "Wed Apr 22 17:15:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 17:15:10 2026 +0800"
      },
      "message": "Implemented NONE value"
    },
    {
      "commit": "56adf773d4d1fbe09b5c58e12b3af1f789828ba7",
      "tree": "3d05311e3b884fbf337f5b9e0d989fcdcaf61120",
      "parents": [
        "1c6fa3c2493dacc403486b8e8138b927b11e36b6"
      ],
      "author": {
        "name": "Yongzao",
        "email": "532741407@qq.com",
        "time": "Tue Apr 21 21:39:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 21:39:17 2026 +0800"
      },
      "message": "finish (#791)"
    },
    {
      "commit": "1c6fa3c2493dacc403486b8e8138b927b11e36b6",
      "tree": "c23da0fd26edffe12f0a7b1a6aa22f8f1faf9e95",
      "parents": [
        "865d75fb79ee7c6ea21efbbdb4e757cf4194b733"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Apr 21 19:14:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 19:14:58 2026 +0800"
      },
      "message": "[CI] Expand Python unit-test matrix to 3.9/3.11/3.14 (#790)"
    },
    {
      "commit": "865d75fb79ee7c6ea21efbbdb4e757cf4194b733",
      "tree": "05523b4917ce0d0d6da73fe16ebd9615b19e1e99",
      "parents": [
        "5e8a38ae97896765854a3188926c91b15f63c5f4"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Apr 21 18:04:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 18:04:23 2026 +0800"
      },
      "message": "[Python] Fix Linux Py3.14 wheel CI and dataframe edge cases (#789)\n\n* fix py3.9 black\n\n* ci wheel python 3.14\n\n* ci fix\n\n* ci fix\n\n* fix ci\n\n* ci fix\n\n* ci fix"
    },
    {
      "commit": "5e8a38ae97896765854a3188926c91b15f63c5f4",
      "tree": "355cbbd23cf2f729dab612db6d87665483ac1c68",
      "parents": [
        "c934f78e52aa35388050ac241bc2c9391f4eddc6"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Mon Apr 20 17:52:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 17:52:19 2026 +0800"
      },
      "message": "Add CLAUDE.md files and update .gitignore (#788)"
    },
    {
      "commit": "c934f78e52aa35388050ac241bc2c9391f4eddc6",
      "tree": "3fa98069acb5e429369c0cc10afa9d0d2a692393",
      "parents": [
        "eaf903093076f8e646f44fa68d02370a9d923fec"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Apr 20 14:30:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 14:30:12 2026 +0800"
      },
      "message": "Update README with clang-format install notes (#786)"
    },
    {
      "commit": "eaf903093076f8e646f44fa68d02370a9d923fec",
      "tree": "2a531189a11ce08bb8f34e2602c5260b1b610a51",
      "parents": [
        "2ab087b64a62784f03f77ed2a08d09b74266b958"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Mon Apr 20 14:05:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 14:05:52 2026 +0800"
      },
      "message": "Add test file cleanup and fix .gitignore for Python tests (#787)\n\n- Wrap test_lower_case_name and test_tsfile_config in try/finally\n  blocks to ensure generated .tsfile files are cleaned up\n- Fix test_tree_all_datatype_query_to_dataframe_variants to clean up\n  the correct file (record_write_and_read.tsfile instead of\n  tablet_write_and_read.tsfile)\n- Add python/tsfile/dataset/__pycache__ to .gitignore\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2ab087b64a62784f03f77ed2a08d09b74266b958",
      "tree": "1f27032fa08fd44272684caf052852e97db45144",
      "parents": [
        "a58a073e1b855662561beecd340e3274fdb7bcbc"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Apr 20 11:47:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 11:47:24 2026 +0800"
      },
      "message": "Enable Python Spotless check in CI (#785)\n\n* Enable python spotless check\n\n* Enable python spotless check\n\n* Enable python spotless check\n\n* Enable python spotless check"
    },
    {
      "commit": "a58a073e1b855662561beecd340e3274fdb7bcbc",
      "tree": "2b2e98805f871cc72e77bd672ed86a1750057c3b",
      "parents": [
        "651007d96265dd35150ad137b4cb1fbdd8afcf4a"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 20 09:50:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 09:50:37 2026 +0800"
      },
      "message": "fix cpp restore statistic (#784)\n\n* fix cpp restore statistic\n\n* fix cpp restore device last_time\n\n* fix ci\n\n* removed unused aligned value  column count"
    },
    {
      "commit": "651007d96265dd35150ad137b4cb1fbdd8afcf4a",
      "tree": "19a862e86f0c0a56cb9bc4e51dfdd0babeba046d",
      "parents": [
        "3de49f7fc0348964a962173cbdcd37cac598f071"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Fri Apr 17 12:38:20 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Fri Apr 17 12:38:20 2026 +0800"
      },
      "message": "fix restorable_tsfile_io_writer memory leak and unstop loop\n"
    },
    {
      "commit": "3de49f7fc0348964a962173cbdcd37cac598f071",
      "tree": "82a61f66e3a3742d25480bb84f405c575f801c82",
      "parents": [
        "34833e7a59d4aea406adc2cb4809246a28e53fd9"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Thu Apr 16 11:51:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 11:51:16 2026 +0800"
      },
      "message": "Fix multi-recovery metadata indexing and add regression coverage. (#783)\n\nUse value-based device keys in TSMIterator and merge recovered chunk metadata by device/measurement so repeated recovery writes do not trigger duplicate-device index failures; add a multi-round recovery test and relax a filesystem error assertion for environment consistency."
    },
    {
      "commit": "34833e7a59d4aea406adc2cb4809246a28e53fd9",
      "tree": "0a505989ee6387ea360af1619229b0842e47ac0f",
      "parents": [
        "a55f058d916ea729c65e43556ffc3334030f03c6"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Wed Apr 15 15:36:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 15:36:04 2026 +0800"
      },
      "message": "Add PyPI badge to README and README-zh.md (#782)"
    },
    {
      "commit": "a55f058d916ea729c65e43556ffc3334030f03c6",
      "tree": "4db84fb3f1aaa0972ecf9a219bacac6cdc22c0dd",
      "parents": [
        "12bd435ecc361369a67ec6c52d5c4f7bccf928a5"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Wed Apr 15 10:31:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 10:31:04 2026 +0800"
      },
      "message": "fix get_metadata datatype (#781)\n\n* fix get_metadata datatype\n\n* add it"
    },
    {
      "commit": "12bd435ecc361369a67ec6c52d5c4f7bccf928a5",
      "tree": "ffc7f09c7c8920e9b09ebe5dd1ae07e34634c4df",
      "parents": [
        "2a4fa502c981365e23fa55a7cea4bc1a4183223b"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Tue Apr 14 15:31:58 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Tue Apr 14 15:35:31 2026 +0800"
      },
      "message": "fix query-by-row unexist path\n"
    },
    {
      "commit": "2a4fa502c981365e23fa55a7cea4bc1a4183223b",
      "tree": "9017216a595248408bfc949fe811efcdbe803e05",
      "parents": [
        "d14d01ba1c1695dec899fb37efc96ad0e00bd78b"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Tue Apr 14 14:51:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 14:51:46 2026 +0800"
      },
      "message": "Format Python code with Spotless and Black (#770)"
    },
    {
      "commit": "d14d01ba1c1695dec899fb37efc96ad0e00bd78b",
      "tree": "ffd778ad1e344b8c2993b945bbf19c94298169f6",
      "parents": [
        "3c809d5f63aa64b2a96f6d21ceda53bad0a0d559"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Tue Apr 14 10:15:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:15:30 2026 +0800"
      },
      "message": "Add dedicated Tablet API for object path writes. (#780)"
    },
    {
      "commit": "3c809d5f63aa64b2a96f6d21ceda53bad0a0d559",
      "tree": "2cb113b9942b2cd3ad6f834e3050027396195dec",
      "parents": [
        "cb59543280364df451660400a80498f12667953e"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 13 10:20:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 10:20:23 2026 +0800"
      },
      "message": "Fix tree queryByRow device ID parsing for multi-segment paths (#776)\n\nPath splitting now joins device nodes and parses via StringArrayDeviceID(string)\nto match write-time normalization. Add C++ and Python regression tests."
    },
    {
      "commit": "cb59543280364df451660400a80498f12667953e",
      "tree": "745a5b249a18d567275881b87d26a6d75e04cb69",
      "parents": [
        "fa3e01f1895dd2d498a63c552f50bf27eb85b797"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 13 09:44:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 09:44:04 2026 +0800"
      },
      "message": "fix(cpp): skip missing device/measurement in tree queryByRow (#777)\n\nAlign QDSWithoutTimeGenerator with Java: treat E_DEVICE_NOT_EXIST and\nE_MEASUREMENT_NOT_EXIST as skippable paths and fix column index mapping\nwhen some paths are omitted. Add C++ and Python regression tests.\n\nMade-with: Cursor"
    }
  ],
  "next": "fa3e01f1895dd2d498a63c552f50bf27eb85b797"
}
