)]}'
{
  "log": [
    {
      "commit": "dded09d82a84ae5e637c3e7c42e0240aacb4e23b",
      "tree": "c413785ba9430bf31111a0ae7086231a7a940257",
      "parents": [
        "706b772334e67740187ab7642c73342dbe9e28c2"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Thu Jul 23 19:58:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 19:58:48 2026 -0700"
      },
      "message": "[UUID 2/8] UUID ingest and segment storage (#18870)\n\nPart 2/8 of splitting apache/pinot#18140 (logical UUID type). Rebased onto master, which includes the merged #18869 type foundation.\n\nDownstream references use the UuidKey class merged in #18869."
    },
    {
      "commit": "706b772334e67740187ab7642c73342dbe9e28c2",
      "tree": "42fb0fd35173047529313c08fcaa287ac8ff5580",
      "parents": [
        "867b53b7489d476407a09ca5f40b12a42693e58c"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Jul 23 15:31:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 15:31:54 2026 -0700"
      },
      "message": "Simplify getMovingConsumingSegments and drop per-segment stream allocation (#19068)"
    },
    {
      "commit": "867b53b7489d476407a09ca5f40b12a42693e58c",
      "tree": "2a03344fcea92becfeb231e21785fbad1376c867",
      "parents": [
        "afbf3049019b7cc337287d6647a7f32902b5e250"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Jul 23 13:50:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:50:58 2026 -0700"
      },
      "message": "Skip full target recompute on IdealState version change for strict realtime rebalance that only moves tier segments (#19054)"
    },
    {
      "commit": "afbf3049019b7cc337287d6647a7f32902b5e250",
      "tree": "fd8f56dafe1aca09f87ff2ed3dadf2219e0a75ee",
      "parents": [
        "3b2eeca5e7b63d19a97c79f681b5d5b4b90d740c"
      ],
      "author": {
        "name": "Jhow",
        "email": "44998515+J-HowHuang@users.noreply.github.com",
        "time": "Thu Jul 23 13:49:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:49:02 2026 -0700"
      },
      "message": "Cache segment to tier map at rebalance start (#19055)"
    },
    {
      "commit": "3b2eeca5e7b63d19a97c79f681b5d5b4b90d740c",
      "tree": "8799469d24aff23ac559207c7ed5113a29cba3cb",
      "parents": [
        "280f6b655a81fb055d6a15efc05e5d53c5e4d7a9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 11:51:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:51:00 2026 -0700"
      },
      "message": "Bump it.unimi.dsi:fastutil from 8.5.18 to 8.5.19 (#19063)"
    },
    {
      "commit": "280f6b655a81fb055d6a15efc05e5d53c5e4d7a9",
      "tree": "64dbdb03b28e4ec9c7edcdd64bb3aeba746997d5",
      "parents": [
        "33433f056d243935f5dac284d602bcf8b3ef945a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 11:50:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:50:41 2026 -0700"
      },
      "message": "Bump io.grpc:grpc-bom from 1.82.2 to 1.83.0 (#19062)"
    },
    {
      "commit": "33433f056d243935f5dac284d602bcf8b3ef945a",
      "tree": "adec6af4223f846d66a9f42e182d931eabd7c53f",
      "parents": [
        "682b94b24bb7d0dbf6d0891fcd1456ef47e4b645"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 11:50:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:50:21 2026 -0700"
      },
      "message": "Bump org.mongodb:bson from 5.9.0 to 5.9.1 (#19061)"
    },
    {
      "commit": "682b94b24bb7d0dbf6d0891fcd1456ef47e4b645",
      "tree": "dc52e7f391ae4a800507b95d391f56e248a21812",
      "parents": [
        "e3f2bf5fc3604bff33b02c1a4fad2da4e63c2ba6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 11:50:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:50:01 2026 -0700"
      },
      "message": "Bump org.webjars:swagger-ui from 5.32.8 to 5.32.11 (#19060)"
    },
    {
      "commit": "e3f2bf5fc3604bff33b02c1a4fad2da4e63c2ba6",
      "tree": "ed023365c1e9e9d40b9bc6a3d98414a845a61c18",
      "parents": [
        "2298c6d8c62e7bc4e5946d4d9a10fcd5034379a4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 11:46:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:46:11 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.49.0 to 2.49.1 (#19059)"
    },
    {
      "commit": "2298c6d8c62e7bc4e5946d4d9a10fcd5034379a4",
      "tree": "79962f6ac089d35fbb07c6c621cb30392461c3d1",
      "parents": [
        "86535a9b6b3ec5e959bff9fb2d8cc14f59fc68aa"
      ],
      "author": {
        "name": "9aman",
        "email": "35227405+9aman@users.noreply.github.com",
        "time": "Thu Jul 23 13:41:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 01:11:58 2026 -0700"
      },
      "message": "Skip selection LIMIT pruning for segments with externally-deleted docs (#19039)\n\nSelectionQuerySegmentPruner decrements the LIMIT budget by each segment\u0027s\nraw total doc count and prunes trailing segments. When a segment applies a\npost-selection doc mask that removes rows at query time (beyond upsert\u0027s\nvalidDocIds), the raw count overstates the surviving rows, so SELECT ... LIMIT\nand ORDER BY ... LIMIT can under-return (a correct prefix, short by the removed\nfraction). count(*) and aggregations are unaffected.\n\nAdd IndexSegment#hasDeletedDocIds() (default false) as a generic signal,\nindependent of upsert, that a segment carries externally-supplied deleted docs\ncounted in total docs but excluded at query time. The selection pruner skips\npruning when the first segment reports it, mirroring the existing upsert\ngetValidDocIds() guard. ImmutableSegmentImpl gains setHasDeletedDocIds(...) so\ncallers can mark such segments.\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "86535a9b6b3ec5e959bff9fb2d8cc14f59fc68aa",
      "tree": "da37992e84639b89fc007bdfec736cb5d05ad3e9",
      "parents": [
        "d512b22ecbdf88d0fe4921b88435bad3c085b808"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Jul 22 18:05:05 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 03:35:05 2026 +0530"
      },
      "message": "Fix explicit tableOptions hint handling in PinotImplicitTableHintRule (#19003)"
    },
    {
      "commit": "d512b22ecbdf88d0fe4921b88435bad3c085b808",
      "tree": "80e6816bb190ae92752c584ba3868cc5d275bcf3",
      "parents": [
        "fff8c9cf5a9576b10fb39c25fb510a985e78d9fa"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Wed Jul 22 13:52:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 13:52:03 2026 -0700"
      },
      "message": "Track segments with snapshot to improve upsert snapshot taking flow (#19028)"
    },
    {
      "commit": "fff8c9cf5a9576b10fb39c25fb510a985e78d9fa",
      "tree": "e5fbb94bf62ef5df7d8fc3d068ad7a7b77735706",
      "parents": [
        "4586982166920e3acb2c56c5d969822032070b0e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 00:15:17 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 00:15:17 2026 +0530"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.48.4 to 2.49.0 (#19050)\n\nBumps software.amazon.awssdk:bom from 2.48.4 to 2.49.0.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.49.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": "4586982166920e3acb2c56c5d969822032070b0e",
      "tree": "6d47fe0c0f73a516218d1505389785af394e00b4",
      "parents": [
        "51b9d74dd7b7e3240c47a0b403d2e3aa146a330a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 00:15:10 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 00:15:10 2026 +0530"
      },
      "message": "Bump com.squareup.okio:okio-bom from 3.17.0 to 3.18.0 (#19052)\n\nBumps [com.squareup.okio:okio-bom](https://github.com/lysine-dev/okio) from 3.17.0 to 3.18.0.\n- [Changelog](https://github.com/lysine-dev/okio/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/lysine-dev/okio/compare/parent-3.17.0...parent-3.18.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.squareup.okio:okio-bom\n  dependency-version: 3.18.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": "51b9d74dd7b7e3240c47a0b403d2e3aa146a330a",
      "tree": "e80e82c79b13d89bd3fba54a1ad5dc6b36b7e82b",
      "parents": [
        "de8cbd3380802c80d1e595dc44030ac79bd35b96"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Jul 22 14:27:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 23:57:44 2026 +0530"
      },
      "message": "Widen INT arithmetic to LONG in plus/minus/mult scalar functions (#19036)"
    },
    {
      "commit": "de8cbd3380802c80d1e595dc44030ac79bd35b96",
      "tree": "9f7f9331861498e9665082473ed84cec0ee2456f",
      "parents": [
        "c3cd3c70ad264665555b7204fc973e4adeb09c7d"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Wed Jul 22 16:04:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 16:04:07 2026 +0200"
      },
      "message": "[MSE] Remove the experimental enriched join feature (#19033)"
    },
    {
      "commit": "c3cd3c70ad264665555b7204fc973e4adeb09c7d",
      "tree": "1517e869c89b57a65468dda803fae5ea68aa3916",
      "parents": [
        "bde7223cf2973b93bb9bce3a8f03d356411baa78"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Wed Jul 22 04:29:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 04:29:25 2026 -0700"
      },
      "message": "Fix TDigest accumulator serialization through generic serdes for capacity-preserving state (#19017)\n\n* Fix TDigest accumulator serialization through generic serdes for capacity-preserving state\n\nPercentileTDigestAccumulator now overrides byteSize()/asBytes() to emit its\nmixed-capacity-safe serialize() bytes, so ObjectSerDeUtils.TDIGEST_SER_DE and\nCustomSerDeUtils.TDIGEST_SER_DE stay readable by plain MergingDigest.fromBytes\nreaders (percentileRawTDigest final results previously emitted verbose bytes\nwith more centroids than a fresh reader allocates, failing with\nArrayIndexOutOfBoundsException). Also routes percentileSmartTDigest through the\naccumulator, completing the #18996 routing.\n\n* Address review comments: null-safe merge, pending write-through in asBytes, static test imports"
    },
    {
      "commit": "bde7223cf2973b93bb9bce3a8f03d356411baa78",
      "tree": "20ac4f4127e154ec9dc1278f4796dab2d3bb0adb",
      "parents": [
        "385e38a9c0fe7d09b9e6c549935c61e8e4c92c0c"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Jul 21 23:58:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 23:58:08 2026 -0700"
      },
      "message": "Implement canProduceBitmaps and getBitmaps for AND and OR filter operators (#19038)"
    },
    {
      "commit": "385e38a9c0fe7d09b9e6c549935c61e8e4c92c0c",
      "tree": "5f1130720e2cad05821c9d94520ee20751cdafa4",
      "parents": [
        "7a6c7d954ae9ec06d42d6696028cc4065e7aec8e"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Tue Jul 21 19:10:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 16:10:24 2026 -0700"
      },
      "message": "Fix checkstyle failure in BaseSingleSegmentConversionExecutorTest (#19037)"
    },
    {
      "commit": "7a6c7d954ae9ec06d42d6696028cc4065e7aec8e",
      "tree": "f873fd717baf4aa83511fe99a5aa938529e4e33d",
      "parents": [
        "ffb1ffb1fab9e065b241c39597822f85eef68a00"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 21 11:47:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:47:17 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.48.3 to 2.48.4 (#19031)"
    },
    {
      "commit": "ffb1ffb1fab9e065b241c39597822f85eef68a00",
      "tree": "439fc14cc25c7710cca320800c2b3201545cb794",
      "parents": [
        "29cabf90e3358139c536ee125e83879f3d25f920"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 21 11:46:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:46:32 2026 -0700"
      },
      "message": "Bump com.microsoft.azure:msal4j from 1.25.0 to 1.25.1 (#19030)"
    },
    {
      "commit": "29cabf90e3358139c536ee125e83879f3d25f920",
      "tree": "be2c2090896c40d3960f675eface6010180ddbc9",
      "parents": [
        "ed2240ee74bf073c0200366712805fac1c5e3da1"
      ],
      "author": {
        "name": "tarun11Mavani",
        "email": "35224468+tarun11Mavani@users.noreply.github.com",
        "time": "Wed Jul 22 00:08:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:38:03 2026 -0700"
      },
      "message": "fix(minion): fail single-segment task when segment upload fails (#18813)"
    },
    {
      "commit": "ed2240ee74bf073c0200366712805fac1c5e3da1",
      "tree": "b6ce7381e40bb925ca91b892192f7150f488bcd0",
      "parents": [
        "7d62928d7e2ea4cbc589adfa76bb9204a3ae25f0"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Jul 21 10:58:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 10:58:19 2026 -0700"
      },
      "message": "Render non-String scalars in jsonPathString without JSON quotes (#19029)"
    },
    {
      "commit": "7d62928d7e2ea4cbc589adfa76bb9204a3ae25f0",
      "tree": "de5be515708c77e75cae295bfbb929a742cc7f40",
      "parents": [
        "a6d16ef377265b060635407e71e872fe3376aef6"
      ],
      "author": {
        "name": "tarun11Mavani",
        "email": "35224468+tarun11Mavani@users.noreply.github.com",
        "time": "Tue Jul 21 21:23:08 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 08:53:08 2026 -0700"
      },
      "message": "OPEN_STRUCT storage layer — columnar two-tier dense/sparse index (PR 2b/4) (#18643)\n\n* [WIP] OPEN_STRUCT storage layer — columnar two-tier dense/sparse index (PR 2/4)\n\nStorage layer for the OPEN_STRUCT column type: a self-describing column\nwhose keys are discovered at ingest time and stored columnar in two tiers.\n\nMutable (consuming) path:\n- MutableOpenStructIndex / MutableKeyColumn: per-key dictionary-encoded\n  forward index + presence bitmap, with 3-level type resolution (declared\n  child FieldSpec, else value-based inference) and maxDenseKeys capping.\n- MutableOpenStructDataSource exposes per-key DataSources to the query layer\n  via the OpenStructDataSource SPI; implemented as a MutableIndex.\n\nSeal / offline path:\n- OpenStructColumnSplitter classifies keys into dense vs sparse by fill rate\n  (plus explicit denseKeys and maxDenseKeys), writes each dense key as a\n  standard materialized column (col$key) with optional dictionary/inverted/\n  null-vector, and packs the rest into a single sparse JSON column\n  (col$__sparse__). Emits per-child and parent column metadata.\n- BaseSegmentCreator merges the splitter\u0027s per-child metadata into the\n  segment properties so each child loads as its own column.\n\nImmutable (sealed) path:\n- ImmutableSegmentImpl groups materialized children (parentColumn metadata)\n  under an ImmutableOpenStructDataSource in a single pass over column metadata.\n- ImmutableSegmentLoader keeps materialized children that are absent from the\n  user-facing schema.\n\nWiring / validation:\n- OpenStructIndexType + OpenStructIndexPlugin register the index; reader\n  factory is a no-op (children load as standard columns).\n- TableConfigUtils rejects user columns containing the reserved \u0027$\u0027 separator\n  when any field is OPEN_STRUCT.\n- RealtimeSegmentStatsContainer returns EmptyColumnStatistics for the parent.\n- V1Constants: PARENT_COLUMN, HAS_SPARSE_COLUMN; OpenStructNaming helpers\n  including shared value-\u003eDataType inference.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): support BIG_DECIMAL in dense materialization\n\nA BIG_DECIMAL-valued OPEN_STRUCT key aborted segment seal: BIG_DECIMAL is\nits own stored type (unlike BOOLEAN-\u003eINT, TIMESTAMP-\u003eLONG), so the splitter\u0027s\ntype switches hit `default: throw`. It is reachable via inferDataType for any\njava.math.BigDecimal or an explicit child FieldSpec.\n\nAdd BIG_DECIMAL as a variable-length stored type alongside STRING/BYTES in\nOpenStructColumnSplitter: getDefaultValue (BigDecimal.ZERO), dictionary build,\nraw var-byte forward index (putBigDecimal), and dictionary-vs-raw sizing.\nDictionary dedup uses BigDecimal.equals (matching SegmentDictionaryCreator\u0027s\nequals-keyed indexOfSV), not compareTo, so scale-differing equal values\n(1.0 vs 1.00) stay distinct instead of silently resolving to dict id 0.\n\nThe realtime mutable path and segment min/max metadata already handle\nBIG_DECIMAL and are unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): build dense dictionary and stats from a column stats collector\n\nTreats absent docs as null docs holding the default value (standard model). For keys\nwith absent docs, CARDINALITY now counts the default and MIN/MAX include it. Intended.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): emit dense child metadata via shared addColumnMetadataInfo\n\nReplaces the hand-written emitVirtualColumnMetadata with the standard metadata\nwriter plus the OPEN_STRUCT-specific keys (PARENT_COLUMN, hasNullValue,\nhasInvertedIndex). The shared writer additionally emits standard keys the old\ncode omitted, producing a superset of the previous metadata.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): size dict-vs-raw from collector stats; drop _distinctValuesPerKey\n\nReplaces the _distinctValuesPerKey distinct-string-set tracking with the sealed\nstats collector\u0027s cardinality and longest-element length. _totalRawBytesPerKey is\nretained for the var-length raw-size estimate.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): drop redundant dictionaryElementSize alias\n\ndictElementSize is already 0 on the raw path (only assigned when a dictionary\ncreator exists), so the conditional alias was a no-op. Pass it directly.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): write dense child indexes via standard index creators\n\nDrives each dense materialized child\u0027s forward, dictionary-id forward, and inverted index\nthrough the standard ForwardIndexCreator / DictionaryBasedInvertedIndexCreator obtained from\nStandardIndexes, using an IndexCreationContext built from the sealed stats collector (no\nTableConfig). The dict-vs-raw decision now mirrors BaseSegmentCreator.createDictionaryForColumn\n(standard default flags), and absent docs store the Pinot dimension null default. Deletes\nwriteRawForwardIndex, shouldUseDictionary, getDefaultValue, and _totalRawBytesPerKey.\n\nBehavior changes (intended, unreleased feature): absent-doc defaults are now dimension nulls\n(STRING \"null\", INT MIN_VALUE, ...); the local size-ratio dict downgrade is removed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): extract dict decision and index writing from writeDenseKeyColumn\n\nSplit the ~144-line writeDenseKeyColumn into a focused orchestrator plus two\nprivate helpers, mirroring how BaseSegmentCreator decomposes column creation:\n\n- resolveUseDictionary(...): the three-step dict-vs-raw decision.\n- writeForwardAndInvertedIndexes(...): dictionary + forward + inverted creation,\n  the per-doc add loop, and the nested resource handling; returns the dictionary\n  element size for metadata.\n\nBehavior-preserving — no logic, ordering, or resource-management change. Covered\nby the existing OpenStructColumnSplitterTest (16 tests).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* refactor(open_struct): move inferDataType out of OpenStructNaming into OpenStructTypeInference\n\ninferDataType performs value-\u003eDataType inference, an orthogonal concern to\nOpenStructNaming\u0027s column-name string mapping (it uses none of the naming\nconstants). Relocate it to a dedicated OpenStructTypeInference class in the same\npackage so each class has a single responsibility; update the two callers.\n\nBehavior-preserving — the method body is moved verbatim. The core Object\nclassification still delegates to PinotDataType.getSingleValueType; the\nremaining PinotDataType-\u003eDataType switch is OPEN_STRUCT-specific policy that\nexists nowhere else.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* feat(open_struct): build dense-key indexes via a generic creator loop (inverted/range/bloom)\n\nDrive per-key index creation from IndexService#getAllIndexes (filtered to the OPEN_STRUCT\nallowlist), building the dictionary separately and reconciling forward/dictionary encoding\nwith the dictionary decision. Each vetted index type\u0027s validate() runs against the resolved\nchild FieldSpec at build time so misconfigurations (e.g. range on a non-numeric raw key)\nfail with the canonical message instead of crashing inside the creator.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): seal dictionary in finally block so it survives IndexCreator failures\n\ndictCreator.seal() was positioned after the inner try/finally for index\ncreators. If any IndexCreator.seal() threw, the dictionary file was left\nunsealed on disk. Move seal into the inner finally so it runs regardless\nof index creator success/failure.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): wire OPEN_STRUCT through the offline batch segment-build pipeline\n\nThe OPEN_STRUCT storage/creator layer was implemented but the offline\nbatch ingestion pipeline (SegmentIndexCreationDriverImpl) was never made\nOPEN_STRUCT-aware, causing segment builds to throw.\n\nFour gaps fixed:\n- PinotDataType.getPinotDataTypeForIngestion: add OPEN_STRUCT case\n  returning MAP so the Map value passes through the transform pipeline\n  unchanged (unblocks both offline and realtime ingestion).\n- StatsCollectorUtil.createStatsCollector: add OPEN_STRUCT case using\n  MapColumnPreIndexStatsCollector and exclude from NoDictCollector opt.\n- ForwardIndexType.shouldCreateIndex: return false for OPEN_STRUCT\n  parent — it has no forward index (mirroring MutableSegmentImpl).\n- BaseSegmentCreator.writeMetadata: register splitter child columns in\n  the DIMENSIONS property so V3 converter discovers their index files.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): realtime consume→seal pipeline + e2e test\n\nFix three gaps in the realtime OPEN_STRUCT consume→seal path:\n\n1. MutableOpenStructIndex: remove consume-time dense-key cap that\n   incorrectly dropped keys by arrival order. All observed keys are\n   now retained; dense/sparse classification deferred to seal time\n   via OpenStructColumnSplitter.classify().\n\n2. PinotSegmentRecordReader: OPEN_STRUCT parent columns have no\n   forward index, so PinotSegmentColumnReader crashes on them. Track\n   OpenStructDataSource columns separately and reconstruct per-doc\n   map values via getMapValue(docId) for the row-major seal path.\n\n3. SegmentColumnarIndexCreator: the column-major build path (used by\n   RealtimeSegmentConverter when columnMajorSegmentBuilder is enabled)\n   also tried to create PinotSegmentColumnReader for OPEN_STRUCT\n   parents. Read from OpenStructDataSource.getMapValue(docId) instead,\n   feeding the map values to the OpenStructColumnSplitter.\n\nAdd OpenStructDataSource.getMapValue() as a default SPI method (throws\nUnsupportedOperationException), implemented by MutableOpenStructDataSource\nwhich reconstructs the map from per-key MutableKeyColumns.\n\nAdd realtime e2e integration test (OpenStructIngestionCommitRealtimeTest)\nthat validates: Kafka consume, forceCommit, COUNT(*), dense/sparse child\ncolumn presence and types, per-key forward/dictionary index_map, and\nparent/sparse metadata properties.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): preserve per-key inverted indexes through SegmentPreProcessor\n\nThe SegmentPreProcessor\u0027s InvertedIndexHandler was stripping inverted indexes\nfrom OPEN_STRUCT child columns because IndexLoadingConfig only knew about\nschema-level columns. Add addOpenStructChildConfigs() to resolve per-key\nFieldConfig from the parent\u0027s OpenStructIndexConfig and inject it into the\nconfig map before handlers run.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* test(open_struct): add offline OPEN_STRUCT ingestion + commit e2e test\n\nExercises the row-major offline build path (PinotSegmentRecordReader →\nSegmentColumnarIndexCreator) with the same per-key index matrix and\ndense/sparse validation as the realtime variant.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style(open_struct): convert Javadoc to /// markdown style\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* fix(open_struct): replace type-coercion WARN with ServerMeter counter, add parent Javadoc\n\n- Add OPEN_STRUCT_TYPE_COERCION_FAILURES ServerMeter for production visibility\n  when values are dropped due to type mismatch (replaces per-value LOGGER.warn)\n- OpenStructColumnSplitter: accumulate failures, emit metric + info log at seal\n- MutableOpenStructIndex: emit metric per-failure on realtime path\n- ImmutableOpenStructDataSource: document that parent index container is empty\n  and callers must use getDataSource(key) for per-key access\n\n* fix: replace Collections.emptyMap() with Map.of() in SegmentColumnarIndexCreator\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a6d16ef377265b060635407e71e872fe3376aef6",
      "tree": "de76d633b9c9c1d18bfc158af26ac2202993dfcc",
      "parents": [
        "b9e538a117e7a7934c6b656d7e0f77b6e89ee0b3"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Tue Jul 21 12:01:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 12:01:46 2026 +0200"
      },
      "message": "Fix ClassCastException in skip-leaf direct aggregation with deduplicated agg calls (#19023)"
    },
    {
      "commit": "b9e538a117e7a7934c6b656d7e0f77b6e89ee0b3",
      "tree": "831f74991dd63a842382985d06f2bfdfe28f2b87",
      "parents": [
        "e7c9043b17f8cf12fc817de66c0243b715314bca"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Mon Jul 20 21:06:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 12:06:44 2026 -0700"
      },
      "message": "[multistage] Fix flaky RAW_MESSAGES assertion in GrpcSenderBackpressureTest (#19020)"
    },
    {
      "commit": "e7c9043b17f8cf12fc817de66c0243b715314bca",
      "tree": "39932de97e83f1fbdccee88fdf5591e40dda006b",
      "parents": [
        "26110ff9c76c28e0f4d379cb281f24ac4b6d0b07"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 12:05:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 12:05:05 2026 -0700"
      },
      "message": "Bump axios from 1.16.0 to 1.18.0 in /pinot-controller/src/main/resources (#19022)"
    },
    {
      "commit": "26110ff9c76c28e0f4d379cb281f24ac4b6d0b07",
      "tree": "0a81708d270baeecdc3723b55fcb147b38eaacb2",
      "parents": [
        "28922369c889b448aaef396681b2966d1fb2a138"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 11:54:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 11:54:56 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.48.2 to 2.48.3 (#19018)"
    },
    {
      "commit": "28922369c889b448aaef396681b2966d1fb2a138",
      "tree": "2852a6619a877d6b844fa9c87362ee2483655c1d",
      "parents": [
        "fae8080bc7813e5fea7f4f3ed73615ff38eeed51"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Sun Jul 19 15:03:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 15:03:49 2026 -0700"
      },
      "message": "Upgrade Pinot to JDK 25 (#19014)\n\n* Bump org.apache.datasketches:datasketches-java from 6.2.0 to 9.0.0\n\n* Require JDK 25 baseline and port to datasketches-java 9.0.0\n\ndatasketches-java 9.0.0 ships Java 25 bytecode (its foreign-memory access\nlayer needs the FFM API finalized after Java 21), so the two changes are\ninseparable: Pinot services now build and run on JDK 25+.\n\n- pom: jdk.version 21 -\u003e 25; enforcer rule and message updated; SPI/client\n  modules keep their hard-coded Java 11 bytecode targets\n- Port all datasketches call sites (pinot-segment-local, pinot-core,\n  pinot-integration-tests) to the 9.0.0 API: theta/tuple/frequencies class\n  renames, tuple.aninteger.IntegerSketch -\u003e IntegerTupleSketch, removed\n  Sketches utility classes, datasketches-memory Memory -\u003e\n  java.lang.foreign.MemorySegment\n- CI: unit/integration/quickstart/compat workflows to temurin-25; docker\n  publish matrices drop the no-longer-buildable JDK 21 variant; Dockerfile,\n  Dockerfile.build, Dockerfile.package defaults to 25\n- compatibility-verifier: stop forcing -Djdk.version\u003d21 on every build;\n  each tree now builds with its own pom default (release-1.5.0 targets 11,\n  current targets 25) - verified locally that release-1.5.0 builds on JDK 25\n- Add DataSketchesSerialCompatTest: pinned Base64 fixtures generated by\n  datasketches-java 6.2.0 for theta (ordered/unordered), integer tuple,\n  KLL doubles, CPC, frequent longs/strings, asserted through the query-path\n  ObjectSerDe instances including non-zero-position ByteBuffer wire paths\n- LICENSE-binary: datasketches-java 9.0.0; datasketches-memory removed\n  (9.0.0 no longer depends on it); docs (README, helm, CLAUDE.md) updated\n\n* Replace removed System.setSecurityManager usage in predownload test\n\nJEP 486 (JDK 24+) made System.setSecurityManager throw\nUnsupportedOperationException unconditionally. The test already intercepts\nSystem.exit via ExitHelper.setExitAction; restore the default action in the\nfinally block instead of the vestigial SecurityManager save/restore.\n\n* Add BenchmarkSketchSerDe covering sketch serde deserialize+merge hot paths\n\nBenchmarks the per-row ObjectSerDeUtils sketch deserialize + union/merge\npaths (theta, tuple, KLL, CPC) used by aggregation over serialized-sketch\nBYTES columns, to compare datasketches memory access layers across\nupgrades (6.2.0 Unsafe vs 9.0.0 java.lang.foreign MemorySegment).\n\n* Fix Comparable type mismatch in SerializedFrequent*Sketch wrappers\n\nThe wrappers declared Comparable\u003csketch type\u003e while runtime comparisons\n(final-result ordering) pass wrapper instances, so the erased compareTo\nbridge would throw ClassCastException. Align with every other Serialized*\ncustom object: implement Comparable\u003cwrapper\u003e and use Integer.compare.\nPre-existing issue surfaced by review on the datasketches type rename.\n\n* Address review comments: parameterize remaining raw tuple types, fix stale JDK 21 doc mentions\n\n---------\n\nCo-authored-by: Xiang Fu \u003cxiangfu.1024@gmail.com\u003e"
    },
    {
      "commit": "fae8080bc7813e5fea7f4f3ed73615ff38eeed51",
      "tree": "b17dcf55fc5a7162f1f942ea2b1431e289bc677c",
      "parents": [
        "dce035f9ce7358fbb3e8c3a45b15e3ea19b5f05e"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Sat Jul 18 19:21:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 19:21:49 2026 -0700"
      },
      "message": "[core] Optimize TDigest percentile aggregation (#18996)"
    },
    {
      "commit": "dce035f9ce7358fbb3e8c3a45b15e3ea19b5f05e",
      "tree": "7aef5fde016d31e587c400742cf3dc23b92ac597",
      "parents": [
        "54fdacede325180a0746c8cd07d59499b752757f"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Sat Jul 18 18:11:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 18:11:08 2026 -0700"
      },
      "message": "Add jsonPath*Fast / jsonPath*FirstMatch extractor functions (#18972)\n\nIngestion JsonPath extraction goes through Jayway (parse(json).read(path)),\nwhich builds a full Jackson DOM of the document and only then walks to the\nfield - once per row per derived column, a major ingestion CPU cost.\n\nThis adds a streaming Jackson-based extractor for simple linear paths ($\nfollowed only by .key, [\u0027key\u0027], [int]), exposed as opt-in scalar functions so\neach derived column chooses independently, in two clearly named families:\n\n  jsonPathStringFast/jsonPathLongFast/jsonPathDoubleFast(object, path, default)\n    - streaming, full scan; identical result to the existing Jayway jsonPath*\n      functions, just faster.\n  jsonPathStringFirstMatch/...FirstMatch(object, path, default)\n    - streaming, stops at the addressed field; faster still when the field is\n      early, at the cost of two documented behavior changes on undefined/corrupt\n      input (duplicate keys resolve to the first occurrence; a document malformed\n      strictly after the field is not rejected).\n\nBoth resolve a simple linear path in a single streaming pass and fall back to\nJayway for complex paths (wildcards, deep scan, filters, unions, slices,\nnegative indices) and non-JSON input, and also fall back to Jayway on any\nstreaming exception, so an unforeseen streaming bug can only cost a second parse\non a row, never a wrong result. The existing jsonPath* functions and the\njsonExtractScalar transform are unchanged. Server-local compute only - no wire,\nsegment, or config-schema change.\n\nComponents:\n  - SimpleJsonPath: compiles/caches the \"simple linear chain\" JsonPath subset,\n    returning null (-\u003e Jayway) for anything else. Plain ConcurrentHashMap cache\n    (lock-free reads) rather than a size-bounded Guava cache that locks per read.\n  - StreamingJsonPathExtractor: single forward pass with skipChildren() on\n    non-addressed subtrees; single- and multi-path overloads (the multi-path\n    single-pass form and byte[] overloads are engine support for follow-ups).\n  - JsonFunctions: the six opt-in scalar functions above.\n\nTesting:\n  - StreamingJsonPathExtractorTest: differential test against the exact Jayway\n    config it replaces (value level and through the Fast functions), a hand-\n    picked matrix (missing paths, invalid JSON, null/empty/whitespace/BOM, type\n    mismatches, nested arrays, unicode, duplicate keys, big/precise numbers,\n    dotted keys), randomized fuzz incl. a dedicated BigDecimal-context fuzz, the\n    one documented full-scan divergence pinned, the FirstMatch duplicate-key\n    divergence pinned, and a FunctionRegistry resolution check.\n  - JsonPathTest: derives columns via the new functions through ingestion\n    transform configs and asserts they equal the Jayway-derived column on both\n    query engines.\n  - BenchmarkJsonPathExtraction (pinot-perf): Jayway vs streaming, single- and\n    multi-column.\n\nNote on one full-scan divergence: Jayway materializes the whole document, so it\nrejects a value it can lex but not materialize (a string over maxStringLength, or\na float with an int-overflow exponent under BigDecimal) even outside the\naddressed path; the streaming extractor skips such subtrees and returns the\nrequested value. It never returns a different value for the addressed path."
    },
    {
      "commit": "54fdacede325180a0746c8cd07d59499b752757f",
      "tree": "2c5764f3ae90d57639bf74e6f0eb7cb8f76c0a6a",
      "parents": [
        "de2f596815f69b6a1ae17e01f898fdab0f20814d"
      ],
      "author": {
        "name": "Robert Lankford",
        "email": "rlankfo@gmail.com",
        "time": "Sat Jul 18 01:28:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 13:58:13 2026 +0530"
      },
      "message": "Fix docker-compose demo so cluster state and data survive restarts (#19004)\n\nThe docker-compose demo under docker/images/pinot had two issues that\nmade it break after a `docker compose down \u0026\u0026 up`:\n\n1. Pinot instance IDs were derived from the container IP because no host\n   was passed to the start commands. On restart, containers get new IPs,\n   so each service registered under a new instance ID and existing segment\n   assignments were orphaned on now-dead instances (segments reported as\n   unavailable, empty ExternalView). Pass -controllerHost/-brokerHost/\n   -serverHost/-minionHost so instance IDs are tied to the stable compose\n   hostnames instead.\n\n2. The controller, server, and Kafka data bind mounts pointed at container\n   paths the processes did not actually use (the controller wrote to\n   /tmp/data/PinotController, the server to /tmp/data/pinotServerData +\n   /tmp/data/pinotSegments, and Kafka to /tmp/kraft-combined-logs), so all\n   data lived on the ephemeral container layer and was lost on restart.\n   Align each process\u0027s data directory to its mounted volume via -dataDir/\n   -segmentDir and KAFKA_LOG_DIRS.\n\nVerified: after loading a realtime table and committing a segment, a\n`docker compose down \u0026\u0026 up` (without wiping ZooKeeper) brings the segment\nback ONLINE on the same stable server and queries return the expected rows."
    },
    {
      "commit": "de2f596815f69b6a1ae17e01f898fdab0f20814d",
      "tree": "c182d26cd4c2764bdc187e0cc3535f22bdb06bb0",
      "parents": [
        "41ee76b7ba66a5e7d200d99591544a58689eeb7e"
      ],
      "author": {
        "name": "Chaitanya Deepthi",
        "email": "45308220+deepthi912@users.noreply.github.com",
        "time": "Fri Jul 17 23:43:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 23:43:26 2026 -0700"
      },
      "message": "Add skipUpsertDelete query option to view valid docs instead of queryable docs (#19009)"
    },
    {
      "commit": "41ee76b7ba66a5e7d200d99591544a58689eeb7e",
      "tree": "0d5e8858688acf9877a42bab7a2a74b498cee10c",
      "parents": [
        "f216ed25ac2319fd3654febe062c9b097b2f74b3"
      ],
      "author": {
        "name": "Navina Ramesh",
        "email": "navina@startree.ai",
        "time": "Fri Jul 17 18:53:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 18:53:13 2026 -0700"
      },
      "message": "Fix UnsupportedOperationException when RLS filter combines with expression override (#19008)"
    },
    {
      "commit": "f216ed25ac2319fd3654febe062c9b097b2f74b3",
      "tree": "4d03194b4b585448b52d058197de5e8a75693d92",
      "parents": [
        "944ef22d1aa202d1554a1c6c253220c5002daf06"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Fri Jul 17 11:47:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 00:17:51 2026 +0530"
      },
      "message": "Add tests for chaining colocated joins, window functions and set operations without shuffle (#18997)"
    },
    {
      "commit": "944ef22d1aa202d1554a1c6c253220c5002daf06",
      "tree": "bf4f296394f4c26a7a4d205f9167d949d5edcae4",
      "parents": [
        "6a15b9a2b22d7efb186e60e58208d86db285f638"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jul 18 00:16:43 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 00:16:43 2026 +0530"
      },
      "message": "Bump com.google.cloud:libraries-bom from 26.85.0 to 26.85.1 (#19006)"
    },
    {
      "commit": "6a15b9a2b22d7efb186e60e58208d86db285f638",
      "tree": "16a32ec28cf733793279eaf51b7fa0c91276f6d8",
      "parents": [
        "00d1c88763d4015b9ce966ad7c13a52abf30f9b2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jul 18 00:16:32 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 00:16:32 2026 +0530"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.48.1 to 2.48.2 (#19005)"
    },
    {
      "commit": "00d1c88763d4015b9ce966ad7c13a52abf30f9b2",
      "tree": "022064ba487c6fca8dca35e214708a41248e72ed",
      "parents": [
        "1c3ad4b8b86e47f5483e782d9befecfbccdadda6"
      ],
      "author": {
        "name": "deepinsight coder",
        "email": "32898216+Vamsi-klu@users.noreply.github.com",
        "time": "Thu Jul 16 15:10:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:10:48 2026 -0700"
      },
      "message": "Expose authorization header in Swagger API docs (#18974)"
    },
    {
      "commit": "1c3ad4b8b86e47f5483e782d9befecfbccdadda6",
      "tree": "5753c35f82a83e14f4dbd8bfdfd1c7cead5941a2",
      "parents": [
        "371582a0d0958f704eba2573a2ff9b1ec4124aa3"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Fri Jul 17 03:35:07 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 15:05:07 2026 -0700"
      },
      "message": "Add unit tests for JsonIndexHandler index lifecycle (#18962)"
    },
    {
      "commit": "371582a0d0958f704eba2573a2ff9b1ec4124aa3",
      "tree": "ba4e9454ff1efc0f474701d5f1caa8c5bb153b54",
      "parents": [
        "1216618848ed4fc69e4aa4b514a8479823b87a26"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Jul 16 15:03:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 03:33:05 2026 +0530"
      },
      "message": "Add support for window function EXCLUDE clause (#18482)"
    },
    {
      "commit": "1216618848ed4fc69e4aa4b514a8479823b87a26",
      "tree": "7e674c6a35a2e82f1cda55057a2360fa51a21ac7",
      "parents": [
        "f054a9073fa0f61b441f8e17e4ba8d7a22ca58eb"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Fri Jul 17 03:11:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:41:51 2026 -0700"
      },
      "message": "Fix FSDirectory resource leak when IndexWriter construction fails in HNSW vector index (#18964)"
    },
    {
      "commit": "f054a9073fa0f61b441f8e17e4ba8d7a22ca58eb",
      "tree": "51f75636b8f9f1a9248e01c9b0cc99fd794d65ee",
      "parents": [
        "11eb00c9eb60ab31af4b2fb1898b8e87453e96f2"
      ],
      "author": {
        "name": "Jhow",
        "email": "44998515+J-HowHuang@users.noreply.github.com",
        "time": "Thu Jul 16 12:34:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 12:34:56 2026 -0700"
      },
      "message": "Update sortedness in metadata if disagree with ColumnStatistics (#18998)"
    },
    {
      "commit": "11eb00c9eb60ab31af4b2fb1898b8e87453e96f2",
      "tree": "f0da19d965100a4807182df4040e28defd7361fb",
      "parents": [
        "3790129aa15ec70d9870a5f61fa09b67d2a1fbc3"
      ],
      "author": {
        "name": "Jhow",
        "email": "44998515+J-HowHuang@users.noreply.github.com",
        "time": "Thu Jul 16 12:07:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 00:37:27 2026 +0530"
      },
      "message": "improve messages when resource utilization exceed (#18993)"
    },
    {
      "commit": "3790129aa15ec70d9870a5f61fa09b67d2a1fbc3",
      "tree": "e4248df45b22c8b6c1cfff432ffb5d90977b92b7",
      "parents": [
        "f93483005406af40aabce2a1a989ede8dfdd2c7a"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Thu Jul 16 20:37:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 20:37:20 2026 +0200"
      },
      "message": "Generate UUID sample data in the schema recommender (#18973)"
    },
    {
      "commit": "f93483005406af40aabce2a1a989ede8dfdd2c7a",
      "tree": "1303090cf616f0acbf8b57ab5bb1e701718f8df1",
      "parents": [
        "0270103952a8463b6a5cef4e89c81d619ee8266e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 16 11:15:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:15:54 2026 -0700"
      },
      "message": "Bump spark3.version from 3.5.8 to 3.5.9 (#18999)\n\nBumps `spark3.version` from 3.5.8 to 3.5.9.\n\nUpdates `org.apache.spark:spark-core_2.13` from 3.5.8 to 3.5.9\n\nUpdates `org.apache.spark:spark-sql_2.13` from 3.5.8 to 3.5.9\n\nUpdates `org.apache.spark:spark-launcher_2.13` from 3.5.8 to 3.5.9\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.spark:spark-core_2.13\n  dependency-version: 3.5.9\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.spark:spark-sql_2.13\n  dependency-version: 3.5.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.spark:spark-launcher_2.13\n  dependency-version: 3.5.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "0270103952a8463b6a5cef4e89c81d619ee8266e",
      "tree": "d6788f22e8e4fcf9b21371ca4ba7091f78d6a02f",
      "parents": [
        "00e5d7e33c9f8e8e3c7d1f499ad1b55f6da0f2c5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 16 11:15:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:15:51 2026 -0700"
      },
      "message": "Bump org.apache.ivy:ivy from 2.5.3 to 2.6.0 (#19000)\n\nBumps org.apache.ivy:ivy from 2.5.3 to 2.6.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.ivy:ivy\n  dependency-version: 2.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": "00e5d7e33c9f8e8e3c7d1f499ad1b55f6da0f2c5",
      "tree": "dc70ea97f4d5c048cfaeee7deae1055f1bea2295",
      "parents": [
        "8984d8c589e2b0010528fc4a977429364f35f5f9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 16 11:15:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 11:15:48 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.48.0 to 2.48.1 (#19001)\n\nBumps software.amazon.awssdk:bom from 2.48.0 to 2.48.1.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.48.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8984d8c589e2b0010528fc4a977429364f35f5f9",
      "tree": "cb190893989f647d69fb65e932fa3f3c1081d199",
      "parents": [
        "f865accd77820505953cfbb106523b34ef5c9a5e"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Jul 16 20:14:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 23:44:00 2026 +0530"
      },
      "message": "Include stage/worker/server provenance in MSE error block logs (#19002)"
    },
    {
      "commit": "f865accd77820505953cfbb106523b34ef5c9a5e",
      "tree": "89aeaa7396cc18eec56406652eae69881d8da507",
      "parents": [
        "fd772eedd5fb849f6aee5067f3509c768a326ece"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Jul 16 11:11:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 23:41:33 2026 +0530"
      },
      "message": "Support forcing colocated set operations to avoid data shuffle using query hint (#18804)"
    },
    {
      "commit": "fd772eedd5fb849f6aee5067f3509c768a326ece",
      "tree": "72aee972bed08657d42cdcf6d18862e9af07684b",
      "parents": [
        "6bdd2328092bef7f6a188b67c2b305166d5b6364"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Jul 15 11:03:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 23:33:49 2026 +0530"
      },
      "message": "Add regression test for unsatisfiable map-key predicates collapsing the scan to empty Values (#18995)"
    },
    {
      "commit": "6bdd2328092bef7f6a188b67c2b305166d5b6364",
      "tree": "98bf91a5216f05438d3d4022454bff32c40f099a",
      "parents": [
        "068b458883d645ee2c686ab2a5e123ef2ffe8cff"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 15 10:24:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 10:24:46 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.6 to 2.48.0 (#18994)"
    },
    {
      "commit": "068b458883d645ee2c686ab2a5e123ef2ffe8cff",
      "tree": "6a74d6cd7351968a9c6057187957907e65642dc5",
      "parents": [
        "a91a03345cfc007401be8e429e90cbef8a5a6060"
      ],
      "author": {
        "name": "Navina Ramesh",
        "email": "navina@startree.ai",
        "time": "Tue Jul 14 17:29:37 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 14:29:37 2026 -0700"
      },
      "message": "Add optional metadata map to FieldSpec (#18984)\n\nAdd an optional, additive Map\u003cString, String\u003e metadata to FieldSpec for\nfree-form per-column metadata: @JsonInclude(NON_EMPTY) so it is omitted when\nunset/empty, excluded from isBackwardCompatibleWith, and round-tripped via the\nshared appendFieldIdAndAliases helper (so TimeFieldSpec preserves it too).\n\nThe keys and their interpretation are defined by whoever populates it; the core\nschema attaches no semantics. Rolling-upgrade safe: old readers ignore the\nunknown property (concrete subclasses are @JsonIgnoreProperties(ignoreUnknown)),\nnew writers omit it when empty."
    },
    {
      "commit": "a91a03345cfc007401be8e429e90cbef8a5a6060",
      "tree": "0fbd9c272275a522128320c8f1cfbc98370b34ff",
      "parents": [
        "b240bda9f6a3052ab2b10ee693aeb2a1f37506c6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 11:35:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 11:35:49 2026 -0700"
      },
      "message": "Bump org.jetbrains.kotlin:kotlin-bom from 2.4.0 to 2.4.10 (#18990)"
    },
    {
      "commit": "b240bda9f6a3052ab2b10ee693aeb2a1f37506c6",
      "tree": "a15cf48492b013e6c1f3d26cb2c26c59ecc4d427",
      "parents": [
        "f20642ce475476d77be14c8eef27292dc8f2a3a6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 11:35:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 11:35:23 2026 -0700"
      },
      "message": "Bump actions/setup-node from 6 to 7 (#18989)"
    },
    {
      "commit": "f20642ce475476d77be14c8eef27292dc8f2a3a6",
      "tree": "05cf3171d822731f6eea4f2f0bdb560cf850deb2",
      "parents": [
        "36be41ba283b4ea4827ee973f6d76c8e0a7d25f3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 11:35:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 11:35:01 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.5 to 2.47.6 (#18988)"
    },
    {
      "commit": "36be41ba283b4ea4827ee973f6d76c8e0a7d25f3",
      "tree": "1c8063103f084a228d6bb69ec2103cadda7c9ad8",
      "parents": [
        "9a93618392cf3290b5713b71f1f2c73e2383b3de"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Tue Jul 14 19:34:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 16:04:39 2026 +0200"
      },
      "message": "Add unit tests for RangeIndexHandler version-change detection (#18958)"
    },
    {
      "commit": "9a93618392cf3290b5713b71f1f2c73e2383b3de",
      "tree": "3223c188eff9f99c2020ad5a2ff8759ebd056567",
      "parents": [
        "2cd8ae8bb386fa3596d85f56f079fab12141d00e"
      ],
      "author": {
        "name": "John Solomon J",
        "email": "45750230+johnsolomonj@users.noreply.github.com",
        "time": "Mon Jul 13 22:38:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 22:38:46 2026 -0700"
      },
      "message": "Add compression statistics tracking and table APIs (#18185)\n\nTrack uncompressed serialized value sizes and raw forward-index codecs in segment metadata behind the default-off compressionStatsEnabled table flag.\n\nExpose bounded, replica-aware compression summaries and optional per-column details through the table size and metadata APIs, with rolling-upgrade fallback, controller metrics, documentation, and focused coverage.\n\nCo-authored-by: John Solomon J \u003cjsolomonj@splunk.com\u003e"
    },
    {
      "commit": "2cd8ae8bb386fa3596d85f56f079fab12141d00e",
      "tree": "a3cfb2689c8259ac9992cdf611d481b2ac67165f",
      "parents": [
        "ecb288d666d4918b1a30e8dc185e0e761036db55"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Tue Jul 14 06:48:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 21:48:38 2026 -0700"
      },
      "message": "Fix compat-test Kafka setup: upgrade to 4.2.1 (KRaft) after 3.9.2 removal from downloads.apache.org (#18985)\n\nKafka 3.9.2 was dropped from the live Apache mirror (only current\nreleases are hosted there), and the archive.apache.org fallback is\nbandwidth-throttled so every 300s-capped curl attempt times out,\nfailing the compatibility test jobs after ~20 minutes.\n\n- Bump default Kafka to 4.2.1 (available on downloads.apache.org).\n  The live download URL is still tried first; on failure (404 once the\n  version rotates off) it falls back to the archive mirror, now logging\n  the HTTP status.\n- Convert the single-node setup to KRaft (Kafka 4.x is KRaft-only):\n  combined broker+controller config, controller listener on 19093,\n  storage format before start. Note Kafka 4.x brokers require clients\n  \u003e\u003d 2.1 (KIP-896); both suite sides use the kafka30 plugin (3.9.x).\n- Make the archive fallback stall-tolerant (abort below 100KB/s for\n  60s or after 30 min, single retry) so the worst case stays within\n  the job timeout, and clean up partial downloads on failure."
    },
    {
      "commit": "ecb288d666d4918b1a30e8dc185e0e761036db55",
      "tree": "621eb94c11594baef3ef3224ca7578d604f24332",
      "parents": [
        "d59403e74410ced40350a735b6568cc56734ac49"
      ],
      "author": {
        "name": "NOOB",
        "email": "harnoor@startree.ai",
        "time": "Tue Jul 14 09:49:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 21:19:51 2026 -0700"
      },
      "message": "Add server-level consumption rate limit observability metrics and fix byte-mode overflow (#18942)\n\n* Add server-level consumption rate limit observability metrics and fix byte-mode overflow\n\nServer-level realtime consumption rate limiting had two observability gaps:\n\n1. The server-wide quota utilization was published through the per-table\n   CONSUMPTION_QUOTA_UTILIZATION gauge keyed by the meter name \"realtimeRowsConsumed\".\n   Being a server-wide value, exporters mapped it to a misleading, per-table-shaped\n   series that server-level dashboards could not match.\n\n2. QuotaUtilizationTracker/AsyncMetricEmitter aggregated the per-minute unit count in\n   an int and cast the LongAdder sum to int in emit(). In byte-based throttling mode\n   the per-minute byte sum for a busy server exceeds Integer.MAX_VALUE (~35.8 MB/s over\n   the 60s window), overflowing to a negative utilization.\n\nThere was also no metric exposing the configured rate limit, so a dashboard could not\nshow the cap or whether limiting was enabled.\n\nChanges:\n- Add SERVER_CONSUMPTION_QUOTA_UTILIZATION (global) and emit the server-level\n  utilization through it instead of the per-table gauge.\n- Add SERVER_CONSUMPTION_RATE_LIMIT (global) and CONSUMPTION_RATE_LIMIT (per-table),\n  emitting the configured caps on limiter setup/config change (server gauge is set to\n  -1 when disabled; server utilization is reset to 0 on disable so the two server\n  gauges stay consistent).\n- Widen the per-minute aggregate and the emit() read to long to fix the byte-mode\n  overflow.\n\nBackward-incompatible metric change: the server-wide quota utilization moves from\nconsumptionQuotaUtilization{table\u003d\"realtimeRowsConsumed\"} to the new global gauge\nserverConsumptionQuotaUtilization; dashboards keyed on the old series should switch.\n\n* Add listener-level test verifying the rate-limit gauge updates on cluster config change\n\n* Do not reset the server utilization gauge on disable\n\nThe utilization gauge is a live measurement that stops updating once the\nlimiter is closed; on a rate-limit update the emitter keeps running so it\nself-corrects, and on disable the -1 cap already signals any last value is\nstale. Leaving it untouched keeps it consistent with the per-partition\nutilization gauge, which is likewise not reset on removal.\n\n* Remove per-partition rate limit gauges when the limit is removed\n\nA partition rate limit change only takes effect when the next consuming\nsegment creates its rate limiter. When that creation finds no configured\nlimit (i.e. the limit was removed), remove the per-partition cap and\nutilization gauges so they do not linger with stale values. Removing a\nnever-emitted gauge is a no-op, so this is safe for partitions that never\nhad a limit and creates no new series.\n\n* Add lifecycle test: partition rate limit set, removed, then set again\n\nUses a real metrics registry to verify the cap gauge is registered with the\nconfigured value, removed when a consumer is created without a limit, and\ncleanly re-registered with the new value when the limit is configured again."
    },
    {
      "commit": "d59403e74410ced40350a735b6568cc56734ac49",
      "tree": "545a7d7f17d14eb56d042c1236f0980eb241b2c5",
      "parents": [
        "bf56bec552a1d141db32dedf18ab398cfa9678a7"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Tue Jul 14 03:34:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 18:34:31 2026 -0700"
      },
      "message": "Support binary JSON payload formats (PostgreSQL jsonb, SQLite JSONB, Smile, CBOR) in the JSON stream decoder (#18953)\n\n* Support binary JSON payload formats in the JSON stream decoder\n\nJSONMessageDecoder only understood UTF-8 text JSON. Add a pluggable\npayload-format layer so a stream can also carry PostgreSQL jsonb, SQLite\nJSONB, Smile, or CBOR, selected with the new `jsonFormat` decoder\nproperty.\n\nWhen `jsonFormat` is unset (equivalently AUTO) the encoding is detected\nper message from its leading magic/version bytes, falling back to text\nJSON. Detection is allocation-free and cannot mis-route a well-formed\ntext JSON document: a top-level `{`/`[`, optionally after whitespace,\ncollides with none of the binary signatures. Pin `TEXT` to skip\ndetection entirely.\n\nEvery format decodes to the same `Map\u003cString, Object\u003e` contract Jackson\nproduces for text JSON, so the existing JSONRecordExtractor handles all\nof them unchanged.\n\nNotes on the two hand-rolled decoders:\n\n- PostgreSQL jsonb\u0027s wire format is *not* its on-disk JsonbContainer\n  layout. `jsonb_send` renders the value with JsonbToCString and emits a\n  version byte followed by text JSON; `jsonb_recv` reverses it. Every\n  standard binary producer (v3 protocol, COPY ... WITH (FORMAT binary),\n  logical replication via pgoutput) routes through that send function,\n  so this parser strips the version byte and parses the text body.\n\n- SQLite JSONB (3.45+) is a genuine binary format and is decoded per\n  spec, including the JSON5 element types. Nested elements are bounded\n  by their enclosing container, not merely by the payload, so a crafted\n  element cannot overrun its parent and silently swallow later siblings.\n\nAdds jackson-dataformat-smile and jackson-dataformat-cbor (versions\nmanaged by jackson-bom) and records both in LICENSE-binary.\n\n* Address review: reject SQLite JSONB payloads not exactly filled by their top-level element\n\nSQLite\u0027s JSONB validity rule requires the outer element to exactly fill\nthe BLOB. Without that check a top-level element declaring a short size\n(e.g. a bare 0x0C empty object followed by real data) decoded to a\npartial -- possibly empty -- row and silently discarded the trailing\nbytes, which AUTO made reachable for any payload whose first byte\ncarries the OBJECT nibble. Reject when the cursor does not land on the\npayload limit, and cover it with parser- and decoder-level regression\ntests.\n\nAlso from review:\n- Fix a malformed nested {@code {} construct in the JSONMessageDecoder\n  Javadoc that terminated the inline tag early.\n- Keep the original exception as the cause when fromConfig() rejects an\n  unsupported jsonFormat.\n- Rename testDefaultIsText -\u003e testUnsetFormatAutoDetectsText; the\n  default is AUTO, not a pinned TEXT format.\n- Pin test fixtures to UTF-8 instead of the platform default charset.\n\nAdds coverage for the previously untested SQLite branches: size\ndescriptors 14/15 (including rejection of an oversized uint64 size),\nsigned hex INT5, FLOAT5 with a leading \u0027+\u0027, the \\u escape, the TEXT5\nescape extensions, and the missing-value / non-text-label errors.\n\n* Bound the decode-failure diagnostic and pin it to an explicit charset\n\nThe decode() failure message echoed the whole payload via\nnew String(payload, offset, length), which uses the platform default\ncharset. That was tolerable when the payload was always text JSON, but\nthe binary encodings make it a liability: an arbitrarily large Smile /\nCBOR / SQLite JSONB message was decoded as mojibake and dumped into the\nlog in full.\n\nRender at most the first 128 bytes, as UTF-8 when they contain no\ncontrol characters other than whitespace and as hex otherwise, and\nalways report the true payload length. Text payloads keep their readable\nrendering; binary payloads become a short hex prefix.\n\n* Use separate text and hex windows for the decode-failure diagnostic\n\nA single 128-byte cap kept binary payloads out of the log but truncated\nmalformed text records before the offending field, losing the operator\ncontext the old full-payload message provided.\n\nRender up to 512 bytes of text but only 128 bytes as hex; since hex costs\ntwo characters per byte, both produce a message of comparable length.\n\n* Assert the two decode-diagnostic behaviors that were claimed but untested\n\nBoth changes were described in the review thread but nothing verified\nthem, so a regression would have gone unnoticed:\n\n- fromConfig() now has a test that captures the IllegalArgumentException\n  and asserts both the message contents and that the underlying valueOf\n  failure survives as the cause. The previous assertThrows passed even\n  before the cause was chained.\n\n- describePayload()\u0027s \"bytes \u003e\u003d 0x80 are not control characters, so\n  non-ASCII UTF-8 still renders as text\" branch had no fixture: every\n  case was pure ASCII or contained a low control byte forcing the hex\n  path. Added a multibyte UTF-8 payload.\n\n* Default unset jsonFormat to TEXT and gate SQLite auto-detection on exact fill\n\nDefaulting an unset jsonFormat to AUTO turned per-message detection on\nfor every existing JSON stream, which is a backward-compatibility and\ndata-correctness change: SqliteJsonbPayloadParser.matches() gated only on\nthe OBJECT low nibble, so roughly one arbitrary binary byte in sixteen\nclaimed the payload, and a lone 0x0c is a validly-exact empty object. A\ncorrupt message that previously failed text decoding could therefore be\ningested as an empty row.\n\nTwo changes:\n\n- An unset jsonFormat now resolves to TEXT, preserving the decoder\u0027s\n  historical behavior byte for byte. AUTO must be requested explicitly.\n\n- SQLite detection additionally requires the top-level object\u0027s declared\n  size to exactly fill the payload -- the same validity rule parse()\n  enforces -- so AUTO can no longer hand a corrupt message to that parser\n  on the strength of a single nibble. The check is allocation-free and\n  covers all four size descriptors, including an 8-byte size whose sign\n  bit is set.\n\nTests assert that an unset format decodes text and rejects Smile, CBOR,\nPostgres, SQLite and a bare 0x0c; that explicit AUTO still detects each\nformat; and that detection accepts only exactly-filling SQLite objects.\n\n* Share one header decoder between SQLite detection and parsing\n\nmatches() and readElement() each carried their own copy of the element\nheader layout (size-descriptor -\u003e header width and declared size). They\nagreed, but nothing held them to it: every existing size-descriptor test\ndrives parse(), so a byte-order slip in the matches() copy -- reading a\n2-byte size as 0x0400 rather than 0x0004, say -- would have shipped\nsilently, either rejecting a valid SQLite object so AUTO fell back to\ntext, or claiming a payload that does not fill.\n\nExtract headerLength() and declaredSize() and call them from both, so\ndetection and parsing can no longer disagree about the layout, and the\nparse() tests now exercise the same code detection uses.\n\nAssert matches() over every size descriptor rather than only 14: an\nexactly-filling and an off-by-one case for each of 12/13/14/15, a\nbyte-order guard for the 2-byte size, truncated headers for each width,\nand that anything matches() claims parse() also accepts.\n\n* Add pinot-json README documenting the jsonFormat decoder property\n\nA user manual for the JSON input format plugin: the jsonFormat values,\nthe TEXT default and opt-in AUTO detection (with the per-message\ndetection order and its signatures), realtime table config examples for\ntext, a pinned binary format, and AUTO, plus per-format notes and the\ndecode-failure diagnostic behavior.\n\n* Reject non-canonical SQLite JSONB numbers and invalid UTF-8\n\nThe SQLite JSONB decoder was more permissive than text JSON on two paths,\nletting a corrupt stream message ingest a value Jackson would reject:\n\n- Canonical numbers (TYPE_INT / TYPE_FLOAT) shared the permissive JSON5\n  parsers. Double.parseDouble accepts NaN, Infinity, a leading \u0027+\u0027, Java\n  hex floats and type suffixes; Long.parseLong / BigInteger accept a\n  leading \u0027+\u0027 and leading zeros. So a malformed canonical number decoded\n  to a non-finite or non-canonical value instead of failing the record.\n  Validate TYPE_INT / TYPE_FLOAT against the RFC 8259 number grammar\n  before parsing, keeping the permissive handling only for the JSON5\n  types (TYPE_INT5 / TYPE_FLOAT5).\n\n- Text was decoded with new String(..., UTF_8), which substitutes U+FFFD\n  for malformed bytes. A corrupt record could therefore ingest mutated\n  field names or values. Decode with a CharsetDecoder configured for\n  CodingErrorAction.REPORT so invalid UTF-8 fails the record.\n\nAdds regressions: canonical NaN / Infinity / +1.5 / hex-float and +5 /\n007 are rejected while the JSON5 variants and canonical happy paths still\ndecode; valid multibyte UTF-8 decodes while a lone invalid byte in a\nvalue or field name is rejected.\n\n* Cap SQLite JSONB nesting depth and numeric-token length\n\nTwo hardening fixes on the SQLite JSONB decode path (per review):\n\n- Blocker: readElement -\u003e readArray/readObject recursed one frame per\n  nesting level with no depth cap. Each level is only ~1-3 wire bytes, so\n  a small (sub-MB) but deeply nested message could throw\n  StackOverflowError. Because that is an Error, not an Exception, it\n  escaped both JSONMessageDecoder.decode and StreamDataDecoderImpl.decode\n  (which catch Exception) and propagated to the consumer thread\u0027s\n  catch (Throwable), moving the whole consuming segment to ERROR -- a\n  poison pill from one bad record. Cap nesting at 1000 (Jackson\u0027s\n  StreamReadConstraints default) and throw IllegalArgumentException past\n  it, so deep nesting is handled as a bad record like every other\n  malformed input.\n\n- Numeric tokens fell back to new BigInteger(text), which is ~O(n^2). An\n  unbounded digit run (up to the payload size) was a per-message CPU sink\n  with no analogue in text JSON, which caps number length via Jackson.\n  Cap numeric tokens at 1000 characters to match.\n\nAdds deep-nesting and oversized-numeric regression tests (the existing\ntests only exercised shallow nesting), and documents the bare-0x0C\nempty-object AUTO caveat in the README."
    },
    {
      "commit": "bf56bec552a1d141db32dedf18ab398cfa9678a7",
      "tree": "63ccd06114e405edbfdb259b925cee02477ec3b0",
      "parents": [
        "9acb4348717e31e8f30b4b7072d1afd822d34655"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 17:18:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 17:18:07 2026 -0700"
      },
      "message": "Bump org.apache.thrift:libthrift from 0.23.0 to 0.24.0 (#18983)"
    },
    {
      "commit": "9acb4348717e31e8f30b4b7072d1afd822d34655",
      "tree": "3329a25c2dc375f437cbf907cb992174d63c0a0a",
      "parents": [
        "33c8a45632f55e8c48d0408d0ea2831daff9fd32"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 17:17:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 17:17:48 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.4 to 2.47.5 (#18982)"
    },
    {
      "commit": "33c8a45632f55e8c48d0408d0ea2831daff9fd32",
      "tree": "a3bb3a77bfb6a3cdf64a56766492c66dc5b92c94",
      "parents": [
        "a2a27a1e5146fe6687f5be5de038743f2bdbbfbd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 17:17:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 17:17:29 2026 -0700"
      },
      "message": "Bump bouncycastle.version from 1.84 to 1.85 (#18981)"
    },
    {
      "commit": "a2a27a1e5146fe6687f5be5de038743f2bdbbfbd",
      "tree": "82e205541753f494363e6cd48d3541c59ea0f036",
      "parents": [
        "e0210aaf2530fc123aa48f7560174c59d10aaec5"
      ],
      "author": {
        "name": "Timothy Elgersma",
        "email": "timothye@stripe.com",
        "time": "Sat Jul 11 21:26:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 18:26:41 2026 -0700"
      },
      "message": "Fix flaky SelectionCombineOperatorTest by waiting for workers before reading stats (#18946)\n\n* Fix flaky SelectionCombineOperatorTest by waiting for workers before reading stats\n\nIn `BaseSingleBlockCombineOperator.getNextBlock()`, `attachExecutionStats()` was called before `stopProcess()`, meaning worker threads could still be mutating operator state (specifically `_numDocsScanned` in `SelectionOnlyOperator`, a plain non-volatile `int`) when the main thread iterated over operators to aggregate statistics. This caused `numEntriesScannedPostFilter` (derived as `_numDocsScanned * numColumnsProjected`) to diverge from `numDocsScanned` when a worker thread updated `_numDocsScanned` between the two consecutive reads of it inside `getExecutionStatistics()`.\n\nThe fix restructures `getNextBlock()` so that `stopProcess()` — which already uses a `Phaser` to await all worker threads — runs in the `finally` block before `attachExecutionStats()` is called. No behavior change on the normal (non-early-termination) path.\n\nFix flakey test.\n\nReproduced the flake by adding `@Test(invocationCount \u003d 5000)` to `selectionOnly()` and running against the pre-fix code: failed twice with `expected [30] but found [20]` and `expected [50] but found [40]`(numEntriesScannedPostFilter ≠ numDocsScanned). The same 5000-iteration run passes cleanly with the fix applied.\n\nSafe to revert. The change only reorders when `stopProcess()` is called relative to `attachExecutionStats()` within a single query execution; it has no effect on query results or external behavior, only on the correctness of execution statistics under early termination.\n\n* wrap the whole body in another try catch to avoid throwing anything at all."
    },
    {
      "commit": "e0210aaf2530fc123aa48f7560174c59d10aaec5",
      "tree": "898c97239a7413f739e4d2c47cbda359941177fe",
      "parents": [
        "f37bbe5980f82424898bd4a8df1b4c8fc426e2da"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Sat Jul 11 07:34:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 22:34:37 2026 -0700"
      },
      "message": "Report NOT_CALCULATED for uncomputable consuming-segment lag (#18836) (#18971)\n\nThe consuming-segments panel\u0027s \"Max Partition Availability Lag (ms)\" showed\nan epoch-sized value when a record\u0027s upstream ingestion timestamp was missing\nor invalid. The availability lag was computed as\n`lastProcessedTimeMs - recordIngestionTimeMs` without validating the ingestion\ntime, so a record with no timestamp (Kafka NO_TIMESTAMP \u003d -1, an unset\nLong.MIN_VALUE, or 0) turned the subtraction into a nonsensical ~now-sized lag\nthat leaked into the MAX_RECORD_AVAILABILITY_LAG_MS metric and the UI.\n\nGuard the availability-lag computation on `getRecordIngestionTimeMs() \u003e 0` in\nall three StreamMetadataProvider implementations (kafka-3.0, kafka-4.0,\nkinesis) so an invalid ingestion time reports the SPI\u0027s\nPartitionLagState.NOT_CALCULATED sentinel instead. Also replace the hard-coded\n\"UNKNOWN\" fallback (offset and availability lag) with NOT_CALCULATED to align\nwith the SPI-defined sentinel; downstream consumers (RealtimeConsumerMonitor,\nUI) already treat it as \"no value\".\n\nAdd per-module regression tests covering valid, unset, NO_TIMESTAMP (-1), and\n0 ingestion times, plus the offset-lag fallback."
    },
    {
      "commit": "f37bbe5980f82424898bd4a8df1b4c8fc426e2da",
      "tree": "368f35cbef82f2f9559c9a07f55fe1e40d22450e",
      "parents": [
        "e7b57c06ec7d1225c6a1489017d31fffe8b1ef32"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Sat Jul 11 03:58:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 18:58:43 2026 -0700"
      },
      "message": "Map recommender Avro schema by original data type, not stored type (#18970)\n\n* Map Avro schema by original data type, not stored type\n\n`AvroSchemaUtil.toAvroSchemaJsonObject` switched on `getStoredType()`,\ncollapsing logical types to their physical storage: a BOOLEAN field\nemitted Avro `\"int\"` and TIMESTAMP a plain `\"long\"`, so the generated\nAvro schema misrepresented the column and could not round-trip back to\nBOOLEAN/TIMESTAMP.\n\nSwitch on the original `DataType` instead: BOOLEAN -\u003e Avro `boolean`,\nTIMESTAMP -\u003e `timestamp-millis` long, UUID -\u003e `bytes` (unchanged), all\nothers unchanged. `AvroWriter` coerces the generator\u0027s stored int `0`/`1`\nfor BOOLEAN columns to a `Boolean` so the new schema serializes, with the\nboolean columns resolved once per file rather than per row.\n\nThe segment-processing converters `AvroUtils.getAvroSchemaFromPinotSchema`\nand `SegmentProcessorAvroUtils.convertPinotSchemaToAvroSchema`\nintentionally keep the stored type because they serialize physically\nstored values; this divergence is documented on `toAvroSchemaJsonObject`.\n\n* Dedupe nullable-union unwrap: reuse AvroRecordAppender.nonNullBranch in test\n\nAddress review nit: expose the appender\u0027s union-branch helper as\n@VisibleForTesting (returning the branch Schema) and have the test\u0027s\nnonNullBranch delegate to it instead of re-implementing the union walk."
    },
    {
      "commit": "e7b57c06ec7d1225c6a1489017d31fffe8b1ef32",
      "tree": "ac71a5499dc2a0d95ce65dd8c269e5f12c77269f",
      "parents": [
        "dbc50f4cad5e64b5d3a02a00ea4ac3acf781fea2"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Jul 10 23:16:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:16:56 2026 -0700"
      },
      "message": "Add MV BYTES and BIG_DECIMAL support to GenericRow serializer/deserializer (#18969)\n\nGenericRowSerializer/GenericRowDeserializer supported single-value BYTES and\nBIG_DECIMAL, but the multi-value switch branches only handled INT/LONG/FLOAT/\nDOUBLE/STRING. Serializing a row with an MV BYTES or MV BIG_DECIMAL column\nthrew IllegalStateException(\"Unsupported MV stored type\") in the segment\nprocessing framework.\n\nAdd the missing MV BYTES and BIG_DECIMAL cases to all four switch blocks\n(serialize size pass, serialize write pass, deserialize, compare), mirroring\nthe existing SV cases and the MV STRING length-prefixed layout. Extend\nGenericRowSerDeTest with both MV columns and add a negative compare test that\nexercises the non-zero and differing-cardinality branches."
    },
    {
      "commit": "dbc50f4cad5e64b5d3a02a00ea4ac3acf781fea2",
      "tree": "d202166c667f6978096854f7534ae2199fd6af24",
      "parents": [
        "e244b41dec7abdbc5ff1bc42b62fd838644eb433"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Jul 10 20:39:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:39:10 2026 -0700"
      },
      "message": "Follow-up to #18941: routing-filter pruner-invariant test + construction cleanup (#18951)\n\n* Follow-up to #18941: routing-filter test + construction cleanup\n\n#18941 fixed segment pruners throwing \"No enum constant\norg.apache.pinot.sql.FilterKind.\u003cop\u003e\" when a boolean scalar function is used\ndirectly as a predicate, by wrapping non-FilterKind operators as\nEQUALS(fn, true). This is a small follow-up on top of it.\n\nTest: add testMixedPredicateYieldsOnlyFilterKindOperatorsForPruners, which\nasserts the invariant pruners actually depend on -- every operator they traverse\nresolves via FilterKind.valueOf -- over a whole normalized filter tree rather\nthan a single wrapped node. It uses the shape of a reported failure, where\narrayContainsString canonicalized to the lowercase operator\n\"arraycontainsstring\" and sat directly under AND.\n\nCleanup: build the EQUALS/AND expressions via RequestUtils.getFunctionExpression\ninstead of hand-rolling Expression/Function and their operand lists in three\nplaces (addFilterExpression, the always-false literal branch, and\nwrapAsEqualsTrue). RequestUtils.getFunction already allocates a mutable\nArrayList for operands, so this is behavior-preserving; it also drops the now\nunused ExpressionType import.\n\n* Address review: assert pruner-visited nodes are FUNCTION expressions\n\nSegment pruners dereference filterExpression.getFunctionCall() unconditionally\nbefore resolving the operator, so a non-FUNCTION node NPEs them -- which is\nprecisely what ensureFilterIsFunctionExpression exists to prevent. The invariant\nhelper returned early on a null function call, so a regression producing a\nnon-FUNCTION node would have passed silently.\n\nAssert the function call is non-null instead of returning, and broaden the\npredicate under test to mix all the shapes that arrive non-FUNCTION or\nnon-FilterKind: a boolean scalar function, a bare boolean identifier, and a\nconstant-folded FALSE literal. Also assert no operand is dropped.\n\nVerified the assertion has teeth: reverting the identifier-wrapping in\nensureFilterIsFunctionExpression makes the test fail on the bare IDENTIFIER\nnode rather than pass."
    },
    {
      "commit": "e244b41dec7abdbc5ff1bc42b62fd838644eb433",
      "tree": "caf22af3231e081d39f18b15d49d77843a163a59",
      "parents": [
        "d25aa722e248a7e2f69ce4556dc83017f58a529a"
      ],
      "author": {
        "name": "Samuel Papin",
        "email": "spapin@users.noreply.github.com",
        "time": "Fri Jul 10 14:36:19 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 11:36:19 2026 -0700"
      },
      "message": "Sort lineage entries by timestamp then id for deterministic list output (#18859)\n\nSegmentLineage.toJsonObject() sorted entries by millisecond timestamp only, over a\nHashMap, so entries sharing a millisecond came out in arbitrary (UUID-hash) order\n-- non-deterministic list output, and a ~29% flake in testListSegmentLineage (two\nback-to-back replaces share a millisecond ~57% of the time on a fast machine).\n\nAdd the entry id as a sort tiebreaker so the output is deterministic for a given\nset of entries: (timestamp, then id). No change to id generation -- entries remain\nidentified by UUID. testListSegmentLineage derives the expected order with the same\n(timestamp, id) sort and asserts the response matches."
    },
    {
      "commit": "d25aa722e248a7e2f69ce4556dc83017f58a529a",
      "tree": "9707cedeb4810d12d6f7d6f2404b50f03361e785",
      "parents": [
        "a6457514843c4968f72c929a54735d5320a12ca4"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Fri Jul 10 23:15:37 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 10:45:37 2026 -0700"
      },
      "message": "Add equals() and hashCode() to VectorIndexConfig (#18957)"
    },
    {
      "commit": "a6457514843c4968f72c929a54735d5320a12ca4",
      "tree": "f6b9b88b87e16bc85181b75f092d7da38f54dae9",
      "parents": [
        "b474b311eccd3e8f3abcdb9b494ff65708112170"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Fri Jul 10 21:44:13 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:14:13 2026 -0700"
      },
      "message": "Fix JsonIndexConfig equals/hashCode missing _indexPaths and _maxBytesSize (#18959)"
    },
    {
      "commit": "b474b311eccd3e8f3abcdb9b494ff65708112170",
      "tree": "80a660fc54a8ddb192e561cf0417c49cbab15964",
      "parents": [
        "008774c76bda24275518c873926baa3ad279931d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 08:34:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:34:13 2026 -0700"
      },
      "message": "Bump org.mongodb:bson from 5.6.1 to 5.9.0 (#18965)\n\nBumps [org.mongodb:bson](https://github.com/mongodb/mongo-java-driver) from 5.6.1 to 5.9.0.\n- [Release notes](https://github.com/mongodb/mongo-java-driver/releases)\n- [Commits](https://github.com/mongodb/mongo-java-driver/compare/r5.6.1...r5.9.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.mongodb:bson\n  dependency-version: 5.9.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "008774c76bda24275518c873926baa3ad279931d",
      "tree": "4da138a96d122fe850bf080577af9d51f9582e2a",
      "parents": [
        "55302c1570eafecf763c9e541fdcdf73f34ffa55"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 08:34:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:34:09 2026 -0700"
      },
      "message": "Bump org.roaringbitmap:RoaringBitmap from 1.6.14 to 1.6.15 (#18966)\n\nBumps [org.roaringbitmap:RoaringBitmap](https://github.com/RoaringBitmap/RoaringBitmap) from 1.6.14 to 1.6.15.\n- [Release notes](https://github.com/RoaringBitmap/RoaringBitmap/releases)\n- [Commits](https://github.com/RoaringBitmap/RoaringBitmap/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.roaringbitmap:RoaringBitmap\n  dependency-version: 1.6.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "55302c1570eafecf763c9e541fdcdf73f34ffa55",
      "tree": "f71f812594965462eec4d3c57ef10e7c36752131",
      "parents": [
        "9605870ace980e0fbc0deb864442a4a20cb2228d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 08:34:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:34:05 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.3 to 2.47.4 (#18967)\n\nBumps software.amazon.awssdk:bom from 2.47.3 to 2.47.4.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.47.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9605870ace980e0fbc0deb864442a4a20cb2228d",
      "tree": "6760a2e571253c76f17664af78e46529403f956c",
      "parents": [
        "8e99d01b9b725db351a09d8616020d9b61e286a7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 08:34:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 08:34:01 2026 -0700"
      },
      "message": "Bump io.grpc:grpc-bom from 1.82.1 to 1.82.2 (#18968)\n\nBumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.82.1 to 1.82.2.\n- [Release notes](https://github.com/grpc/grpc-java/releases)\n- [Commits](https://github.com/grpc/grpc-java/compare/v1.82.1...v1.82.2)\n\n---\nupdated-dependencies:\n- dependency-name: io.grpc:grpc-bom\n  dependency-version: 1.82.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8e99d01b9b725db351a09d8616020d9b61e286a7",
      "tree": "fff2d50e0bf853abbfe78f12729ff36439835c3d",
      "parents": [
        "3019dc48bb1ad46bdd286bf8f1ff3f9db9d6174c"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Jul 10 09:09:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 00:09:08 2026 -0700"
      },
      "message": "Fix raw BYTES column min/max generation (#18952)"
    },
    {
      "commit": "3019dc48bb1ad46bdd286bf8f1ff3f9db9d6174c",
      "tree": "be86e46d4c6ee1703cbb002595195298ce772d02",
      "parents": [
        "e55c18172a5ddfc313dc79420d86268c167bec66"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Jul 09 23:53:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 23:53:45 2026 -0700"
      },
      "message": "Refactor upsert/dedup config validation into per-mode branches (#18956)"
    },
    {
      "commit": "e55c18172a5ddfc313dc79420d86268c167bec66",
      "tree": "02e2ff668ac077b6c7b644bea9f2a3a88e5f68d5",
      "parents": [
        "c6552066091a259513e0503a95a1e704a7f14543"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Jul 09 23:49:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 23:49:56 2026 -0700"
      },
      "message": "Add explicit target data type constructor to DataTypeColumnTransformer (#18954)"
    },
    {
      "commit": "c6552066091a259513e0503a95a1e704a7f14543",
      "tree": "27a7bf31996e0eab2ca5d0d591294fdbffba9176",
      "parents": [
        "04a294f3e2e393609e256efa8e2b95e2e20f5bfc"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Jul 09 23:47:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 23:47:57 2026 -0700"
      },
      "message": "Support no-dictionary aggregation-key columns in consuming segments and consolidate metrics-aggregation validation (#18955)"
    },
    {
      "commit": "04a294f3e2e393609e256efa8e2b95e2e20f5bfc",
      "tree": "3bc60f6541b2807eeb7592cafeca40fc9abf2c0c",
      "parents": [
        "849c6206237fd7ce7151229db87638bac9ff54c0"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Jul 10 07:50:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:50:58 2026 -0700"
      },
      "message": "Add BSON (MongoDB) input format support (#18950)\n\n* Add BSON (MongoDB) input format support\n\nAdd a new `pinot-bson` input-format plugin for reading MongoDB BSON data,\ncovering both batch and streaming ingestion:\n\n- BSONRecordReader reads mongodump-style files (concatenated length-prefixed\n  BSON documents); gzip files are supported transparently.\n- BSONMessageDecoder decodes one BSON document per stream message.\n- BSONRecordExtractor maps BSON\u0027s types onto the RecordExtractor contract:\n  ObjectId -\u003e hex String, DateTime -\u003e java.sql.Timestamp, Decimal128 -\u003e\n  BigDecimal (NaN/Infinity -\u003e null), Binary -\u003e byte[], embedded documents -\u003e\n  Map, arrays -\u003e Object[], with a toString() fallback for rare/deprecated types.\n\nBSON is registered in the FileFormat enum and RecordReaderFactory so\n`dataFormat: bson` works in batch ingestion out of the box, and the module is\nwired into the BOM, distribution assembly, tools, and LICENSE-binary. Uses the\nstandalone org.mongodb:bson library (no MongoDB driver / network dependency).\n\n* Address PR review comments\n\n- BSONRecordReader: on a truncated/corrupt tail, emit the already-read valid\n  record and defer the fetch error to the following next() call (via a stashed\n  IOException surfaced through hasNext()/next()), instead of discarding the last\n  valid record. Matches the emit-then-error behavior of JSONRecordReader.\n- BSONMessageDecoderTest: use assertSame instead of assertTrue(result \u003d\u003d row).\n- Add a reader regression test covering the truncated-tail case.\n\n* Address review: bound frame length, handle negative-zero Decimal128\n\n- BSONRecordReader: reject a frame length above the 16MB BSON maximum. A corrupt\n  length prefix (e.g. 0x7FFFFFFF) previously reached `new byte[length]` and raised\n  OutOfMemoryError, an Error that escapes the catch(RuntimeException)/catch(IOException)\n  recovery paths and aborts the segment build. It now surfaces as a recoverable\n  IOException before any allocation.\n- BSONRecordExtractor: negative-zero Decimal128 (a legal Mongo value, at any exponent)\n  has isNaN()\u003d\u003dfalse and isInfinite()\u003d\u003dfalse, so it slipped the guard and threw\n  ArithmeticException out of extract(). It now converts to BigDecimal.ZERO. There is no\n  public negative-zero predicate and Decimal128.parse(\"-0.00\") !\u003d NEGATIVE_ZERO, so the\n  exception is caught rather than pre-checked.\n- BSONRecordReader.open(): close the input stream if the first read fails, matching\n  JSONRecordReader.init().\n- BSONUtils: hoist the immutable DecoderContext to a static final field.\n- BSONRecordExtractor javadoc: correct the toString() fallback wording -- it also covers\n  the internal Timestamp type and the 5.x binary vector types.\n- Add regression tests for both fixed edge cases.\n\n* Address review: map BsonTimestamp, pin fallback strings, cover bson registration\n\n- BsonTimestamp (the oplog `ts` / change-stream `clusterTime` field) previously\n  fell through to value.toString() and ingested as the debug string\n  \"Timestamp{value\u003d..., seconds\u003d..., inc\u003d...}\". Convert it to java.sql.Timestamp\n  at second granularity, matching MongoDB\u0027s $toDate. The intra-second ordinal\n  counter is not representable and is dropped.\n\n- The remaining toString() fallbacks (MinKey, MaxKey, Symbol, Code,\n  BsonRegularExpression) render via formats that org.mongodb:bson does not\n  document, yet they are baked into segment data. testExoticTypeFallsBackToToString\n  asserted extract(x).equals(x.toString()), which is self-referential and pins\n  nothing. Pin the literal strings so a driver upgrade that reformats them fails\n  the build instead of silently rewriting segments.\n\n- Add a round-trip test for BSON binary subtypes 0x03/0x04 (how MongoDB stores\n  UUIDs). They currently decode to Binary -\u003e byte[] because DocumentCodec defaults\n  to UuidRepresentation.UNSPECIFIED; pin that so a default flip to java.util.UUID\n  (which would change the column from BYTES to a 36-char STRING) is caught.\n\n- RecordReaderFactoryTest enumerates every format\u0027s default reader class but\n  omitted bson, leaving `dataFormat: bson` resolution unverified and a typo in\n  DEFAULT_BSON_RECORD_READER_CLASS a runtime-only failure.\n\n- Document BSONUtils\u0027 thread safety (the shared DocumentCodec/DecoderContext are\n  immutable, so concurrent ingestion threads may decode). Note that Decimal128\n  extends Number, so its branch must stay above the Number pass-through.\n\n- Use /// Javadoc consistently across the plugin.\n\n* Read the BsonTimestamp seconds field as unsigned\n\nBSON stores a Timestamp\u0027s seconds component as an unsigned 32-bit field, but\nBsonTimestamp#getTime() returns it as a signed int. From 2038-01-19T03:14:08Z\nonward the high bit is set, so widening the raw value sign-extended it: a\n2039-01-01 oplog timestamp ingested as 1902-11-25.\n\nMask before widening. This matches the MongoDB server, which reads those seconds\nas unsigned."
    },
    {
      "commit": "849c6206237fd7ce7151229db87638bac9ff54c0",
      "tree": "05707816eca6e4fb86837d34cd950ca808753243",
      "parents": [
        "4ec85058e6575a0d8137b79833a61a84fac14d0d"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Jul 09 11:58:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 00:28:49 2026 +0530"
      },
      "message": "Enable broker segment pruning by default for the MSE logical planner (and fix routing-filter construction bugs it surfaces) (#18941)"
    },
    {
      "commit": "4ec85058e6575a0d8137b79833a61a84fac14d0d",
      "tree": "fe9679c04ff8e6f170980283bf0f4acb70964c64",
      "parents": [
        "13b3ce0d92883d0ab07b656b5c38e9636377cb12"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 09 22:29:46 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:29:46 2026 +0530"
      },
      "message": "Bump io.netty:netty-bom from 4.1.135.Final to 4.1.136.Final (#18945)"
    },
    {
      "commit": "13b3ce0d92883d0ab07b656b5c38e9636377cb12",
      "tree": "df3e0dff13336b6c5034fd9019b610609a4607f1",
      "parents": [
        "e76f5e5ca0f48153e5c9cc6794a108049dc62234"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 09 22:29:33 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:29:33 2026 +0530"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.1 to 2.47.3 (#18944)"
    },
    {
      "commit": "e76f5e5ca0f48153e5c9cc6794a108049dc62234",
      "tree": "98afb1200353826163bb17661d9a7b86c901c1cf",
      "parents": [
        "f29b359b8464b8d8f54aefa92e9fec37544f94e7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 09 22:29:23 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 22:29:23 2026 +0530"
      },
      "message": "Bump orc.version from 1.9.8 to 1.9.9 (#18943)"
    },
    {
      "commit": "f29b359b8464b8d8f54aefa92e9fec37544f94e7",
      "tree": "adb14b36b8e03f43a60e1e7421dc0f83bdb541bd",
      "parents": [
        "1f77985327d0a424604458391887321aa3936cf3"
      ],
      "author": {
        "name": "ilamhs",
        "email": "ikanniah@hubspot.com",
        "time": "Wed Jul 08 17:00:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 17:00:36 2026 -0700"
      },
      "message": "Fix SmartHLL ClassCastException in GROUP BY ORDER BY (#18841)"
    },
    {
      "commit": "1f77985327d0a424604458391887321aa3936cf3",
      "tree": "995852c8f11368b3d009601edc3f2db39198eb9f",
      "parents": [
        "eba4f6971bf11a738a375e87aa7556281f62c558"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 16:05:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 16:05:10 2026 -0700"
      },
      "message": "Bump org.apache.helix:helix-core from 2.0.0 to 2.0.1 (#18939)"
    },
    {
      "commit": "eba4f6971bf11a738a375e87aa7556281f62c558",
      "tree": "b02dfde6e177ab9b1d4e16c6b75a2c025770891e",
      "parents": [
        "08c64f3d722a5ab877098f4d09ae5ee918402d6e"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Wed Jul 08 15:29:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 15:29:53 2026 -0700"
      },
      "message": "Fix dateTimeConvert regression parsing decimal/scientific-notation epoch strings (#18940)"
    },
    {
      "commit": "08c64f3d722a5ab877098f4d09ae5ee918402d6e",
      "tree": "a8d0d7081363a7f459e818c7f9e72c40a58e7f0d",
      "parents": [
        "46ff7489c59a6559d3ccca2d732d2d105317ea1f"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Jul 08 14:11:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 02:41:56 2026 +0530"
      },
      "message": "Fix multi-stage physical optimizer failing to query empty tables (#18925)"
    },
    {
      "commit": "46ff7489c59a6559d3ccca2d732d2d105317ea1f",
      "tree": "e353852a849c2037b3909a14bd4b3d8fe2512c22",
      "parents": [
        "637b6b3babd59b1c9ccf46e40b656ca53e0f7039"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Wed Jul 08 13:03:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 13:03:49 2026 -0700"
      },
      "message": "Remove deprecated Kafka high-level-consumer (HLC) code (#18931)"
    },
    {
      "commit": "637b6b3babd59b1c9ccf46e40b656ca53e0f7039",
      "tree": "315433a00dbda2fcc3d8ac8cb2b2f8aedfba823a",
      "parents": [
        "93dcfc24e5f69cd88a4e4870179d3ea94ba00ae7"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Jul 08 13:01:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 01:31:07 2026 +0530"
      },
      "message": "Add broker pruning support to partitioned leaf path and logical tables in MSE (#18924)"
    },
    {
      "commit": "93dcfc24e5f69cd88a4e4870179d3ea94ba00ae7",
      "tree": "45e8f7683be5da4f6e824d59f549700d230e471a",
      "parents": [
        "23aa0888f2540f1683f49d73ee442b9c478e5322"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 22:24:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 22:24:47 2026 +0530"
      },
      "message": "Bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 (#18936)\n\nBumps [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.22.0 to 2.22.1.\n- [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.22.0...jackson-bom-2.22.1)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson:jackson-bom\n  dependency-version: 2.22.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "23aa0888f2540f1683f49d73ee442b9c478e5322",
      "tree": "b7c3d3d08550bde12e69e6fcd3abdde83baaf111",
      "parents": [
        "2fc75fcf5a3e33c6dc1ef41c6f6310b5e68aab71"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 22:24:38 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 22:24:38 2026 +0530"
      },
      "message": "Bump com.google.cloud:libraries-bom from 26.84.0 to 26.85.0 (#18937)\n\nBumps [com.google.cloud:libraries-bom](https://github.com/googleapis/google-cloud-java) from 26.84.0 to 26.85.0.\n- [Release notes](https://github.com/googleapis/google-cloud-java/releases)\n- [Changelog](https://github.com/googleapis/google-cloud-java/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/googleapis/google-cloud-java/commits/libraries-bom/v26.85.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.google.cloud:libraries-bom\n  dependency-version: 26.85.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": "2fc75fcf5a3e33c6dc1ef41c6f6310b5e68aab71",
      "tree": "109c7219fdc68363db7d9931018b52cbe3caf60e",
      "parents": [
        "b6c3ca686af50988a39e762151dcec3646466744"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 22:24:30 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 22:24:30 2026 +0530"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.47.0 to 2.47.1 (#18938)\n\nBumps software.amazon.awssdk:bom from 2.47.0 to 2.47.1.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.47.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b6c3ca686af50988a39e762151dcec3646466744",
      "tree": "8c7667a82d5fd4e3193821cff25772df2e163679",
      "parents": [
        "50dcbffb4dfc73122a6213cbf32d3401d90715d5"
      ],
      "author": {
        "name": "RAGHVENDRA KUMAR YADAV",
        "email": "raghavmnnit@gmail.com",
        "time": "Tue Jul 07 15:04:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 15:04:32 2026 -0700"
      },
      "message": "Fix vector index load failure on non-local segment directories (storeInSegmentFile\u003dtrue) (#18930)"
    },
    {
      "commit": "50dcbffb4dfc73122a6213cbf32d3401d90715d5",
      "tree": "8c0730184361040a0bf4f426c8c6180d6fef3eec",
      "parents": [
        "26aa88a2dea67fa062c23f25c4b6fabc806ea327"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Wed Jul 08 03:18:47 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 14:48:47 2026 -0700"
      },
      "message": "Refactor splitPart(limit) to avoid full array allocation (#18892)\n\nThe 4-argument splitPart overload previously allocated a full String[]\nvia StringUtils.splitByWholeSeparator on every call, even when only a\nsingle element was needed. This is wasteful in hot query paths where\nsplitPart is invoked per-row.\n\nReplace the array-based implementation with index-based forward scanning\nthat extracts only the requested field without materializing all split\nparts. The new implementation:\n\n- Skips leading separators\n- Collapses consecutive separators (matching splitByWholeSeparator semantics)\n- Handles trailing separators (producing one empty trailing token)\n- For positive indices: single forward scan, O(index) work\n- For negative indices: two passes (count then extract) but still no\n  String[] allocation\n\nFalls back to the array-based path only for null/empty delimiters\n(whitespace splitting) where the rules are complex.\n\nAll existing unit tests (172 cases including randomized fuzz) pass\nunchanged, confirming behavioral equivalence."
    },
    {
      "commit": "26aa88a2dea67fa062c23f25c4b6fabc806ea327",
      "tree": "c2b230afeba5fe7507c9736812d3f45e98ed89ea",
      "parents": [
        "e5284a736be779d9fe12be0f9cf54783f70bea4f"
      ],
      "author": {
        "name": "Akanksha kedia",
        "email": "89628774+Akanksha-kedia@users.noreply.github.com",
        "time": "Wed Jul 08 01:17:31 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 12:47:31 2026 -0700"
      },
      "message": "Fix SchemaUtils to include validation failure reason in error message (#18896)\n\nThe updateSchema endpoint in PinotSchemaRestletResource was catching\nSchemaBackwardIncompatibleException but only returning a generic message\n(\"Only allow adding new columns\") without including the actual reason\nfrom the exception. This made it difficult for users to understand why\ntheir schema update was rejected.\n\nNow the error response includes e.getMessage() which contains detailed\nincompatibility information (missing columns, incompatible field types,\nprimary key changes, and fix suggestions)."
    },
    {
      "commit": "e5284a736be779d9fe12be0f9cf54783f70bea4f",
      "tree": "1dbe76abb55ca63a8b982e876b6ef3dfaa38b6ce",
      "parents": [
        "be8d3b221cef50b928a1dfac4876a7d076b6ab45"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Jul 07 12:31:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 12:31:11 2026 -0700"
      },
      "message": "Simplify ColumnReader SPI: drop iterator API, replace type checks with getValueType() (#18918)"
    },
    {
      "commit": "be8d3b221cef50b928a1dfac4876a7d076b6ab45",
      "tree": "a8d59f4259d0d9c12b94d7421bf8156abcf4515b",
      "parents": [
        "bb83fa618c22d4d59d838e5ec8429d541d7da90f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 07 11:24:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 11:24:35 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.46.21 to 2.47.0 (#18929)\n\nBumps software.amazon.awssdk:bom from 2.46.21 to 2.47.0.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.47.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": "bb83fa618c22d4d59d838e5ec8429d541d7da90f",
      "tree": "f800c46e00d0f43fca5919aafd6efde524c19160",
      "parents": [
        "91416079849599668de91c200eb16aebc1288f46"
      ],
      "author": {
        "name": "Pradeep Singh Negi",
        "email": "47029282+pradeeee@users.noreply.github.com",
        "time": "Tue Jul 07 16:18:30 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 03:48:30 2026 -0700"
      },
      "message": "Initialize ServerMetrics in PredownloadScheduler (#18608)\n\n* Initialize ServerMetrics in PredownloadScheduler for predownload container\n\nThe PredownloadScheduler runs in a separate predownload container that\nstarts before the main Pinot server. Previously, it only initialized\nPredownloadMetrics but did not set up the ServerMetrics registry. This\ncaused PredownloadMetrics (which internally depends on ServerMetrics)\nto silently fall back to the NOOP metrics instance, resulting in no\nserver-level metrics being emitted from the predownload container.\n\nThis change initializes ServerMetrics via PinotMetricUtils in the\ninitializeMetricsReporter() method. The initialization is wrapped in a\ntry-catch so that if the underlying metrics factory cannot be created\n(e.g., because a vendor-specific metrics client is not yet available\nin the predownload lifecycle), the predownload process continues with\nthe default NOOP ServerMetrics rather than crashing.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Add tests for ServerMetrics initialization in PredownloadScheduler\n\nThree test cases covering the initializeMetricsReporter() change:\n\n1. testInitializeMetricsReporterRegistersServerMetrics - verifies that\n   ServerMetrics is properly initialized and registered when the\n   metrics factory is available\n\n2. testInitializeMetricsReporterFallsBackOnFailure - verifies that\n   when PinotMetricUtils throws (e.g., vendor metrics client not\n   ready), the scheduler continues with the NOOP ServerMetrics\n   instance instead of crashing\n\n3. testInitializeMetricsReporterAlwaysCreatesPredownloadMetrics -\n   verifies that PredownloadMetrics is always created and registered\n   regardless of whether ServerMetrics initialization succeeds or fails\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Address review comments: narrow catch to Exception, log register result\n\n- Changed catch(Throwable) to catch(Exception) to avoid swallowing\n  JVM-level Errors like OutOfMemoryError\n- Check ServerMetrics.register() return value and log success or\n  error if an instance was already registered\n\n* Extract shared ServerMetricsInitUtils for ServerMetrics construction/registration\n\nDeduplicates ServerMetrics construction + registration logic between\nBaseServerStarter (real server) and PredownloadScheduler (predownload\ncontainer). Registration failure now throws IllegalStateException from\nthe shared method; PredownloadScheduler\u0027s existing try/catch keeps\npredownload\u0027s graceful-degradation behavior unchanged.\n\n* Trigger CI re-run\n\n* Make ServerMetrics registration idempotent to fix integration tests\n\nServerMetricsInitUtils.initServerMetrics() previously threw\nIllegalStateException when ServerMetrics was already registered.\nThis broke integration tests where multiple servers start in the\nsame JVM via ClusterTest.startOneServer, causing 38 test failures.\n\nNow returns the existing instance instead of throwing.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: psinghnegi \u003cpsinghnegi@uber.com\u003e\nCo-authored-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "91416079849599668de91c200eb16aebc1288f46",
      "tree": "47b771f626942c5ed2e18fec9d6dba122e599e9b",
      "parents": [
        "1f1521b83890932bd05b49feb2fdbdae631c2ded"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Tue Jul 07 01:33:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 10:33:30 2026 +0200"
      },
      "message": "Close op chain when scheduling fails to release operator resources (#18928)"
    }
  ],
  "next": "1f1521b83890932bd05b49feb2fdbdae631c2ded"
}
