blob: 1fe245337cbe9feaf31f01295090e67b83e32ed9 [file] [log] [blame]
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1058],{15680:(e,a,t)=>{t.d(a,{xA:()=>d,yg:()=>h});var n=t(96540);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a<arguments.length;a++){var t=null!=arguments[a]?arguments[a]:{};a%2?r(Object(t),!0).forEach((function(a){i(e,a,t[a])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):r(Object(t)).forEach((function(a){Object.defineProperty(e,a,Object.getOwnPropertyDescriptor(t,a))}))}return e}function o(e,a){if(null==e)return{};var t,n,i=function(e,a){if(null==e)return{};var t,n,i={},r=Object.keys(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n<r.length;n++)t=r[n],a.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var p=n.createContext({}),s=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},d=function(e){var a=s(e.components);return n.createElement(p.Provider,{value:a},e.children)},u="mdxType",g={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},m=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),u=s(t),m=i,h=u["".concat(p,".").concat(m)]||u[m]||g[m]||r;return t?n.createElement(h,l(l({ref:a},d),{},{components:t})):n.createElement(h,l({ref:a},d))}));function h(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=t.length,l=new Array(r);l[0]=m;var o={};for(var p in a)hasOwnProperty.call(a,p)&&(o[p]=a[p]);o.originalType=e,o[u]="string"==typeof e?e:i,l[1]=o;for(var s=2;s<r;s++)l[s]=t[s];return n.createElement.apply(null,l)}return n.createElement.apply(null,t)}m.displayName="MDXCreateElement"},13810:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>p,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var n=t(58168),i=t(98587),r=(t(96540),t(15680)),l=["components"],o={id:"release-notes",title:"Release notes"},p=void 0,s={unversionedId:"release-info/release-notes",id:"release-info/release-notes",title:"Release notes",description:"\x3c!--",source:"@site/docs/29.0.0/release-info/release-notes.md",sourceDirName:"release-info",slug:"/release-info/release-notes",permalink:"/docs/29.0.0/release-info/release-notes",draft:!1,tags:[],version:"current",frontMatter:{id:"release-notes",title:"Release notes"},sidebar:"docs",previous:{title:"Papers",permalink:"/docs/29.0.0/misc/papers-and-talks"},next:{title:"Upgrade notes",permalink:"/docs/29.0.0/release-info/upgrade-notes"}},d={},u=[{value:"Important features, changes, and deprecations",id:"important-features-changes-and-deprecations",level:2},{value:"MSQ export statements (experimental)",id:"msq-export-statements-experimental",level:3},{value:"SQL PIVOT and UNPIVOT (experimental)",id:"sql-pivot-and-unpivot-experimental",level:3},{value:"Range support in window functions (experimental)",id:"range-support-in-window-functions-experimental",level:3},{value:"Improved INNER joins",id:"improved-inner-joins",level:3},{value:"Improved concurrent append and replace (experimental)",id:"improved-concurrent-append-and-replace-experimental",level:3},{value:"First and last aggregators for double, float, and long data types",id:"first-and-last-aggregators-for-double-float-and-long-data-types",level:3},{value:"Support for logging audit events",id:"support-for-logging-audit-events",level:3},{value:"Enabled empty ingest queries",id:"enabled-empty-ingest-queries",level:3},{value:"MSQ support for Google Cloud Storage",id:"msq-support-for-google-cloud-storage",level:3},{value:"Experimental extensions",id:"experimental-extensions",level:3},{value:"DDSketch",id:"ddsketch",level:4},{value:"Spectator histogram",id:"spectator-histogram",level:4},{value:"Delta Lake",id:"delta-lake",level:4},{value:"Functional area and related changes",id:"functional-area-and-related-changes",level:2},{value:"Web console",id:"web-console",level:3},{value:"Support for array types",id:"support-for-array-types",level:4},{value:"File inputs for query detail archive",id:"file-inputs-for-query-detail-archive",level:4},{value:"Improved lookup dialog",id:"improved-lookup-dialog",level:4},{value:"Improved time chart brush and added auto-granularity",id:"improved-time-chart-brush-and-added-auto-granularity",level:4},{value:"Other web console improvements",id:"other-web-console-improvements",level:4},{value:"General ingestion",id:"general-ingestion",level:3},{value:"Added system fields to input sources",id:"added-system-fields-to-input-sources",level:4},{value:"Changed how Druid allocates weekly segments",id:"changed-how-druid-allocates-weekly-segments",level:4},{value:"Changed how empty or null array columns are stored",id:"changed-how-empty-or-null-array-columns-are-stored",level:4},{value:"Enabled skipping compaction for datasources with partial-eternity segments",id:"enabled-skipping-compaction-for-datasources-with-partial-eternity-segments",level:4},{value:"Kill task improvements",id:"kill-task-improvements",level:4},{value:"Segment allocation improvements",id:"segment-allocation-improvements",level:4},{value:"Other ingestion improvements",id:"other-ingestion-improvements",level:4},{value:"SQL-based ingestion",id:"sql-based-ingestion",level:3},{value:"Added <code>castToType</code> parameter",id:"added-casttotype-parameter",level:4},{value:"Improved the EXTEND operator",id:"improved-the-extend-operator",level:4},{value:"Improved tombstone generation to honor granularity specified in a <code>REPLACE</code> query",id:"improved-tombstone-generation-to-honor-granularity-specified-in-a-replace-query",level:4},{value:"Improved hash joins using filters",id:"improved-hash-joins-using-filters",level:4},{value:"Configurable page size limit",id:"configurable-page-size-limit",level:4},{value:"Streaming ingestion",id:"streaming-ingestion",level:3},{value:"Improved Amazon Kinesis automatic reset",id:"improved-amazon-kinesis-automatic-reset",level:4},{value:"Querying",id:"querying",level:3},{value:"Added IPv6_MATCH SQL function",id:"added-ipv6_match-sql-function",level:4},{value:"Added JSON_QUERY_ARRAY function",id:"added-json_query_array-function",level:4},{value:"Added support for <code>aggregateMultipleValues</code>",id:"added-support-for-aggregatemultiplevalues",level:4},{value:"Added native <code>arrayContainsElement</code> filter",id:"added-native-arraycontainselement-filter",level:4},{value:"Added index support",id:"added-index-support",level:4},{value:"Improved <code>timestamp_extract</code> function",id:"improved-timestamp_extract-function",level:4},{value:"Improved JSON_VALUE and JSON_QUERY",id:"improved-json_value-and-json_query",level:4},{value:"Improved filtering performance for lookups",id:"improved-filtering-performance-for-lookups",level:4},{value:"Enabled query request queuing by default when total laning is turned on",id:"enabled-query-request-queuing-by-default-when-total-laning-is-turned-on",level:4},{value:"Other querying improvements",id:"other-querying-improvements",level:4},{value:"Data management",id:"data-management",level:3},{value:"Changed <code>numCorePartitions</code> to 0 for tombstones",id:"changed-numcorepartitions-to-0-for-tombstones",level:4},{value:"Clean up duty for non-overlapping eternity tombstones",id:"clean-up-duty-for-non-overlapping-eternity-tombstones",level:4},{value:"Enabled skipping compaction for datasources with partial-eternity segments",id:"enabled-skipping-compaction-for-datasources-with-partial-eternity-segments-1",level:4},{value:"Enhanced the JSON parser unexpected token logging",id:"enhanced-the-json-parser-unexpected-token-logging",level:4},{value:"Other data management improvements",id:"other-data-management-improvements",level:4},{value:"Metrics and monitoring",id:"metrics-and-monitoring",level:3},{value:"Extensions",id:"extensions",level:3},{value:"Basic security improvements",id:"basic-security-improvements",level:4},{value:"DataSketches improvements",id:"datasketches-improvements",level:4},{value:"Microsoft Azure improvements",id:"microsoft-azure-improvements",level:4},{value:"Kubernetes improvements",id:"kubernetes-improvements",level:4},{value:"Kafka emitter improvements",id:"kafka-emitter-improvements",level:4},{value:"Prometheus emitter improvements",id:"prometheus-emitter-improvements",level:4},{value:"Iceberg improvements",id:"iceberg-improvements",level:4},{value:"Upgrade notes and incompatible changes",id:"upgrade-notes-and-incompatible-changes",level:2},{value:"Upgrade notes",id:"upgrade-notes",level:3},{value:"Changed <code>equals</code> filter for native queries",id:"changed-equals-filter-for-native-queries",level:4},{value:"Console automatically sets <code>arrayIngestMode</code> for MSQ queries",id:"console-automatically-sets-arrayingestmode-for-msq-queries",level:4},{value:"Improved concurrent append and replace (experimental)",id:"improved-concurrent-append-and-replace-experimental-1",level:4},{value:"Enabled empty ingest queries",id:"enabled-empty-ingest-queries-1",level:4},{value:"Enabled query request queuing by default when total laning is turned on",id:"enabled-query-request-queuing-by-default-when-total-laning-is-turned-on-1",level:4},{value:"Changed how empty or null array columns are stored",id:"changed-how-empty-or-null-array-columns-are-stored-1",level:4},{value:"Changed how Druid allocates weekly segments",id:"changed-how-druid-allocates-weekly-segments-1",level:4},{value:"Removed the <code>auto</code> search strategy",id:"removed-the-auto-search-strategy",level:3},{value:"Developer notes",id:"developer-notes",level:3},{value:"Improved <code>InDimFilter</code> reverse-lookup optimization",id:"improved-indimfilter-reverse-lookup-optimization",level:4},{value:"Other developer improvements",id:"other-developer-improvements",level:4},{value:"Web console logging",id:"web-console-logging",level:4},{value:"Dependency updates",id:"dependency-updates",level:4}],g={toc:u},m="wrapper";function h(e){var a=e.components,o=(0,i.A)(e,l);return(0,r.yg)(m,(0,n.A)({},g,o,{components:a,mdxType:"MDXLayout"}),(0,r.yg)("p",null,"Apache Druid 29.0.0 contains over 350 new features, bug fixes, performance enhancements, documentation improvements, and additional test coverage from 67 contributors."),(0,r.yg)("p",null,"See the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/issues?q=is%3Aclosed+milestone%3A29.0.0+sort%3Aupdated-desc+"},"complete set of changes")," for additional details, including bug fixes."),(0,r.yg)("p",null,"Review the ",(0,r.yg)("a",{parentName:"p",href:"#upgrade-notes"},"upgrade notes")," before you upgrade to Druid 29.0.0.\nIf you are upgrading across multiple versions, see the ",(0,r.yg)("a",{parentName:"p",href:"/docs/29.0.0/release-info/upgrade-notes"},"Upgrade notes")," page, which lists upgrade notes for the most recent Druid versions."),(0,r.yg)("h2",{id:"important-features-changes-and-deprecations"},"Important features, changes, and deprecations"),(0,r.yg)("p",null,"This section contains important information about new and existing features."),(0,r.yg)("h3",{id:"msq-export-statements-experimental"},"MSQ export statements (experimental)"),(0,r.yg)("p",null,"Druid 29.0.0 adds experimental support for export statements to the MSQ task engine. This allows query tasks to write data to an external destination through the ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/multi-stage-query/reference#extern-function"},(0,r.yg)("inlineCode",{parentName:"a"},"EXTERN")," function"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15689"},"#15689")),(0,r.yg)("h3",{id:"sql-pivot-and-unpivot-experimental"},"SQL PIVOT and UNPIVOT (experimental)"),(0,r.yg)("p",null,"Druid 29.0.0 adds experimental support for the SQL PIVOT and UNPIVOT operators."),(0,r.yg)("p",null,"The PIVOT operator carries out an aggregation and transforms rows into columns in the output. The following is the general syntax for the PIVOT operator:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},"PIVOT (aggregation_function(column_to_aggregate)\n FOR column_with_values_to_pivot\n IN (pivoted_column1 [, pivoted_column2 ...])\n)\n")),(0,r.yg)("p",null,"The UNPIVOT operator transforms existing column values into rows. The following is the general syntax for the UNPIVOT operator:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},"UNPIVOT (values_column \n FOR names_column\n IN (unpivoted_column1 [, unpivoted_column2 ... ])\n)\n")),(0,r.yg)("h3",{id:"range-support-in-window-functions-experimental"},"Range support in window functions (experimental)"),(0,r.yg)("p",null,"Window functions (experimental) now support ranges where both endpoints are unbounded or are the current row. Ranges work in strict mode, which means that Druid will fail queries that aren't supported. You can turn off strict mode for ranges by setting the context parameter ",(0,r.yg)("inlineCode",{parentName:"p"},"windowingStrictValidation")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"false"),"."),(0,r.yg)("p",null,"The following example shows a window expression with RANGE frame specifications:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},"(ORDER BY c)\n(ORDER BY c RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)\n(ORDER BY c RANGE BETWEEN CURRENT ROW AND UNBOUNDED PRECEDING)\n")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15703"},"#15703")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15746"},"#15746")),(0,r.yg)("h3",{id:"improved-inner-joins"},"Improved INNER joins"),(0,r.yg)("p",null,"Druid now supports arbitrary join conditions for INNER join. Any sub-conditions that can't be evaluated as part of the join are converted to a post-join filter. Improved join capabilities allow Druid to more effectively support applications like Tableau."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15302"},"#15302")),(0,r.yg)("h3",{id:"improved-concurrent-append-and-replace-experimental"},"Improved concurrent append and replace (experimental)"),(0,r.yg)("p",null,"You no longer have to manually determine the task lock type for concurrent append and replace (experimental) with the ",(0,r.yg)("inlineCode",{parentName:"p"},"taskLockType")," task context. Instead, Druid can now determine it automatically for you. You can use the context parameter ",(0,r.yg)("inlineCode",{parentName:"p"},'"useConcurrentLocks": true')," for individual tasks and datasources or enable concurrent append and replace at a cluster level using ",(0,r.yg)("inlineCode",{parentName:"p"},"druid.indexer.task.default.context"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15684"},"#15684")),(0,r.yg)("h3",{id:"first-and-last-aggregators-for-double-float-and-long-data-types"},"First and last aggregators for double, float, and long data types"),(0,r.yg)("p",null,"Druid now supports first and last aggregators for the double, float, and long types in native and MSQ ingestion spec and MSQ queries. Previously, they were only supported for native queries. For more information, see ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/querying/aggregations/#first-and-last-aggregators"},"First and last aggregators"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/14462"},"#14462")),(0,r.yg)("p",null,"Additionally, the following functions can now return numeric values:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"EARLIEST and EARLIEST_BY"),(0,r.yg)("li",{parentName:"ul"},"LATEST and LATEST_BY")),(0,r.yg)("p",null,"You can use these functions as aggregators at ingestion time."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15607"},"#15607")),(0,r.yg)("h3",{id:"support-for-logging-audit-events"},"Support for logging audit events"),(0,r.yg)("p",null,"Added support for logging audit events and improved coverage of audited REST API endpoints.\nTo enable logging audit events, set config ",(0,r.yg)("inlineCode",{parentName:"p"},"druid.audit.manager.type")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"log")," in both the Coordinator and Overlord or in ",(0,r.yg)("inlineCode",{parentName:"p"},"common.runtime.properties"),". When you set ",(0,r.yg)("inlineCode",{parentName:"p"},"druid.audit.manager.type")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"sql"),", audit events are persisted to metadata store."),(0,r.yg)("p",null,"In both cases, Druid audits the following events:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Coordinator",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Update load rules"),(0,r.yg)("li",{parentName:"ul"},"Update lookups"),(0,r.yg)("li",{parentName:"ul"},"Update coordinator dynamic config"),(0,r.yg)("li",{parentName:"ul"},"Update auto-compaction config"))),(0,r.yg)("li",{parentName:"ul"},"Overlord",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Submit a task"),(0,r.yg)("li",{parentName:"ul"},"Create/update a supervisor"),(0,r.yg)("li",{parentName:"ul"},"Update worker config"))),(0,r.yg)("li",{parentName:"ul"},"Basic security extension",(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},"Create user"),(0,r.yg)("li",{parentName:"ul"},"Delete user"),(0,r.yg)("li",{parentName:"ul"},"Update user credentials"),(0,r.yg)("li",{parentName:"ul"},"Create role"),(0,r.yg)("li",{parentName:"ul"},"Delete role"),(0,r.yg)("li",{parentName:"ul"},"Assign role to user"),(0,r.yg)("li",{parentName:"ul"},"Set role permissions")))),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15480"},"#15480")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15653"},"#15653")),(0,r.yg)("p",null,"Also fixed an issue with the basic auth integration test by not persisting logs to the database."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15561"},"#15561")),(0,r.yg)("h3",{id:"enabled-empty-ingest-queries"},"Enabled empty ingest queries"),(0,r.yg)("p",null,"The MSQ task engine now allows empty ingest queries by default. Previously, ingest queries that produced no data would fail with the ",(0,r.yg)("inlineCode",{parentName:"p"},"InsertCannotBeEmpty")," MSQ fault.\nFor more information, see ",(0,r.yg)("a",{parentName:"p",href:"#enabled-empty-ingest-queries"},"Empty ingest queries in the upgrade notes"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15674"},"#15674")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15495"},"#15495")),(0,r.yg)("p",null,"In the web console, you can use a toggle to control whether an ingestion fails if the ingestion query produces no data."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15627"},"#15627")),(0,r.yg)("h3",{id:"msq-support-for-google-cloud-storage"},"MSQ support for Google Cloud Storage"),(0,r.yg)("p",null,"The MSQ task engine now supports Google Cloud Storage (GCS). You can use durable storage with GCS. See ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/multi-stage-query/reference#durable-storage-configurations"},"Durable storage configurations")," for more information."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15398"},"#15398")),(0,r.yg)("h3",{id:"experimental-extensions"},"Experimental extensions"),(0,r.yg)("p",null,"Druid 29.0.0 adds the following extensions."),(0,r.yg)("h4",{id:"ddsketch"},"DDSketch"),(0,r.yg)("p",null,"A new DDSketch extension is available as a community contribution. The DDSketch extension (",(0,r.yg)("inlineCode",{parentName:"p"},"druid-ddsketch"),") provides support for approximate quantile queries using the ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/datadog/sketches-java"},"DDSketch")," library."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15049"},"#15049")),(0,r.yg)("h4",{id:"spectator-histogram"},"Spectator histogram"),(0,r.yg)("p",null,"A new histogram extension is available as a community contribution. The Spectator-based histogram extension (",(0,r.yg)("inlineCode",{parentName:"p"},"druid-spectator-histogram"),") provides approximate histogram aggregators and percentile post-aggregators based on ",(0,r.yg)("a",{parentName:"p",href:"https://netflix.github.io/atlas-docs/spectator/"},"Spectator")," fixed-bucket histograms."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15340"},"#15340")),(0,r.yg)("h4",{id:"delta-lake"},"Delta Lake"),(0,r.yg)("p",null,"A new Delta Lake extension is available as a community contribution. The Delta Lake extension (",(0,r.yg)("inlineCode",{parentName:"p"},"druid-deltalake-extensions"),") lets you use the ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/development/extensions-contrib/delta-lake"},"Delta Lake input source")," to ingest data stored in a Delta Lake table into Apache Druid."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15755"},"#15755")),(0,r.yg)("h2",{id:"functional-area-and-related-changes"},"Functional area and related changes"),(0,r.yg)("p",null,"This section contains detailed release notes separated by areas."),(0,r.yg)("h3",{id:"web-console"},"Web console"),(0,r.yg)("h4",{id:"support-for-array-types"},"Support for array types"),(0,r.yg)("p",null,"Added support for array types for all the ingestion wizards."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Load data",src:t(92156).A,width:"1471",height:"1000"})),(0,r.yg)("p",null,"When loading multi-value dimensions or arrays using the Druid ",(0,r.yg)("strong",{parentName:"p"},"Query")," console, note the value of the ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayIngestMode")," parameter. Druid now configures the ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayIngestMode")," parameter in the data loading flow, and its value can persist across the SQL tab, even if you execute unrelated Data Manipulation Language (DML) operations within the same tab."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15588"},"#15588")),(0,r.yg)("h4",{id:"file-inputs-for-query-detail-archive"},"File inputs for query detail archive"),(0,r.yg)("p",null,"The ",(0,r.yg)("strong",{parentName:"p"},"Load query detail archive")," now supports loading queries by selecting a JSON file directly or dragging the file into the dialog."),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Load query detail archive",src:t(21573).A,width:"576",height:"388"})),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15632"},"#15632")),(0,r.yg)("h4",{id:"improved-lookup-dialog"},"Improved lookup dialog"),(0,r.yg)("p",null,"The lookup dialog in the web console now includes following optional fields. See ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/development/extensions-core/lookups-cached-global#jdbc-lookup"},"JDBC lookup")," for more information."),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Jitter seconds"),(0,r.yg)("li",{parentName:"ul"},"Load timeout seconds"),(0,r.yg)("li",{parentName:"ul"},"Max heap percentage")),(0,r.yg)("p",null,(0,r.yg)("img",{alt:"Lookup dialog",src:t(49774).A,width:"761",height:"861"})),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15472/"},"#15472")),(0,r.yg)("h4",{id:"improved-time-chart-brush-and-added-auto-granularity"},"Improved time chart brush and added auto-granularity"),(0,r.yg)("p",null,"Improved the web console ",(0,r.yg)("strong",{parentName:"p"},"Explore")," view as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added the notion of timezone in the explore view."),(0,r.yg)("li",{parentName:"ul"},'Time chart is now able to automatically pick a granularity if "auto" is selected (which is the default) based on the current time filter extent.'),(0,r.yg)("li",{parentName:"ul"},"Brush is now automatically enabled in the time chart."),(0,r.yg)("li",{parentName:"ul"},"Brush interval snaps to the selected time granularity."),(0,r.yg)("li",{parentName:"ul"},"Added a highlight bubble to all visualizations (except table because it has its own).")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/14990"},"#14990")),(0,r.yg)("h4",{id:"other-web-console-improvements"},"Other web console improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added the ability to detect multiple ",(0,r.yg)("inlineCode",{parentName:"li"},"EXPLAIN PLAN")," queries in the workbench and run them individually ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15570"},"#15570")),(0,r.yg)("li",{parentName:"ul"},"Added the ability to sort a segment table on start and end when grouping by interval ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15720"},"#15720")),(0,r.yg)("li",{parentName:"ul"},"Improved the time shift for compare logic in the web console to include literals ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15433"},"#15433")),(0,r.yg)("li",{parentName:"ul"},"Improved robustness of time shifting in tables in Explore view ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15359"},"#15359")),(0,r.yg)("li",{parentName:"ul"},"Improved ingesting data using the web console ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15339"},"#15339")),(0,r.yg)("li",{parentName:"ul"},"Improved management proxy detection ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15453"},"#15453")),(0,r.yg)("li",{parentName:"ul"},"Fixed rendering on a disabled worker ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15712"},"#15712")),(0,r.yg)("li",{parentName:"ul"},"Fix an issue where ",(0,r.yg)("inlineCode",{parentName:"li"},"waitUntilSegmentLoad")," would always be set to ",(0,r.yg)("inlineCode",{parentName:"li"},"true")," even if explicitly set to ",(0,r.yg)("inlineCode",{parentName:"li"},"false")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15781"},"#15781")),(0,r.yg)("li",{parentName:"ul"},"Enabled table driven query modification actions to work with slices ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15779"},"#15779"))),(0,r.yg)("h3",{id:"general-ingestion"},"General ingestion"),(0,r.yg)("h4",{id:"added-system-fields-to-input-sources"},"Added system fields to input sources"),(0,r.yg)("p",null,"Added the option to return system fields when defining an input source. This allows for ingestion of metadata, such as an S3 object's URI."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15276"},"#15276")),(0,r.yg)("h4",{id:"changed-how-druid-allocates-weekly-segments"},"Changed how Druid allocates weekly segments"),(0,r.yg)("p",null,"When the requested granularity is a month or larger but a segment can't be allocated, Druid resorts to day partitioning.\nUnless explicitly specified, Druid skips week-granularity segments for data partitioning because these segments don't align with the end of the month or more coarse-grained intervals."),(0,r.yg)("p",null,"Previously, if Druid couldn't allocate segments by month, it tried allocating them by week next.\nIn the new behavior, Druid skips partitioning by week and goes directly to day. Week segments can only be allocated if the chosen partitioning in the append task is WEEK."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15589"},"#15589")),(0,r.yg)("h4",{id:"changed-how-empty-or-null-array-columns-are-stored"},"Changed how empty or null array columns are stored"),(0,r.yg)("p",null,"Columns ingested with the ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," column indexer that contain only empty or null containing arrays are now stored as ",(0,r.yg)("inlineCode",{parentName:"p"},"ARRAY<LONG>")," instead of ",(0,r.yg)("inlineCode",{parentName:"p"},"COMPLEX<json>"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15505"},"#15505")),(0,r.yg)("h4",{id:"enabled-skipping-compaction-for-datasources-with-partial-eternity-segments"},"Enabled skipping compaction for datasources with partial-eternity segments"),(0,r.yg)("p",null,"Druid now skips compaction for datasources with segments that have an interval start or end which coincides with Eternity interval end-points."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15542"},"#15542")),(0,r.yg)("h4",{id:"kill-task-improvements"},"Kill task improvements"),(0,r.yg)("p",null,"Improved kill tasks as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Resolved an issue where the auto-kill feature failed to honor the specified buffer period. This occurred when multiple unused segments within an interval were marked as unused at different times."),(0,r.yg)("li",{parentName:"ul"},"You can submit kill tasks with an optional parameter ",(0,r.yg)("inlineCode",{parentName:"li"},"maxUsedStatusLastUpdatedTime"),". When set to a date time, the kill task considers segments in the specified interval marked as unused no later than this time. The default behavior is to kill all unused segments in the interval regardless of the time when segments where marked as unused.")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15710"},"#15710")),(0,r.yg)("h4",{id:"segment-allocation-improvements"},"Segment allocation improvements"),(0,r.yg)("p",null,"Improved segment allocation as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Changed how Druid allocates weekly segments ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15589"},"#15589")),(0,r.yg)("li",{parentName:"ul"},"Enhanced polling in segment allocation queue ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15590"},"#15590")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue in segment allocation that could cause loss of appended data when running interleaved append and replace tasks ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15459"},"#15459"))),(0,r.yg)("h4",{id:"other-ingestion-improvements"},"Other ingestion improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added a default implementation for the ",(0,r.yg)("inlineCode",{parentName:"li"},"evalDimension")," method in the ",(0,r.yg)("inlineCode",{parentName:"li"},"RowFunction")," interface ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15452"},"#15452")),(0,r.yg)("li",{parentName:"ul"},"Added a configurable delay to the Peon service that determines how long a Peon should wait before dropping a segment ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15373"},"#15373")),(0,r.yg)("li",{parentName:"ul"},"Improved metadata store updates by attempting to retry updates rather than failing ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15141"},"#15141")),(0,r.yg)("li",{parentName:"ul"},"Improved the error message you get when ",(0,r.yg)("inlineCode",{parentName:"li"},"taskQueue")," reaches ",(0,r.yg)("inlineCode",{parentName:"li"},"maxSize")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15409"},"#15409")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with columnar frames always writing multi-valued columns where the input column had ",(0,r.yg)("inlineCode",{parentName:"li"},"hasMultipleValues = UNKNOWN")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15300"},"#15300")),(0,r.yg)("li",{parentName:"ul"},"Fixed a race condition where there were multiple attempts to publish segments for the same sequence ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/14995"},"#14995")),(0,r.yg)("li",{parentName:"ul"},"Fixed a race condition that can occur at high streaming concurrency ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15174"},"#15174")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue where complex types that are also numbers were assumed to also be double ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15272"},"#15272")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with unnecessary retries triggered when exceptions like ",(0,r.yg)("inlineCode",{parentName:"li"},"IOException")," obfuscated S3 exceptions ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15238"},"#15238")),(0,r.yg)("li",{parentName:"ul"},"Fixed segment retrieval when the input interval does not lie within the years ",(0,r.yg)("inlineCode",{parentName:"li"},"[1000, 9999]")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15608"},"#15608")),(0,r.yg)("li",{parentName:"ul"},"Fixed empty strings being incorrectly converted to null values ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15525"},"#15525")),(0,r.yg)("li",{parentName:"ul"},"Simplified ",(0,r.yg)("inlineCode",{parentName:"li"},"IncrementalIndex")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"OnHeapIncrementalIndex")," by removing some parameters ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15448"},"#15448")),(0,r.yg)("li",{parentName:"ul"},"Updated active task payloads being accessed from memory before reverting to the metadata store ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15377"},"#15377")),(0,r.yg)("li",{parentName:"ul"},"Updated ",(0,r.yg)("inlineCode",{parentName:"li"},"OnheapIncrementalIndex"),' to no longer try to offer a thread-safe "add" method ',(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15697"},"#15697"))),(0,r.yg)("h3",{id:"sql-based-ingestion"},"SQL-based ingestion"),(0,r.yg)("h4",{id:"added-casttotype-parameter"},"Added ",(0,r.yg)("inlineCode",{parentName:"h4"},"castToType")," parameter"),(0,r.yg)("p",null,"Added optional ",(0,r.yg)("inlineCode",{parentName:"p"},"castToType")," parameter to ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," column schema."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15417"},"#15417")),(0,r.yg)("h4",{id:"improved-the-extend-operator"},"Improved the EXTEND operator"),(0,r.yg)("p",null,"The EXTEND operator now supports the following array types: ",(0,r.yg)("inlineCode",{parentName:"p"},"VARCHAR ARRAY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"BIGINT ARRAY"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"FLOAT ARRAY"),", and ",(0,r.yg)("inlineCode",{parentName:"p"},"DOUBLE ARRAY"),"."),(0,r.yg)("p",null,"The following example shows an extern input with Druid native input types ",(0,r.yg)("inlineCode",{parentName:"p"},"ARRAY<STRING>"),", ",(0,r.yg)("inlineCode",{parentName:"p"},"ARRAY<LONG>")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"STRING"),":"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},"EXTEND (a VARCHAR ARRAY, b BIGINT ARRAY, c VARCHAR)\n")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15458"},"#15458")),(0,r.yg)("h4",{id:"improved-tombstone-generation-to-honor-granularity-specified-in-a-replace-query"},"Improved tombstone generation to honor granularity specified in a ",(0,r.yg)("inlineCode",{parentName:"h4"},"REPLACE")," query"),(0,r.yg)("p",null,"MSQ ",(0,r.yg)("inlineCode",{parentName:"p"},"REPLACE")," queries now generate tombstone segments honoring the segment granularity specified in the query rather than generating irregular tombstones. If a query generates more than 5000 tombstones, Druid returns an MSQ ",(0,r.yg)("inlineCode",{parentName:"p"},"TooManyBucketsFault")," error, similar to the behavior with data segments."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15243"},"#15243")),(0,r.yg)("h4",{id:"improved-hash-joins-using-filters"},"Improved hash joins using filters"),(0,r.yg)("p",null,"Improved consistency of JOIN behavior for queries using either the native or MSQ task engine to prune based on base (left-hand side) columns only."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15299"},"#15299")),(0,r.yg)("h4",{id:"configurable-page-size-limit"},"Configurable page size limit"),(0,r.yg)("p",null,"You can now limit the pages size for results of SELECT queries run using the MSQ task engine. See ",(0,r.yg)("inlineCode",{parentName:"p"},"rowsPerPage")," in the ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/multi-stage-query/reference"},"SQL-based ingestion reference"),"."),(0,r.yg)("h3",{id:"streaming-ingestion"},"Streaming ingestion"),(0,r.yg)("h4",{id:"improved-amazon-kinesis-automatic-reset"},"Improved Amazon Kinesis automatic reset"),(0,r.yg)("p",null,"Changed Amazon Kinesis automatic reset behavior to only reset the checkpoints for partitions where sequence numbers are unavailable."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15338"},"#15338")),(0,r.yg)("h3",{id:"querying"},"Querying"),(0,r.yg)("h4",{id:"added-ipv6_match-sql-function"},"Added IPv6_MATCH SQL function"),(0,r.yg)("p",null,"Added IPv6_MATCH SQL function for matching IPv6 addresses in a subnet:"),(0,r.yg)("pre",null,(0,r.yg)("code",{parentName:"pre",className:"language-sql"},"IPV6_MATCH(address, subnet)\n")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15212/"},"#15212")),(0,r.yg)("h4",{id:"added-json_query_array-function"},"Added JSON_QUERY_ARRAY function"),(0,r.yg)("p",null,"Added JSON_QUERY_ARRAY which is similar to JSON_QUERY except the return type is always ",(0,r.yg)("inlineCode",{parentName:"p"},"ARRAY<COMPLEX<json>>")," instead of ",(0,r.yg)("inlineCode",{parentName:"p"},"COMPLEX<json>"),". Essentially, this function allows extracting arrays of objects from nested data and performing operations such as UNNEST, ARRAY_LENGTH, ARRAY_SLICE, or any other available ARRAY operations."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15521"},"#15521")),(0,r.yg)("h4",{id:"added-support-for-aggregatemultiplevalues"},"Added support for ",(0,r.yg)("inlineCode",{parentName:"h4"},"aggregateMultipleValues")),(0,r.yg)("p",null,"Improved the ",(0,r.yg)("inlineCode",{parentName:"p"},"ANY_VALUE(expr)")," function to support the boolean option ",(0,r.yg)("inlineCode",{parentName:"p"},"aggregateMultipleValues"),". The ",(0,r.yg)("inlineCode",{parentName:"p"},"aggregateMultipleValues")," option is enabled by default. When you run ANY_VALUE on an MVD, the function returns the stringified array. If ",(0,r.yg)("inlineCode",{parentName:"p"},"aggregateMultipleValues")," is set to ",(0,r.yg)("inlineCode",{parentName:"p"},"false"),", ANY_VALUE returns the first value instead."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15434"},"#15434")),(0,r.yg)("h4",{id:"added-native-arraycontainselement-filter"},"Added native ",(0,r.yg)("inlineCode",{parentName:"h4"},"arrayContainsElement")," filter"),(0,r.yg)("p",null,"Added native ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayContainsElement")," filter to improve performance when using ARRAY_CONTAINS on array columns."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15366"},"#15366")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15455"},"#15455")),(0,r.yg)("p",null,"Also ARRAY_OVERLAP now uses the ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayContainsElement")," filter when filtering ARRAY typed columns, so that it can use indexes like ARRAY_CONTAINS."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15451"},"#15451")),(0,r.yg)("h4",{id:"added-index-support"},"Added index support"),(0,r.yg)("p",null,"Improved nested JSON columns as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added ",(0,r.yg)("inlineCode",{parentName:"li"},"ValueIndexes")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"ArrayElementIndexes")," for nested arrays. "),(0,r.yg)("li",{parentName:"ul"},"Added ",(0,r.yg)("inlineCode",{parentName:"li"},"ValueIndexes")," for nested long and double columns.")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15752"},"#15752")),(0,r.yg)("h4",{id:"improved-timestamp_extract-function"},"Improved ",(0,r.yg)("inlineCode",{parentName:"h4"},"timestamp_extract")," function"),(0,r.yg)("p",null,"The ",(0,r.yg)("inlineCode",{parentName:"p"},"timestamp_extract(expr, unit, [timezone])")," Druid native query function now supports dynamic values."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15586"},"#15586")),(0,r.yg)("h4",{id:"improved-json_value-and-json_query"},"Improved JSON_VALUE and JSON_QUERY"),(0,r.yg)("p",null,"Added support for using expressions to compute the JSON path argument for JSON_VALUE and JSON_QUERY functions dynamically. The JSON path argument doesn't have to be a constant anymore."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15320"},"#15320")),(0,r.yg)("h4",{id:"improved-filtering-performance-for-lookups"},"Improved filtering performance for lookups"),(0,r.yg)("p",null,"Enhanced filtering performance for lookups as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added ",(0,r.yg)("inlineCode",{parentName:"li"},"sqlReverseLookupThreshold")," SQL query context parameter. ",(0,r.yg)("inlineCode",{parentName:"li"},"sqlReverseLookupThreshold")," represents the maximum size of an IN filter that will be created as part of lookup reversal ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15832"},"#15832")),(0,r.yg)("li",{parentName:"ul"},"Improved loading and dropping of containers for lookups to reduce inconsistencies during updates ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/14806"},"#14806")),(0,r.yg)("li",{parentName:"ul"},"Changed behavior for initialization of lookups to load the first lookup as is, regardless of cache status ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15598"},"#15598"))),(0,r.yg)("h4",{id:"enabled-query-request-queuing-by-default-when-total-laning-is-turned-on"},"Enabled query request queuing by default when total laning is turned on"),(0,r.yg)("p",null,"When query scheduler threads are less than server HTTP threads, total laning turns on.\nThis reserves some HTTP threads for non-query requests such as health checks.\nThe total laning previously would reject any query request that exceeds the lane capacity.\nNow, excess requests will instead be queued with a timeout equal to ",(0,r.yg)("inlineCode",{parentName:"p"},"MIN(Integer.MAX_VALUE, druid.server.http.maxQueryTimeout)"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15440"},"#15440")),(0,r.yg)("h4",{id:"other-querying-improvements"},"Other querying improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added a supplier that can return ",(0,r.yg)("inlineCode",{parentName:"li"},"NullValueIndex")," to be used by ",(0,r.yg)("inlineCode",{parentName:"li"},"NullFilter"),". This improvement should speed up ",(0,r.yg)("inlineCode",{parentName:"li"},"is null")," and ",(0,r.yg)("inlineCode",{parentName:"li"},"is not null")," filters on JSON columns ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15687"},"#15687")),(0,r.yg)("li",{parentName:"ul"},"Added an option to compare results with relative error tolerance ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15429"},"#15429")),(0,r.yg)("li",{parentName:"ul"},"Added capability for the Broker to access datasource schemas defined in the catalog when processing SQL queries ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15469"},"#15469")),(0,r.yg)("li",{parentName:"ul"},"Added CONCAT flattening and filter decomposition ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15634"},"#15634")),(0,r.yg)("li",{parentName:"ul"},"Enabled ARRAY_TO_MV to support expression inputs ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15528"},"#15528")),(0,r.yg)("li",{parentName:"ul"},"Improved ",(0,r.yg)("inlineCode",{parentName:"li"},"ExpressionPostAggregator")," to handle ARRAY types output by the grouping engine ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15543"},"#15543")),(0,r.yg)("li",{parentName:"ul"},"Improved the error message you get when there's an error in the specified interval ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15454"},"#15454")),(0,r.yg)("li",{parentName:"ul"},"Improved how three-valued logic is handled ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15629"},"#15629")),(0,r.yg)("li",{parentName:"ul"},"Improved error reporting for math functions ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/14987"},"#14987")),(0,r.yg)("li",{parentName:"ul"},"Improved handling of COALESCE, SEARCH, and filter optimization ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15609"},"#15609")),(0,r.yg)("li",{parentName:"ul"},"Increased memory available for subqueries when the query scheduler is configured to limit queries below the number of server threads ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15295"},"#15295")),(0,r.yg)("li",{parentName:"ul"},"Optimized SQL planner for filter expressions by introducing column indexes for expression virtual columns ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15585"},"#15585")),(0,r.yg)("li",{parentName:"ul"},"Optimized queries involving large NOT IN operations ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15625"},"#15625")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with nested empty array fields ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15532"},"#15532")),(0,r.yg)("li",{parentName:"ul"},"Fixed NPE with virtual expression with unnest ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15513"},"#15513")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with AND and OR operators and numeric ",(0,r.yg)("inlineCode",{parentName:"li"},"nvl")," not clearing out stale null vectors for vector expression processing ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15587"},"#15587")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with filtering columns when using partial paths such as in ",(0,r.yg)("inlineCode",{parentName:"li"},"JSON_QUERY")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15643"},"#15643")),(0,r.yg)("li",{parentName:"ul"},"Fixed queries that raise an exception when sketches are stored in cache ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15654"},"#15654")),(0,r.yg)("li",{parentName:"ul"},"Fixed queries involving JSON functions that failed when using negative indexes ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15650"},"#15650")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue where queries involving filters on TIME_FLOOR could encounter ",(0,r.yg)("inlineCode",{parentName:"li"},"ClassCastException")," when comparing ",(0,r.yg)("inlineCode",{parentName:"li"},"RangeValue")," in ",(0,r.yg)("inlineCode",{parentName:"li"},"CombineAndSimplifyBounds")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15778"},"#15778"))),(0,r.yg)("h3",{id:"data-management"},"Data management"),(0,r.yg)("h4",{id:"changed-numcorepartitions-to-0-for-tombstones"},"Changed ",(0,r.yg)("inlineCode",{parentName:"h4"},"numCorePartitions")," to 0 for tombstones"),(0,r.yg)("p",null,"Tombstone segments now have 0 core partitions. This means they can be dropped or removed independently without affecting availability of other appended segments in the same co-partition space. Prior to this change, removing tombstones with 1 core partition that contained appended segments in the partition space could make the appended segments unavailable."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15379"},"#15379")),(0,r.yg)("h4",{id:"clean-up-duty-for-non-overlapping-eternity-tombstones"},"Clean up duty for non-overlapping eternity tombstones"),(0,r.yg)("p",null,"Added ",(0,r.yg)("inlineCode",{parentName:"p"},"MarkEternityTombstonesAsUnused")," to clean up non-overlapping eternity tombstones","\u2014","tombstone segments that either start at ",(0,r.yg)("inlineCode",{parentName:"p"},"-INF")," or end at ",(0,r.yg)("inlineCode",{parentName:"p"},"INF")," and don't overlap with any overshadowed used segments in the datasource."),(0,r.yg)("p",null,"Also added a new metric ",(0,r.yg)("inlineCode",{parentName:"p"},"segment/unneededEternityTombstone/count")," to count the number of dropped non-overshadowed eternity tombstones per datasource."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15281"},"#15281")),(0,r.yg)("h4",{id:"enabled-skipping-compaction-for-datasources-with-partial-eternity-segments-1"},"Enabled skipping compaction for datasources with partial-eternity segments"),(0,r.yg)("p",null,"Druid now skips compaction for datasources with segments that have their interval start or end coinciding with Eternity interval end-points."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15542"},"#15542")),(0,r.yg)("h4",{id:"enhanced-the-json-parser-unexpected-token-logging"},"Enhanced the JSON parser unexpected token logging"),(0,r.yg)("p",null,"The JSON parser unexpected token error now includes the context of the expected ",(0,r.yg)("inlineCode",{parentName:"p"},"VALUE_STRING")," token. This makes it easier to track mesh/proxy network error messages and to avoid unnecessary research into Druid server rest endpoint responses."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15176"},"#15176")),(0,r.yg)("h4",{id:"other-data-management-improvements"},"Other data management improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Fixed an issue where the Broker would return an HTTP ",(0,r.yg)("inlineCode",{parentName:"li"},"400")," status code instead of ",(0,r.yg)("inlineCode",{parentName:"li"},"503")," when a Coordinator was temporarily unavailable, such as during a rolling upgrade ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15756"},"#15756")),(0,r.yg)("li",{parentName:"ul"},"Added user identity to Router query request logs ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15126"},"#15126")),(0,r.yg)("li",{parentName:"ul"},"Improved process to retrieve segments from metadata store by retrieving segments in batches ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15305"},"#15305")),(0,r.yg)("li",{parentName:"ul"},"Improved logging messages when skipping auto-compaction for a data source ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15460"},"#15460")),(0,r.yg)("li",{parentName:"ul"},"Improved compaction by modifying the segment iterator to skip intervals without data ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15676"},"#15676")),(0,r.yg)("li",{parentName:"ul"},"Increased ",(0,r.yg)("inlineCode",{parentName:"li"},"_acceptQueueSize")," based on value of ",(0,r.yg)("inlineCode",{parentName:"li"},"net.core.somaxconn")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15596"},"#15596")),(0,r.yg)("li",{parentName:"ul"},"Optimized the process to mark segments as unused ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15352"},"#15352")),(0,r.yg)("li",{parentName:"ul"},"Updated auto-compaction to preserve spatial dimensions rather than rewrite them into regular string dimensions ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15321"},"#15321"))),(0,r.yg)("h3",{id:"metrics-and-monitoring"},"Metrics and monitoring"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added worker status and duration metrics in live and task reports ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15180"},"#15180")),(0,r.yg)("li",{parentName:"ul"},"Updated ",(0,r.yg)("inlineCode",{parentName:"li"},"serviceName")," for ",(0,r.yg)("inlineCode",{parentName:"li"},"segment/count")," metric to match the configured metric name within the StatsD emitter ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15347"},"#15347"))),(0,r.yg)("h3",{id:"extensions"},"Extensions"),(0,r.yg)("h4",{id:"basic-security-improvements"},"Basic security improvements"),(0,r.yg)("p",null,"The computed hash values of passwords are now cached for the ",(0,r.yg)("inlineCode",{parentName:"p"},"druid-basic-security")," extension to boost authentication validator performance."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15648"},"#15648")),(0,r.yg)("h4",{id:"datasketches-improvements"},"DataSketches improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Improved performance of HLL sketch merge aggregators ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15162"},"#15162")),(0,r.yg)("li",{parentName:"ul"},"Updated histogram post-aggregators for Quantiles and KLL sketches for when all values in the sketch are equal. Previously these queries fail but now return ",(0,r.yg)("inlineCode",{parentName:"li"},"[N, 0, 0, ...]"),", where N is the number of values in the sketch, and the length of the list is equal to the value assigned to ",(0,r.yg)("inlineCode",{parentName:"li"},"numBins")," ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15381"},"#15381"))),(0,r.yg)("h4",{id:"microsoft-azure-improvements"},"Microsoft Azure improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added support for Azure Storage Accounts authentication options ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15287"},"#15287")),(0,r.yg)("li",{parentName:"ul"},"Added support for Azure Government when using Microsoft Azure Storage for deep storage ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15523"},"#15523")),(0,r.yg)("li",{parentName:"ul"},"Fixed the ",(0,r.yg)("inlineCode",{parentName:"li"},"batchDeleteFiles")," method in Azure Storage ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15730"},"#15730"))),(0,r.yg)("h4",{id:"kubernetes-improvements"},"Kubernetes improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added cleanup lifecycle management for MiddleManager-less task scheduling ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15133"},"#15133")),(0,r.yg)("li",{parentName:"ul"},"Fixed an issue where the Overlord does not start when a cluster does not use a MiddleManager or ZooKeeper ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15445"},"#15445")),(0,r.yg)("li",{parentName:"ul"},"Improved logs and status messages for MiddleManager-less ingestion ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15527"},"#15527"))),(0,r.yg)("h4",{id:"kafka-emitter-improvements"},"Kafka emitter improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added a config option to the Kafka emitter that lets you mask sensitive values for the Kafka producer. This feature is optional and will not affect prior configs for the emitter ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15485"},"#15485")),(0,r.yg)("li",{parentName:"ul"},"Resolved ",(0,r.yg)("inlineCode",{parentName:"li"},"InterruptedException")," logging in ingestion task logs ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15519"},"#15519"))),(0,r.yg)("h4",{id:"prometheus-emitter-improvements"},"Prometheus emitter improvements"),(0,r.yg)("p",null,"You can configure the ",(0,r.yg)("inlineCode",{parentName:"p"},"pushgateway")," strategy to delete metrics from Prometheus push gateway on task shutdown using the following Prometheus emitter configurations:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"druid.emitter.prometheus.deletePushGatewayMetricsOnShutdown"),": When set to true, peon tasks delete metrics from the Prometheus push gateway on task shutdown. Default value is false."),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"druid.emitter.prometheus.waitForShutdownDelay"),": Time in milliseconds to wait for peon tasks to delete metrics from ",(0,r.yg)("inlineCode",{parentName:"li"},"pushgateway")," on shutdown. Applicable only when ",(0,r.yg)("inlineCode",{parentName:"li"},"druid.emitter.prometheus.deletePushGatewayMetricsOnShutdown")," is set to true. Default value is none, meaning that there is no delay between peon task shutdown and metrics deletion from the push gateway.")),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/14935"},"#14935")),(0,r.yg)("h4",{id:"iceberg-improvements"},"Iceberg improvements"),(0,r.yg)("p",null,"Improved the Iceberg extension as follows:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added a parameter ",(0,r.yg)("inlineCode",{parentName:"li"},"snapshotTime")," to the iceberg input source spec that allows the user to ingest data files associated with the most recent snapshot. This helps the user ingest data based on older snapshots by specifying the associated snapshot time ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15348"},"#15348")),(0,r.yg)("li",{parentName:"ul"},"Added a new Iceberg ingestion filter of type ",(0,r.yg)("inlineCode",{parentName:"li"},"range")," to filter on ranges of column values ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15782"},"#15782")),(0,r.yg)("li",{parentName:"ul"},"Fixed a typo in the Iceberg warehouse path for s3 ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15823"},"#15823"))),(0,r.yg)("h2",{id:"upgrade-notes-and-incompatible-changes"},"Upgrade notes and incompatible changes"),(0,r.yg)("h3",{id:"upgrade-notes"},"Upgrade notes"),(0,r.yg)("h4",{id:"changed-equals-filter-for-native-queries"},"Changed ",(0,r.yg)("inlineCode",{parentName:"h4"},"equals")," filter for native queries"),(0,r.yg)("p",null,"The ",(0,r.yg)("a",{parentName:"p",href:"https://druid.apache.org/docs/latest/querying/filters#equality-filter"},"equality filter")," on mixed type ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," columns that contain arrays must now be filtered as their presenting type. This means that if any rows are arrays (for example, the segment metadata and ",(0,r.yg)("inlineCode",{parentName:"p"},"information_schema")," reports the type as some array type), then the native queries must also filter as if they are some array type."),(0,r.yg)("p",null,"This change impacts mixed type ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," columns that contain both scalars and arrays. It doesn't impact SQL, which already has this limitation due to how the type presents itself."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15503"},"#15503")),(0,r.yg)("h4",{id:"console-automatically-sets-arrayingestmode-for-msq-queries"},"Console automatically sets ",(0,r.yg)("inlineCode",{parentName:"h4"},"arrayIngestMode")," for MSQ queries"),(0,r.yg)("p",null,"Druid console now configures the ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayIngestMode")," parameter in the data loading flow, and its value can persist across the SQL tab unless manually updated. When loading multi-value dimensions or arrays in the Druid console, note the value of the ",(0,r.yg)("inlineCode",{parentName:"p"},"arrayIngestMode")," parameter to prevent mixing multi-value dimensions and arrays in the same column of a data source."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15588"},"#15588")),(0,r.yg)("h4",{id:"improved-concurrent-append-and-replace-experimental-1"},"Improved concurrent append and replace (experimental)"),(0,r.yg)("p",null,"You no longer have to manually determine the task lock type for concurrent append and replace (experimental) with the ",(0,r.yg)("inlineCode",{parentName:"p"},"taskLockType")," task context. Instead, Druid can now determine it automatically for you. You can use the context parameter ",(0,r.yg)("inlineCode",{parentName:"p"},'"useConcurrentLocks": true')," for individual tasks and datasources or enable concurrent append and replace at a cluster level using ",(0,r.yg)("inlineCode",{parentName:"p"},"druid.indexer.task.default.context"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15684"},"#15684")),(0,r.yg)("h4",{id:"enabled-empty-ingest-queries-1"},"Enabled empty ingest queries"),(0,r.yg)("p",null,"The MSQ task engine now allows empty ingest queries by default. For queries that don't generate any output rows, the MSQ task engine reports zero values for ",(0,r.yg)("inlineCode",{parentName:"p"},"numTotalRows")," and ",(0,r.yg)("inlineCode",{parentName:"p"},"totalSizeInBytes")," instead of null. Previously, ingest queries that produced no data would fail with the ",(0,r.yg)("inlineCode",{parentName:"p"},"InsertCannotBeEmpty")," MSQ fault."),(0,r.yg)("p",null,"To revert to the original behavior, set the MSQ query parameter ",(0,r.yg)("inlineCode",{parentName:"p"},"failOnEmptyInsert")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"true"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15495"},"#15495")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15674"},"#15674")),(0,r.yg)("h4",{id:"enabled-query-request-queuing-by-default-when-total-laning-is-turned-on-1"},"Enabled query request queuing by default when total laning is turned on"),(0,r.yg)("p",null,"When query scheduler threads are less than server HTTP threads, total laning turns on.\nThis reserves some HTTP threads for non-query requests such as health checks.\nThe total laning previously would reject any query request that exceeds the lane capacity.\nNow, excess requests will instead be queued with a timeout equal to ",(0,r.yg)("inlineCode",{parentName:"p"},"MIN(Integer.MAX_VALUE, druid.server.http.maxQueryTimeout)"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15440"},"#15440")),(0,r.yg)("h4",{id:"changed-how-empty-or-null-array-columns-are-stored-1"},"Changed how empty or null array columns are stored"),(0,r.yg)("p",null,"Columns ingested with the auto column indexer that contain only empty or null arrays are now stored as ",(0,r.yg)("inlineCode",{parentName:"p"},"ARRAY<LONG\\>")," instead of ",(0,r.yg)("inlineCode",{parentName:"p"},"COMPLEX<json\\>"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15505"},"#15505")),(0,r.yg)("h4",{id:"changed-how-druid-allocates-weekly-segments-1"},"Changed how Druid allocates weekly segments"),(0,r.yg)("p",null,"When the requested granularity is a month or larger but a segment can't be allocated, Druid resorts to day partitioning.\nUnless explicitly specified, Druid skips week-granularity segments for data partitioning because these segments don't align with the end of the month or more coarse-grained intervals."),(0,r.yg)("p",null,"Previously, if Druid couldn't allocate segments by month, it tried allocating them by week next.\nIn the new behavior, Druid skips partitioning by week and goes directly to day. Week segments can only be allocated if the chosen partitioning in the append task is WEEK."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15589"},"#15589")),(0,r.yg)("h3",{id:"removed-the-auto-search-strategy"},"Removed the ",(0,r.yg)("inlineCode",{parentName:"h3"},"auto")," search strategy"),(0,r.yg)("p",null,"Removed the ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," search strategy from the native search query. Setting ",(0,r.yg)("inlineCode",{parentName:"p"},"searchStrategy")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"auto")," is now equivalent to ",(0,r.yg)("inlineCode",{parentName:"p"},"useIndexes"),"."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15550"},"#15550")),(0,r.yg)("h3",{id:"developer-notes"},"Developer notes"),(0,r.yg)("h4",{id:"improved-indimfilter-reverse-lookup-optimization"},"Improved ",(0,r.yg)("inlineCode",{parentName:"h4"},"InDimFilter")," reverse-lookup optimization"),(0,r.yg)("p",null,"This improvement includes the following changes:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Added the ",(0,r.yg)("inlineCode",{parentName:"li"},"mayIncludeUnknown")," parameter to ",(0,r.yg)("inlineCode",{parentName:"li"},"DimFilter#optimize"),"."),(0,r.yg)("li",{parentName:"ul"},"Enabled ",(0,r.yg)("inlineCode",{parentName:"li"},"InDimFilter#optimizeLookup")," to handle ",(0,r.yg)("inlineCode",{parentName:"li"},"mayIncludeUnknown")," and perform reverse lookups in a wider range of cases."),(0,r.yg)("li",{parentName:"ul"},"Made ",(0,r.yg)("inlineCode",{parentName:"li"},"unapply")," method in ",(0,r.yg)("inlineCode",{parentName:"li"},"LookupExtractor")," protected and relocated callers to ",(0,r.yg)("inlineCode",{parentName:"li"},"unapplyAll"),".")),(0,r.yg)("p",null,"If your extensions provide a ",(0,r.yg)("inlineCode",{parentName:"p"},"DimFilter"),", you may need to rebuild them to ensure compatibility with this release."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15611"},"#15611")),(0,r.yg)("h4",{id:"other-developer-improvements"},"Other developer improvements"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},"Fixed an issue with the Druid Docker image ",(0,r.yg)("a",{parentName:"li",href:"https://github.com/apache/druid/pull/15264"},"#15264"))),(0,r.yg)("h4",{id:"web-console-logging"},"Web console logging"),(0,r.yg)("p",null,"The web console now logs request errors in end-to-end tests to help with debugging."),(0,r.yg)("p",null,(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15483"},"#15483")),(0,r.yg)("h4",{id:"dependency-updates"},"Dependency updates"),(0,r.yg)("p",null,"The following dependencies have been updated:"),(0,r.yg)("ul",null,(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Added ",(0,r.yg)("inlineCode",{parentName:"p"},"chronoshift")," as a dependency ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/14990"},"#14990"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Added ",(0,r.yg)("inlineCode",{parentName:"p"},"gson")," to ",(0,r.yg)("inlineCode",{parentName:"p"},"pom.xml")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15488/"},"#15488"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Confluent's dependencies to 6.2.12 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15441"},"#15441"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Excluded ",(0,r.yg)("inlineCode",{parentName:"p"},"jackson-jaxrs")," from ",(0,r.yg)("inlineCode",{parentName:"p"},"ranger-plugin-common"),", which isn't required, to address CVEs ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15481"},"#15481"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated AWS SDK version to ",(0,r.yg)("inlineCode",{parentName:"p"},"1.12.638")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15814"},"#15814"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Avro to 1.11.3 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15419"},"#15419"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Ranger libraries to the newest available version ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15363"},"#15363"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated the iceberg core version to 1.4.1 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15348"},"#15348"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Reduced dependency footprint for the iceberg extension ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15280"},"#15280"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated ",(0,r.yg)("inlineCode",{parentName:"p"},"com.github.eirslett")," version to 1.15.0 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15556"},"#15556"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated multiple webpack dependencies:"),(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"webpack")," to 5.89.0"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"webpack-bundle-analyzer")," to 4.10.1"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"webpack-cli")," to 5.1.4"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"webpack-dev-server")," to 4.15.1")),(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15555"},"#15555"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated ",(0,r.yg)("inlineCode",{parentName:"p"},"pac4j-oidc")," java security library version to 4.5.7 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15522"},"#15522"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated ",(0,r.yg)("inlineCode",{parentName:"p"},"io.kubernetes.client-java")," version to 19.0.0 and ",(0,r.yg)("inlineCode",{parentName:"p"},"docker-java-bom")," to 3.3.4 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15449"},"#15449"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated core Apache Kafka dependencies to 3.6.1 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15539"},"#15539"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated and pruned multiple dependencies for the web console, including dropping Babel. As a result, Internet Explorer 11 is no longer supported with the web console ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15487"},"#15487"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Apache Zookeeper to 3.8.3 from 3.5.10 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15477"},"#15477"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Gauva to 32.0.1 from 31.1 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15482"},"#15482"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated multiple dependencies to address CVEs:"),(0,r.yg)("ul",{parentName:"li"},(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"dropwizard-metrics")," to 4.2.22 to address GHSA-mm8h-8587-p46h in ",(0,r.yg)("inlineCode",{parentName:"li"},"com.rabbitmq:amqp-client")),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"ant")," to 1.10.14 to resolve GHSA-f62v-xpxf-3v68, GHSA-4p6w-m9wc-c9c9, GHSA-q5r4-cfpx-h6fh, and GHSA-5v34-g2px-j4fw"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"comomons-compress")," to 1.24.0 to resolve GHSA-cgwf-w82q-5jrr"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"jose4j")," to 0.9.3 to resolve GHSA-7g24-qg88-p43q and GHSA-jgvc-jfgh-rjvv"),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("inlineCode",{parentName:"li"},"kotlin-stdlib")," to 1.6.0 to resolve GHSA-cqj8-47ch-rvvq and CVE-2022-24329")),(0,r.yg)("p",{parentName:"li"},(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15464"},"#15464"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Jackson to version 2.12.7.1 to address CVE-2022-42003 and CVE-2022-42004 which affects ",(0,r.yg)("inlineCode",{parentName:"p"},"jackson-databind")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15461"},"#15461"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated ",(0,r.yg)("inlineCode",{parentName:"p"},"com.google.code.gson:gson")," from 2.2.4 to 2.10.1 since 2.2.4 is affected by CVE-2022-25647 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15461"},"#15461"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Jedis to version 5.0.2 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15344"},"#15344"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated ",(0,r.yg)("inlineCode",{parentName:"p"},"commons-codec:commons-codec")," from 1.13 to 1.16.0 ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/14819"},"#14819"))),(0,r.yg)("li",{parentName:"ul"},(0,r.yg)("p",{parentName:"li"},"Updated Nimbus version to ",(0,r.yg)("inlineCode",{parentName:"p"},"8.22.1")," ",(0,r.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/pull/15753"},"#15753")))))}h.isMDXComponent=!0},49774:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/image01-8fc0d1038aefe22b7cda862b45ef98a2.png"},21573:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/image02-5501edd64241f5f2689d5d6ed8e4cbbf.png"},92156:(e,a,t)=>{t.d(a,{A:()=>n});const n=t.p+"assets/images/image03-54128b2b56fe83ac3b347825ff1e5307.png"}}]);