diff --git a/packages/query-splitter/src/splitQuery.ts b/packages/query-splitter/src/splitQuery.ts index dea612cec..567e9d7c1 100644 --- a/packages/query-splitter/src/splitQuery.ts +++ b/packages/query-splitter/src/splitQuery.ts @@ -30,17 +30,17 @@ export interface SplitLineContext extends SplitStreamContext { // semicolonKeyTokenRegex: RegExp; } -export type SplitResultItem = - | string - | { - text: string; - startPosition: number; - endPosition: number; - startLine: number; - startColumn: number; - endLine: number; - endColumn: number; - }; +export interface SplitResultItemRich { + text: string; + startPosition: number; + endPosition: number; + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +export type SplitResultItem = string | SplitResultItemRich; function movePosition(context: SplitLineContext, count: number) { if (context.options.returnRichInfo) { @@ -208,23 +208,42 @@ function pushQuery(context: SplitLineContext) { const trimmed = sql.trim(); if (trimmed) { if (context.options.returnRichInfo) { - context.pushOutput({ - text: trimmed, + context.pushOutput( + trimPositions(sql, { + text: trimmed, - startPosition: context.commandStartPosition, - startLine: context.commandStartLine, - startColumn: context.commandStartColumn, + startPosition: context.commandStartPosition, + startLine: context.commandStartLine, + startColumn: context.commandStartColumn, - endPosition: context.streamPosition, - endLine: context.line, - endColumn: context.column, - }); + endPosition: context.streamPosition, + endLine: context.line, + endColumn: context.column, + }) + ); } else { context.pushOutput(trimmed); } } } +function trimPositions(full: string, positions: SplitResultItemRich): SplitResultItemRich { + const startIndex = full.indexOf(positions.text); + const res = { ...positions }; + for (let i = 0; i < startIndex; i += 1) { + if (full[i] == '\n') { + res.startPosition += 1; + res.startLine += 1; + res.startColumn = 0; + } else { + res.startPosition += 1; + res.startColumn += 1; + } + } + + return res; +} + function markStartCommand(context: SplitLineContext) { if (context.options.returnRichInfo) { context.commandStartPosition = context.streamPosition; @@ -299,15 +318,17 @@ export function finishSplitStream(context: SplitStreamContext) { const trimmed = context.commandPart.trim(); if (trimmed) { if (context.options.returnRichInfo) { - context.pushOutput({ - text: trimmed, - startPosition: context.commandStartPosition, - startLine: context.commandStartLine, - startColumn: context.commandStartColumn, - endPosition: context.streamPosition, - endLine: context.line, - endColumn: context.column, - }); + context.pushOutput( + trimPositions(context.commandPart, { + text: trimmed, + startPosition: context.commandStartPosition, + startLine: context.commandStartLine, + startColumn: context.commandStartColumn, + endPosition: context.streamPosition, + endLine: context.line, + endColumn: context.column, + }) + ); } else { context.pushOutput(trimmed); } diff --git a/packages/query-splitter/src/splitter.test.ts b/packages/query-splitter/src/splitter.test.ts index cf021e990..935f5e140 100644 --- a/packages/query-splitter/src/splitter.test.ts +++ b/packages/query-splitter/src/splitter.test.ts @@ -111,9 +111,9 @@ test('count lines', () => { expect.objectContaining({ text: 'SELECT * FROM `table2`', - startPosition: 23, - startLine: 0, - startColumn: 23, + startPosition: 24, + startLine: 1, + startColumn: 0, endPosition: 46, endLine: 1, @@ -144,9 +144,9 @@ test('count lines with flush', () => { expect.objectContaining({ text: 'SELECT * FROM `table2`', - startPosition: 23, - startLine: 0, - startColumn: 23, + startPosition: 24, + startLine: 1, + startColumn: 0, endPosition: 46, endLine: 1, diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index 6ab7114ea..3f9293c6c 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -68,6 +68,7 @@ import { findEngineDriver } from 'dbgate-tools'; import AceEditor from '../query/AceEditor.svelte'; import StatusBarTabItem from '../widgets/StatusBarTabItem.svelte'; + import { showSnackbarError } from '../utility/snackbar'; export let tabid; export let conid; @@ -139,6 +140,11 @@ async function executeCore(sql) { if (busy) return; + if (!sql || !sql.trim()) { + showSnackbarError('Skipped executing empty query'); + return; + } + executeNumber++; visibleResultTabs = true;