public SqlDataType(SqlDataTypeOption type, bool isMax = false) : this()
 {
     Type  = type;
     IsMax = isMax;
     Size  = null;
     Scale = null;
 }
 public SqlDataType(SqlDataTypeOption type, int size) : this()
 {
     Type  = type;
     IsMax = false;
     Size  = size;
     Scale = null;
 }
        public static SqlDataType Parse(string value)
        {
            var    match      = Regex.Match(value, "(?<Name>[a-zA-Z_]*)(\\((?<Parameters>.*)\\))?");
            var    match2     = Regex.Match(value, "\\((?<Parameters>.*)\\)");
            string name       = match.Groups["Name"].Value.ToLower().Trim();
            string parameters = match.Groups["Parameters"].Value;

            SqlDataTypeOption option = name.ToSqlDataTypeOption();

            if (!string.IsNullOrEmpty(parameters))
            {
                string cleanParamters = parameters.Trim().ToLower().Replace(" ", string.Empty);
                if (cleanParamters == "max")
                {
                    return(new SqlDataType(option, true));
                }

                if (cleanParamters.Contains(","))
                {
                    string[] split = cleanParamters.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    int      size  = int.Parse(split[0]);
                    int      scale = int.Parse(split[1]);
                    return(new SqlDataType(option, size, scale));
                }
                else
                {
                    int size = int.Parse(cleanParamters);
                    return(new SqlDataType(option, size));
                }
            }

            return(new SqlDataType(option));
        }
 public SqlDataType(SqlDataTypeOption type, int size, int scale)
 {
     Type  = type;
     IsMax = false;
     Size  = size;
     Scale = scale;
 }
Beispiel #5
0
        private bool ShouldParamterize(SqlDataTypeOption sqlDataTypeOption)
        {
            switch (sqlDataTypeOption)
            {
            case SqlDataTypeOption.BigInt:
            case SqlDataTypeOption.Int:
            case SqlDataTypeOption.SmallInt:
            case SqlDataTypeOption.TinyInt:
            case SqlDataTypeOption.Bit:
            case SqlDataTypeOption.Decimal:
            case SqlDataTypeOption.Numeric:
            case SqlDataTypeOption.Money:
            case SqlDataTypeOption.SmallMoney:
            case SqlDataTypeOption.Float:
            case SqlDataTypeOption.Real:
            case SqlDataTypeOption.DateTime:
            case SqlDataTypeOption.SmallDateTime:
            case SqlDataTypeOption.Char:
            case SqlDataTypeOption.VarChar:
            case SqlDataTypeOption.NChar:
            case SqlDataTypeOption.NVarChar:
            case SqlDataTypeOption.Binary:
            case SqlDataTypeOption.VarBinary:
            case SqlDataTypeOption.UniqueIdentifier:
            case SqlDataTypeOption.Date:
            case SqlDataTypeOption.Time:
            case SqlDataTypeOption.DateTime2:
            case SqlDataTypeOption.DateTimeOffset:
                return(true);

            default:
                return(false);
            }
        }
Beispiel #6
0
        public static SqlDataTypeReference DataType(SqlDataTypeOption option, IEnumerable <Literal> parameters)
        {
            var fragment = new SqlDataTypeReference();

            fragment.SqlDataTypeOption = option;
            fragment.Parameters.AddRange(parameters);
            return(fragment);
        }
        public static SqlDataTypeReference SqlDataType(SqlDataTypeOption option, params Literal[] parameters)
        {
            var fragment = new SqlDataTypeReference();

            fragment.SqlDataTypeOption = option;
            fragment.Parameters.AddRange(parameters);
            return(fragment);
        }
Beispiel #8
0
 public void Reset()
 {
     SqlDataTypeOption     = SqlDataTypeOption.VarChar;
     SqlDataTypeParameters = null;
     VariableName          = null;
     IsNegative            = false;
     Parameters.Clear();
 }
 private static int GetDtoIndex(SqlDataTypeOption dto)
 {
     return indexOfDTO[dto];
 }
Beispiel #10
0
 internal static bool IsHigherPrecedence(SqlDataTypeOption t1, SqlDataTypeOption t2)
 {
     int precedenceOfType1 = 0;
     precedenceTable.TryGetValue(t1, out precedenceOfType1);
     int precedenceOfType2 = 0;
     precedenceTable.TryGetValue(t2, out precedenceOfType2);
     return precedenceOfType1 < precedenceOfType2;
 }
