From 1e1f0ffac6a01f18822211994679cb1f6fb94182 Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Thu, 18 Dec 2025 15:47:19 -0800 Subject: [PATCH 1/2] Update calls with native --- .../components/segment-timeline/segment-timeline.tsx | 10 ++++++---- .../datasource-columns-table.tsx | 1 + .../src/dialogs/doctor-dialog/doctor-checks.tsx | 9 +++++++-- web-console/src/helpers/capabilities.ts | 2 +- .../src/views/datasources-view/datasources-view.tsx | 3 ++- .../components/source-pane/source-pane.tsx | 1 + .../components/source-query-pane/source-query-pane.tsx | 1 + web-console/src/views/explore-view/explore-view.tsx | 1 + .../home-view/datasources-card/datasources-card.tsx | 1 + .../views/home-view/segments-card/segments-card.tsx | 1 + .../views/home-view/services-card/services-card.tsx | 1 + .../home-view/supervisors-card/supervisors-card.tsx | 1 + .../src/views/home-view/tasks-card/tasks-card.tsx | 1 + web-console/src/views/segments-view/segments-view.tsx | 7 +++++-- web-console/src/views/services-view/services-view.tsx | 5 ++++- .../sql-data-loader-view/schema-step/schema-step.tsx | 1 + web-console/src/views/tasks-view/tasks-view.tsx | 1 + .../recent-query-task-panel.tsx | 1 + .../src/views/workbench-view/workbench-view.tsx | 1 + 19 files changed, 38 insertions(+), 11 deletions(-) diff --git a/web-console/src/components/segment-timeline/segment-timeline.tsx b/web-console/src/components/segment-timeline/segment-timeline.tsx index b390dabcdca2..1f81a0588e91 100644 --- a/web-console/src/components/segment-timeline/segment-timeline.tsx +++ b/web-console/src/components/segment-timeline/segment-timeline.tsx @@ -102,6 +102,7 @@ export const SegmentTimeline = function SegmentTimeline(props: SegmentTimelinePr const tables = await queryDruidSql<{ TABLE_NAME: string }>( { query: `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE'`, + context: { engine: 'native' }, }, signal, ); @@ -134,9 +135,10 @@ export const SegmentTimeline = function SegmentTimeline(props: SegmentTimelinePr .addSelect(C('end'), { addToOrderBy: 'end', direction: 'DESC' }) .toString(); - const endRes = await queryDruidSql<{ end: string }>({ query: endQuery }, signal).catch( - () => [], - ); + const endRes = await queryDruidSql<{ end: string }>( + { query: endQuery, context: { engine: 'native' } }, + signal, + ).catch(() => []); if (endRes.length !== 1) { return getDateRange(DEFAULT_SHOWN_DURATION); } @@ -153,7 +155,7 @@ export const SegmentTimeline = function SegmentTimeline(props: SegmentTimelinePr .toString(); const startRes = await queryDruidSql<{ start: string }>( - { query: startQuery }, + { query: startQuery, context: { engine: 'native' } }, signal, ).catch(() => []); if (startRes.length !== 1) { diff --git a/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx b/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx index bfc5b7e22d59..ade706bb8267 100644 --- a/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx +++ b/web-console/src/dialogs/datasource-table-action-dialog/datasource-columns-table/datasource-columns-table.tsx @@ -47,6 +47,7 @@ export const DatasourceColumnsTable = React.memo(function DatasourceColumnsTable { query: `SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'druid' AND TABLE_NAME = ${L(datasourceId)}`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/dialogs/doctor-dialog/doctor-checks.tsx b/web-console/src/dialogs/doctor-dialog/doctor-checks.tsx index 17cd8acd1a46..b9f143f14a24 100644 --- a/web-console/src/dialogs/doctor-dialog/doctor-checks.tsx +++ b/web-console/src/dialogs/doctor-dialog/doctor-checks.tsx @@ -278,12 +278,15 @@ export const DOCTOR_CHECKS: DoctorCheck[] = [ // Check SQL // ------------------------------------- { - name: 'Verify that SQL works', + name: 'Verify that native SQL works', check: async controls => { // Make sure that we can run the simplest query let sqlResult: any[]; try { - sqlResult = await queryDruidSql({ query: `SELECT 1 + 1 AS "two"` }); + sqlResult = await queryDruidSql({ + query: `SELECT 1 + 1 AS "two"`, + context: { engine: 'native' }, + }); } catch (e) { controls.addIssue( `Could not query SQL ensure that "druid.sql.enable" is set to "true" and that there is a Broker service running. Got: ${e.message}`, @@ -310,6 +313,7 @@ export const DOCTOR_CHECKS: DoctorCheck[] = [ FROM sys.servers WHERE "server_type" = 'historical' ORDER BY "fill" DESC`, + context: { engine: 'native' }, }); // Note: for some reason adding ` AND "curr_size" * 100.0 / "max_size" > 90` to the filter does not work as of this writing Apr 8, 2024 } catch (e) { @@ -367,6 +371,7 @@ FROM ( ) GROUP BY 1 ORDER BY "num_bad_time_chunks"`, + context: { engine: 'native' }, }); } catch (e) { return; diff --git a/web-console/src/helpers/capabilities.ts b/web-console/src/helpers/capabilities.ts index 4c33f723cfde..e31466e65a34 100644 --- a/web-console/src/helpers/capabilities.ts +++ b/web-console/src/helpers/capabilities.ts @@ -233,7 +233,7 @@ export class Capabilities { { query: FUNCTION_SQL, resultFormat: 'array', - context: { timeout: Capabilities.STATUS_TIMEOUT }, + context: { engine: 'native', timeout: Capabilities.STATUS_TIMEOUT }, }, { timeout: Capabilities.STATUS_TIMEOUT }, ) diff --git a/web-console/src/views/datasources-view/datasources-view.tsx b/web-console/src/views/datasources-view/datasources-view.tsx index dc3f9ef45b41..463991a806a6 100644 --- a/web-console/src/views/datasources-view/datasources-view.tsx +++ b/web-console/src/views/datasources-view/datasources-view.tsx @@ -441,7 +441,7 @@ GROUP BY 1, 2`; if (capabilities.hasSql()) { const query = DatasourcesView.query(visibleColumns); setIntermediateQuery(query); - datasources = await queryDruidSql({ query }, signal); + datasources = await queryDruidSql({ query, context: { engine: 'native' } }, signal); } else if (capabilities.hasCoordinatorAccess()) { const datasourcesResp = await getApiArray( '/druid/coordinator/v1/datasources?simple', @@ -493,6 +493,7 @@ GROUP BY 1, 2`; const runningTasks = await queryDruidSql( { query: DatasourcesView.RUNNING_TASK_SQL, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/explore-view/components/source-pane/source-pane.tsx b/web-console/src/views/explore-view/components/source-pane/source-pane.tsx index fc0a2688cee4..c7f6af2a1f1c 100644 --- a/web-console/src/views/explore-view/components/source-pane/source-pane.tsx +++ b/web-console/src/views/explore-view/components/source-pane/source-pane.tsx @@ -58,6 +58,7 @@ export const SourcePane = React.memo(function SourcePane(props: SourcePaneProps) processQuery: async () => { const tables = await queryDruidSql<{ TABLE_NAME: string }>({ query: `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE'`, + context: { engine: 'native' }, }); return tables.map(d => d.TABLE_NAME); diff --git a/web-console/src/views/explore-view/components/source-query-pane/source-query-pane.tsx b/web-console/src/views/explore-view/components/source-query-pane/source-query-pane.tsx index c3524b3ecebc..5f6d32c17487 100644 --- a/web-console/src/views/explore-view/components/source-query-pane/source-query-pane.tsx +++ b/web-console/src/views/explore-view/components/source-query-pane/source-query-pane.tsx @@ -48,6 +48,7 @@ export const SourceQueryPane = React.memo(function SourceQueryPane(props: Source processQuery: async () => { return await queryDruidSql({ query: `SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS`, + context: { engine: 'native' }, }); }, }); diff --git a/web-console/src/views/explore-view/explore-view.tsx b/web-console/src/views/explore-view/explore-view.tsx index 7176c05cf65c..bfdd231a5b77 100644 --- a/web-console/src/views/explore-view/explore-view.tsx +++ b/web-console/src/views/explore-view/explore-view.tsx @@ -129,6 +129,7 @@ export const ExploreView = React.memo(function ExploreView({ capabilities }: Exp async function initializeWithFirstTable() { const tables = await queryDruidSql<{ TABLE_NAME: string }>({ query: `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE' LIMIT 1`, + context: { engine: 'native' }, }); const firstTableName = tables[0].TABLE_NAME; diff --git a/web-console/src/views/home-view/datasources-card/datasources-card.tsx b/web-console/src/views/home-view/datasources-card/datasources-card.tsx index e80c5cadd3f6..e098672471f8 100644 --- a/web-console/src/views/home-view/datasources-card/datasources-card.tsx +++ b/web-console/src/views/home-view/datasources-card/datasources-card.tsx @@ -37,6 +37,7 @@ export const DatasourcesCard = React.memo(function DatasourcesCard(props: Dataso datasources = await queryDruidSql( { query: `SELECT datasource FROM sys.segments GROUP BY 1`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/home-view/segments-card/segments-card.tsx b/web-console/src/views/home-view/segments-card/segments-card.tsx index 8278ff86a3d9..390e2f7c36b8 100644 --- a/web-console/src/views/home-view/segments-card/segments-card.tsx +++ b/web-console/src/views/home-view/segments-card/segments-card.tsx @@ -51,6 +51,7 @@ export const SegmentsCard = React.memo(function SegmentsCard(props: SegmentsCard COUNT(*) FILTER (WHERE is_realtime = 1) AS "realtime" FROM sys.segments WHERE is_active = 1`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/home-view/services-card/services-card.tsx b/web-console/src/views/home-view/services-card/services-card.tsx index 4689a8861bf7..722c8a43c613 100644 --- a/web-console/src/views/home-view/services-card/services-card.tsx +++ b/web-console/src/views/home-view/services-card/services-card.tsx @@ -50,6 +50,7 @@ export const ServicesCard = React.memo(function ServicesCard(props: ServicesCard }>( { query: `SELECT server_type AS "service_type", COUNT(*) as "count" FROM sys.servers GROUP BY 1`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/home-view/supervisors-card/supervisors-card.tsx b/web-console/src/views/home-view/supervisors-card/supervisors-card.tsx index cfd45ccadcef..54fd419914be 100644 --- a/web-console/src/views/home-view/supervisors-card/supervisors-card.tsx +++ b/web-console/src/views/home-view/supervisors-card/supervisors-card.tsx @@ -45,6 +45,7 @@ export const SupervisorsCard = React.memo(function SupervisorsCard(props: Superv COUNT(*) FILTER (WHERE "suspended" = 0) AS "running", COUNT(*) FILTER (WHERE "suspended" = 1) AS "suspended" FROM sys.supervisors`, + context: { engine: 'native' }, }, signal, ) diff --git a/web-console/src/views/home-view/tasks-card/tasks-card.tsx b/web-console/src/views/home-view/tasks-card/tasks-card.tsx index 40493e522759..3779294f737f 100644 --- a/web-console/src/views/home-view/tasks-card/tasks-card.tsx +++ b/web-console/src/views/home-view/tasks-card/tasks-card.tsx @@ -48,6 +48,7 @@ async function getTaskCounts(capabilities: Capabilities, signal: AbortSignal): P COUNT(*) AS "count" FROM sys.tasks GROUP BY 1`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/segments-view/segments-view.tsx b/web-console/src/views/segments-view/segments-view.tsx index 7fa62f220192..67e6bbba5695 100644 --- a/web-console/src/views/segments-view/segments-view.tsx +++ b/web-console/src/views/segments-view/segments-view.tsx @@ -339,7 +339,7 @@ export class SegmentsView extends React.PureComponent `'${start}/${end}'`) .join(', '); @@ -403,6 +405,7 @@ export class SegmentsView extends React.PureComponent( { query: sqlQuery, + context: { engine: 'native' }, }, signal, ) diff --git a/web-console/src/views/services-view/services-view.tsx b/web-console/src/views/services-view/services-view.tsx index b2d49a3375e4..6bb6b485e428 100644 --- a/web-console/src/views/services-view/services-view.tsx +++ b/web-console/src/views/services-view/services-view.tsx @@ -292,7 +292,10 @@ ORDER BY processQuery: async ({ capabilities, visibleColumns }, signal) => { let services: ServiceResultRow[]; if (capabilities.hasSql()) { - services = await queryDruidSql({ query: ServicesView.SERVICE_SQL }, signal); + services = await queryDruidSql( + { query: ServicesView.SERVICE_SQL, context: { engine: 'native' } }, + signal, + ); } else if (capabilities.hasCoordinatorAccess()) { services = (await getApiArray('/druid/coordinator/v1/servers?simple', signal)).map( (s: any): ServiceResultRow => { diff --git a/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx b/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx index 14a8e59e98f0..d73778f1ee94 100644 --- a/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx +++ b/web-console/src/views/sql-data-loader-view/schema-step/schema-step.tsx @@ -407,6 +407,7 @@ export const SchemaStep = function SchemaStep(props: SchemaStepProps) { { query: `SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'druid' ORDER BY TABLE_NAME ASC`, resultFormat: 'array', + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/tasks-view/tasks-view.tsx b/web-console/src/views/tasks-view/tasks-view.tsx index 23a8d2d52f0d..bb064c7dab4d 100644 --- a/web-console/src/views/tasks-view/tasks-view.tsx +++ b/web-console/src/views/tasks-view/tasks-view.tsx @@ -188,6 +188,7 @@ ORDER BY return await queryDruidSql( { query: TasksView.TASK_SQL, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx index 2e07b60bd649..a20423567cf8 100644 --- a/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx +++ b/web-console/src/views/workbench-view/recent-query-task-panel/recent-query-task-panel.tsx @@ -104,6 +104,7 @@ FROM sys.tasks WHERE "type" = 'query_controller' ORDER BY "created_time" DESC LIMIT 100`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/views/workbench-view/workbench-view.tsx b/web-console/src/views/workbench-view/workbench-view.tsx index 71ce8182885d..16a9f77caae2 100644 --- a/web-console/src/views/workbench-view/workbench-view.tsx +++ b/web-console/src/views/workbench-view/workbench-view.tsx @@ -227,6 +227,7 @@ export class WorkbenchView extends React.PureComponent( { query: `SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS`, + context: { engine: 'native' }, }, signal, ); From 57007ad6d9f8b9352ce01e58638eb6e46f6dc6fa Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Thu, 18 Dec 2025 16:51:22 -0800 Subject: [PATCH 2/2] Update api query --- .../segment-timeline/segment-bar-chart.tsx | 2 +- .../lookup-values-table.tsx | 1 + .../retention-dialog/retention-dialog.tsx | 1 + .../workbench-query/workbench-query.spec.ts | 32 +++++++++++++++++++ .../workbench-query/workbench-query.ts | 4 +++ .../supervisors-view/supervisors-view.tsx | 2 ++ 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/web-console/src/components/segment-timeline/segment-bar-chart.tsx b/web-console/src/components/segment-timeline/segment-bar-chart.tsx index 78a82b90acd3..4c03f4c1e86c 100644 --- a/web-console/src/components/segment-timeline/segment-bar-chart.tsx +++ b/web-console/src/components/segment-timeline/segment-bar-chart.tsx @@ -72,7 +72,7 @@ export const SegmentBarChart = function SegmentBarChart(props: SegmentBarChartPr .addSelect(F.sum(C('num_rows')).as('rows')) .toString(); - return (await queryDruidSql({ query }, signal)).map(sr => { + return (await queryDruidSql({ query, context: { engine: 'native' } }, signal)).map(sr => { const start = new Date(sr.start); const end = new Date(sr.end); diff --git a/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx b/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx index dc2cd81b1e61..ebdb2ef4bdf9 100644 --- a/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx +++ b/web-console/src/dialogs/lookup-table-action-dialog/lookup-values-table/lookup-values-table.tsx @@ -45,6 +45,7 @@ export const LookupValuesTable = React.memo(function LookupValuesTable( return await queryDruidSql( { query: `SELECT "k", "v" FROM ${N('lookup').table(lookupId)} LIMIT 5000`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/dialogs/retention-dialog/retention-dialog.tsx b/web-console/src/dialogs/retention-dialog/retention-dialog.tsx index af1f37bf3171..37ccb62bde03 100644 --- a/web-console/src/dialogs/retention-dialog/retention-dialog.tsx +++ b/web-console/src/dialogs/retention-dialog/retention-dialog.tsx @@ -63,6 +63,7 @@ FROM "sys"."servers" WHERE "server_type" = 'historical' GROUP BY 1 ORDER BY 1`, + context: { engine: 'native' }, }, signal, ); diff --git a/web-console/src/druid-models/workbench-query/workbench-query.spec.ts b/web-console/src/druid-models/workbench-query/workbench-query.spec.ts index 9c732e7a15a2..82bbb28f69aa 100644 --- a/web-console/src/druid-models/workbench-query/workbench-query.spec.ts +++ b/web-console/src/druid-models/workbench-query/workbench-query.spec.ts @@ -287,6 +287,7 @@ describe('WorkbenchQuery', () => { engine: 'sql-native', query: { context: { + engine: 'native', sqlOuterLimit: 1001, sqlQueryId: 'deadbeef-9fb0-499c-8475-ea461e96a4fd', sqlStringifyArrays: false, @@ -315,6 +316,7 @@ describe('WorkbenchQuery', () => { engine: 'sql-native', query: { context: { + engine: 'native', sqlOuterLimit: 1001, sqlQueryId: 'lol', sqlStringifyArrays: false, @@ -354,6 +356,7 @@ describe('WorkbenchQuery', () => { engine: 'sql-native', query: { context: { + engine: 'native', sqlOuterLimit: 1001, sqlQueryId: 'deadbeef-9fb0-499c-8475-ea461e96a4fd', sqlStringifyArrays: false, @@ -395,6 +398,7 @@ describe('WorkbenchQuery', () => { engine: 'sql-native', query: { context: { + engine: 'native', sqlOuterLimit: 1001, sqlQueryId: 'lol', sqlStringifyArrays: false, @@ -410,6 +414,34 @@ describe('WorkbenchQuery', () => { }); }); + it('works with sql (preserves explicit engine context)', () => { + const sql = `SELECT * FROM wikipedia`; + + const workbenchQuery = WorkbenchQuery.blank() + .changeQueryString(sql) + .changeQueryContext({ engine: 'msq-task' }); + + const apiQuery = workbenchQuery.getApiQuery(makeQueryId); + expect(apiQuery).toEqual({ + cancelQueryId: 'deadbeef-9fb0-499c-8475-ea461e96a4fd', + engine: 'sql-native', + query: { + context: { + engine: 'msq-task', + sqlOuterLimit: 1001, + sqlQueryId: 'deadbeef-9fb0-499c-8475-ea461e96a4fd', + sqlStringifyArrays: false, + }, + header: true, + query: 'SELECT * FROM wikipedia', + resultFormat: 'array', + sqlTypesHeader: true, + typesHeader: true, + }, + prefixLines: 0, + }); + }); + it('works with sql-task (as SQL string)', () => { const sql = `INSERT INTO wiki2 SELECT * FROM wikipedia`; diff --git a/web-console/src/druid-models/workbench-query/workbench-query.ts b/web-console/src/druid-models/workbench-query/workbench-query.ts index 694c3b35a239..825b6af5b15d 100644 --- a/web-console/src/druid-models/workbench-query/workbench-query.ts +++ b/web-console/src/druid-models/workbench-query/workbench-query.ts @@ -552,6 +552,10 @@ export class WorkbenchQuery { ...queryContext, }; + if (engine === 'sql-native') { + apiQuery.context.engine ??= 'native'; + } + let cancelQueryId: string | undefined; if (engine === 'sql-native' || engine === 'sql-msq-dart') { cancelQueryId = apiQuery.context.sqlQueryId; diff --git a/web-console/src/views/supervisors-view/supervisors-view.tsx b/web-console/src/views/supervisors-view/supervisors-view.tsx index a56ac816c389..498362469683 100644 --- a/web-console/src/views/supervisors-view/supervisors-view.tsx +++ b/web-console/src/views/supervisors-view/supervisors-view.tsx @@ -317,6 +317,7 @@ export class SupervisorsView extends React.PureComponent< await queryDruidSql( { query: sqlQuery, + context: { engine: 'native' }, }, signal, ) @@ -336,6 +337,7 @@ export class SupervisorsView extends React.PureComponent< await queryDruidSql<{ cnt: number }>( { query: sqlQuery, + context: { engine: 'native' }, }, signal, )