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; } }