Skip to content

Commit 19a914e

Browse files
NH-4088 - Fix TypeNames.Get for decimal capacity
* Compare capacity against precision for precision based types * Fix dialects declarations for max precision * Fix dialects declarations for precision based types which were using length as precision or scale It is a prerequisite to the fix of GetTypeCastName.
1 parent c7845d8 commit 19a914e

15 files changed

+94
-84
lines changed

src/NHibernate/Dialect/DB2Dialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public DB2Dialect()
3939
RegisterColumnType(DbType.Date, "DATE");
4040
RegisterColumnType(DbType.DateTime, "TIMESTAMP");
4141
RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)");
42-
RegisterColumnType(DbType.Decimal, 19, "DECIMAL(19, $l)");
42+
// DB2 max precision is 31, but .Net is 28-29 anyway.
43+
RegisterColumnType(DbType.Decimal, 28, "DECIMAL($p, $s)");
4344
RegisterColumnType(DbType.Double, "DOUBLE");
4445
RegisterColumnType(DbType.Int16, "SMALLINT");
4546
RegisterColumnType(DbType.Int32, "INTEGER");

src/NHibernate/Dialect/Dialect.cs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,10 @@ public virtual string GetTypeName(SqlType sqlType)
215215
{
216216
if (sqlType.LengthDefined || sqlType.PrecisionDefined || sqlType.ScaleDefined)
217217
{
218-
string resultWithLength = _typeNames.Get(sqlType.DbType, sqlType.Length, sqlType.Precision, sqlType.Scale);
219-
if (resultWithLength != null) return resultWithLength;
218+
return _typeNames.Get(sqlType.DbType, sqlType.Length, sqlType.Precision, sqlType.Scale);
220219
}
221220

222-
string result = _typeNames.Get(sqlType.DbType);
223-
if (result == null)
224-
{
225-
throw new HibernateException(string.Format("No default type mapping for SqlType {0}", sqlType));
226-
}
227-
228-
return result;
221+
return _typeNames.Get(sqlType.DbType);
229222
}
230223

231224
/// <summary>
@@ -239,12 +232,7 @@ public virtual string GetTypeName(SqlType sqlType)
239232
/// <returns>The database type name used by ddl.</returns>
240233
public virtual string GetTypeName(SqlType sqlType, int length, int precision, int scale)
241234
{
242-
string result = _typeNames.Get(sqlType.DbType, length, precision, scale);
243-
if (result == null)
244-
{
245-
throw new HibernateException(string.Format("No type mapping for SqlType {0} of length {1}", sqlType, length));
246-
}
247-
return result;
235+
return _typeNames.Get(sqlType.DbType, length, precision, scale);
248236
}
249237

250238
/// <summary>

src/NHibernate/Dialect/FirebirdDialect.cs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using NHibernate.Dialect.Schema;
77
using NHibernate.Engine;
88
using NHibernate.SqlCommand;
9-
using NHibernate.SqlTypes;
109
using NHibernate.Type;
1110
using Environment = NHibernate.Cfg.Environment;
1211

@@ -30,12 +29,6 @@ namespace NHibernate.Dialect
3029
/// </remarks>
3130
public class FirebirdDialect : Dialect
3231
{
33-
#region Fields
34-
35-
private const int MAX_DECIMAL_PRECISION = 18;
36-
37-
#endregion
38-
3932
public FirebirdDialect()
4033
{
4134
RegisterKeywords();
@@ -49,23 +42,6 @@ public override string AddColumnString
4942
get { return "add"; }
5043
}
5144

52-
public override string GetTypeName(SqlType sqlType)
53-
{
54-
if (IsUnallowedDecimal(sqlType.DbType, sqlType.Precision))
55-
return base.GetTypeName(new SqlType(sqlType.DbType, MAX_DECIMAL_PRECISION, sqlType.Scale));
56-
57-
return base.GetTypeName(sqlType);
58-
}
59-
60-
public override string GetTypeName(SqlType sqlType, int length, int precision, int scale)
61-
{
62-
var fbDecimalPrecision = precision;
63-
if (IsUnallowedDecimal(sqlType.DbType, precision))
64-
fbDecimalPrecision = MAX_DECIMAL_PRECISION;
65-
66-
return base.GetTypeName(sqlType, length, fbDecimalPrecision, scale);
67-
}
68-
6945
public override string GetSelectSequenceNextValString(string sequenceName)
7046
{
7147
return string.Format("gen_id({0}, 1 )", sequenceName);
@@ -544,11 +520,6 @@ private void RegisterTrigonometricFunctions()
544520
RegisterFunction("tanh", new StandardSQLFunction("tanh", NHibernateUtil.Double));
545521
}
546522

547-
private static bool IsUnallowedDecimal(DbType dbType, int precision)
548-
{
549-
return dbType == DbType.Decimal && precision > MAX_DECIMAL_PRECISION;
550-
}
551-
552523
#region Informational metadata
553524

554525
/// <summary>
@@ -562,4 +533,4 @@ private static bool IsUnallowedDecimal(DbType dbType, int precision)
562533

563534
#endregion
564535
}
565-
}
536+
}

