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(", ",", ")"));