mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-25 17:23:10 -05:00
Add support for setting query options in settings and through API (#5484)
Initial query execution options PR. This is the second in a set of query editor extensibility improvements I'm making. The PRs include (1) bug fix for webview in query tab (2) dynamic toolbars and (3) fix query event sequencing and event metadata info.
This commit is contained in:
15
src/sql/azdata.proposed.d.ts
vendored
15
src/sql/azdata.proposed.d.ts
vendored
@@ -740,6 +740,10 @@ declare module 'azdata' {
|
||||
flavor: string;
|
||||
}
|
||||
|
||||
export interface QueryExecutionOptions {
|
||||
options: Map<string, any>;
|
||||
}
|
||||
|
||||
export interface QueryProvider extends DataProvider {
|
||||
cancelQuery(ownerUri: string): Thenable<QueryCancelResult>;
|
||||
runQuery(ownerUri: string, selection: ISelectionData, runOptions?: ExecutionPlanOptions): Thenable<void>;
|
||||
@@ -750,6 +754,7 @@ declare module 'azdata' {
|
||||
getQueryRows(rowData: QueryExecuteSubsetParams): Thenable<QueryExecuteSubsetResult>;
|
||||
disposeQuery(ownerUri: string): Thenable<void>;
|
||||
saveResults(requestParams: SaveResultsRequestParams): Thenable<SaveResultRequestResult>;
|
||||
setQueryExecutionOptions(ownerUri: string, options: QueryExecutionOptions): Thenable<void>;
|
||||
|
||||
// Notifications
|
||||
registerOnQueryComplete(handler: (result: QueryExecuteCompleteNotificationResult) => any): void;
|
||||
@@ -3884,11 +3889,8 @@ declare module 'azdata' {
|
||||
|
||||
uri: string;
|
||||
|
||||
// get the document's execution options
|
||||
getOptions(): Map<string, string>;
|
||||
|
||||
// set the document's execution options
|
||||
setOptions(options: Map<string, string>): void;
|
||||
setExecutionOptions(options: Map<string, any>): Thenable<void>;
|
||||
|
||||
// tab content is build using the modelview UI builder APIs
|
||||
// probably should rename DialogTab class since it is useful outside dialogs
|
||||
@@ -3913,7 +3915,10 @@ declare module 'azdata' {
|
||||
*/
|
||||
export function registerQueryEventListener(listener: queryeditor.QueryEventListener): void;
|
||||
|
||||
export function getQueryDocument(fileUri: string): queryeditor.QueryDocument;
|
||||
/**
|
||||
* Get a QueryDocument object for a file URI
|
||||
*/
|
||||
export function getQueryDocument(fileUri: string): Thenable<queryeditor.QueryDocument>;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -191,6 +191,8 @@ export interface IConnectionManagementService {
|
||||
|
||||
getConnectionInfo(fileUri: string): ConnectionManagementInfo;
|
||||
|
||||
getDefaultProviderId(): string;
|
||||
|
||||
/**
|
||||
* Cancels the connection
|
||||
*/
|
||||
|
||||
@@ -760,6 +760,11 @@ export class ConnectionManagementService extends Disposable implements IConnecti
|
||||
}
|
||||
}
|
||||
|
||||
public getDefaultProviderId(): string {
|
||||
let defaultProvider = WorkbenchUtils.getSqlConfigValue<string>(this._configurationService, Constants.defaultEngine);
|
||||
return defaultProvider && this._providers.has(defaultProvider) ? defaultProvider : undefined;
|
||||
}
|
||||
|
||||
private async fillInAzureTokenIfNeeded(connection: IConnectionProfile): Promise<boolean> {
|
||||
if (connection.authenticationType !== Constants.azureMFA || connection.options['azureAccountToken']) {
|
||||
return true;
|
||||
|
||||
@@ -36,6 +36,7 @@ export interface IQueryManagementService {
|
||||
getQueryRows(rowData: azdata.QueryExecuteSubsetParams): Thenable<azdata.QueryExecuteSubsetResult>;
|
||||
disposeQuery(ownerUri: string): Thenable<void>;
|
||||
saveResults(requestParams: azdata.SaveResultsRequestParams): Thenable<azdata.SaveResultRequestResult>;
|
||||
setQueryExecutionOptions(uri: string, options: azdata.QueryExecutionOptions): Thenable<void>;
|
||||
|
||||
// Callbacks
|
||||
onQueryComplete(result: azdata.QueryExecuteCompleteNotificationResult): void;
|
||||
@@ -73,6 +74,7 @@ export interface IQueryRequestHandler {
|
||||
getQueryRows(rowData: azdata.QueryExecuteSubsetParams): Thenable<azdata.QueryExecuteSubsetResult>;
|
||||
disposeQuery(ownerUri: string): Thenable<void>;
|
||||
saveResults(requestParams: azdata.SaveResultsRequestParams): Thenable<azdata.SaveResultRequestResult>;
|
||||
setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Thenable<void>;
|
||||
|
||||
// Edit Data actions
|
||||
initializeEdit(ownerUri: string, schemaName: string, objectName: string, objectType: string, rowLimit: number, queryString: string): Thenable<void>;
|
||||
@@ -177,9 +179,13 @@ export class QueryManagementService implements IQueryManagementService {
|
||||
TelemetryUtils.addTelemetry(this._telemetryService, this.logService, eventName, data);
|
||||
}
|
||||
|
||||
private _runAction<T>(uri: string, action: (handler: IQueryRequestHandler) => Thenable<T>): Thenable<T> {
|
||||
private _runAction<T>(uri: string, action: (handler: IQueryRequestHandler) => Thenable<T>, fallBackToDefaultProvider: boolean = false): Thenable<T> {
|
||||
let providerId: string = this._connectionService.getProviderIdFromUri(uri);
|
||||
|
||||
if (!providerId && fallBackToDefaultProvider) {
|
||||
providerId = this._connectionService.getDefaultProviderId();
|
||||
}
|
||||
|
||||
if (!providerId) {
|
||||
return Promise.reject(new Error('Connection is required in order to interact with queries'));
|
||||
}
|
||||
@@ -236,6 +242,11 @@ export class QueryManagementService implements IQueryManagementService {
|
||||
return runner.disposeQuery(ownerUri);
|
||||
});
|
||||
}
|
||||
public setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Thenable<void> {
|
||||
return this._runAction(ownerUri, (runner) => {
|
||||
return runner.setQueryExecutionOptions(ownerUri, options);
|
||||
}, true);
|
||||
}
|
||||
|
||||
public saveResults(requestParams: azdata.SaveResultsRequestParams): Thenable<azdata.SaveResultRequestResult> {
|
||||
return this._runAction(requestParams.ownerUri, (runner) => {
|
||||
|
||||
@@ -50,7 +50,7 @@ export default class QueryRunner extends Disposable {
|
||||
private _messages: IQueryMessage[] = [];
|
||||
private registered = false;
|
||||
|
||||
private _isQueryPlan: boolean;
|
||||
private _isQueryPlan: boolean = false;
|
||||
public get isQueryPlan(): boolean { return this._isQueryPlan; }
|
||||
private _planXml = new Deferred<string>();
|
||||
public get planXml(): Thenable<string> { return this._planXml.promise; }
|
||||
@@ -180,12 +180,6 @@ export default class QueryRunner extends Disposable {
|
||||
this._totalElapsedMilliseconds = 0;
|
||||
// TODO issue #228 add statusview callbacks here
|
||||
|
||||
if (runOptions && (runOptions.displayActualQueryPlan || runOptions.displayEstimatedQueryPlan)) {
|
||||
this._isQueryPlan = true;
|
||||
} else {
|
||||
this._isQueryPlan = false;
|
||||
}
|
||||
|
||||
this._onQueryStart.fire();
|
||||
|
||||
// Send the request to execute the query
|
||||
@@ -335,16 +329,15 @@ export default class QueryRunner extends Disposable {
|
||||
batchSet = this._batchSets[resultSet.batchId];
|
||||
}
|
||||
// handle getting queryPlanxml if we need too
|
||||
if (this.isQueryPlan) {
|
||||
// check if this result has show plan, this needs work, it won't work for any other provider
|
||||
let hasShowPlan = !!result.resultSetSummary.columnInfo.find(e => e.columnName === 'Microsoft SQL Server 2005 XML Showplan');
|
||||
if (hasShowPlan) {
|
||||
this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => {
|
||||
if (e.resultSubset.rows) {
|
||||
this._planXml.resolve(e.resultSubset.rows[0][0].displayValue);
|
||||
}
|
||||
});
|
||||
}
|
||||
// check if this result has show plan, this needs work, it won't work for any other provider
|
||||
let hasShowPlan = !!result.resultSetSummary.columnInfo.find(e => e.columnName === 'Microsoft SQL Server 2005 XML Showplan');
|
||||
if (hasShowPlan) {
|
||||
this._isQueryPlan = true;
|
||||
this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => {
|
||||
if (e.resultSubset.rows) {
|
||||
this._planXml.resolve(e.resultSubset.rows[0][0].displayValue);
|
||||
}
|
||||
});
|
||||
}
|
||||
// we will just ignore the set if we already have it
|
||||
// ideally this should never happen
|
||||
@@ -362,25 +355,24 @@ export default class QueryRunner extends Disposable {
|
||||
let batchSet: azdata.BatchSummary;
|
||||
batchSet = this._batchSets[resultSet.batchId];
|
||||
// handle getting queryPlanxml if we need too
|
||||
if (this.isQueryPlan) {
|
||||
// check if this result has show plan, this needs work, it won't work for any other provider
|
||||
let hasShowPlan = !!result.resultSetSummary.columnInfo.find(e => e.columnName === 'Microsoft SQL Server 2005 XML Showplan');
|
||||
if (hasShowPlan) {
|
||||
this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => {
|
||||
if (e.resultSubset.rows) {
|
||||
let planXmlString = e.resultSubset.rows[0][0].displayValue;
|
||||
this._planXml.resolve(e.resultSubset.rows[0][0].displayValue);
|
||||
// fire query plan available event if execution is completed
|
||||
if (result.resultSetSummary.complete) {
|
||||
this._onQueryPlanAvailable.fire({
|
||||
providerId: 'MSSQL',
|
||||
fileUri: result.ownerUri,
|
||||
planXml: planXmlString
|
||||
});
|
||||
}
|
||||
// check if this result has show plan, this needs work, it won't work for any other provider
|
||||
let hasShowPlan = !!result.resultSetSummary.columnInfo.find(e => e.columnName === 'Microsoft SQL Server 2005 XML Showplan');
|
||||
if (hasShowPlan) {
|
||||
this._isQueryPlan = true;
|
||||
this.getQueryRows(0, 1, result.resultSetSummary.batchId, result.resultSetSummary.id).then(e => {
|
||||
if (e.resultSubset.rows) {
|
||||
let planXmlString = e.resultSubset.rows[0][0].displayValue;
|
||||
this._planXml.resolve(e.resultSubset.rows[0][0].displayValue);
|
||||
// fire query plan available event if execution is completed
|
||||
if (result.resultSetSummary.complete) {
|
||||
this._onQueryPlanAvailable.fire({
|
||||
providerId: 'MSSQL',
|
||||
fileUri: result.ownerUri,
|
||||
planXml: planXmlString
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
if (batchSet) {
|
||||
// Store the result set in the batch and emit that a result set has completed
|
||||
|
||||
@@ -260,6 +260,14 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape {
|
||||
return this._resolveProvider<azdata.QueryProvider>(handle).runQueryAndReturn(ownerUri, queryString);
|
||||
}
|
||||
|
||||
$setQueryExecutionOptions(handle: number, ownerUri: string, options: azdata.QueryExecutionOptions): Thenable<void> {
|
||||
if (this._resolveProvider<azdata.QueryProvider>(handle).setQueryExecutionOptions) {
|
||||
return this._resolveProvider<azdata.QueryProvider>(handle).setQueryExecutionOptions(ownerUri, options);
|
||||
} else {
|
||||
return new Promise((r) => r());
|
||||
}
|
||||
}
|
||||
|
||||
$parseSyntax(handle: number, ownerUri: string, query: string): Thenable<azdata.SyntaxParseResult> {
|
||||
return this._resolveProvider<azdata.QueryProvider>(handle).parseSyntax(ownerUri, query);
|
||||
}
|
||||
|
||||
@@ -15,17 +15,14 @@ class ExtHostQueryDocument implements azdata.queryeditor.QueryDocument {
|
||||
private _proxy: MainThreadQueryEditorShape) {
|
||||
}
|
||||
|
||||
// get the document's execution options
|
||||
getOptions(): Map<string, string> {
|
||||
return undefined;
|
||||
public setExecutionOptions(options: Map<string, any>): Thenable<void> {
|
||||
let executionOptions: azdata.QueryExecutionOptions = {
|
||||
options: options
|
||||
};
|
||||
return this._proxy.$setQueryExecutionOptions(this.uri, executionOptions);
|
||||
}
|
||||
|
||||
// set the document's execution optionsß
|
||||
setOptions(options: Map<string, string>): void {
|
||||
|
||||
}
|
||||
|
||||
createQueryTab(tab: azdata.window.DialogTab): void {
|
||||
public createQueryTab(tab: azdata.window.DialogTab): void {
|
||||
this._proxy.$createQueryTab(this.uri, tab.title, tab.content);
|
||||
}
|
||||
}
|
||||
@@ -63,4 +60,11 @@ export class ExtHostQueryEditor implements ExtHostQueryEditorShape {
|
||||
listener.onQueryEvent(event.type, new ExtHostQueryDocument('MSSQL', fileUri, this._proxy), planXml);
|
||||
}
|
||||
}
|
||||
|
||||
public $getQueryDocument(fileUri: string): Thenable<azdata.queryeditor.QueryDocument> {
|
||||
return new Promise((resolve) => {
|
||||
resolve(new ExtHostQueryDocument('MSSQL', fileUri, this._proxy));
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -127,6 +127,9 @@ export class MainThreadDataProtocol implements MainThreadDataProtocolShape {
|
||||
getQueryRows(rowData: azdata.QueryExecuteSubsetParams): Thenable<azdata.QueryExecuteSubsetResult> {
|
||||
return self._proxy.$getQueryRows(handle, rowData);
|
||||
},
|
||||
setQueryExecutionOptions(ownerUri: string, options: azdata.QueryExecutionOptions): Thenable<void> {
|
||||
return self._proxy.$setQueryExecutionOptions(handle, ownerUri, options);
|
||||
},
|
||||
disposeQuery(ownerUri: string): Thenable<void> {
|
||||
return self._proxy.$disposeQuery(handle, ownerUri);
|
||||
},
|
||||
|
||||
@@ -7,11 +7,12 @@ import { SqlExtHostContext, SqlMainContext, ExtHostQueryEditorShape, MainThreadQ
|
||||
import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol';
|
||||
import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers';
|
||||
import { IConnectionManagementService, IConnectionCompletionOptions, ConnectionType, RunQueryOnConnectionMode } from 'sql/platform/connection/common/connectionManagement';
|
||||
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
|
||||
import { QueryEditor } from 'sql/workbench/parts/query/browser/queryEditor';
|
||||
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { dispose, IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { IQueryModelService, IQueryEvent } from 'sql/platform/query/common/queryModel';
|
||||
import { IQueryManagementService } from 'sql/platform/query/common/queryManagement';
|
||||
import * as azdata from 'azdata';
|
||||
|
||||
@extHostNamedCustomer(SqlMainContext.MainThreadQueryEditor)
|
||||
export class MainThreadQueryEditor implements MainThreadQueryEditorShape {
|
||||
@@ -22,7 +23,7 @@ export class MainThreadQueryEditor implements MainThreadQueryEditorShape {
|
||||
constructor(
|
||||
extHostContext: IExtHostContext,
|
||||
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
|
||||
@IQueryEditorService private _queryEditorService: IQueryEditorService,
|
||||
@IQueryManagementService private _queryManagementService: IQueryManagementService,
|
||||
@IQueryModelService private _queryModelService: IQueryModelService,
|
||||
@IEditorService private _editorService: IEditorService
|
||||
) {
|
||||
@@ -96,4 +97,8 @@ export class MainThreadQueryEditor implements MainThreadQueryEditorShape {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public $setQueryExecutionOptions(fileUri: string, options: azdata.QueryExecutionOptions): Thenable<void> {
|
||||
return this._queryManagementService.setQueryExecutionOptions(fileUri, options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/co
|
||||
import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage';
|
||||
import * as extHostTypes from 'vs/workbench/api/common/extHostTypes';
|
||||
import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures';
|
||||
import { AzureResource } from 'sql/platform/accounts/common/interfaces';
|
||||
|
||||
export interface ISqlExtensionApiFactory {
|
||||
vsCodeFactory(extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode;
|
||||
@@ -462,8 +463,8 @@ export function createApiFactory(
|
||||
extHostQueryEditor.$registerQueryInfoListener('MSSQL', listener);
|
||||
},
|
||||
|
||||
getQueryDocument(fileUri: string): azdata.queryeditor.QueryDocument {
|
||||
return undefined;
|
||||
getQueryDocument(fileUri: string): Thenable<azdata.queryeditor.QueryDocument> {
|
||||
return extHostQueryEditor.$getQueryDocument(fileUri);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -662,7 +663,7 @@ export function createApiFactory(
|
||||
extHostDataProvider.$onEditSessionReady(provider.handle, ownerUri, success, message);
|
||||
});
|
||||
|
||||
return extHostDataProvider.$registerQueryProvider(provider);
|
||||
return extHostDataProvider.$registerQueryProvider(<azdata.QueryProvider>provider);
|
||||
};
|
||||
|
||||
let registerObjectExplorerProvider = (provider: sqlops.ObjectExplorerProvider): vscode.Disposable => {
|
||||
|
||||
@@ -173,6 +173,10 @@ export abstract class ExtHostDataProtocolShape {
|
||||
* Gets a subset of rows in a result set in order to display in the UI
|
||||
*/
|
||||
$getQueryRows(handle: number, rowData: azdata.QueryExecuteSubsetParams): Thenable<azdata.QueryExecuteSubsetResult> { throw ni(); }
|
||||
/**
|
||||
* Sets the query execution options for a query editor document
|
||||
*/
|
||||
$setQueryExecutionOptions(handle: number, ownerUri: string, options: azdata.QueryExecutionOptions): Thenable<void> { throw ni(); }
|
||||
|
||||
/**
|
||||
* Disposes the cached information regarding a query
|
||||
@@ -793,6 +797,7 @@ export interface MainThreadQueryEditorShape extends IDisposable {
|
||||
$connect(fileUri: string, connectionId: string): Thenable<void>;
|
||||
$runQuery(fileUri: string): void;
|
||||
$createQueryTab(fileUri: string, title: string, content: string): void;
|
||||
$setQueryExecutionOptions(fileUri: string, options: azdata.QueryExecutionOptions): Thenable<void>;
|
||||
$registerQueryInfoListener(handle: number, providerId: string): void;
|
||||
}
|
||||
|
||||
|
||||
@@ -404,6 +404,116 @@ let registryProperties = {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.intelliSense.lowerCaseSuggestions', 'Should IntelliSense suggestions be lowercase')
|
||||
},
|
||||
'mssql.query.rowCount': {
|
||||
'type': 'number',
|
||||
'default': 0,
|
||||
'description': localize('mssql.query.setRowCount', 'Maximum number of rows to return before the server stops processing your query.')
|
||||
},
|
||||
'mssql.query.textSize': {
|
||||
'type': 'number',
|
||||
'default': 2147483647,
|
||||
'description': localize('mssql.query.textSize', 'Maximum size of text and ntext data returned from a SELECT statement')
|
||||
},
|
||||
'mssql.query.executionTimeout': {
|
||||
'type': 'number',
|
||||
'default': 0,
|
||||
'description': localize('mssql.query.executionTimeout', 'An execution time-out of 0 indicates an unlimited wait (no time-out)')
|
||||
},
|
||||
'mssql.query.noCount': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.noCount', 'Enable SET NOCOUNT option')
|
||||
},
|
||||
'mssql.query.noExec': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.noExec', 'Enable SET NOEXEC option')
|
||||
},
|
||||
'mssql.query.parseOnly': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.parseOnly', 'Enable SET PARSEONLY option')
|
||||
},
|
||||
'mssql.query.arithAbort': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.arithAbort', 'Enable SET ARITHABORT option')
|
||||
},
|
||||
'mssql.query.statisticsTime': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.statisticsTime', 'Enable SET STATISTICS TIME option')
|
||||
},
|
||||
'mssql.query.statisticsIO': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.statisticsIO', 'Enable SET STATISTICS IO option')
|
||||
},
|
||||
'mssql.query.xactAbortOn': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.xactAbortOn', 'Enable SET XACT_ABORT ON option')
|
||||
},
|
||||
'mssql.query.transactionIsolationLevel': {
|
||||
'enum': ['READ COMMITTED', 'READ UNCOMMITTED', 'REPEATABLE READ', 'SERIALIZABLE'],
|
||||
'default': 'READ COMMITTED',
|
||||
'description': localize('mssql.query.transactionIsolationLevel', 'Enable SET TRANSACTION ISOLATION LEVEL option')
|
||||
},
|
||||
'mssql.query.deadlockPriority': {
|
||||
'enum': ['Normal', 'Low'],
|
||||
'default': 'Normal',
|
||||
'description': localize('mssql.query.deadlockPriority', 'Enable SET DEADLOCK_PRIORITY option')
|
||||
},
|
||||
'mssql.query.lockTimeout': {
|
||||
'type': 'number',
|
||||
'default': -1,
|
||||
'description': localize('mssql.query.lockTimeout', 'Enable SET LOCK TIMEOUT option (in milliseconds)')
|
||||
},
|
||||
'mssql.query.queryGovernorCostLimit': {
|
||||
'type': 'number',
|
||||
'default': -1,
|
||||
'description': localize('mssql.query.queryGovernorCostLimit', 'Enable SET QUERY_GOVERNOR_COST_LIMIT')
|
||||
},
|
||||
'mssql.query.ansiDefaults': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.ansiDefaults', 'Enable SET ANSI_DEFAULTS')
|
||||
},
|
||||
'mssql.query.quotedIdentifier': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': localize('mssql.query.quotedIdentifier', 'Enable SET QUOTED_IDENTIFIER')
|
||||
},
|
||||
'mssql.query.ansiNullDefaultOn': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': localize('mssql.query.ansiNullDefaultOn', 'Enable SET ANSI_NULL_DFLT_ON')
|
||||
},
|
||||
'mssql.query.implicitTransactions': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.implicitTransactions', 'Enable SET IMPLICIT_TRANSACTIONS')
|
||||
},
|
||||
'mssql.query.cursorCloseOnCommit': {
|
||||
'type': 'boolean',
|
||||
'default': false,
|
||||
'description': localize('mssql.query.cursorCloseOnCommit', 'Enable SET CURSOR_CLOSE_ON_COMMIT')
|
||||
},
|
||||
'mssql.query.ansiPadding': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': localize('mssql.query.ansiPadding', 'Enable SET ANSI_PADDING')
|
||||
},
|
||||
'mssql.query.ansiWarnings': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': localize('mssql.query.ansiWarnings', 'Enable SET ANSI_WARNINGS')
|
||||
},
|
||||
'mssql.query.ansiNulls': {
|
||||
'type': 'boolean',
|
||||
'default': true,
|
||||
'description': localize('mssql.query.ansiNulls', 'Enable SET ANSI_NULLS')
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user