diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2445/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2445/Fixture.cs
new file mode 100644
index 00000000000..4ef3087ca31
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2445/Fixture.cs
@@ -0,0 +1,168 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by AsyncGenerator.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+using System.Linq;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Dialect;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Test.NHSpecificTest.GH2445;
+using NUnit.Framework;
+using NHibernate.Linq;
+
+namespace NHibernate.Test.NHSpecificTest.GH2446
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class FixtureAsync : TestCaseMappingByCode
+ {
+ protected override void Configure(Configuration configuration)
+ {
+ configuration.SetProperty(Environment.Hbm2ddlKeyWords, "auto-quote");
+ }
+
+ protected override bool AppliesTo(Dialect.Dialect dialect)
+ {
+ return dialect is MySQLDialect || dialect is SQLiteDialect;
+ }
+
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class(m =>
+ {
+ m.Id(c => c.Id, id =>
+ {
+ id.Generator(Generators.Native);
+ });
+ m.Property(o => o.Short, o => o.NotNullable(true));
+ m.Property(o => o.Integer, o => o.NotNullable(true));
+ m.Property(o => o.Long, o => o.NotNullable(true));
+ m.Property(o => o.NullableNumber);
+ m.Property(o => o.ShortNumber, o => o.NotNullable(true));
+ m.Property(o => o.NullableShortNumber);
+ m.Property(o => o.LargeNumber, o => o.NotNullable(true));
+ m.Property(o => o.NullableLargeNumber);
+ });
+
+ return mapper.CompileMappingForAllExplicitlyAddedEntities();
+ }
+
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var entity = new UnsignedEntity()
+ {
+ Short = 123,
+ Integer = 12345,
+ Long = 123456789,
+ LargeNumber = 123456789,
+ NullableLargeNumber = null,
+ NullableNumber = null,
+ ShortNumber = 123,
+ NullableShortNumber = null
+ };
+ session.Save(entity);
+ tx.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ session.CreateQuery("delete from UnsignedEntity").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+
+ [Test]
+ public async Task TestUIntAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var number = 10;
+ await (session.Query().Where(o => o.Id == (uint) number).ToListAsync());
+ await (session.Query().Where(o => o.Id == (uint) o.Integer).ToListAsync());
+ await (session.Query().Where(o => o.Id > number).ToListAsync());
+ }
+ }
+
+ [Test]
+ public async Task TestNullableUIntAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var number = 10;
+ await (session.Query().Where(o => o.NullableNumber == (uint?) number).ToListAsync());
+ await (session.Query().Where(o => o.NullableNumber == (uint?) o.Integer).ToListAsync());
+ await (session.Query().Where(o => o.NullableNumber > number).ToListAsync());
+ }
+ }
+
+
+ [Test]
+ public async Task TestUShortAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ short number = 10;
+ await (session.Query().Where(o => o.ShortNumber == (ushort) number).ToListAsync());
+ await (session.Query().Where(o => o.ShortNumber == (ushort) o.Short).ToListAsync());
+ await (session.Query().Where(o => o.ShortNumber > number).ToListAsync());
+ }
+ }
+
+ [Test]
+ public async Task TestNullableUShortAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ short number = 10;
+ await (session.Query().Where(o => o.NullableShortNumber == (ushort?) number).ToListAsync());
+ await (session.Query().Where(o => o.NullableShortNumber == (ushort?) o.Short).ToListAsync());
+ await (session.Query().Where(o => o.NullableShortNumber > number).ToListAsync());
+ }
+ }
+
+ [Test]
+ public async Task TestULongAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ long number = 10;
+ await (session.Query().Where(o => o.LargeNumber == (ulong) number).ToListAsync());
+ await (session.Query().Where(o => o.LargeNumber == (ulong) o.Long).ToListAsync());
+ await (session.Query().Where(o => o.LargeNumber > (ulong) number).ToListAsync());
+ }
+ }
+
+ [Test]
+ public async Task TestNullableULongAsync()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ long number = 10;
+ await (session.Query().Where(o => o.NullableLargeNumber == (ulong?) number).ToListAsync());
+ await (session.Query().Where(o => o.NullableLargeNumber == (ulong?) o.Long).ToListAsync());
+ await (session.Query().Where(o => o.NullableLargeNumber > (ulong?) number).ToListAsync());
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2445/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2445/Fixture.cs
new file mode 100644
index 00000000000..1963dacee42
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2445/Fixture.cs
@@ -0,0 +1,156 @@
+using System.Linq;
+using NHibernate.Cfg;
+using NHibernate.Cfg.MappingSchema;
+using NHibernate.Dialect;
+using NHibernate.Mapping.ByCode;
+using NHibernate.Test.NHSpecificTest.GH2445;
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2446
+{
+ [TestFixture]
+ public class Fixture : TestCaseMappingByCode
+ {
+ protected override void Configure(Configuration configuration)
+ {
+ configuration.SetProperty(Environment.Hbm2ddlKeyWords, "auto-quote");
+ }
+
+ protected override bool AppliesTo(Dialect.Dialect dialect)
+ {
+ return dialect is MySQLDialect || dialect is SQLiteDialect;
+ }
+
+ protected override HbmMapping GetMappings()
+ {
+ var mapper = new ModelMapper();
+ mapper.Class(m =>
+ {
+ m.Id(c => c.Id, id =>
+ {
+ id.Generator(Generators.Native);
+ });
+ m.Property(o => o.Short, o => o.NotNullable(true));
+ m.Property(o => o.Integer, o => o.NotNullable(true));
+ m.Property(o => o.Long, o => o.NotNullable(true));
+ m.Property(o => o.NullableNumber);
+ m.Property(o => o.ShortNumber, o => o.NotNullable(true));
+ m.Property(o => o.NullableShortNumber);
+ m.Property(o => o.LargeNumber, o => o.NotNullable(true));
+ m.Property(o => o.NullableLargeNumber);
+ });
+
+ return mapper.CompileMappingForAllExplicitlyAddedEntities();
+ }
+
+ protected override void OnSetUp()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var entity = new UnsignedEntity()
+ {
+ Short = 123,
+ Integer = 12345,
+ Long = 123456789,
+ LargeNumber = 123456789,
+ NullableLargeNumber = null,
+ NullableNumber = null,
+ ShortNumber = 123,
+ NullableShortNumber = null
+ };
+ session.Save(entity);
+ tx.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ session.CreateQuery("delete from UnsignedEntity").ExecuteUpdate();
+ tx.Commit();
+ }
+ }
+
+ [Test]
+ public void TestUInt()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var number = 10;
+ session.Query().Where(o => o.Id == (uint) number).ToList();
+ session.Query().Where(o => o.Id == (uint) o.Integer).ToList();
+ session.Query().Where(o => o.Id > number).ToList();
+ }
+ }
+
+ [Test]
+ public void TestNullableUInt()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ var number = 10;
+ session.Query().Where(o => o.NullableNumber == (uint?) number).ToList();
+ session.Query().Where(o => o.NullableNumber == (uint?) o.Integer).ToList();
+ session.Query().Where(o => o.NullableNumber > number).ToList();
+ }
+ }
+
+
+ [Test]
+ public void TestUShort()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ short number = 10;
+ session.Query().Where(o => o.ShortNumber == (ushort) number).ToList();
+ session.Query().Where(o => o.ShortNumber == (ushort) o.Short).ToList();
+ session.Query().Where(o => o.ShortNumber > number).ToList();
+ }
+ }
+
+ [Test]
+ public void TestNullableUShort()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ short number = 10;
+ session.Query().Where(o => o.NullableShortNumber == (ushort?) number).ToList();
+ session.Query().Where(o => o.NullableShortNumber == (ushort?) o.Short).ToList();
+ session.Query().Where(o => o.NullableShortNumber > number).ToList();
+ }
+ }
+
+ [Test]
+ public void TestULong()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ long number = 10;
+ session.Query().Where(o => o.LargeNumber == (ulong) number).ToList();
+ session.Query().Where(o => o.LargeNumber == (ulong) o.Long).ToList();
+ session.Query().Where(o => o.LargeNumber > (ulong) number).ToList();
+ }
+ }
+
+ [Test]
+ public void TestNullableULong()
+ {
+ using (var session = OpenSession())
+ using (var tx = session.BeginTransaction())
+ {
+ long number = 10;
+ session.Query().Where(o => o.NullableLargeNumber == (ulong?) number).ToList();
+ session.Query().Where(o => o.NullableLargeNumber == (ulong?) o.Long).ToList();
+ session.Query().Where(o => o.NullableLargeNumber > (ulong?) number).ToList();
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2445/UnsignedEntity.cs b/src/NHibernate.Test/NHSpecificTest/GH2445/UnsignedEntity.cs
new file mode 100644
index 00000000000..f31bda62efa
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2445/UnsignedEntity.cs
@@ -0,0 +1,23 @@
+namespace NHibernate.Test.NHSpecificTest.GH2445
+{
+ public class UnsignedEntity
+ {
+ public virtual uint Id { get; set; }
+
+ public virtual short Short { get; set; }
+
+ public virtual int Integer { get; set; }
+
+ public virtual long Long { get; set; }
+
+ public virtual uint? NullableNumber { get; set; }
+
+ public virtual ushort ShortNumber { get; set; }
+
+ public virtual ushort? NullableShortNumber { get; set; }
+
+ public virtual ulong LargeNumber { get; set; }
+
+ public virtual ulong? NullableLargeNumber { get; set; }
+ }
+}
diff --git a/src/NHibernate/Hql/Ast/HqlTreeNode.cs b/src/NHibernate/Hql/Ast/HqlTreeNode.cs
index 8967174bde3..7f6156f7dd6 100755
--- a/src/NHibernate/Hql/Ast/HqlTreeNode.cs
+++ b/src/NHibernate/Hql/Ast/HqlTreeNode.cs
@@ -204,6 +204,23 @@ internal HqlQuery(IASTFactory factory, params HqlStatement[] children)
public class HqlIdent : HqlExpression
{
+ private static readonly Dictionary SupportedIdentTypes = new Dictionary
+ {
+ {TypeCode.Boolean, "bool"},
+ {TypeCode.Int16, "short"},
+ {TypeCode.Int32, "integer"},
+ {TypeCode.Int64, "long"},
+ {TypeCode.UInt16, "ushort"},
+ {TypeCode.UInt32, "uint"},
+ {TypeCode.UInt64, "ulong"},
+ {TypeCode.Decimal, "decimal"},
+ {TypeCode.Single, "single"},
+ {TypeCode.DateTime, "datetime"},
+ {TypeCode.String, "string"},
+ {TypeCode.Char, "char"},
+ {TypeCode.Double, "double"}
+ };
+
internal HqlIdent(IASTFactory factory, string ident)
: base(HqlSqlWalker.IDENT, ident, factory)
{
@@ -212,72 +229,37 @@ internal HqlIdent(IASTFactory factory, string ident)
internal HqlIdent(IASTFactory factory, System.Type type)
: base(HqlSqlWalker.IDENT, "", factory)
{
- type = type.UnwrapIfNullable();
-
- switch (System.Type.GetTypeCode(type))
+ if (!TryGetTypeName(type, out var typeName))
{
- case TypeCode.Boolean:
- SetText("bool");
- break;
- case TypeCode.Int16:
- SetText("short");
- break;
- case TypeCode.Int32:
- SetText("integer");
- break;
- case TypeCode.Int64:
- SetText("long");
- break;
- case TypeCode.Decimal:
- SetText("decimal");
- break;
- case TypeCode.Single:
- SetText("single");
- break;
- case TypeCode.DateTime:
- SetText("datetime");
- break;
- case TypeCode.String:
- SetText("string");
- break;
- case TypeCode.Double:
- SetText("double");
- break;
- default:
- if (type == typeof(Guid))
- {
- SetText("guid");
- break;
- }
- if (type == typeof(DateTimeOffset))
- {
- SetText("datetimeoffset");
- break;
- }
- throw new NotSupportedException(string.Format("Don't currently support idents of type {0}", type.Name));
+ throw new NotSupportedException($"Don't currently support idents of type {type.Name}");
}
+
+ SetText(typeName);
}
internal static bool SupportsType(System.Type type)
+ {
+ return TryGetTypeName(type, out _);
+ }
+
+ private static bool TryGetTypeName(System.Type type, out string typeName)
{
type = type.UnwrapIfNullable();
- switch (System.Type.GetTypeCode(type))
+ if (SupportedIdentTypes.TryGetValue(System.Type.GetTypeCode(type), out typeName))
{
- case TypeCode.Boolean:
- case TypeCode.Int16:
- case TypeCode.Int32:
- case TypeCode.Int64:
- case TypeCode.Decimal:
- case TypeCode.Single:
- case TypeCode.DateTime:
- case TypeCode.String:
- case TypeCode.Double:
- return true;
- default:
- return
- type == typeof(Guid) ||
- type == typeof(DateTimeOffset);
+ return true;
+ }
+
+ if (type == typeof(Guid))
+ {
+ typeName = "guid";
+ }
+ else if (type == typeof(DateTimeOffset))
+ {
+ typeName = "datetimeoffset";
}
+
+ return typeName != null;
}
}