// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // using System; using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts; using Microsoft.SqlTools.Utility; using Newtonsoft.Json; namespace Microsoft.SqlTools.ServiceLayer.SqlContext { /// /// Collection of settings related to the execution of queries /// public class QueryExecutionSettings : GeneralRequestDetails { #region Constants /// /// Default value for batch separator (de facto standard as per SSMS) /// private const string DefaultBatchSeparator = "GO"; /// /// Default number of chars to store for long text fields (de facto standard as per SSMS) /// private const int DefaultMaxCharsToStore = 65535; // 64 KB - QE default /// /// Default number of chars to store of XML values (de facto standard as per SSMS) /// xml is a special case so number of chars to store is usually greater than for other long types /// private const int DefaultMaxXmlCharsToStore = 2097152; // 2 MB - QE default /// /// Default selection of returning an actual XML showplan with all batches /// Do not return any execution plan by default /// private static ExecutionPlanOptions DefaultExecutionPlanOptions = new ExecutionPlanOptions { IncludeActualExecutionPlanXml = false, IncludeEstimatedExecutionPlanXml = false }; /// /// Default option for displaying a bit column as a number. (defacto standard as per SSMS) /// private const bool DefaultDisplayBitAsNumber = true; /// /// default row count /// private const int DefaultRowCount = 0; /// /// default text size /// private const int DefaultTextSize = 2147483647; /// /// default execution timeout /// private const int DefaultExecutionTimeout = 0; /// /// default no count /// private const bool DefaultNoCount = false; /// /// default no exec /// private const bool DefaultNoExec = false; /// /// default parse only /// private const bool DefaultParseOnly = false; /// /// default arith abort /// private const bool DefaultArithAbort = true; /// /// default concat null yields null /// private const bool DefaultConcatNullYieldsNull = true; /// /// default statistics time /// private const bool DefaultStatisticsTime = false; /// /// default statistics IO /// private const bool DefaultStatisticsIO = false; /// /// default transaction abort ON /// private const bool DefaultXactAbortOn = false; /// /// default ANSI padding /// private const bool DefaultAnsiPadding = true; /// /// default ANSI warnings /// private const bool DefaultAnsiWarnings = true; /// /// default ANSI Nulls /// private const bool DefaultAnsiNulls = true; /// /// default use ANSI defaults /// private const bool DefaultAnsiDefaults = false; /// /// default quoted identifier /// private const bool DefaultQuotedIdentifier = true; /// /// default ANSI NULL default ON /// private const bool DefaultAnsiNullDefaultOn = true; /// /// default implicit transactions /// private const bool DefaultImplicitTransactions = false; /// /// default cursor close on commit /// private const bool DefaultCursorCloseOnCommit = false; /// /// default transaction isolation level /// private const string DefaultTransactionIsolationLevel = "READ UNCOMMITTED"; /// /// default deadlock priority /// private const string DefaultDeadlockPriority = "Normal"; /// /// default lock timeout /// private const int DefaultLockTimeout = -1; /// /// default query governor cost limit /// private const int DefaultQueryGovernorCostLimit = 0; /// /// Default value for flag to run query in sqlcmd mode /// private bool DefaultSqlCmdMode = false; /// /// Default value for flag to enable Always Encrypted Parameterization /// private bool DefaultAlwaysEncryptedParameterizationValue = false; #endregion #region Member Variables private ExecutionPlanOptions? executionPlanOptions; #endregion #region Properties /// /// The configured batch separator, will use a default if a value was not configured /// public string BatchSeparator { get { return GetOptionValue("batchSeparator", DefaultBatchSeparator); } set { SetOptionValue("batchSeparator", value); } } /// /// Maximum number of characters to store in temp file for long character fields and binary /// fields. Will use a default if a value was not configured. /// public int MaxCharsToStore { get { return GetOptionValue("maxCharsToStore", DefaultMaxCharsToStore); } set { SetOptionValue("maxCharsToStore", value); } } /// /// Maximum number of characters to store in temp file for XML columns. Will use a default /// value if one was not configured. /// public int MaxXmlCharsToStore { get { return GetOptionValue("maxXmlCharsToStore", DefaultMaxXmlCharsToStore); } set { SetOptionValue("maxXmlCharsToStore", value); } } /// /// Options for returning execution plans when executing queries /// public ExecutionPlanOptions ExecutionPlanOptions { get { return executionPlanOptions ?? DefaultExecutionPlanOptions; } set { executionPlanOptions = value; } } /// /// Determines how to generate display value for bit columns. If true, bit columns /// will be rendered as "1" or "0". If false, bit columns will be rendered as /// "true" or "false" /// public bool DisplayBitAsNumber { get { return GetOptionValue("displayBitAsNumber", DefaultDisplayBitAsNumber); } set { SetOptionValue("displayBitAsNumber", value); } } /// /// Set row count /// public int RowCount { get { return GetOptionValue("rowCount", DefaultRowCount); } set { SetOptionValue("rowCount", value); } } /// /// Set text size /// public int TextSize { get { return GetOptionValue("textSize", DefaultTextSize); } set { SetOptionValue("textSize", value); } } /// /// Set execution timeout /// public int ExecutionTimeout { get { return GetOptionValue("executionTimeout", DefaultExecutionTimeout); } set { SetOptionValue("executionTimeout", value); } } /// /// Set no count /// public bool NoCount { get { return GetOptionValue("noCount", DefaultNoCount); } set { SetOptionValue("noCount", value); } } /// /// Set no exec /// public bool NoExec { get { return GetOptionValue("noExec", DefaultNoExec); } set { SetOptionValue("noExec", value); } } /// /// Set parse only /// public bool ParseOnly { get { return GetOptionValue("parseOnly", DefaultParseOnly); } set { SetOptionValue("parseOnly", value); } } /// /// Set arith abort /// public bool ArithAbort { get { return GetOptionValue("arithAbort", DefaultArithAbort); } set { SetOptionValue("arithAbort", value); } } /// /// Set concat null yields null /// public bool ConcatNullYieldsNull { get { return GetOptionValue("concatNullYieldsNull", DefaultConcatNullYieldsNull); } set { SetOptionValue("concatNullYieldsNull", value); } } /// /// Set statistics time /// public bool StatisticsTime { get { return GetOptionValue("statisticsTime", DefaultStatisticsTime); } set { SetOptionValue("statisticsTime", value); } } /// /// Set statistics I\O /// public bool StatisticsIO { get { return GetOptionValue("statisticsIO", DefaultStatisticsIO); } set { SetOptionValue("statisticsIO", value); } } /// /// Set transaction abort ON /// public bool XactAbortOn { get { return GetOptionValue("xactAbortOn", DefaultXactAbortOn); } set { SetOptionValue("xactAbortOn", value); } } /// /// Set transaction isolation level /// public string TransactionIsolationLevel { get { return GetOptionValue("transactionIsolationLevel", DefaultTransactionIsolationLevel); } set { if (string.Equals("READ UNCOMMITTED", value, StringComparison.OrdinalIgnoreCase) || string.Equals("READ COMMITTED", value, StringComparison.OrdinalIgnoreCase) || string.Equals("REPEATABLE READ", value, StringComparison.OrdinalIgnoreCase) || string.Equals("SNAPSHOT", value, StringComparison.OrdinalIgnoreCase) || string.Equals("SERIALIZABLE", value, StringComparison.OrdinalIgnoreCase)) { SetOptionValue("transactionIsolationLevel", value); } } } /// /// Set deadlock priority /// public string DeadlockPriority { get { return GetOptionValue("deadlockPriority", DefaultDeadlockPriority); } set { if (string.Equals("LOW", value, StringComparison.OrdinalIgnoreCase) || string.Equals("NORMAL", value, StringComparison.OrdinalIgnoreCase) || string.Equals("HIGH", value, StringComparison.OrdinalIgnoreCase)) { SetOptionValue("deadlockPriority", value); } } } /// /// Set lock timeout /// public int LockTimeout { get { return GetOptionValue("lockTimeout", DefaultLockTimeout); } set { SetOptionValue("lockTimeout", value); } } /// /// Set query governor cost limit /// public int QueryGovernorCostLimit { get { return GetOptionValue("queryGovernorCostLimit", DefaultQueryGovernorCostLimit); } set { SetOptionValue("queryGovernorCostLimit", value); } } /// /// Set ANSI defaults ON /// public bool AnsiDefaults { get { return GetOptionValue("ansiDefaults", DefaultAnsiDefaults); } set { SetOptionValue("ansiDefaults", value); } } /// /// Set quoted identifier /// public bool QuotedIdentifier { get { return GetOptionValue("quotedIdentifier", DefaultQuotedIdentifier); } set { SetOptionValue("quotedIdentifier", value); } } /// /// Set ANSI null default on /// public bool AnsiNullDefaultOn { get { return GetOptionValue("ansiNullDefaultOn", DefaultAnsiNullDefaultOn); } set { SetOptionValue("ansiNullDefaultOn", value); } } /// /// Set implicit transactions /// public bool ImplicitTransactions { get { return GetOptionValue("implicitTransactions", DefaultImplicitTransactions); } set { SetOptionValue("implicitTransactions", value); } } /// /// Set cursor close on commit /// public bool CursorCloseOnCommit { get { return GetOptionValue("cursorCloseOnCommit", DefaultCursorCloseOnCommit); } set { SetOptionValue("cursorCloseOnCommit", value); } } /// /// Set ANSI padding /// public bool AnsiPadding { get { return GetOptionValue("ansiPadding", DefaultAnsiPadding); } set { SetOptionValue("ansiPadding", value); } } /// /// Set ANSI warnings /// public bool AnsiWarnings { get { return GetOptionValue("ansiWarnings", DefaultAnsiWarnings); } set { SetOptionValue("ansiWarnings", value); } } /// /// Set ANSI nulls /// public bool AnsiNulls { get { return GetOptionValue("ansiNulls", DefaultAnsiNulls); } set { SetOptionValue("ansiNulls", value); } } /// /// Setting to return the actual execution plan as XML /// public bool IncludeActualExecutionPlanXml { get { return GetOptionValue("includeActualExecutionPlanXml"); } set { SetOptionValue("includeActualExecutionPlanXml", value); } } /// /// Setting to return the estimated execution plan as XML /// public bool IncludeEstimatedExecutionPlanXml { get { return GetOptionValue("includeEstimatedExecutionPlanXml"); } set { SetOptionValue("includeEstimatedExecutionPlanXml", value); } } /// /// Set sqlCmd Mode /// public bool IsSqlCmdMode { get { return GetOptionValue("isSqlCmdMode", DefaultSqlCmdMode); } set { SetOptionValue("isSqlCmdMode", value); } } /// /// Set Always Encrypted Parameterization Mode /// [JsonProperty("alwaysEncryptedParameterization")] public bool IsAlwaysEncryptedParameterizationEnabled { get { return GetOptionValue("alwaysEncryptedParameterization", DefaultAlwaysEncryptedParameterizationValue); } set { SetOptionValue("alwaysEncryptedParameterization", value); } } #endregion #region Public Methods /// /// Update the current settings with the new settings /// /// The new settings public void Update(QueryExecutionSettings newSettings) { BatchSeparator = newSettings.BatchSeparator; MaxCharsToStore = newSettings.MaxCharsToStore; MaxXmlCharsToStore = newSettings.MaxXmlCharsToStore; ExecutionPlanOptions = newSettings.ExecutionPlanOptions; DisplayBitAsNumber = newSettings.DisplayBitAsNumber; RowCount = newSettings.RowCount; TextSize = newSettings.TextSize; ExecutionTimeout = newSettings.ExecutionTimeout; NoCount = newSettings.NoCount; NoExec = newSettings.NoExec; ParseOnly = newSettings.ParseOnly; ArithAbort = newSettings.ArithAbort; StatisticsTime = newSettings.StatisticsTime; StatisticsIO = newSettings.StatisticsIO; XactAbortOn = newSettings.XactAbortOn; TransactionIsolationLevel = newSettings.TransactionIsolationLevel; DeadlockPriority = newSettings.DeadlockPriority; LockTimeout = newSettings.LockTimeout; QueryGovernorCostLimit = newSettings.QueryGovernorCostLimit; AnsiDefaults = newSettings.AnsiDefaults; QuotedIdentifier = newSettings.QuotedIdentifier; AnsiNullDefaultOn = newSettings.AnsiNullDefaultOn; ImplicitTransactions = newSettings.ImplicitTransactions; CursorCloseOnCommit = newSettings.CursorCloseOnCommit; AnsiPadding = newSettings.AnsiPadding; AnsiWarnings = newSettings.AnsiWarnings; AnsiNulls = newSettings.AnsiNulls; IsSqlCmdMode = newSettings.IsSqlCmdMode; IsAlwaysEncryptedParameterizationEnabled = newSettings.IsAlwaysEncryptedParameterizationEnabled; } #endregion } }