)]}'
{
  "commit": "366f382730192df84a05a42a53afb01628bb57f4",
  "tree": "584e2d7284ea0017faaec5a86ab8b476bfd70a22",
  "parents": [
    "2caf902d6b3fffd0c023beb68ecbac776ab60ee6"
  ],
  "author": {
    "name": "CritasWang",
    "email": "critas@outlook.com",
    "time": "Thu Jan 29 23:04:57 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Jan 29 23:04:57 2026 +0800"
  },
  "message": "Fix insertTablet serialization, add SessionDataSet iterator, and align query handling with Java/C# clients (#4)\n\n* Initial plan\n\n* Fix insertTablet serialization and add sql_dialect support\n\n- Fix insertTablet to serialize data column-by-column instead of row-by-row\n- Add bitmap support for null values after column data\n- Add sqlDialect field to Config interface\n- Pass sqlDialect in TSOpenSessionReq configuration\n- Default TableSessionPool to use sql_dialect \u003d \"table\"\n\n\n* Update sql_dialect to be internal-only, retain USE DATABASE logic\n\n- Remove sqlDialect from public Config interface\n- Add InternalConfig with sqlDialect field for internal use only\n- SessionPool automatically sets sql_dialect\u003d\"tree\"\n- TableSessionPool automatically sets sql_dialect\u003d\"table\"\n- Retain USE DATABASE logic in TableSessionPool for database context\n- Users don\u0027t need to specify sql_dialect - it\u0027s determined by pool type\n\n\n* Fix string byte length serialization\n\n- Change string serialization to write byte length instead of character length\n- This ensures UTF-8 multi-byte characters are handled correctly\n\n\n* Fix endianness issue in TEXT/STRING/BLOB serialization\n\n- Change from little-endian (writeInt32LE) to big-endian (writeInt32BE)\n- Java\u0027s ReadWriteIOUtils expects big-endian byte order\n- This fixes BufferUnderflowException when inserting TEXT/STRING/BLOB data\n\n\n* Address code review feedback\n\n- Fix bitmap byte count calculation to use Math.ceil instead of floor+1\n- Add database name validation to prevent SQL injection\n- Database names must only contain alphanumeric, underscores, hyphens, and dots\n\n\n* Migrate Thrift generation to TypeScript\n\n- Generate TypeScript declaration files (.d.ts) alongside JavaScript\n- Use official Apache Thrift compiler with ts option instead of @creditkarma/thrift-typescript\n- Update generate:thrift script to use: thrift --gen js:node,ts\n- Update GitHub workflow to generate TypeScript definitions\n- Add comprehensive thrift/README.md documentation\n- Remove @creditkarma/thrift-typescript dependency\n- Remove unused fix-thrift-int64.js script (not needed with official compiler)\n- Update build to copy both .js and .d.ts files to dist/\n\n\n* Add TypeScript examples documentation and cleanup\n\n- Add docs/TYPESCRIPT_EXAMPLES.md with usage examples\n- Remove unused scripts/fix-thrift-int64.js (not needed with official compiler)\n- Document benefits of TypeScript support\n\n\n* Reorganize documentation structure\n\n- Move API docs to docs/: implementation.md, data-types.md, thrift.md, typescript-examples.md\n- Move development docs to docs/development/: build-infrastructure.md, debugging-e2e.md, test-database.md\n- Move project-status.md to docs/\n- Delete obsolete summary files: CI_CD_SUMMARY.md, COMMENT_RESPONSE_SUMMARY.md, DATABASE_CONSOLIDATION_SUMMARY.md, DATA_TYPES_IMPLEMENTATION_SUMMARY.md, E2E_FIX_ANALYSIS.md, ESLINT_9_UPGRADE.md, GLOB_FIX_DETAILS.md, IMPROVEMENTS_SUMMARY.md, NPM_DEPRECATIONS_FIXED.md\n- Keep in root: README.md, CONTRIBUTING.md, CHANGELOG.md, LICENSE\n- Add docs/README.md with comprehensive index\n- Update main README.md with documentation links section\n\n\n* Implement SessionDataSet with iterator pattern\n\n- Add RowRecord class for representing individual query result rows\n- Add SessionDataSet class with hasNext()/next() iterator pattern\n- Add executeQuery() method that returns SessionDataSet\n- Support lazy loading - fetches more data on-demand\n- Proper resource management with close() method\n- Column access by name or index with type safety\n- Keep executeQueryStatement() for backward compatibility (deprecated)\n- Add comprehensive E2E tests for SessionDataSet\n- Export new classes in index.ts\n\n\n* Add comprehensive SessionDataSet documentation\n\n- Add sessiondataset-guide.md with complete usage guide\n- Update README.md with SessionDataSet quick start example\n- Add SessionDataSet section highlighting benefits\n- Update docs/README.md to include new guide\n- Document migration from old QueryResult pattern\n- Add performance tips and best practices\n- Include troubleshooting section\n\n\n* Replace executeQueryStatement to return SessionDataSet\n\n- Remove executeQuery() method, keep only executeQueryStatement()\n- executeQueryStatement() now returns SessionDataSet instead of QueryResult\n- Remove old parseQueryResult() and recursive fetchResults() methods\n- Update BaseSessionPool.executeQueryStatement() to return SessionDataSet\n- Update Session.test.ts to use SessionDataSet iterator pattern\n- Update SessionDataSet.test.ts to use executeQueryStatement()\n- Mark QueryResult as deprecated\n\n\n* Update AllDataTypes.test.ts to use SessionDataSet API pattern\n\n\n* Update LargeQuery.test.ts to use SessionDataSet pattern\n\n* Update MultiNode.test.ts to use SessionDataSet pattern\n\n\n* Update TableModelDataTypes.test.ts to use SessionDataSet pattern\n\n\n* Update TableSessionPool.test.ts to use SessionDataSet pattern\n\n\n* Update documentation for SessionDataSet API changes\n\n- Remove all references to executeQuery() (no longer exists)\n- Update README to show executeQueryStatement returns SessionDataSet\n- Update sessiondataset-guide.md with new API\n- Add migration section explaining breaking change\n- Add toArray() helper for small datasets\n- Remove deprecated QueryResult examples\n\n\n* Add queryResult support and fix session release timing\n\n- Add support for both queryDataSet and queryResult formats in query responses\n- Add parseQueryResult() method to handle TsBlock format (Buffer[])\n- Update Session.executeQueryStatement() to handle both formats\n- Update SessionDataSet.fetchNextBatch() to handle both formats\n- Add cleanup callback mechanism to SessionDataSet\n- Fix BaseSessionPool to release session only when dataset.close() is called\n- Session is now held until dataset is closed, not released immediately after query\n\n\n* Fix parseQueryResult to handle queries without time column\n\n- Add ignoreTimeStamp parameter to parseQueryResult() method\n- Extract ignoreTimeStamp from TSExecuteStatementResp\n- Pass ignoreTimeStamp to SessionDataSet constructor\n- Handle cases where time column is not present (ignoreTimeStamp\u003dtrue)\n- When ignoreTimeStamp is true, all queryResult buffers are value columns\n- When ignoreTimeStamp is false, queryResult[0] is time column\n- Add helper methods getDataTypeCode() and getRowCountFromBuffer()\n- Update fetchNextBatch() to pass ignoreTimeStamp when parsing results\n- Matches Java and C# client implementations\n\n\n* 修复数据读取逻辑\n\n* 修复查询\n\n* Fix column name handling and add Docker log collection on CI failure\n\n- Add support for both full and short column names in SessionDataSet\n- Extract short name (last segment) and register both mappings\n- Add getShortColumnNames() method for convenience\n- Update SessionDataSet test to use getShortColumnNames()\n- Add Docker log collection step in e2e-1c1d.yml workflow (on failure)\n- Add Docker log collection step in e2e-3c3d.yml workflow (on failure)\n- Docker logs saved to test-results/docker-logs/ and uploaded as artifacts\n\n\n* Remove getShortColumnNames() and update tests to use fully qualified column names\n\n- Remove getShortColumnNames() method from SessionDataSet\n- Remove extractShortColumnName() private method\n- Remove short name registration from column index map\n- Update SessionDataSet.test.ts to use fully qualified column names\n- Tests now use \"root.test.d1.s1\" instead of \"s1\"\n- Tests now use \"root.test.large.d1.value\" instead of \"value\"\n- Tests now use \"root.test.column.d1.temperature\" instead of \"temperature\"\n- All column name assertions updated to expect full paths\n\n\n* Fix tree model aggregation function names to use lowercase\n\n- Change MAX_VALUE to max_value in tree model queries\n- Change MIN_VALUE to min_value in tree model queries\n- Tree model uses lowercase function names (max_value, min_value)\n- Table model continues to use standard SQL (MAX, MIN)\n- Fixes \"UDF MAX has not been registered\" error in AllDataTypes.test.ts\n\n\n* Fix timestamp endianness in insertTablet - use big-endian\n\n- Change timestamp serialization from little-endian to big-endian\n- Use writeBigInt64BE instead of BigInt64Array for timestamps\n- IoTDB protocol expects big-endian byte order (Java standard)\n- Matches C# client which converts to big-endian: Array.Reverse(longBuff)\n- Fixes issue where timestamps appeared negative in database\n\n\n* Fix TSQueryDataSet deserialization to use big-endian byte order\n\n- Change all numeric type deserialization from little-endian to big-endian\n- INT32: Use readInt32BE instead of Int32Array (little-endian)\n- INT64: Use readBigInt64BE instead of BigInt64Array (little-endian)\n- FLOAT: Use readFloatBE instead of Float32Array (little-endian)\n- DOUBLE: Use readDoubleBE instead of Float64Array (little-endian)\n- TIMESTAMP: Use readBigInt64BE instead of BigInt64Array\n- DATE: Use readInt32BE instead of Int32Array\n- TEXT/STRING/BLOB: Use readInt32BE for length prefix\n- TSQueryDataSet format uses Java\u0027s big-endian byte order\n- TsBlock format (ColumnDecoder) already correctly uses little-endian\n- Fixes test failures where values were byte-swapped (e.g., 9 → 150994944)\n\n\n* Fix TsBlock deserialization to use big-endian byte order\n\n- Change ColumnDecoder to use big-endian for all numeric types\n- INT32/DATE: readInt32BE instead of readInt32LE\n- INT64/TIMESTAMP: readBigInt64BE instead of readBigInt64LE\n- FLOAT: readFloatBE instead of readFloatLE\n- DOUBLE: readDoubleBE instead of readDoubleBE\n- TEXT/STRING/BLOB: Already uses readInt32BE for length prefix\n- TsBlock format (queryResult) uses big-endian byte order\n- Matches C# client which reverses bytes from big-endian to little-endian\n- Fixes byte-swap errors where 100 was read as 1677721600\n\n\n* Fix insertTablet serialization and migrate to 1C3D cluster setup\n\nPart 1: Fix insertTablet column data serialization\n- Change INT32 from Int32Array (LE) to writeInt32BE (BE)\n- Change INT64 from BigInt64Array (LE) to writeBigInt64BE (BE)\n- Change FLOAT from Float32Array (LE) to writeFloatBE (BE)\n- Change DOUBLE from Float64Array (LE) to writeDoubleBE (BE)\n- Change DATE from Int32Array (LE) to writeInt32BE (BE)\n- All insertTablet data now uses big-endian to match IoTDB protocol\n- Fixes last 1c1d test failure: Expected 300, received 738263040\n\nPart 2: Migrate from 3C3D to 1C3D cluster configuration\n- Create docker-compose-1c3d.yml: 1 ConfigNode + 3 DataNodes\n- Set schema_replication_factor\u003d3 (metadata replicas)\n- Set data_replication_factor\u003d2 (data replicas)\n- Rename e2e-3c3d.yml workflow to e2e-1c3d.yml\n- Update workflow to use 1c3d docker-compose file\n- Update container names: iotdb-datanode-1/2/3 (not iotdb-datanode1/2/3)\n- CN count doesn\u0027t affect testing, reduces resource usage\n\n\n* Update all examples to use SessionDataSet iterator pattern\n\n- Update basic-session.ts to use hasNext()/next()/close()\n- Update session-pool.ts to use SessionDataSet API\n- Update table-session-pool.ts to use SessionDataSet API\n- Update multi-node.ts to use SessionDataSet API\n- Update ssl-connection.ts to use SessionDataSet API\n- Replace old QueryResult API (.rows, .columns) with modern iterator pattern\n- All examples now demonstrate proper resource cleanup with close()\n- Examples match new SessionDataSet documentation\n\n\n* Fix MultiNode E2E test failures\n\n- Add beforeEach() to clean up root.test database before each test\n- Ensure clean state prevents \"already exists\" errors\n- Fix \"Should create database and timeseries\" test to handle clean state\n- Reduce stress test operations from 30 to 10 per pool to avoid timeout\n- Add 30s timeout to stress test (was using default 5s)\n- Fix \"Should handle queries across all DataNodes simultaneously\" test:\n  - Insert data before querying to ensure results exist\n  - Add 500ms delay for data availability\n  - Add 20s timeout (was using default 5s)\n- Tests now properly handle multi-node cluster operations without timeouts\n\n\n* Initial plan\n\n* Fix beforeEach timeout in MultiNode E2E tests\n\nAdd 60000ms timeout to beforeEach hook to prevent timeout failures in multi-node cluster operations. The hook performs async operations (DROP DATABASE + setTimeout) that can take longer than Jest\u0027s default timeout, especially in multi-node environments.\n\nThis fixes the failing tests:\n- \"Should support nodeUrls configuration for multi-node setup\"\n- \"Should support nodeUrls configuration in object format\"\n\nFollows the same pattern as beforeAll (60000ms) and afterAll (90000ms) in the same file.\n\n\n* Optimize MultiNode tests - remove unnecessary cleanup and reduce delays\n\n- Remove beforeEach() cleanup - handle \"already exists\" errors like other tests\n- Create database with try-catch to ignore \"already exist\" errors (matches AllDataTypes.test.ts pattern)\n- Reduce replication wait from 2000ms to 200ms (10x faster)\n- Reduce data availability wait from 500ms to 100ms (5x faster)\n- Total time savings: ~2.5 seconds per test run\n- Matches pattern used in AllDataTypes.test.ts and SessionPool.test.ts\n- Tests now run much faster while maintaining correctness\n\n\n* Fix MultiNode test timeouts with parallel operations\n\n- Reduce stress test operations from 10 to 5 per pool (15 total)\n- Close datasets in parallel using Promise.all() instead of sequential loops\n- Process query results in parallel for 3 DataNodes simultaneously\n- Add explicit 10s timeouts to nodeUrls configuration tests\n- Parallel dataset closing is ~3x faster than sequential\n- Tests now complete well within timeout limits\n\n\n* Reduce IoTDB startup wait time in CI workflows\n\n- Reduce 1c1d startup wait from 45s to 5s\n- Reduce 1c3d startup wait from 75s to 5s\n- Total CI time savings: ~65 seconds per workflow run\n- Port verification step ensures containers are ready before tests run\n\n\n---------\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "e69a21f664c395da7ee684749c6607b8cd293afa",
      "old_mode": 33188,
      "old_path": ".github/workflows/check-thrift.yml",
      "new_id": "53fa8c5e81e1f55981264d86834f97d7ab44f7b7",
      "new_mode": 33188,
      "new_path": ".github/workflows/check-thrift.yml"
    },
    {
      "type": "modify",
      "old_id": "c7dff5f262619b4f76f741de5c44bd944eb69dff",
      "old_mode": 33188,
      "old_path": ".github/workflows/e2e-1c1d.yml",
      "new_id": "5f01d42b907d9dfee2f5392f4af092ee896dfd7c",
      "new_mode": 33188,
      "new_path": ".github/workflows/e2e-1c1d.yml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d2bfd81c5d785921d9a10c15345708a095c2f57b",
      "new_mode": 33188,
      "new_path": ".github/workflows/e2e-1c3d.yml"
    },
    {
      "type": "delete",
      "old_id": "a4021dd539c47a5b4788976e11de853ccd8a1ee7",
      "old_mode": 33188,
      "old_path": ".github/workflows/e2e-3c3d.yml",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "8b18027060d7d6eb34941e307f617e60f0d1148f",
      "old_mode": 33188,
      "old_path": "CI_CD_SUMMARY.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "6ce8d1ca6ba8b30edc115b405bae1dc709a7733d",
      "old_mode": 33188,
      "old_path": "COMMENT_RESPONSE_SUMMARY.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "41dcae54a47822746d9e09043afa00c0188f054b",
      "old_mode": 33188,
      "old_path": "DATABASE_CONSOLIDATION_SUMMARY.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "7b45224c8a224d32590f4aba60b53e882a103558",
      "old_mode": 33188,
      "old_path": "DATA_TYPES_IMPLEMENTATION_SUMMARY.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "9a50874ebc9d8bbb9dfae85788537cd71c521d1a",
      "old_mode": 33188,
      "old_path": "E2E_FIX_ANALYSIS.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "627d9edf04bf66899024bcd58a933b5203f984ed",
      "new_mode": 33188,
      "new_path": "E2E_TEST_STATUS.md"
    },
    {
      "type": "delete",
      "old_id": "af752d65e3c86565f5987eb6a0e1529827ed802f",
      "old_mode": 33188,
      "old_path": "ESLINT_9_UPGRADE.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "7228e2b67ac6209363c871356a0cc96f4244366f",
      "old_mode": 33188,
      "old_path": "GLOB_FIX_DETAILS.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "c7d038273daf12be753583b3b4b485b7c85aeba6",
      "old_mode": 33188,
      "old_path": "IMPROVEMENTS_SUMMARY.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "delete",
      "old_id": "9361fdb968d2ed63ad68b33a17407db3d4d1e011",
      "old_mode": 33188,
      "old_path": "NPM_DEPRECATIONS_FIXED.md",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "bb294fd5191da93821839d9d0dca4defb7ab1bb1",
      "old_mode": 33188,
      "old_path": "README.md",
      "new_id": "7e9dd9f0f00aa744c7c370ff3feb7273d89a64e1",
      "new_mode": 33188,
      "new_path": "README.md"
    },
    {
      "type": "modify",
      "old_id": "36990b76b36ed23f77c3a46bab9558306bd4a3e8",
      "old_mode": 33188,
      "old_path": "docker-compose-1c1d.yml",
      "new_id": "4f6c49b40e8b5f6a0473c5c23798090b264f7fc2",
      "new_mode": 33188,
      "new_path": "docker-compose-1c1d.yml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a71f76c11136b846943eebf996c9eb9fdfaf1d65",
      "new_mode": 33188,
      "new_path": "docker-compose-1c3d.yml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fbabc5c0f41f722ed24ffe633bce06a8bd3f984f",
      "new_mode": 33188,
      "new_path": "docs/README.md"
    },
    {
      "type": "rename",
      "old_id": "60c08b60a1ca787ed798cc86e97091488a005e0e",
      "old_mode": 33188,
      "old_path": "DATA_TYPES.md",
      "new_id": "60c08b60a1ca787ed798cc86e97091488a005e0e",
      "new_mode": 33188,
      "new_path": "docs/data-types.md",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "dc3cecee7c5d18d3b8f5a8d22f3809373349cf77",
      "old_mode": 33188,
      "old_path": "BUILD_INFRASTRUCTURE_ANALYSIS.md",
      "new_id": "dc3cecee7c5d18d3b8f5a8d22f3809373349cf77",
      "new_mode": 33188,
      "new_path": "docs/development/build-infrastructure.md",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "690b6a9b367ab7639c3b44a95a003ebc309e6624",
      "old_mode": 33188,
      "old_path": "DEBUGGING_E2E.md",
      "new_id": "690b6a9b367ab7639c3b44a95a003ebc309e6624",
      "new_mode": 33188,
      "new_path": "docs/development/debugging-e2e.md",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "42fd9183d5518fa74074b4115c7e862130f29b60",
      "old_mode": 33188,
      "old_path": "TEST_DATABASE_REFERENCE.md",
      "new_id": "42fd9183d5518fa74074b4115c7e862130f29b60",
      "new_mode": 33188,
      "new_path": "docs/development/test-database.md",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "ba5592b838cd12d3406eeaa36b6cd6d26e107a2e",
      "old_mode": 33188,
      "old_path": "IMPLEMENTATION.md",
      "new_id": "ba5592b838cd12d3406eeaa36b6cd6d26e107a2e",
      "new_mode": 33188,
      "new_path": "docs/implementation.md",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "414a4e8cc09d535beb342df63c0f23cb04db37b7",
      "old_mode": 33188,
      "old_path": "PROJECT_STATUS.md",
      "new_id": "414a4e8cc09d535beb342df63c0f23cb04db37b7",
      "new_mode": 33188,
      "new_path": "docs/project-status.md",
      "score": 100
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "abe8012b139cb56f0b45e51dee7c993a854c8aa8",
      "new_mode": 33188,
      "new_path": "docs/sessiondataset-guide.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e44ee38fb44ad7392e902431766c2c3906d77db0",
      "new_mode": 33188,
      "new_path": "docs/thrift.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7f1b0589467af9cb31daab45400450a04daa4266",
      "new_mode": 33188,
      "new_path": "docs/typescript-examples.md"
    },
    {
      "type": "modify",
      "old_id": "4830ae79c4ed87d3ab58e41b0d8464a99a3e88c4",
      "old_mode": 33188,
      "old_path": "examples/basic-session.ts",
      "new_id": "6e307a7467eb0ded1f8c8b4227b25d84d11a1236",
      "new_mode": 33188,
      "new_path": "examples/basic-session.ts"
    },
    {
      "type": "modify",
      "old_id": "a6edc50b5703d207ef5d5a3f0ed8dab56c648485",
      "old_mode": 33188,
      "old_path": "examples/multi-node.ts",
      "new_id": "a5597c700a907917f918ebda4df5a7eb578b812a",
      "new_mode": 33188,
      "new_path": "examples/multi-node.ts"
    },
    {
      "type": "modify",
      "old_id": "201be0476520622177c825a5b0d8c419a0b4042a",
      "old_mode": 33188,
      "old_path": "examples/session-pool.ts",
      "new_id": "2e31a1e1344afec4926a87a6c196c46ea7d562de",
      "new_mode": 33188,
      "new_path": "examples/session-pool.ts"
    },
    {
      "type": "modify",
      "old_id": "426de5caa51c1cfd529a0a29598c424248191cc8",
      "old_mode": 33188,
      "old_path": "examples/ssl-connection.ts",
      "new_id": "5fcf3debd1822713039489b517d91791b172432d",
      "new_mode": 33188,
      "new_path": "examples/ssl-connection.ts"
    },
    {
      "type": "modify",
      "old_id": "1d0b7e516a74011896306e48d4f1b93691112a51",
      "old_mode": 33188,
      "old_path": "examples/table-session-pool.ts",
      "new_id": "a9af5e523cc8b621fec745dc87de8c7d62751088",
      "new_mode": 33188,
      "new_path": "examples/table-session-pool.ts"
    },
    {
      "type": "modify",
      "old_id": "5c36a09c3550c1ced752acbc9ecef3651b57b357",
      "old_mode": 33188,
      "old_path": "package.json",
      "new_id": "c596a7aeb09d7848fdd0ad04dc7c76b8325c3fba",
      "new_mode": 33188,
      "new_path": "package.json"
    },
    {
      "type": "modify",
      "old_id": "b3a013bdb444c6d2979d942cc1e53b52ad8d1935",
      "old_mode": 33188,
      "old_path": "src/client/BaseSessionPool.ts",
      "new_id": "67705208b648d12e3082c3a63687a449ade4acee",
      "new_mode": 33188,
      "new_path": "src/client/BaseSessionPool.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "52701cc21022b19481ef9f86b1f6825e052b95f4",
      "new_mode": 33188,
      "new_path": "src/client/ColumnDecoder.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bb6b21c6b9deaba31fe0d8f2e5d2ac3b99dc2f4e",
      "new_mode": 33188,
      "new_path": "src/client/RowRecord.ts"
    },
    {
      "type": "modify",
      "old_id": "4f303ef11614cbdc413b90ca031354340166c852",
      "old_mode": 33188,
      "old_path": "src/client/Session.ts",
      "new_id": "c0e815633fec870e56ed2d77e2567b7448914878",
      "new_mode": 33188,
      "new_path": "src/client/Session.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "342809d9b79811b5507bafe73a99d0d32c11e03b",
      "new_mode": 33188,
      "new_path": "src/client/SessionDataSet.ts"
    },
    {
      "type": "modify",
      "old_id": "720825a063d332b85e51b17620f986ee8d768516",
      "old_mode": 33188,
      "old_path": "src/client/SessionPool.ts",
      "new_id": "46353dcec54a811de1e8125ce211618686a0333e",
      "new_mode": 33188,
      "new_path": "src/client/SessionPool.ts"
    },
    {
      "type": "modify",
      "old_id": "85c10544f9465ada8b860aedebeb4cfa2143f6ef",
      "old_mode": 33188,
      "old_path": "src/client/TableSessionPool.ts",
      "new_id": "abb02ff9e20a233ddc441c7a834bff6b83efe417",
      "new_mode": 33188,
      "new_path": "src/client/TableSessionPool.ts"
    },
    {
      "type": "modify",
      "old_id": "959f385bacac2015d1040fca72d88b488bb88d8b",
      "old_mode": 33188,
      "old_path": "src/connection/Connection.ts",
      "new_id": "e351d22c0e4684d6d22335b3d9e5c295a156865e",
      "new_mode": 33188,
      "new_path": "src/connection/Connection.ts"
    },
    {
      "type": "modify",
      "old_id": "79911b4b2adeeb88a95cad149e07b5dcfe2965f3",
      "old_mode": 33188,
      "old_path": "src/index.ts",
      "new_id": "2312f92922929e8502d09f41a40ba60240dae0c5",
      "new_mode": 33188,
      "new_path": "src/index.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "db3c947537d2f0a7877d58cca183b536172f0035",
      "new_mode": 33188,
      "new_path": "src/thrift/generated/IClientRPCService.d.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3a99ee2f4119d5ab0d757f843c024de634a046d2",
      "new_mode": 33188,
      "new_path": "src/thrift/generated/client_types.d.ts"
    },
    {
      "type": "modify",
      "old_id": "338f8046abc50584e989d67a8e1d3822309a87f3",
      "old_mode": 33188,
      "old_path": "src/thrift/generated/client_types.js",
      "new_id": "7eed3b969083a08af478422bfca2096e0d0c6a11",
      "new_mode": 33188,
      "new_path": "src/thrift/generated/client_types.js"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4af875d03f639aee51edac741bb52747e259c493",
      "new_mode": 33188,
      "new_path": "src/thrift/generated/common_types.d.ts"
    },
    {
      "type": "modify",
      "old_id": "c136bce8033bd38f5e9f97059c5e6e1e22766f3c",
      "old_mode": 33188,
      "old_path": "src/thrift/generated/common_types.js",
      "new_id": "86bb11447d2632ae89c6393d7ace8aabe0f5c513",
      "new_mode": 33188,
      "new_path": "src/thrift/generated/common_types.js"
    },
    {
      "type": "modify",
      "old_id": "af9f938d62022c71aab6c3b9963724978642672e",
      "old_mode": 33188,
      "old_path": "src/utils/Config.ts",
      "new_id": "6c6a77e6393cd236f665c48a5b9483325618fc46",
      "new_mode": 33188,
      "new_path": "src/utils/Config.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dab49508582daf1264d90df61aa2687a6db29d72",
      "new_mode": 33188,
      "new_path": "test.out"
    },
    {
      "type": "modify",
      "old_id": "111a2c0907706ad7fb3942de3e3ef9107c7ebb4b",
      "old_mode": 33188,
      "old_path": "tests/e2e/AllDataTypes.test.ts",
      "new_id": "2cb5316a86637de96ee52f9a3e1752b03eba0da9",
      "new_mode": 33188,
      "new_path": "tests/e2e/AllDataTypes.test.ts"
    },
    {
      "type": "modify",
      "old_id": "d7ad47bc7c1c89f702ee6f5d5226e687b6a03f30",
      "old_mode": 33188,
      "old_path": "tests/e2e/LargeQuery.test.ts",
      "new_id": "4479f53b62785ac8c7c992166175aa5f9cdcc3d5",
      "new_mode": 33188,
      "new_path": "tests/e2e/LargeQuery.test.ts"
    },
    {
      "type": "modify",
      "old_id": "17e7930b8d95f51832e520f7986f718026dce1e6",
      "old_mode": 33188,
      "old_path": "tests/e2e/MultiNode.test.ts",
      "new_id": "6a2fe13b6c6bf6d89ee82b00cc07c7a73c7f08ac",
      "new_mode": 33188,
      "new_path": "tests/e2e/MultiNode.test.ts"
    },
    {
      "type": "modify",
      "old_id": "c72d0519c042c5b9ca94a504b8bd3b5ea713e148",
      "old_mode": 33188,
      "old_path": "tests/e2e/Session.test.ts",
      "new_id": "313b52309c26ecf1c89a6772c52645e927555db1",
      "new_mode": 33188,
      "new_path": "tests/e2e/Session.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "95920376b7a3e4834471f631a289e0970f722416",
      "new_mode": 33188,
      "new_path": "tests/e2e/SessionDataSet.test.ts"
    },
    {
      "type": "modify",
      "old_id": "7a718aad25f549726589cfc5860354595a9dfb75",
      "old_mode": 33188,
      "old_path": "tests/e2e/SessionPool.test.ts",
      "new_id": "f1d4b58f46d42f6fafa317475ef8864d9940acf9",
      "new_mode": 33188,
      "new_path": "tests/e2e/SessionPool.test.ts"
    },
    {
      "type": "modify",
      "old_id": "f0c8dcca4063dea90d33b069d0c18d90e2e0adc5",
      "old_mode": 33188,
      "old_path": "tests/e2e/TableModelDataTypes.test.ts",
      "new_id": "eb744310277edbb3143bf7e4af13e64bddbc1018",
      "new_mode": 33188,
      "new_path": "tests/e2e/TableModelDataTypes.test.ts"
    },
    {
      "type": "modify",
      "old_id": "83679219cf39fbf72a54ba0f878e51d5d9aeb01d",
      "old_mode": 33188,
      "old_path": "tests/e2e/TableSessionPool.test.ts",
      "new_id": "aacf93ffb60b584958e97d92674d85cde58d5e9b",
      "new_mode": 33188,
      "new_path": "tests/e2e/TableSessionPool.test.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e44ee38fb44ad7392e902431766c2c3906d77db0",
      "new_mode": 33188,
      "new_path": "thrift/README.md"
    }
  ]
}
