Skip to content

Commit 02a4f71

Browse files
NH-4087 - Fix decimal parameter with scale above 5
* Use dialect configurable default scale/precision * Fixes #1187
1 parent 22bc773 commit 02a4f71

14 files changed

+760
-182
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System;
12+
using System.Collections;
13+
using NHibernate.Dialect;
14+
using NHibernate.Driver;
15+
using NHibernate.Engine;
16+
using NUnit.Framework;
17+
18+
namespace NHibernate.Test.DriverTest
19+
{
20+
using System.Threading.Tasks;
21+
[TestFixture]
22+
public class OdbcDriverFixtureAsync : TestCase
23+
{
24+
protected override string MappingsAssembly => "NHibernate.Test";
25+
26+
protected override IList Mappings => new[] { "DriverTest.MultiTypeEntity.hbm.xml" };
27+
28+
protected override bool AppliesTo(Dialect.Dialect dialect)
29+
{
30+
return dialect is MsSql2000Dialect;
31+
}
32+
33+
protected override bool AppliesTo(ISessionFactoryImplementor factory)
34+
{
35+
return factory.ConnectionProvider.Driver is OdbcDriver;
36+
}
37+
38+
protected override void OnTearDown()
39+
{
40+
base.OnTearDown();
41+
42+
using (var s = OpenSession())
43+
using (var t = s.BeginTransaction())
44+
{
45+
s.CreateQuery("delete from MultiTypeEntity").ExecuteUpdate();
46+
t.Commit();
47+
}
48+
}
49+
50+
[Test]
51+
public async Task CrudAsync()
52+
{
53+
// Should use default dimension for CRUD op because the mapping does not
54+
// have dimensions specified.
55+
object savedId;
56+
using (var s = OpenSession())
57+
using (var t = s.BeginTransaction())
58+
{
59+
savedId = await (s.SaveAsync(
60+
new MultiTypeEntity
61+
{
62+
StringProp = "a",
63+
StringClob = "a",
64+
BinaryBlob = new byte[] { 1, 2, 3 },
65+
Binary = new byte[] { 4, 5, 6 },
66+
Currency = 123.4m,
67+
Double = 123.5d,
68+
Decimal = 789.5m,
69+
DecimalHighScale = 1234567890.0123456789m
70+
}));
71+
await (t.CommitAsync());
72+
}
73+
74+
using (var s = OpenSession())
75+
using (var t = s.BeginTransaction())
76+
{
77+
var m = await (s.GetAsync<MultiTypeEntity>(savedId));
78+
79+
Assert.That(m.StringProp, Is.EqualTo("a"), "StringProp");
80+
Assert.That(m.StringClob, Is.EqualTo("a"), "StringClob");
81+
Assert.That(m.BinaryBlob, Is.EqualTo(new byte[] { 1, 2, 3 }), "BinaryBlob");
82+
Assert.That(m.Binary, Is.EqualTo(new byte[] { 4, 5, 6 }), "BinaryBlob");
83+
Assert.That(m.Currency, Is.EqualTo(123.4m), "Currency");
84+
Assert.That(m.Double, Is.EqualTo(123.5d).Within(0.0001d), "Double");
85+
Assert.That(m.Decimal, Is.EqualTo(789.5m), "Decimal");
86+
Assert.That(m.DecimalHighScale, Is.EqualTo(1234567890.0123456789m), "DecimalHighScale");
87+
88+
m.StringProp = "b";
89+
m.StringClob = "b";
90+
m.BinaryBlob = new byte[] { 4, 5, 6 };
91+
m.Binary = new byte[] { 7, 8, 9 };
92+
m.Currency = 456.78m;
93+
m.Double = 987.6d;
94+
m.Decimal = 1323456.45m;
95+
m.DecimalHighScale = 9876543210.0123456789m;
96+
await (t.CommitAsync());
97+
}
98+
99+
using (var s = OpenSession())
100+
using (var t = s.BeginTransaction())
101+
{
102+
var m = await (s.LoadAsync<MultiTypeEntity>(savedId));
103+
104+
Assert.That(m.StringProp, Is.EqualTo("b"), "StringProp");
105+
Assert.That(m.StringClob, Is.EqualTo("b"), "StringClob");
106+
Assert.That(m.BinaryBlob, Is.EqualTo(new byte[] { 4, 5, 6 }), "BinaryBlob");
107+
Assert.That(m.Binary, Is.EqualTo(new byte[] { 7, 8, 9 }), "BinaryBlob");
108+
Assert.That(m.Currency, Is.EqualTo(456.78m), "Currency");
109+
Assert.That(m.Double, Is.EqualTo(987.6d).Within(0.0001d), "Double");
110+
Assert.That(m.Decimal, Is.EqualTo(1323456.45m), "Decimal");
111+
Assert.That(m.DecimalHighScale, Is.EqualTo(9876543210.0123456789m), "DecimalHighScale");
112+
113+
await (t.CommitAsync());
114+
}
115+
}
116+
}
117+
}

