diff --git a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs index 8ba6c4fc45..7ca3a60a71 100644 --- a/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs +++ b/Microsoft.Azure.Cosmos/src/Query/Core/Parser/CstToAstVisitor.cs @@ -8,6 +8,7 @@ namespace Microsoft.Azure.Cosmos.Query.Core.Parser using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Contracts; + using System.Globalization; using Antlr4.Runtime.Misc; using Antlr4.Runtime.Tree; using Microsoft.Azure.Cosmos.SqlObjects; @@ -963,7 +964,7 @@ private static Number64 GetNumber64ValueFromNode(IParseTree parseTree) } else { - number64 = double.Parse(text); + number64 = double.Parse(text, CultureInfo.InvariantCulture); } return number64; diff --git a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/Parser/SqlParserBaselineTests.cs b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/Parser/SqlParserBaselineTests.cs index fbbca5abbc..11f23fab83 100644 --- a/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/Parser/SqlParserBaselineTests.cs +++ b/Microsoft.Azure.Cosmos/tests/Microsoft.Azure.Cosmos.Tests/Query/Parser/SqlParserBaselineTests.cs @@ -5,6 +5,9 @@ namespace Microsoft.Azure.Cosmos.Tests.Query.Parser { using System; + using System.Collections.Generic; + using System.Globalization; + using System.Threading; using System.Xml; using Microsoft.Azure.Cosmos.Query.Core.Monads; using Microsoft.Azure.Cosmos.Query.Core.Parser; @@ -17,6 +20,8 @@ public abstract class SqlParserBaselineTests : BaselineTests parseQueryMonad = SqlQueryParser.Monadic.Parse(input.Query); if (parseQueryMonad.Succeeded) { @@ -26,6 +31,22 @@ public override SqlParserBaselineTestOutput ExecuteTest(SqlParserBaselineTestInp Assert.AreEqual(parseQueryMonad.Result, parseQueryMonad2.Result); } + // Set culture to non-standard (US) to catch any parsing error + foreach (string culture in new List { "en-US", "fr-FR", "jp-JP" }) + { + Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture); + TryCatch parseQueryMonadCulture = SqlQueryParser.Monadic.Parse(input.Query); + if (parseQueryMonadCulture.Succeeded) + { + // Addtional round trip for extra validation + TryCatch parseQueryMonadCulture2 = SqlQueryParser.Monadic.Parse(parseQueryMonad.Result.ToString()); + Assert.IsTrue(parseQueryMonadCulture2.Succeeded); + Assert.AreEqual(parseQueryMonadCulture2.Result, parseQueryMonadCulture2.Result); + } + } + + // return thread to default culture + Thread.CurrentThread.CurrentCulture = defaultCulture; return new SqlParserBaselineTestOutput(parseQueryMonad); } }