diff --git a/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs b/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs index ef95ba9..af81b98 100644 --- a/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs +++ b/DuckDB.NET.Data/PreparedStatement/ClrToDuckDBConverter.cs @@ -173,7 +173,7 @@ private static DuckDBValue DecimalToDuckDBValue(decimal value) result += new BigInteger(decimal.Multiply(fractionalPart, (decimal)power)); - int width = result.IsZero ? 1 : (int)Math.Floor(BigInteger.Log10(BigInteger.Abs(result))) + 1; + int width = Math.Max(scale, result.IsZero ? 1 : (int)Math.Floor(BigInteger.Log10(BigInteger.Abs(result))) + 1); return NativeMethods.Value.DuckDBCreateDecimal(new DuckDBDecimal((byte)width, scale, new DuckDBHugeInt(result))); } diff --git a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs index 8f644d5..3accc4d 100644 --- a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs +++ b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs @@ -168,4 +168,34 @@ public void BindParameterWithoutTable() result.Should().BeOfType().Subject.Should().Be(value); } } -} \ No newline at end of file + + [Fact] + public void BindParameterInComparison() + { + var testCases = new (decimal value, bool expectedResult)[] + { + (decimal.Zero, true), + (0.00m, true), + (123456789.987654321m, false), + (-123456789.987654321m, true), + (1.230m, false), + (-1.23m, true), + (0.000000001m, true), + (-0.000000001m, true), + (1000000.000000001m, false), + (-1000000.000000001m, true), + (1.123456789012345678901m, false) + }; + + foreach (var (value, expectedResult) in testCases) + { + Command.CommandText = "SELECT 0.1 > ?;"; + Command.Parameters.Clear(); + Command.Parameters.Add(new DuckDBParameter(value)); + + var result = Command.ExecuteScalar(); + + result.Should().BeOfType().Subject.Should().Be(expectedResult); + } + } +}