From f948e13571a2eb07e36b7465b0c3defafd61c82f Mon Sep 17 00:00:00 2001 From: Adam Hartford Date: Tue, 9 Dec 2025 11:06:43 -0500 Subject: [PATCH 1/3] Add configuration option to show batch start/completion messages (default enabled) --- extensions/mssql/package.json | 6 ++ extensions/mssql/package.nls.json | 1 + extensions/mssql/src/constants/constants.ts | 1 + .../mssql/src/controllers/queryRunner.ts | 24 ++++++-- .../src/models/sqlOutputContentProvider.ts | 58 +++++++++++-------- 5 files changed, 60 insertions(+), 30 deletions(-) diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 40dc1ef8a0..1dc8e40e26 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -1805,6 +1805,12 @@ "default": false, "scope": "resource" }, + "mssql.showBatchMessages": { + "type": "boolean", + "description": "%mssql.showBatchMessages%", + "default": true, + "scope": "resource" + }, "mssql.splitPaneSelection": { "type": "string", "description": "%mssql.splitPaneSelection%", diff --git a/extensions/mssql/package.nls.json b/extensions/mssql/package.nls.json index e7ee9ef1ad..31effac904 100644 --- a/extensions/mssql/package.nls.json +++ b/extensions/mssql/package.nls.json @@ -121,6 +121,7 @@ "mssql.copyIncludeHeaders": "[Optional] Configuration options for copying results from the Results View", "mssql.copyRemoveNewLine": "[Optional] Configuration options for copying multi-line results from the Results View", "mssql.showBatchTime": "[Optional] Should execution time be shown for individual batches", + "mssql.showBatchMessages": "[Optional] Show batch start and completion messages including 'Started executing query at...' and 'Commands completed successfully' messages.", "mssql.splitPaneSelection": "[Optional] Configuration options for which column new result panes should open in", "mssql.preventAutoExecuteScript": "Prevent automatic execution of scripts (e.g., 'Select Top 1000'). When enabled, scripts will not be automatically executed upon generation.", "mssql.format.alignColumnDefinitionsInColumns": "Should column definitions be aligned?", diff --git a/extensions/mssql/src/constants/constants.ts b/extensions/mssql/src/constants/constants.ts index 441163cb2c..1cc4443be2 100644 --- a/extensions/mssql/src/constants/constants.ts +++ b/extensions/mssql/src/constants/constants.ts @@ -223,6 +223,7 @@ export const configMaxRecentConnections = "maxRecentConnections"; export const configCopyRemoveNewLine = "copyRemoveNewLine"; export const configSplitPaneSelection = "splitPaneSelection"; export const configShowBatchTime = "showBatchTime"; +export const configShowBatchMessages = "showBatchMessages"; export const configPreventAutoExecuteScript = "mssql.query.preventAutoExecuteScript"; export enum extConfigResultKeys { Shortcuts = "shortcuts", diff --git a/extensions/mssql/src/controllers/queryRunner.ts b/extensions/mssql/src/controllers/queryRunner.ts index 9048972302..4a08d004f0 100644 --- a/extensions/mssql/src/controllers/queryRunner.ts +++ b/extensions/mssql/src/controllers/queryRunner.ts @@ -559,13 +559,25 @@ export default class QueryRunner { let message = obj.message; message.time = new Date(message.time).toLocaleTimeString(); - // save the message into the batch summary so it can be restored on view refresh - if (message.batchId >= 0 && this._batchSetMessages[message.batchId] !== undefined) { - this._batchSetMessages[message.batchId].push(message); - } + // Check configuration to see if batch messages should be shown + let extConfig = this._vscodeWrapper.getConfiguration( + Constants.extensionConfigSectionName, + this.uri, + ); + let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages) ?? true; + + // Only show success messages if the configuration allows it + let shouldShowMessage = message.isError || showBatchMessages; - // Send the message to the results pane - this._messageEmitter.fire(message); + if (shouldShowMessage) { + // save the message into the batch summary so it can be restored on view refresh + if (message.batchId >= 0 && this._batchSetMessages[message.batchId] !== undefined) { + this._batchSetMessages[message.batchId].push(message); + } + + // Send the message to the results pane + this._messageEmitter.fire(message); + } // Set row count on status bar if there are no errors if (!obj.message.isError) { diff --git a/extensions/mssql/src/models/sqlOutputContentProvider.ts b/extensions/mssql/src/models/sqlOutputContentProvider.ts index f69cf3bcb4..46c8b9320c 100644 --- a/extensions/mssql/src/models/sqlOutputContentProvider.ts +++ b/extensions/mssql/src/models/sqlOutputContentProvider.ts @@ -481,31 +481,41 @@ export class SqlOutputContentProvider { ); const batchStartListener = queryRunner.onBatchStart(async (batch) => { - let time = new Date().toLocaleTimeString(); - if (batch.executionElapsed && batch.executionEnd) { - time = new Date(batch.executionStart).toLocaleTimeString(); - } - - // Build a message for the selection and send the message - // from the webview - let message: IMessage = { - message: LocalizedConstants.runQueryBatchStartMessage, - selection: batch.selection, - isError: false, - time: time, - link: { - text: LocalizedConstants.runQueryBatchStartLine( - batch.selection.startLine + 1, - ), - uri: queryRunner.uri, - }, - }; - - const resultWebviewState = this._queryResultWebviewController.getQueryResultState( - queryRunner.uri, + // Check configuration to see if batch messages should be shown + let queryUri = queryRunner.uri; + let extConfig = this._vscodeWrapper.getConfiguration( + Constants.extensionConfigSectionName, + queryUri, ); - resultWebviewState.messages.push(message); - this.scheduleThrottledUpdate(queryRunner.uri); + let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages) ?? true; + + if (showBatchMessages) { + let time = new Date().toLocaleTimeString(); + if (batch.executionElapsed && batch.executionEnd) { + time = new Date(batch.executionStart).toLocaleTimeString(); + } + + // Build a message for the selection and send the message + // from the webview + let message: IMessage = { + message: LocalizedConstants.runQueryBatchStartMessage, + selection: batch.selection, + isError: false, + time: time, + link: { + text: LocalizedConstants.runQueryBatchStartLine( + batch.selection.startLine + 1, + ), + uri: queryRunner.uri, + }, + }; + + const resultWebviewState = this._queryResultWebviewController.getQueryResultState( + queryRunner.uri, + ); + resultWebviewState.messages.push(message); + this.scheduleThrottledUpdate(queryRunner.uri); + } }); const onMessageListener = queryRunner.onMessage(async (message) => { From 16874d962e9b7b512b87e004ba7a722c217dda41 Mon Sep 17 00:00:00 2001 From: Adam Hartford Date: Thu, 11 Dec 2025 22:06:43 -0500 Subject: [PATCH 2/3] Code cleanup per PR review. Fix linter errors. --- .../src/models/sqlOutputContentProvider.ts | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/extensions/mssql/src/models/sqlOutputContentProvider.ts b/extensions/mssql/src/models/sqlOutputContentProvider.ts index 46c8b9320c..89ad468e1a 100644 --- a/extensions/mssql/src/models/sqlOutputContentProvider.ts +++ b/extensions/mssql/src/models/sqlOutputContentProvider.ts @@ -487,35 +487,37 @@ export class SqlOutputContentProvider { Constants.extensionConfigSectionName, queryUri, ); - let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages) ?? true; - - if (showBatchMessages) { - let time = new Date().toLocaleTimeString(); - if (batch.executionElapsed && batch.executionEnd) { - time = new Date(batch.executionStart).toLocaleTimeString(); - } + let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages); - // Build a message for the selection and send the message - // from the webview - let message: IMessage = { - message: LocalizedConstants.runQueryBatchStartMessage, - selection: batch.selection, - isError: false, - time: time, - link: { - text: LocalizedConstants.runQueryBatchStartLine( - batch.selection.startLine + 1, - ), - uri: queryRunner.uri, - }, - }; - - const resultWebviewState = this._queryResultWebviewController.getQueryResultState( - queryRunner.uri, - ); - resultWebviewState.messages.push(message); - this.scheduleThrottledUpdate(queryRunner.uri); + if (showBatchMessages === false) { + return; + } + + let time = new Date().toLocaleTimeString(); + if (batch.executionElapsed && batch.executionEnd) { + time = new Date(batch.executionStart).toLocaleTimeString(); } + + // Build a message for the selection and send the message + // from the webview + let message: IMessage = { + message: LocalizedConstants.runQueryBatchStartMessage, + selection: batch.selection, + isError: false, + time: time, + link: { + text: LocalizedConstants.runQueryBatchStartLine( + batch.selection.startLine + 1, + ), + uri: queryRunner.uri, + }, + }; + + const resultWebviewState = this._queryResultWebviewController.getQueryResultState( + queryRunner.uri, + ); + resultWebviewState.messages.push(message); + this.scheduleThrottledUpdate(queryRunner.uri); }); const onMessageListener = queryRunner.onMessage(async (message) => { From 37e0d2a538618f5e3a5e5bbfd27a48b9236ee55e Mon Sep 17 00:00:00 2001 From: Adam Hartford Date: Fri, 12 Dec 2025 07:49:03 -0500 Subject: [PATCH 3/3] Remove redundant "?? true" --- extensions/mssql/src/controllers/queryRunner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/mssql/src/controllers/queryRunner.ts b/extensions/mssql/src/controllers/queryRunner.ts index 4a08d004f0..8aeddbb833 100644 --- a/extensions/mssql/src/controllers/queryRunner.ts +++ b/extensions/mssql/src/controllers/queryRunner.ts @@ -564,7 +564,7 @@ export default class QueryRunner { Constants.extensionConfigSectionName, this.uri, ); - let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages) ?? true; + let showBatchMessages: boolean = extConfig.get(Constants.configShowBatchMessages); // Only show success messages if the configuration allows it let shouldShowMessage = message.isError || showBatchMessages;