Skip to content

Commit 7da47e2

Browse files
fix: FIR-49607 Make type casting invariant culture
1 parent c66ba11 commit 7da47e2

File tree

2 files changed

+63
-6
lines changed

2 files changed

+63
-6
lines changed

FireboltDotNetSdk.Tests/Unit/FireboltDataReaderTest.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections;
33
using System.Data;
44
using System.Text;
5+
using System.Globalization;
56
using FireboltDotNetSdk.Utils;
67
using FireboltDotNetSdk.Client;
78
using FireboltDotNetSdk.Exception;
@@ -818,6 +819,62 @@ public void GetFieldValueGeneric_Struct_PocoDifferentShape_Throws()
818819
});
819820
}
820821

822+
[Test]
823+
public void GetDouble_WithCzechCulture_CommaDecimalStringInDoubleColumn_Fails()
824+
{
825+
var originalCulture = CultureInfo.CurrentCulture;
826+
try
827+
{
828+
CultureInfo.CurrentCulture = new CultureInfo("cs-CZ");
829+
var result = new QueryResult
830+
{
831+
Rows = 1,
832+
Meta = new List<Meta>() { new Meta() { Name = "val", Type = "double" } },
833+
Data = new List<List<object?>>() { new List<object?>() { "2,71828" } }
834+
};
835+
836+
DbDataReader reader = new FireboltDataReader(null, result);
837+
Assert.Multiple(() =>
838+
{
839+
Assert.That(reader.Read(), Is.EqualTo(true));
840+
//the conversion comes back as 271828 instead of 2.71828. This is because Firebolt always returns dot as decimal separator in JSON
841+
Assert.That(Math.Abs(reader.GetDouble(0) - 2.71828), Is.Not.LessThanOrEqualTo(0.000001));
842+
});
843+
}
844+
finally
845+
{
846+
CultureInfo.CurrentCulture = originalCulture;
847+
}
848+
}
849+
850+
[Test]
851+
public void GetDouble_WithCzechCulture_DotDecimalStringInDoubleColumn_Succeeds()
852+
{
853+
var originalCulture = CultureInfo.CurrentCulture;
854+
try
855+
{
856+
CultureInfo.CurrentCulture = new CultureInfo("cs-CZ");
857+
var result = new QueryResult
858+
{
859+
Rows = 1,
860+
Meta = new List<Meta>() { new Meta() { Name = "val", Type = "double" } },
861+
Data = new List<List<object?>>() { new List<object?>() { "2.71828" } }
862+
};
863+
864+
DbDataReader reader = new FireboltDataReader(null, result);
865+
Assert.Multiple(() =>
866+
{
867+
Assert.That(reader.Read(), Is.EqualTo(true));
868+
Assert.That(Math.Abs(reader.GetDouble(0) - 2.71828), Is.LessThanOrEqualTo(0.000001));
869+
Assert.That(reader.GetString(0), Is.EqualTo("2,71828"));
870+
});
871+
}
872+
finally
873+
{
874+
CultureInfo.CurrentCulture = originalCulture;
875+
}
876+
}
877+
821878
class TestPoco
822879
{
823880
[FireboltStructName("int_val")] public int IntVal { get; init; }

FireboltNETSDK/Utils/Types.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,16 @@ public static class TypesConverter
7373
StructType structType => ToStruct(val, structType),
7474
_ => columnType.Type switch
7575
{
76-
FireboltDataType.Long => Convert.ToInt64(val),
77-
FireboltDataType.Int => Convert.ToInt32(val),
78-
FireboltDataType.Decimal => Convert.ToDecimal(val),
76+
FireboltDataType.Long => Convert.ToInt64(val, CultureInfo.InvariantCulture),
77+
FireboltDataType.Int => Convert.ToInt32(val, CultureInfo.InvariantCulture),
78+
FireboltDataType.Decimal => Convert.ToDecimal(val, CultureInfo.InvariantCulture),
7979
FireboltDataType.String => val.ToString(),
8080
FireboltDataType.Geography => val.ToString(),
8181
FireboltDataType.DateTime => ParseDateTime(val),
8282
FireboltDataType.TimestampTz => ParseDateTime(val),
8383
FireboltDataType.TimestampNtz => ParseDateTime(val),
8484
FireboltDataType.Date => ParseDateTime(val),
85-
FireboltDataType.Short => Convert.ToInt16(val),
85+
FireboltDataType.Short => Convert.ToInt16(val, CultureInfo.InvariantCulture),
8686
FireboltDataType.Double => ParseDouble(val),
8787
FireboltDataType.Float => ParseFloat(val),
8888
FireboltDataType.Boolean => ParseBoolean(val),
@@ -188,7 +188,7 @@ private static double ParseDouble(object val)
188188
{
189189
string str when DoubleInfinity.ContainsKey(str) => DoubleInfinity[str],
190190
double d => d,
191-
_ => Convert.ToDouble(val)
191+
_ => Convert.ToDouble(val, CultureInfo.InvariantCulture)
192192
};
193193
}
194194

@@ -198,7 +198,7 @@ private static float ParseFloat(object val)
198198
{
199199
string str when FloatInfinity.ContainsKey(str) => FloatInfinity[str],
200200
float f => f,
201-
_ => Convert.ToSingle(val)
201+
_ => Convert.ToSingle(val, CultureInfo.InvariantCulture)
202202
};
203203
}
204204

0 commit comments

Comments
 (0)