src/NHibernate/Dialect/GenericDialect.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,31 @@ namespace NHibernate.Dialect
99
public class GenericDialect : Dialect
1010
{
1111
/// <summary></summary>
12-
public GenericDialect() : base()
12+
public GenericDialect()
1313
{
14-
RegisterColumnType(DbType.AnsiStringFixedLength, "CHAR($l)");
15-
RegisterColumnType(DbType.AnsiString, "VARCHAR($l)");
16-
RegisterColumnType(DbType.Binary, "VARBINARY($l)");
14+
RegisterColumnType(DbType.AnsiStringFixedLength, "CHAR(255)");
15+
RegisterColumnType(DbType.AnsiStringFixedLength, 8000, "CHAR($l)");
16+
RegisterColumnType(DbType.AnsiString, "VARCHAR(255)");
17+
RegisterColumnType(DbType.AnsiString, 8000, "VARCHAR($l)");
18+
RegisterColumnType(DbType.Binary, "VARBINARY(255)");
19+
RegisterColumnType(DbType.Binary, 8000, "VARBINARY($l)");
1720
RegisterColumnType(DbType.Boolean, "BIT");
1821
RegisterColumnType(DbType.Byte, "TINYINT");
1922
RegisterColumnType(DbType.Currency, "MONEY");
2023
RegisterColumnType(DbType.Date, "DATE");
2124
RegisterColumnType(DbType.DateTime, "DATETIME");
22-
RegisterColumnType(DbType.Decimal, "DECIMAL(19, $l)");
25+
RegisterColumnType(DbType.Decimal, "DECIMAL(19, 5)");
26+
RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)");
2327
RegisterColumnType(DbType.Double, "DOUBLE PRECISION");
2428
RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER");
2529
RegisterColumnType(DbType.Int16, "SMALLINT");
2630
RegisterColumnType(DbType.Int32, "INT");
2731
RegisterColumnType(DbType.Int64, "BIGINT");
2832
RegisterColumnType(DbType.Single, "REAL");
29-
RegisterColumnType(DbType.StringFixedLength, "NCHAR($l)");
30-
RegisterColumnType(DbType.String, "NVARCHAR($l)");
33+
RegisterColumnType(DbType.StringFixedLength, "NCHAR(255)");
34+
RegisterColumnType(DbType.StringFixedLength, 4000, "NCHAR($l)");
35+
RegisterColumnType(DbType.String, "NVARCHAR(255)");
36+
RegisterColumnType(DbType.String, 4000, "NVARCHAR($l)");
3137
RegisterColumnType(DbType.Time, "TIME");
3238
}
3339

@@ -37,4 +43,4 @@ public override string AddColumnString
3743
get { return "add column"; }
3844
}
3945
}
40-
}
46+
}

src/NHibernate/Dialect/InformixDialect.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public partial class InformixDialect : Dialect
3636
/// <summary></summary>
3737
public InformixDialect()
3838
{
39-
RegisterColumnType(DbType.AnsiStringFixedLength, "CHAR($l)");
39+
RegisterColumnType(DbType.AnsiStringFixedLength, "CHAR(255)");
40+
RegisterColumnType(DbType.AnsiStringFixedLength, 255, "CHAR($l)");
4041
RegisterColumnType(DbType.AnsiString, 255, "VARCHAR($l)");
4142
RegisterColumnType(DbType.AnsiString, 32739, "LVARCHAR($l)");
4243
RegisterColumnType(DbType.AnsiString, 2147483647, "TEXT");
@@ -49,14 +50,16 @@ public InformixDialect()
4950
RegisterColumnType(DbType.Date, "DATE");
5051
RegisterColumnType(DbType.DateTime, "datetime year to fraction(5)");
5152
RegisterColumnType(DbType.Decimal, "DECIMAL(19, 5)");
52-
RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)");
53+
// Informix max precision is 32, but .Net is limited to 28-29.
54+
RegisterColumnType(DbType.Decimal, 28, "DECIMAL($p, $s)");
5355
RegisterColumnType(DbType.Double, "DOUBLE");
5456
RegisterColumnType(DbType.Int16, "SMALLINT");
5557
RegisterColumnType(DbType.Int32, "INTEGER");
5658
RegisterColumnType(DbType.Int64, "BIGINT");
5759
RegisterColumnType(DbType.Single, "SmallFloat");
5860
RegisterColumnType(DbType.Time, "datetime hour to second");
59-
RegisterColumnType(DbType.StringFixedLength, "CHAR($l)");
61+
RegisterColumnType(DbType.StringFixedLength, "CHAR(255)");
62+
RegisterColumnType(DbType.StringFixedLength, 255, "CHAR($l)");
6063
RegisterColumnType(DbType.String, 255, "VARCHAR($l)");
6164
RegisterColumnType(DbType.String, 32739, "LVARCHAR($l)");
6265
RegisterColumnType(DbType.String, 2147483647, "TEXT");