Beispiel #11
0
        public static TypeConversionResult GetConversionResult(SqlDataTypeOption from, SqlDataTypeOption to)
        {
            TypeConversionResult result = TypeConversionResult.NotImplemented;
            try
            {
                int fromIndex = GetDtoIndex(from);
                int toIndex = GetDtoIndex(to);
                result = conversionTableArray[fromIndex, toIndex];
            }
            catch(KeyNotFoundException)
            {
                // an unknown sql data type option - default not implemented
                return result;
            }

            return result;
        }
Beispiel #12
0
 public static SqlDataTypeReference DataType(SqlDataTypeOption option, int size, int scale)
 {
     return(DataType(option, Integer(size), Integer(scale)));
 }
 public void AllNumericToStringConversionsCheckConvertedLength(SqlDataTypeOption numericType, SqlDataTypeOption stringType)
 {
     var result = TypeConversionHelper.GetConversionResult(numericType, stringType);
        (result & TypeConversionResult.CheckConvertedLength).Should().NotBe(0, "converting {0} to {1} should check length", numericType, stringType);
 }
 public static SqlDataTypeReference SqlDataType(SqlDataTypeOption option, int size, int scale)
 {
     return(SqlDataType(option, IntegerLiteral(size.ToString()), IntegerLiteral(scale.ToString())));
 }
 public static SqlDataTypeReference SqlDataType(SqlDataTypeOption option, bool max)
 {
     return(max ? SqlDataType(option, MaxLiteral("MAX")) : SqlDataType(option));
 }