src/NHibernate.Test/Async/DriverTest/SqlClientDriverFixture.cs

+69-32
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@
1010

1111
using System;
1212
using System.Collections;
13+
using System.Data;
1314
using NHibernate.Dialect;
1415
using NHibernate.Driver;
16+
using NHibernate.Engine;
17+
using NHibernate.SqlTypes;
1518
using NUnit.Framework;
19+
using Environment = NHibernate.Cfg.Environment;
1620

1721
namespace NHibernate.Test.DriverTest
1822
{
@@ -21,19 +25,30 @@ namespace NHibernate.Test.DriverTest
2125
[TestFixture]
2226
public class SqlClientDriverFixtureAsync : TestCase
2327
{
24-
protected override string MappingsAssembly
28+
protected override string MappingsAssembly => "NHibernate.Test";
29+
30+
protected override IList Mappings => new[] { "DriverTest.MultiTypeEntity.hbm.xml" };
31+
32+
protected override bool AppliesTo(Dialect.Dialect dialect)
2533
{
26-
get { return "NHibernate.Test"; }
34+
return dialect is MsSql2008Dialect;
2735
}
2836

29-
protected override IList Mappings
37+
protected override bool AppliesTo(ISessionFactoryImplementor factory)
3038
{
31-
get { return new[] { "DriverTest.MultiTypeEntity.hbm.xml" }; }
39+
return factory.ConnectionProvider.Driver is SqlClientDriver;
3240
}
3341

34-
protected override bool AppliesTo(Dialect.Dialect dialect)
42+
protected override void OnTearDown()
3543
{
36-
return dialect is MsSql2008Dialect;
44+
base.OnTearDown();
45+
46+
using (var s = OpenSession())
47+
using (var t = s.BeginTransaction())
48+
{
49+
s.CreateQuery("delete from MultiTypeEntity").ExecuteUpdate();
50+
t.Commit();
51+
}
3752
}
3853

3954
[Test]
@@ -42,50 +57,70 @@ public async Task CrudAsync()
4257
// Should use default dimension for CRUD op because the mapping does not
4358
// have dimensions specified.
4459
object savedId;
45-
using (ISession s = OpenSession())
46-
using (ITransaction t = s.BeginTransaction())
60+
using (var s = OpenSession())
61+
using (var t = s.BeginTransaction())
4762
{
48-
savedId = await (s.SaveAsync(new MultiTypeEntity
49-
{
50-
StringProp = "a",
51-
StringClob = "a",
52-
BinaryBlob = new byte[]{1,2,3},
53-
Binary = new byte[] { 4, 5, 6 },
54-
Currency = 123.4m,
55-
Double = 123.5d,
56-
Decimal = 789.5m
57-
}));
63+
savedId = await (s.SaveAsync(
64+
new MultiTypeEntity
65+
{
66+
StringProp = "a",
67+
StringClob = "a",
68+
BinaryBlob = new byte[] { 1, 2, 3 },
69+
Binary = new byte[] { 4, 5, 6 },
70+
Currency = 123.4m,
71+
Double = 123.5d,
72+
Decimal = 789.5m,
73+
DecimalHighScale = 1234567890.0123456789m
74+
}));
5875
await (t.CommitAsync());
5976
}
6077

61-
using (ISession s = OpenSession())
62-
using (ITransaction t = s.BeginTransaction())
78+
using (var s = OpenSession())
79+
using (var t = s.BeginTransaction())
6380
{
6481
var m = await (s.GetAsync<MultiTypeEntity>(savedId));
82+
83+
Assert.That(m.StringProp, Is.EqualTo("a"), "StringProp");
84+
Assert.That(m.StringClob, Is.EqualTo("a"), "StringClob");
85+
Assert.That(m.BinaryBlob, Is.EqualTo(new byte[] { 1, 2, 3 }), "BinaryBlob");
86+
Assert.That(m.Binary, Is.EqualTo(new byte[] { 4, 5, 6 }), "BinaryBlob");
87+
Assert.That(m.Currency, Is.EqualTo(123.4m), "Currency");
88+
Assert.That(m.Double, Is.EqualTo(123.5d).Within(0.0001d), "Double");
89+
Assert.That(m.Decimal, Is.EqualTo(789.5m), "Decimal");
90+
Assert.That(m.DecimalHighScale, Is.EqualTo(1234567890.0123456789m), "DecimalHighScale");
91+
6592
m.StringProp = "b";
6693
m.StringClob = "b";
67-
m.BinaryBlob = new byte[] {4,5,6};
68-
m.Binary = new byte[] {7,8,9};
94+
m.BinaryBlob = new byte[] { 4, 5, 6 };
95+
m.Binary = new byte[] { 7, 8, 9 };
6996
m.Currency = 456.78m;
7097
m.Double = 987.6d;
7198
m.Decimal = 1323456.45m;
99+
m.DecimalHighScale = 9876543210.0123456789m;
72100
await (t.CommitAsync());
73101
}
74102

75-
using (ISession s = OpenSession())
76-
using (ITransaction t = s.BeginTransaction())
103+
using (var s = OpenSession())
104+
using (var t = s.BeginTransaction())
77105
{
78-
await (s.CreateQuery("delete from MultiTypeEntity").ExecuteUpdateAsync());
106+
var m = await (s.LoadAsync<MultiTypeEntity>(savedId));
107+
108+
Assert.That(m.StringProp, Is.EqualTo("b"), "StringProp");
109+
Assert.That(m.StringClob, Is.EqualTo("b"), "StringClob");
110+
Assert.That(m.BinaryBlob, Is.EqualTo(new byte[] { 4, 5, 6 }), "BinaryBlob");
111+
Assert.That(m.Binary, Is.EqualTo(new byte[] { 7, 8, 9 }), "BinaryBlob");
112+
Assert.That(m.Currency, Is.EqualTo(456.78m), "Currency");
113+
Assert.That(m.Double, Is.EqualTo(987.6d).Within(0.0001d), "Double");
114+
Assert.That(m.Decimal, Is.EqualTo(1323456.45m), "Decimal");
115+
Assert.That(m.DecimalHighScale, Is.EqualTo(9876543210.0123456789m), "DecimalHighScale");
116+
79117
await (t.CommitAsync());
80118
}
81119
}
82120

83121
[Test]
84122
public async Task QueryPlansAreReusedAsync()
85123
{
86-
if (!(Sfi.ConnectionProvider.Driver is SqlClientDriver))
87-
Assert.Ignore("Test designed for SqlClientDriver only");
88-
89124
using (ISession s = OpenSession())
90125
using (ITransaction t = s.BeginTransaction())
91126
{
@@ -102,19 +137,21 @@ public async Task QueryPlansAreReusedAsync()
102137
var beforeCount = await (countPlansCommand.UniqueResultAsync<int>());
103138

104139
var insertCount = 10;
105-
for (var i=0; i<insertCount; i++)
140+
for (var i = 0; i < insertCount; i++)
106141
{
107142
await (s.SaveAsync(new MultiTypeEntity() { StringProp = new string('x', i + 1) }));
108143
await (s.FlushAsync());
109144
}
110145

111146
var afterCount = await (countPlansCommand.UniqueResultAsync<int>());
112147

113-
Assert.That(afterCount - beforeCount, Is.LessThan(insertCount - 1),
114-
string.Format("Excessive query plans created: before={0} after={1}", beforeCount, afterCount));
148+
Assert.That(
149+
afterCount - beforeCount,
150+
Is.LessThan(insertCount - 1),
151+
$"Excessive query plans created: before={beforeCount} after={afterCount}");
115152

116153
await (t.RollbackAsync());
117154
}
118155
}
119156
}
120-
}
157+
}

0 commit comments

Comments
 (0)