src/NHibernate/Dialect/IngresDialect.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public IngresDialect()
3636
RegisterColumnType(DbType.Date, "date");
3737
RegisterColumnType(DbType.DateTime, "timestamp");
3838
RegisterColumnType(DbType.Decimal, "decimal(19,5)");
39-
RegisterColumnType(DbType.Decimal, 19, "decimal(18, $l)");
39+
// Ingres max precision is 31, but .Net is limited to 28-29.
40+
RegisterColumnType(DbType.Decimal, 28, "decimal($p, $s)");
4041
RegisterColumnType(DbType.Double, "float8");
4142
RegisterColumnType(DbType.Int16, "int2");
4243
RegisterColumnType(DbType.Int32, "int4");
@@ -64,4 +65,4 @@ public IngresDialect()
6465

6566
#endregion
6667
}
67-
}
68+
}

src/NHibernate/Dialect/MsSql2000Dialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,8 @@ protected virtual void RegisterNumericTypeMappings()
373373
RegisterColumnType(DbType.Byte, "TINYINT");
374374
RegisterColumnType(DbType.Currency, "MONEY");
375375
RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)");
376-
RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)");
376+
// SQL Server max precision is 38, but .Net is limited to 28-29.
377+
RegisterColumnType(DbType.Decimal, 28, "DECIMAL($p, $s)");
377378
RegisterColumnType(DbType.Double, "FLOAT(53)");
378379
RegisterColumnType(DbType.Int16, "SMALLINT");
379380
RegisterColumnType(DbType.Int32, "INT");

src/NHibernate/Dialect/MsSqlCeDialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ protected virtual void RegisterTypeMapping()
150150
RegisterColumnType(DbType.Date, "DATETIME");
151151
RegisterColumnType(DbType.DateTime, "DATETIME");
152152
RegisterColumnType(DbType.Decimal, "NUMERIC(19,5)");
153-
RegisterColumnType(DbType.Decimal, 19, "NUMERIC($p, $s)");
153+
// SQL Server CE max precision is 38, but .Net is limited to 28-29.
154+
RegisterColumnType(DbType.Decimal, 28, "NUMERIC($p, $s)");
154155
RegisterColumnType(DbType.Double, "FLOAT");
155156
RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER");
156157
RegisterColumnType(DbType.Int16, "SMALLINT");

src/NHibernate/Dialect/MySQL5Dialect.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public class MySQL5Dialect : MySQLDialect
88
public MySQL5Dialect()
99
{
1010
RegisterColumnType(DbType.Decimal, "DECIMAL(19,5)");
11-
RegisterColumnType(DbType.Decimal, 19, "DECIMAL($p, $s)");
11+
// My SQL supports precision up to 65, but .Net is limited to 28-29.
12+
RegisterColumnType(DbType.Decimal, 28, "DECIMAL($p, $s)");
1213
RegisterColumnType(DbType.Guid, "BINARY(16)");
1314
}
1415

@@ -17,7 +18,7 @@ protected override void RegisterCastTypes() {
1718
// MySql 5 also supports DECIMAL as a cast type target
1819
// http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html
1920
RegisterCastType(DbType.Decimal, "DECIMAL(19,5)");
20-
RegisterCastType(DbType.Decimal, 19, "DECIMAL($p, $s)");
21+
RegisterCastType(DbType.Decimal, 28, "DECIMAL($p, $s)");
2122
RegisterCastType(DbType.Double, "DECIMAL(19,5)");
2223
RegisterCastType(DbType.Single, "DECIMAL(19,5)");
2324
RegisterCastType(DbType.Guid, "BINARY(16)");
@@ -61,4 +62,4 @@ public override bool SupportsInsertSelectIdentity
6162
get { return true; }
6263
}
6364
}
64-
}
65+
}