Beispiel #16
0
        private void AddToParameterCollection(Literal literal, string parameterName, SqlDataTypeOption sqlDataTypeOption, IList <Literal> sqlDataTypeParameters)
        {
            SqlParameter sqlParameter    = new SqlParameter();
            string       literalValue    = literal.Value;
            object       parsedValue     = null;
            SqlDbType    paramType       = SqlDbType.VarChar;
            bool         parseSuccessful = true;

            switch (sqlDataTypeOption)
            {
            case SqlDataTypeOption.Binary:
                paramType = SqlDbType.Binary;
                try
                {
                    parsedValue = TryParseBinaryLiteral(literalValue, VariableName, SqlDbType.Binary, literal.StartLine);
                }
                catch (ParameterizationFormatException)
                {
                    if (IsCodeSenseRequest)
                    {
                        parseSuccessful = false;
                        AddCodeSenseErrorItem(MessageHelper.MessageType.BINARY_LITERAL_PREFIX_MISSING_ERROR, literal, literal.Value, VariableName, SqlDbType.Binary.ToString());
                    }
                    else
                    {
                        throw;
                    }
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Binary.ToString(), C_SHARP_BYTE_ARRAY, literalValue, literal.StartLine, e);
                }
                break;

            case SqlDataTypeOption.VarBinary:
                paramType = SqlDbType.VarBinary;
                try
                {
                    parsedValue = TryParseBinaryLiteral(literalValue, VariableName, SqlDbType.VarBinary, literal.StartLine);
                    ExtractSize(sqlDataTypeParameters, sqlParameter);
                }
                catch (ParameterizationFormatException)
                {
                    if (IsCodeSenseRequest)
                    {
                        parseSuccessful = false;
                        string sqlDataTypeString = GetSqlDataTypeStringOneParameter(SqlDbType.VarBinary, sqlDataTypeParameters);
                        AddCodeSenseErrorItem(MessageHelper.MessageType.BINARY_LITERAL_PREFIX_MISSING_ERROR, literal, literalValue, VariableName, sqlDataTypeString);
                    }
                    else
                    {
                        throw;
                    }
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    string sqlDataTypeString = GetSqlDataTypeStringOneParameter(SqlDbType.VarBinary, sqlDataTypeParameters);
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, sqlDataTypeString, C_SHARP_BYTE_ARRAY, literalValue, literal.StartLine, e);
                }
                break;


            //Integer literals of form 24.0 will not be supported
            case SqlDataTypeOption.BigInt:
                paramType = SqlDbType.BigInt;
                long parsedLong;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                if (long.TryParse(literalValue, out parsedLong))
                {
                    parsedValue = parsedLong;
                }
                else
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.BigInt.ToString(), "Int64", literalValue, literal.StartLine, null);
                }

                break;

            case SqlDataTypeOption.Int:
                paramType = SqlDbType.Int;
                int parsedInt;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                if (int.TryParse(literalValue, out parsedInt))
                {
                    parsedValue = parsedInt;
                }
                else
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Int.ToString(), "Int32", literalValue, literal.StartLine, null);
                }

                break;

            case SqlDataTypeOption.SmallInt:
                paramType = SqlDbType.SmallInt;
                short parsedShort;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                if (short.TryParse(literalValue, out parsedShort))
                {
                    parsedValue = parsedShort;
                }
                else
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallInt.ToString(), "Int16", literalValue, literal.StartLine, null);
                }

                break;

            case SqlDataTypeOption.TinyInt:
                paramType = SqlDbType.TinyInt;
                byte parsedByte;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                if (byte.TryParse(literalValue, out parsedByte))
                {
                    parsedValue = parsedByte;
                }
                else
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.TinyInt.ToString(), "Byte", literalValue, literal.StartLine, null);
                }

                break;


            case SqlDataTypeOption.Real:
                paramType    = SqlDbType.Real;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                try
                {
                    parsedValue = SqlSingle.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Real.ToString(), "SqlSingle", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.Float:
                paramType    = SqlDbType.Float;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                try
                {
                    parsedValue = SqlDouble.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Float.ToString(), "SqlDouble", literalValue, literal.StartLine, e);
                }

                break;


            case SqlDataTypeOption.Decimal:
            case SqlDataTypeOption.Numeric:
                paramType = SqlDbType.Decimal;
                ExtractPrecisionAndScale(sqlDataTypeParameters, sqlParameter);
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                try
                {
                    parsedValue = SqlDecimal.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    string sqlDecimalDataType = sqlDataTypeParameters != null ? (SqlDbType.Decimal + "(" + sqlDataTypeParameters[0] + ", " + sqlDataTypeParameters[1] + ")") : "";
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, sqlDecimalDataType, "SqlDecimal", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.Money:
                paramType    = SqlDbType.Money;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                try
                {
                    parsedValue = SqlMoney.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Money.ToString(), "SqlMoney", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.SmallMoney:
                paramType    = SqlDbType.SmallMoney;
                literalValue = IsNegative ? "-" + literalValue : literalValue;

                try
                {
                    parsedValue = SqlMoney.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallMoney.ToString(), "SqlMoney", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.DateTime:
                paramType = SqlDbType.DateTime;

                try
                {
                    parsedValue = ParseDateTime(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTime.ToString(), "DateTime", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.SmallDateTime:
                paramType = SqlDbType.SmallDateTime;

                try
                {
                    parsedValue = ParseDateTime(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallDateTime.ToString(), "DateTime", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.DateTime2:
                paramType = SqlDbType.DateTime2;

                try
                {
                    parsedValue = ParseDateTime(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTime2.ToString(), "DateTime", literalValue, literal.StartLine, e);
                }

                ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.Date:
                paramType = SqlDbType.Date;

                try
                {
                    parsedValue = ParseDate(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.Date.ToString(), "DateTime", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.DateTimeOffset:
                paramType = SqlDbType.DateTimeOffset;

                try
                {
                    parsedValue = ParseDateTimeOffset(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTimeOffset.ToString(), "DateTimeOffset", literalValue, literal.StartLine, e);
                }

                ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                break;


            case SqlDataTypeOption.Time:
                paramType = SqlDbType.Time;

                try
                {
                    parsedValue = TimeSpan.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Time.ToString(), "TimeSpan", literalValue, literal.StartLine, e);
                }

                ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.Char:
                paramType = SqlDbType.Char;
                ExtractSize(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.VarChar:
                paramType = SqlDbType.VarChar;
                ExtractSize(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.NChar:
                paramType = SqlDbType.NChar;
                ExtractSize(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.NVarChar:
                paramType = SqlDbType.NVarChar;
                ExtractSize(sqlDataTypeParameters, sqlParameter);
                break;

            case SqlDataTypeOption.UniqueIdentifier:
                paramType = SqlDbType.UniqueIdentifier;

                try
                {
                    parsedValue = SqlGuid.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.UniqueIdentifier.ToString(), "SqlGuid", literalValue, literal.StartLine, e);
                }

                break;

            case SqlDataTypeOption.Bit:
                paramType = SqlDbType.Bit;

                try
                {
                    parsedValue = Byte.Parse(literalValue);
                }
                catch (Exception e)
                {
                    parseSuccessful = false;
                    HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Bit.ToString(), "Byte", literalValue, literal.StartLine, e);
                }
                break;

            default:
                break;
            }

            if (parseSuccessful)
            {
                sqlParameter.ParameterName = parameterName;
                sqlParameter.SqlDbType     = paramType;
                sqlParameter.Value         = parsedValue ?? literalValue;
                sqlParameter.Direction     = ParameterDirection.Input;
                Parameters.Add(sqlParameter);
            }
        }
Beispiel #17
0
        public override void ExplicitVisit(DeclareVariableStatement node)
        {
            if (node == null || node.Declarations == null)
            {
                return;
            }

            StringBuilder codeSenseMessageStringBuilder = new StringBuilder();
            int           endLine = -1;
            int           endCol  = -1;

            foreach (DeclareVariableElement declareVariableElement in node.Declarations)
            {
                if (declareVariableElement.DataType is SqlDataTypeReference dataTypeReference)
                {
                    SqlDataTypeOption sqlDataTypeOption = dataTypeReference.SqlDataTypeOption;

                    if (ShouldParamterize(sqlDataTypeOption))
                    {
                        IList <Literal> sqlDataTypeParameters = dataTypeReference.Parameters;
                        ScalarExpressionTransformer.SqlDataTypeOption     = sqlDataTypeOption;
                        ScalarExpressionTransformer.SqlDataTypeParameters = sqlDataTypeParameters;
                        ScalarExpressionTransformer.VariableName          = declareVariableElement.VariableName.Value;

                        ScalarExpression declareVariableElementValue = declareVariableElement.Value;
                        ScalarExpressionTransformer.ExplicitVisit(declareVariableElementValue);
                        declareVariableElement.Value = ScalarExpressionTransformer.GetTransformedExpression();
                        IList <SqlParameter> sqlParameters = ScalarExpressionTransformer.Parameters;

                        if (sqlParameters.Count == 1 && declareVariableElementValue != null)
                        {
                            codeSenseMessageStringBuilder.Append(SR.ParameterizationDetails(declareVariableElement.VariableName.Value,
                                                                                            sqlParameters[0].SqlDbType.ToString(),
                                                                                            sqlParameters[0].Size,
                                                                                            sqlParameters[0].Precision,
                                                                                            sqlParameters[0].Scale,
                                                                                            sqlParameters[0].SqlValue.ToString()));

                            endLine = declareVariableElementValue.StartLine;
                            endCol  = declareVariableElementValue.StartColumn + declareVariableElementValue.FragmentLength;

                            if (!IsCodeSenseRequest)
                            {
                                string sqlParameterKey = sqlParameters[0].SqlDbType.ToString();
                                ExecutionParameters.TryGetValue(sqlParameterKey, out int currentCount);
                                ExecutionParameters[sqlParameterKey] = currentCount + 1;
                            }
                        }

                        Parameters.AddRange(sqlParameters);
                        ScalarExpressionTransformer.Reset();
                    }
                }
            }

            if (codeSenseMessageStringBuilder.Length > 0)
            {
                CodeSenseMessages.Add(new ScriptFileMarker
                {
                    Level        = ScriptFileMarkerLevel.Information,
                    Message      = codeSenseMessageStringBuilder.ToString(),
                    ScriptRegion = new ScriptRegion
                    {
                        StartLineNumber   = node.StartLine,
                        StartColumnNumber = node.StartColumn,
                        EndLineNumber     = endLine == -1 ? node.StartLine : endLine,
                        EndColumnNumber   = endCol == -1 ? node.StartColumn + node.LastTokenIndex - node.FirstTokenIndex : endCol
                    }
                });
            }

            node.AcceptChildren(this);
            base.ExplicitVisit(node); // let the base class finish up
        }
 public void AllWideStringToStringConversionsCheckNarrowing(SqlDataTypeOption t1, SqlDataTypeOption t2)
 {
     var result = TypeConversionHelper.GetConversionResult(t1, t2);
     (result & TypeConversionResult.Narrowing).Should().NotBe(0, "converting {0} to {1} should warn about narrowing", t1, t2);
 }
Beispiel #19
0
 public static SqlDataTypeReference DataType(SqlDataTypeOption option, bool max)
 {
     return(max ? DataType(option, Max()) : DataType(option));
 }
 public void AllStringToStringConversionsCheckLength(SqlDataTypeOption t1, SqlDataTypeOption t2)
 {
     var result = TypeConversionHelper.GetConversionResult(t1, t2);
     (result & TypeConversionResult.CheckLength).Should().NotBe(0, "converting {0} to {1} should check length", t1, t2);
 }
Beispiel #21
0
 public static SqlDataTypeReference DataType(SqlDataTypeOption option, params Literal[] parameters)
 {
     return(DataType(option, (IEnumerable <Literal>)parameters));
 }