Skip to content

Commit 583bcc8

Browse files
Fix Trim for Sybase ASE
1 parent 229c6c4 commit 583bcc8

File tree

2 files changed

+41
-8
lines changed

2 files changed

+41
-8
lines changed

src/NHibernate/Dialect/Function/AnsiTrimEmulationFunction.cs

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using NHibernate.Engine;
66
using NHibernate.SqlCommand;
77
using NHibernate.Type;
8-
using NHibernate.Util;
98
using System.Text.RegularExpressions;
109

1110
namespace NHibernate.Dialect.Function
@@ -41,6 +40,40 @@ public class AnsiTrimEmulationFunction : ISQLFunction, IFunctionGrammar
4140
new SQLFunctionTemplate(NHibernateUtil.String,
4241
"replace( replace( ltrim( rtrim( replace( replace( ?1, ' ', '${space}$' ), ?2, ' ' ) ) ), ' ', ?2 ), '${space}$', ' ' )");
4342

43+
private readonly ISQLFunction _leadingTrim = LeadingTrim;
44+
private readonly ISQLFunction _trailingTrim = TrailingTrim;
45+
private readonly ISQLFunction _bothTrim = BothTrim;
46+
47+
/// <summary>
48+
/// Default constructor. The target database has to support the <c>replace</c> function.
49+
/// </summary>
50+
public AnsiTrimEmulationFunction()
51+
{
52+
}
53+
54+
/// <summary>
55+
/// Constructor for supplying the name of the replace function to use.
56+
/// </summary>
57+
/// <param name="replaceFunction">The replace function.</param>
58+
public AnsiTrimEmulationFunction(string replaceFunction)
59+
{
60+
_leadingTrim =
61+
new SQLFunctionTemplate(
62+
NHibernateUtil.String,
63+
$"{replaceFunction}( {replaceFunction}( ltrim( {replaceFunction}( {replaceFunction}( ?1, ' ', " +
64+
"'${space}$' ), ?2, ' ' ) ), ' ', ?2 ), '${space}$', ' ' )");
65+
_trailingTrim =
66+
new SQLFunctionTemplate(
67+
NHibernateUtil.String,
68+
$"{replaceFunction}( {replaceFunction}( rtrim( {replaceFunction}( {replaceFunction}( ?1, ' ', " +
69+
"'${space}$' ), ?2, ' ' ) ), ' ', ?2 ), '${space}$', ' ' )");
70+
_bothTrim =
71+
new SQLFunctionTemplate(
72+
NHibernateUtil.String,
73+
$"{replaceFunction}( {replaceFunction}( ltrim( rtrim( {replaceFunction}( {replaceFunction}( ?1, ' ', " +
74+
"'${space}$' ), ?2, ' ' ) ) ), ' ', ?2 ), '${space}$', ' ' )");
75+
}
76+
4477
#region ISQLFunction Members
4578

4679
public IType ReturnType(IType columnType, IMapping mapping)
@@ -174,18 +207,18 @@ public SqlString Render(IList args, ISessionFactoryImplementor factory)
174207

175208
return TrailingSpaceTrim.Render(argsToUse, factory);
176209
}
177-
210+
178211
if (leading && trailing)
179212
{
180-
return BothTrim.Render(argsToUse, factory);
213+
return _bothTrim.Render(argsToUse, factory);
181214
}
182-
215+
183216
if (leading)
184217
{
185-
return LeadingTrim.Render(argsToUse, factory);
218+
return _leadingTrim.Render(argsToUse, factory);
186219
}
187-
188-
return TrailingTrim.Render(argsToUse, factory);
220+
221+
return _trailingTrim.Render(argsToUse, factory);
189222
}
190223

191224
#endregion

src/NHibernate/Dialect/SybaseASE15Dialect.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public SybaseASE15Dialect()
105105
RegisterFunction("square", new StandardSQLFunction("square"));
106106
RegisterFunction("str", new StandardSQLFunction("str", NHibernateUtil.String));
107107
RegisterFunction("tan", new StandardSQLFunction("tan", NHibernateUtil.Double));
108-
// TODO RegisterFunction("trim", new SQLFunctionTemplate(NHibernateUtil.String, "ltrim(rtrim(?1))"));
108+
RegisterFunction("trim", new AnsiTrimEmulationFunction("str_replace"));
109109
RegisterFunction("upper", new StandardSQLFunction("upper"));
110110
RegisterFunction("user", new NoArgSQLFunction("user", NHibernateUtil.String));
111111
RegisterFunction("year", new StandardSQLFunction("year", NHibernateUtil.Int32));

0 commit comments

Comments
 (0)