src/NHibernate/Dialect/Oracle8iDialect.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,10 @@ protected virtual void RegisterNumericTypeMappings()
185185
RegisterColumnType(DbType.Currency, "NUMBER(20,2)");
186186
RegisterColumnType(DbType.Single, "FLOAT(24)");
187187
RegisterColumnType(DbType.Double, "DOUBLE PRECISION");
188-
RegisterColumnType(DbType.Double, 19, "NUMBER($p,$s)");
188+
// Oracle max precision is 39-40, but .Net is limited to 28-29.
189+
RegisterColumnType(DbType.Double, 28, "NUMBER($p,$s)");
189190
RegisterColumnType(DbType.Decimal, "NUMBER(19,5)");
190-
RegisterColumnType(DbType.Decimal, 19, "NUMBER($p,$s)");
191+
RegisterColumnType(DbType.Decimal, 28, "NUMBER($p,$s)");
191192
}
192193

193194
protected virtual void RegisterDateTimeTypeMappings()

src/NHibernate/Dialect/OracleLiteDialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ public OracleLiteDialect()
4343
RegisterColumnType(DbType.Date, "DATE");
4444
RegisterColumnType(DbType.DateTime, "TIMESTAMP(4)");
4545
RegisterColumnType(DbType.Decimal, "NUMBER(19,5)");
46-
RegisterColumnType(DbType.Decimal, 19, "NUMBER(19, $l)");
46+
// Oracle max precision is 39-40, but .Net is limited to 28-29.
47+
RegisterColumnType(DbType.Decimal, 28, "NUMBER($p, $s)");
4748
// having problems with both ODP and OracleClient from MS not being able
4849
// to read values out of a field that is DOUBLE PRECISION
4950
RegisterColumnType(DbType.Double, "DOUBLE PRECISION"); //"FLOAT(53)" );

src/NHibernate/Dialect/PostgreSQLDialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public PostgreSQLDialect()
4242
RegisterColumnType(DbType.Byte, "int2");
4343
RegisterColumnType(DbType.Currency, "decimal(16,4)");
4444
RegisterColumnType(DbType.Decimal, "decimal(19,5)");
45-
RegisterColumnType(DbType.Decimal, 19, "decimal($p, $s)");
45+
// PostgreSQL max precision is unlimited, but .Net is limited to 28-29.
46+
RegisterColumnType(DbType.Decimal, 28, "decimal($p, $s)");
4647
RegisterColumnType(DbType.Double, "float8");
4748
RegisterColumnType(DbType.Int16, "int2");
4849
RegisterColumnType(DbType.Int32, "int4");

src/NHibernate/Dialect/SybaseASA9Dialect.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public SybaseASA9Dialect()
5151
RegisterColumnType(DbType.Date, "DATE");
5252
RegisterColumnType(DbType.DateTime, "TIMESTAMP");
5353
RegisterColumnType(DbType.Decimal, "DECIMAL(18,5)"); // NUMERIC(18,5) is equivalent to DECIMAL(18,5)
54-
RegisterColumnType(DbType.Decimal, 18, "DECIMAL(18,$l)");
54+
// Sybase max precision is 38, but .Net is limited to 28-29.
55+
RegisterColumnType(DbType.Decimal, 28, "DECIMAL($p,$s)");
5556
RegisterColumnType(DbType.Double, "DOUBLE");
5657
RegisterColumnType(DbType.Guid, "CHAR(16)");
5758
RegisterColumnType(DbType.Int16, "SMALLINT");
@@ -185,4 +186,4 @@ private static int GetAfterSelectInsertPoint(SqlString sql)
185186
return 0;
186187
}
187188
}
188-
}
189+
}

src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ protected virtual void RegisterNumericTypeMappings()
9191
RegisterColumnType(DbType.Single, "REAL");
9292
RegisterColumnType(DbType.Double, "DOUBLE");
9393
RegisterColumnType(DbType.Decimal, "NUMERIC(19,5)"); // Precision ranges from 0-127
94-
RegisterColumnType(DbType.Decimal, 19, "NUMERIC($p, $s)"); // Precision ranges from 0-127
94+
// Anywhere max precision is 127, but .Net is limited to 28-29.
95+
RegisterColumnType(DbType.Decimal, 38, "NUMERIC($p, $s)"); // Precision ranges from 0-127
9596
}
9697

9798
protected virtual void RegisterDateTimeTypeMappings()

0 commit comments

Comments
 (0)