Skip to content

Commit f5f2613

Browse files
committed
Concat should return supplied string type
1 parent e0384a3 commit f5f2613

12 files changed

+117
-9
lines changed

src/NHibernate.Test/Async/Hql/HQLFunctions.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,59 @@ public async Task ConcatAsync()
11431143
}
11441144
}
11451145

1146+
[Test]
1147+
public async Task ConcatAnsiFirstParamAsync()
1148+
{
1149+
if (!TestDialect.SupportsAnsiString)
1150+
Assert.Ignore("AnsiString type is not supported by dialect.");
1151+
1152+
var nickName = "abcdef";
1153+
using (ISession s = OpenSession())
1154+
using (var t = s.BeginTransaction())
1155+
{
1156+
var a1 = new Human { NickName = nickName };
1157+
await (s.SaveAsync(a1));
1158+
await (t.CommitAsync());
1159+
}
1160+
1161+
using (var logSpy = new SqlLogSpy())
1162+
using (ISession s = OpenSession())
1163+
{
1164+
var param = nickName + "gg";
1165+
var hql = "from Human a where concat(a.NickName, 'gg') = :param ";
1166+
Animal result = (Animal) await (s.CreateQuery(hql).SetParameter("param", param).UniqueResultAsync());
1167+
Assert.That(result, Is.Not.Null);
1168+
Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString"));
1169+
}
1170+
}
1171+
1172+
[KnownBug("Not fixed yet")]
1173+
[Test]
1174+
public async Task ConcatAnsiSecondParamAsync()
1175+
{
1176+
if (!TestDialect.SupportsAnsiString)
1177+
Assert.Ignore("AnsiString type is not supported by dialect.");
1178+
1179+
var nickName = "abcdef";
1180+
using (ISession s = OpenSession())
1181+
using (var t = s.BeginTransaction())
1182+
{
1183+
var a1 = new Human { NickName = nickName };
1184+
await (s.SaveAsync(a1));
1185+
await (t.CommitAsync());
1186+
}
1187+
1188+
using (var logSpy = new SqlLogSpy())
1189+
using (ISession s = OpenSession())
1190+
{
1191+
var param = "gg" + nickName;
1192+
var hql = "from Human a where concat('gg', a.NickName) = :param ";
1193+
Animal result = (Animal) await (s.CreateQuery(hql).SetParameter("param", param).UniqueResultAsync());
1194+
Assert.That(result, Is.Not.Null);
1195+
Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString"));
1196+
}
1197+
}
1198+
11461199
[Test]
11471200
public async Task HourMinuteSecondAsync()
11481201
{

src/NHibernate.Test/Hql/Animal.hbm.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<property name="Initial" column="name_initial"/>
2121
<property name="Last" column="name_last"/>
2222
</component>
23-
<property name="NickName"/>
23+
<property name="NickName" type="AnsiString(50)" />
2424
<property name="Birthdate" type="Date"/>
2525
</joined-subclass>
2626
</class>

src/NHibernate.Test/Hql/HQLFunctions.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,59 @@ public void Concat()
11321132
}
11331133
}
11341134

1135+
[Test]
1136+
public void ConcatAnsiFirstParam()
1137+
{
1138+
if (!TestDialect.SupportsAnsiString)
1139+
Assert.Ignore("AnsiString type is not supported by dialect.");
1140+
1141+
var nickName = "abcdef";
1142+
using (ISession s = OpenSession())
1143+
using (var t = s.BeginTransaction())
1144+
{
1145+
var a1 = new Human { NickName = nickName };
1146+
s.Save(a1);
1147+
t.Commit();
1148+
}
1149+
1150+
using (var logSpy = new SqlLogSpy())
1151+
using (ISession s = OpenSession())
1152+
{
1153+
var param = nickName + "gg";
1154+
var hql = "from Human a where concat(a.NickName, 'gg') = :param ";
1155+
Animal result = (Animal) s.CreateQuery(hql).SetParameter("param", param).UniqueResult();
1156+
Assert.That(result, Is.Not.Null);
1157+
Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString"));
1158+
}
1159+
}
1160+
1161+
[KnownBug("Not fixed yet")]
1162+
[Test]
1163+
public void ConcatAnsiSecondParam()
1164+
{
1165+
if (!TestDialect.SupportsAnsiString)
1166+
Assert.Ignore("AnsiString type is not supported by dialect.");
1167+
1168+
var nickName = "abcdef";
1169+
using (ISession s = OpenSession())
1170+
using (var t = s.BeginTransaction())
1171+
{
1172+
var a1 = new Human { NickName = nickName };
1173+
s.Save(a1);
1174+
t.Commit();
1175+
}
1176+
1177+
using (var logSpy = new SqlLogSpy())
1178+
using (ISession s = OpenSession())
1179+
{
1180+
var param = "gg" + nickName;
1181+
var hql = "from Human a where concat('gg', a.NickName) = :param ";
1182+
Animal result = (Animal) s.CreateQuery(hql).SetParameter("param", param).UniqueResult();
1183+
Assert.That(result, Is.Not.Null);
1184+
Assert.That(logSpy.GetWholeLog(), Does.Contain("Type: AnsiString"));
1185+
}
1186+
}
1187+
11351188
[Test]
11361189
public void HourMinuteSecond()
11371190
{

src/NHibernate.Test/TestDialect.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Data;
23
using NHibernate.Hql.Ast.ANTLR;
34
using NHibernate.Id;
45
using NHibernate.SqlTypes;
@@ -54,6 +55,8 @@ public bool NativeGeneratorSupportsBulkInsertion
5455

5556
public virtual bool SupportsNullCharactersInUtfStrings => true;
5657

58+
public virtual bool SupportsAnsiString => _dialect.GetTypeName(new SqlType(DbType.AnsiString)) != _dialect.GetTypeName(new SqlType(DbType.String));
59+
5760
/// <summary>
5861
/// Some databases do not support SELECT FOR UPDATE
5962
/// </summary>

src/NHibernate/Dialect/Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ protected Dialect()
101101
RegisterFunction("cast", new CastFunction());
102102
RegisterFunction("transparentcast", new TransparentCastFunction());
103103
RegisterFunction("extract", new AnsiExtractFunction());
104-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", " || ", ")"));
104+
RegisterFunction("concat", new VarArgsSQLFunction("(", " || ", ")"));
105105

