diff --git a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs index e21a2e3f6b2..91296d9f638 100644 --- a/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Async/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -145,9 +145,6 @@ public async Task FunctionsToLowerToUpperAsync() [Test] public async Task ConcatAsync() { - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); - using (var s = OpenSession()) using (s.BeginTransaction()) { diff --git a/src/NHibernate.Test/Async/Criteria/ProjectionsTest.cs b/src/NHibernate.Test/Async/Criteria/ProjectionsTest.cs index aca0e5d3660..28fd672ccab 100644 --- a/src/NHibernate.Test/Async/Criteria/ProjectionsTest.cs +++ b/src/NHibernate.Test/Async/Criteria/ProjectionsTest.cs @@ -69,9 +69,6 @@ protected override void OnTearDown() [Test] public async Task UsingSqlFunctions_ConcatAsync() { - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); - using (ISession session = Sfi.OpenSession()) { string result = await (session.CreateCriteria(typeof(Student)) @@ -89,12 +86,8 @@ public async Task UsingSqlFunctions_ConcatAsync() [Test] public async Task UsingSqlFunctions_Concat_WithCastAsync() { - if(Dialect is Oracle8iDialect) - { + if (Dialect is Oracle8iDialect) Assert.Ignore("Not supported by the active dialect:{0}.", Dialect); - } - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); using (ISession session = Sfi.OpenSession()) { diff --git a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs index a9c304aaa66..e08a71d801d 100644 --- a/src/NHibernate.Test/Async/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Async/Hql/HQLFunctions.cs @@ -1143,6 +1143,59 @@ public async Task ConcatAsync() } } + [Test] + public async Task ConcatAnsiFirstParamAsync() + { + if (!TestDialect.SupportsAnsiString) + Assert.Ignore("AnsiString type is not supported by dialect."); + + var nickName = "abcdef"; + using (ISession s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var a1 = new Human { NickName = nickName, Birthdate = DateTime.Today }; + await (s.SaveAsync(a1)); + await (t.CommitAsync()); + } + + using (var logSpy = new SqlLogSpy()) + using (ISession s = OpenSession()) + { + var param = nickName + "gg"; + var hql = "from Human a where concat(a.NickName, 'gg') = :param "; + Animal result = (Animal) await (s.CreateQuery(hql).SetParameter("param", param).UniqueResultAsync()); + Assert.That(result, Is.Not.Null); + Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString")); + } + } + + [KnownBug("Not fixed yet")] + [Test] + public async Task ConcatAnsiSecondParamAsync() + { + if (!TestDialect.SupportsAnsiString) + Assert.Ignore("AnsiString type is not supported by dialect."); + + var nickName = "abcdef"; + using (ISession s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var a1 = new Human { NickName = nickName, Birthdate = DateTime.Today }; + await (s.SaveAsync(a1)); + await (t.CommitAsync()); + } + + using (var logSpy = new SqlLogSpy()) + using (ISession s = OpenSession()) + { + var param = "gg" + nickName; + var hql = "from Human a where concat('gg', a.NickName) = :param "; + Animal result = (Animal) await (s.CreateQuery(hql).SetParameter("param", param).UniqueResultAsync()); + Assert.That(result, Is.Not.Null); + Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString")); + } + } + [Test] public async Task HourMinuteSecondAsync() { diff --git a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs index 7d5b7d014cf..202487c8f1f 100644 --- a/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs +++ b/src/NHibernate.Test/Criteria/Lambda/FunctionsIntegrationFixture.cs @@ -134,9 +134,6 @@ public void FunctionsToLowerToUpper() [Test] public void Concat() { - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); - using (var s = OpenSession()) using (s.BeginTransaction()) { diff --git a/src/NHibernate.Test/Criteria/ProjectionsTest.cs b/src/NHibernate.Test/Criteria/ProjectionsTest.cs index 0eb03b33a60..c53b0158639 100644 --- a/src/NHibernate.Test/Criteria/ProjectionsTest.cs +++ b/src/NHibernate.Test/Criteria/ProjectionsTest.cs @@ -58,9 +58,6 @@ protected override void OnTearDown() [Test] public void UsingSqlFunctions_Concat() { - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); - using (ISession session = Sfi.OpenSession()) { string result = session.CreateCriteria(typeof(Student)) @@ -78,12 +75,8 @@ public void UsingSqlFunctions_Concat() [Test] public void UsingSqlFunctions_Concat_WithCast() { - if(Dialect is Oracle8iDialect) - { + if (Dialect is Oracle8iDialect) Assert.Ignore("Not supported by the active dialect:{0}.", Dialect); - } - if (TestDialect.HasBrokenTypeInferenceOnSelectedParameters) - Assert.Ignore("Current dialect does not support this test"); using (ISession session = Sfi.OpenSession()) { diff --git a/src/NHibernate.Test/Hql/Animal.hbm.xml b/src/NHibernate.Test/Hql/Animal.hbm.xml index 816664012ec..b860469adc5 100644 --- a/src/NHibernate.Test/Hql/Animal.hbm.xml +++ b/src/NHibernate.Test/Hql/Animal.hbm.xml @@ -20,7 +20,7 @@ - + diff --git a/src/NHibernate.Test/Hql/HQLFunctions.cs b/src/NHibernate.Test/Hql/HQLFunctions.cs index 1a2b80b0efd..d2e36c2b428 100644 --- a/src/NHibernate.Test/Hql/HQLFunctions.cs +++ b/src/NHibernate.Test/Hql/HQLFunctions.cs @@ -1132,6 +1132,59 @@ public void Concat() } } + [Test] + public void ConcatAnsiFirstParam() + { + if (!TestDialect.SupportsAnsiString) + Assert.Ignore("AnsiString type is not supported by dialect."); + + var nickName = "abcdef"; + using (ISession s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var a1 = new Human { NickName = nickName, Birthdate = DateTime.Today }; + s.Save(a1); + t.Commit(); + } + + using (var logSpy = new SqlLogSpy()) + using (ISession s = OpenSession()) + { + var param = nickName + "gg"; + var hql = "from Human a where concat(a.NickName, 'gg') = :param "; + Animal result = (Animal) s.CreateQuery(hql).SetParameter("param", param).UniqueResult(); + Assert.That(result, Is.Not.Null); + Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString")); + } + } + + [KnownBug("Not fixed yet")] + [Test] + public void ConcatAnsiSecondParam() + { + if (!TestDialect.SupportsAnsiString) + Assert.Ignore("AnsiString type is not supported by dialect."); + + var nickName = "abcdef"; + using (ISession s = OpenSession()) + using (var t = s.BeginTransaction()) + { + var a1 = new Human { NickName = nickName, Birthdate = DateTime.Today }; + s.Save(a1); + t.Commit(); + } + + using (var logSpy = new SqlLogSpy()) + using (ISession s = OpenSession()) + { + var param = "gg" + nickName; + var hql = "from Human a where concat('gg', a.NickName) = :param "; + Animal result = (Animal) s.CreateQuery(hql).SetParameter("param", param).UniqueResult(); + Assert.That(result, Is.Not.Null); + Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString")); + } + } + [Test] public void HourMinuteSecond() { diff --git a/src/NHibernate.Test/TestDialect.cs b/src/NHibernate.Test/TestDialect.cs index de15f8565ef..c9fdd931867 100644 --- a/src/NHibernate.Test/TestDialect.cs +++ b/src/NHibernate.Test/TestDialect.cs @@ -1,4 +1,5 @@ using System; +using System.Data; using NHibernate.Hql.Ast.ANTLR; using NHibernate.Id; using NHibernate.SqlTypes; @@ -54,6 +55,8 @@ public bool NativeGeneratorSupportsBulkInsertion public virtual bool SupportsNullCharactersInUtfStrings => true; + public virtual bool SupportsAnsiString => _dialect.GetTypeName(new SqlType(DbType.AnsiString)) != _dialect.GetTypeName(new SqlType(DbType.String)); + /// /// Some databases do not support SELECT FOR UPDATE /// diff --git a/src/NHibernate/Dialect/Dialect.cs b/src/NHibernate/Dialect/Dialect.cs index 9a4db11880e..3f3abe1e870 100644 --- a/src/NHibernate/Dialect/Dialect.cs +++ b/src/NHibernate/Dialect/Dialect.cs @@ -101,7 +101,7 @@ protected Dialect() RegisterFunction("cast", new CastFunction()); RegisterFunction("transparentcast", new TransparentCastFunction()); RegisterFunction("extract", new AnsiExtractFunction()); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", " || ", ")")); + RegisterFunction("concat", new VarArgsSQLFunction("(", " || ", ")")); // the syntax of current_timestamp is extracted from H3.2 tests // - test\hql\ASTParserLoadingTest.java diff --git a/src/NHibernate/Dialect/HanaDialectBase.cs b/src/NHibernate/Dialect/HanaDialectBase.cs index 650965a2c06..f10df925065 100644 --- a/src/NHibernate/Dialect/HanaDialectBase.cs +++ b/src/NHibernate/Dialect/HanaDialectBase.cs @@ -454,7 +454,6 @@ protected virtual void RegisterHANAFunctions() RegisterFunction("ceil", new StandardSQLFunction("ceil")); RegisterFunction("char", new StandardSQLFunction("char", NHibernateUtil.AnsiChar)); RegisterFunction("coalesce", new TypeConvertingVarArgsSQLFunction("coalesce(", ",", ")")); - RegisterFunction("concat", new VarArgsSQLFunction("(", " || ", ")")); RegisterFunction("concat_naz", new StandardSQLFunction("concat_naz", NHibernateUtil.String)); RegisterFunction("convert_currency", new VarArgsSQLFunction("convert_currency(", ",", ")")); RegisterFunction("convert_unit", new VarArgsSQLFunction("convert_unit(", ",", ")")); diff --git a/src/NHibernate/Dialect/MsSql2000Dialect.cs b/src/NHibernate/Dialect/MsSql2000Dialect.cs index 1aec544ed2d..37cf8da8196 100644 --- a/src/NHibernate/Dialect/MsSql2000Dialect.cs +++ b/src/NHibernate/Dialect/MsSql2000Dialect.cs @@ -339,7 +339,7 @@ protected virtual void RegisterFunctions() RegisterFunction("month", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(month, ?1)")); RegisterFunction("year", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(year, ?1)")); RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.Date, "dateadd(dd, 0, datediff(dd, 0, ?1))")); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); + RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")")); RegisterFunction("digits", new StandardSQLFunction("digits", NHibernateUtil.String)); RegisterFunction("ascii", new StandardSQLFunction("ascii", NHibernateUtil.Int32)); RegisterFunction("chr", new StandardSQLFunction("char", NHibernateUtil.Character)); diff --git a/src/NHibernate/Dialect/MsSqlCeDialect.cs b/src/NHibernate/Dialect/MsSqlCeDialect.cs index 86edd426e6e..879933457b3 100644 --- a/src/NHibernate/Dialect/MsSqlCeDialect.cs +++ b/src/NHibernate/Dialect/MsSqlCeDialect.cs @@ -193,7 +193,7 @@ protected virtual void RegisterFunctions() RegisterFunction("trim", new AnsiTrimEmulationFunction()); RegisterFunction("iif", new IifSQLFunction()); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); + RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")")); // Modulo is not supported on real, float, money, and numeric data types RegisterFunction("mod", new ModulusFunctionTemplate(false)); diff --git a/src/NHibernate/Dialect/MySQLDialect.cs b/src/NHibernate/Dialect/MySQLDialect.cs index d7b4be07d63..f5431d3d6c5 100644 --- a/src/NHibernate/Dialect/MySQLDialect.cs +++ b/src/NHibernate/Dialect/MySQLDialect.cs @@ -286,7 +286,7 @@ protected virtual void RegisterFunctions() RegisterFunction("radians", new StandardSQLFunction("radians", NHibernateUtil.Double)); RegisterFunction("exp", new StandardSQLFunction("exp", NHibernateUtil.Double)); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "concat(", ",", ")")); + RegisterFunction("concat", new VarArgsSQLFunction("concat(", ",", ")")); RegisterFunction("replace", new StandardSafeSQLFunction("replace", NHibernateUtil.String, 3)); RegisterFunction("ltrim", new StandardSQLFunction("ltrim")); RegisterFunction("rtrim", new StandardSQLFunction("ltrim")); diff --git a/src/NHibernate/Dialect/OracleLiteDialect.cs b/src/NHibernate/Dialect/OracleLiteDialect.cs index eb5af510652..2676a9ca36d 100644 --- a/src/NHibernate/Dialect/OracleLiteDialect.cs +++ b/src/NHibernate/Dialect/OracleLiteDialect.cs @@ -90,7 +90,7 @@ public OracleLiteDialect() RegisterFunction("user", new NoArgSQLFunction("user", NHibernateUtil.String, false)); // Multi-param string dialect functions... - RegisterFunction("concat", new StandardSQLFunction("concat", NHibernateUtil.String)); + RegisterFunction("concat", new StandardSQLFunction("concat")); RegisterFunction("instr", new StandardSQLFunction("instr", NHibernateUtil.String)); RegisterFunction("instrb", new StandardSQLFunction("instrb", NHibernateUtil.String)); RegisterFunction("lpad", new StandardSQLFunction("lpad", NHibernateUtil.String)); diff --git a/src/NHibernate/Dialect/SybaseASE15Dialect.cs b/src/NHibernate/Dialect/SybaseASE15Dialect.cs index e45b1f7700a..2368400ff09 100644 --- a/src/NHibernate/Dialect/SybaseASE15Dialect.cs +++ b/src/NHibernate/Dialect/SybaseASE15Dialect.cs @@ -68,7 +68,7 @@ public SybaseASE15Dialect() RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "datalength(?1) * 8")); RegisterFunction("ceiling", new StandardSQLFunction("ceiling")); RegisterFunction("char", new StandardSQLFunction("char", NHibernateUtil.String)); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(","+",")")); + RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")")); RegisterFunction("cos", new StandardSQLFunction("cos", NHibernateUtil.Double)); RegisterFunction("cot", new StandardSQLFunction("cot", NHibernateUtil.Double)); RegisterFunction("current_date", new NoArgSQLFunction("current_date", NHibernateUtil.LocalDate)); diff --git a/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs b/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs index 290e626671f..4b7b1cf4c48 100644 --- a/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs +++ b/src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs @@ -257,7 +257,6 @@ protected virtual void RegisterStringFunctions() RegisterFunction("char_length", new StandardSQLFunction("char_length", NHibernateUtil.Int32)); RegisterFunction("compare", new VarArgsSQLFunction(NHibernateUtil.Int32, "compare(", ",", ")")); RegisterFunction("compress", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "compress(", ",", ")")); - RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); RegisterFunction("csconvert", new VarArgsSQLFunction(NHibernateUtil.StringClob, "csconvert(", ",", ")")); RegisterFunction("decompress", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "decompress(", ",", ")")); RegisterFunction("decrypt", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "decrypt(", ",", ")"));