//
// 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
}
}