106106
// the syntax of current_timestamp is extracted from H3.2 tests
107107
// - test\hql\ASTParserLoadingTest.java

src/NHibernate/Dialect/HanaDialectBase.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,6 @@ protected virtual void RegisterHANAFunctions()
454454
RegisterFunction("ceil", new StandardSQLFunction("ceil"));
455455
RegisterFunction("char", new StandardSQLFunction("char", NHibernateUtil.AnsiChar));
456456
RegisterFunction("coalesce", new TypeConvertingVarArgsSQLFunction("coalesce(", ",", ")"));
457-
RegisterFunction("concat", new VarArgsSQLFunction("(", " || ", ")"));
458457
RegisterFunction("concat_naz", new StandardSQLFunction("concat_naz", NHibernateUtil.String));
459458
RegisterFunction("convert_currency", new VarArgsSQLFunction("convert_currency(", ",", ")"));
460459
RegisterFunction("convert_unit", new VarArgsSQLFunction("convert_unit(", ",", ")"));

src/NHibernate/Dialect/MsSql2000Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ protected virtual void RegisterFunctions()
339339
RegisterFunction("month", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(month, ?1)"));
340340
RegisterFunction("year", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(year, ?1)"));
341341
RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.Date, "dateadd(dd, 0, datediff(dd, 0, ?1))"));
342-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
342+
RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")"));
343343
RegisterFunction("digits", new StandardSQLFunction("digits", NHibernateUtil.String));
344344
RegisterFunction("ascii", new StandardSQLFunction("ascii", NHibernateUtil.Int32));
345345
RegisterFunction("chr", new StandardSQLFunction("char", NHibernateUtil.Character));

src/NHibernate/Dialect/MsSqlCeDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ protected virtual void RegisterFunctions()
193193
RegisterFunction("trim", new AnsiTrimEmulationFunction());
194194
RegisterFunction("iif", new IifSQLFunction());
195195

196-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
196+
RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")"));
197197
// Modulo is not supported on real, float, money, and numeric data types
198198
RegisterFunction("mod", new ModulusFunctionTemplate(false));
199199

src/NHibernate/Dialect/MySQLDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ protected virtual void RegisterFunctions()
286286
RegisterFunction("radians", new StandardSQLFunction("radians", NHibernateUtil.Double));
287287
RegisterFunction("exp", new StandardSQLFunction("exp", NHibernateUtil.Double));
288288

289-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "concat(", ",", ")"));
289+
RegisterFunction("concat", new VarArgsSQLFunction("concat(", ",", ")"));
290290
RegisterFunction("replace", new StandardSafeSQLFunction("replace", NHibernateUtil.String, 3));
291291
RegisterFunction("ltrim", new StandardSQLFunction("ltrim"));
292292
RegisterFunction("rtrim", new StandardSQLFunction("ltrim"));

src/NHibernate/Dialect/OracleLiteDialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public OracleLiteDialect()
9090
RegisterFunction("user", new NoArgSQLFunction("user", NHibernateUtil.String, false));
9191

9292
// Multi-param string dialect functions...
93-
RegisterFunction("concat", new StandardSQLFunction("concat", NHibernateUtil.String));
93+
RegisterFunction("concat", new StandardSQLFunction("concat"));
9494
RegisterFunction("instr", new StandardSQLFunction("instr", NHibernateUtil.String));
9595
RegisterFunction("instrb", new StandardSQLFunction("instrb", NHibernateUtil.String));
9696
RegisterFunction("lpad", new StandardSQLFunction("lpad", NHibernateUtil.String));

src/NHibernate/Dialect/SybaseASE15Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public SybaseASE15Dialect()
6868
RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "datalength(?1) * 8"));
6969
RegisterFunction("ceiling", new StandardSQLFunction("ceiling"));
7070
RegisterFunction("char", new StandardSQLFunction("char", NHibernateUtil.String));
71-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(","+",")"));
71+
RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")"));
7272
RegisterFunction("cos", new StandardSQLFunction("cos", NHibernateUtil.Double));
7373
RegisterFunction("cot", new StandardSQLFunction("cot", NHibernateUtil.Double));
7474
RegisterFunction("current_date", new NoArgSQLFunction("current_date", NHibernateUtil.LocalDate));

src/NHibernate/Dialect/SybaseSQLAnywhere10Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ protected virtual void RegisterStringFunctions()
257257
RegisterFunction("char_length", new StandardSQLFunction("char_length", NHibernateUtil.Int32));
258258
RegisterFunction("compare", new VarArgsSQLFunction(NHibernateUtil.Int32, "compare(", ",", ")"));
259259
RegisterFunction("compress", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "compress(", ",", ")"));
260-
RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")"));
260+
RegisterFunction("concat", new VarArgsSQLFunction("(", "+", ")"));
261261
RegisterFunction("csconvert", new VarArgsSQLFunction(NHibernateUtil.StringClob, "csconvert(", ",", ")"));
262262
RegisterFunction("decompress", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "decompress(", ",", ")"));
263263
RegisterFunction("decrypt", new VarArgsSQLFunction(NHibernateUtil.BinaryBlob, "decrypt(", ",", ")"));

0 commit comments

Comments
 (0)