From 8e6d95885eb0abd8bd214b76a7a291ff0acd7957 Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Mon, 17 Nov 2025 09:20:39 -0700 Subject: [PATCH 1/3] Fix decimal parameters having scale > width (#303) --- .../PreparedStatement/ClrToDuckDBConverter.cs | 2 +- .../Parameters/DecimalParameterTest.cs | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) 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..a951c46 100644 --- a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs +++ b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs @@ -168,4 +168,21 @@ public void BindParameterWithoutTable() result.Should().BeOfType().Subject.Should().Be(value); } } -} \ No newline at end of file +} [Fact] + public void BindParameterInComparison() + { + decimal[] values = [decimal.Zero, 0.00m, 123456789.987654321m, -123456789.987654321m, 1.230m, -1.23m, + 0.000000001m, -0.000000001m, 1000000.000000001m, -1000000.000000001m, 1.123456789012345678901m]; + + foreach (var value in values) + { + Command.CommandText = "SELECT 0.1 > ?;"; + Command.Parameters.Clear(); + Command.Parameters.Add(new DuckDBParameter(value)); + + var result = Command.ExecuteScalar(); + + result.Should().BeOfType(); + } + } +} From 38b5d3c8ffa8e0025bb3d11f197632d44c25410e Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Mon, 17 Nov 2025 09:24:56 -0700 Subject: [PATCH 2/3] Fix syntax --- DuckDB.NET.Test/Parameters/DecimalParameterTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs index a951c46..2d00b6b 100644 --- a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs +++ b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs @@ -168,7 +168,8 @@ public void BindParameterWithoutTable() result.Should().BeOfType().Subject.Should().Be(value); } } -} [Fact] + + [Fact] public void BindParameterInComparison() { decimal[] values = [decimal.Zero, 0.00m, 123456789.987654321m, -123456789.987654321m, 1.230m, -1.23m, From 68a44f543ccb3e51bae6656bed7fd0c13d8fc354 Mon Sep 17 00:00:00 2001 From: Calum Sieppert Date: Mon, 17 Nov 2025 10:44:51 -0700 Subject: [PATCH 3/3] Add expected results to test --- .../Parameters/DecimalParameterTest.cs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs index 2d00b6b..3accc4d 100644 --- a/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs +++ b/DuckDB.NET.Test/Parameters/DecimalParameterTest.cs @@ -172,10 +172,22 @@ public void BindParameterWithoutTable() [Fact] public void BindParameterInComparison() { - decimal[] values = [decimal.Zero, 0.00m, 123456789.987654321m, -123456789.987654321m, 1.230m, -1.23m, - 0.000000001m, -0.000000001m, 1000000.000000001m, -1000000.000000001m, 1.123456789012345678901m]; - - foreach (var value in values) + 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(); @@ -183,7 +195,7 @@ public void BindParameterInComparison() var result = Command.ExecuteScalar(); - result.Should().BeOfType(); + result.Should().BeOfType().Subject.Should().Be(expectedResult); } } }