Skip to content

Commit d58b668

Browse files
Fix SQL formatter failures
Fix string parameter conversion to string. Prevent formatters throwing away their failures. Fixes #1319
1 parent 111f755 commit d58b668

File tree

4 files changed

+70
-16
lines changed

4 files changed

+70
-16
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using NHibernate.AdoNet.Util;
2+
using NUnit.Framework;
3+
4+
namespace NHibernate.Test.UtilityTest
5+
{
6+
[TestFixture]
7+
public class SqlStatementLoggerFixture
8+
{
9+
[Test]
10+
public void SupportsInvalidSql()
11+
{
12+
using (var spy = new SqlLogSpy())
13+
{
14+
var logger = new SqlStatementLogger(false, true);
15+
using (var cmd = new System.Data.SqlClient.SqlCommand(
16+
"UPDATE Table Set Column = @p0; @p0 = 'Some data with an embedded quote in parentheses and signal word (''UPDATE'') like this: (don't update)'"))
17+
{
18+
Assert.DoesNotThrow(() => logger.LogCommand(cmd, FormatStyle.Basic));
19+
}
20+
21+
Assert.That(spy.GetWholeLog(), Contains.Substring("Some data with an embedded quote"));
22+
}
23+
}
24+
[Test]
25+
public void SupportsKeywordInParameter()
26+
{
27+
using (var spy = new SqlLogSpy())
28+
{
29+
var logger = new SqlStatementLogger(false, true);
30+
using (var cmd = new System.Data.SqlClient.SqlCommand("UPDATE Table Set Column = @p0;"))
31+
{
32+
cmd.Parameters.AddWithValue(
33+
"p0",
34+
"Some data with an embedded quote in parentheses and signal word ('UPDATE') like this: (don't update)");
35+
Assert.DoesNotThrow(() => logger.LogCommand(cmd, FormatStyle.Basic));
36+
}
37+
38+
var log = spy.GetWholeLog();
39+
Assert.That(log, Contains.Substring("Some data with an embedded quote"));
40+
Assert.That(log.Split('\n'), Has.Length.GreaterThan(2), "SQL seems not formatted");
41+
}
42+
}
43+
}
44+
}

src/NHibernate/AdoNet/Util/BasicFormatter.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace NHibernate.AdoNet.Util
77
{
88
public class BasicFormatter : IFormatter
99
{
10+
private static readonly INHibernateLogger Logger = NHibernateLogger.For(typeof(BasicFormatter));
11+
1012
protected const string IndentString = " ";
1113
protected const string Initial = "\n ";
1214
protected static readonly HashSet<string> beginClauses = new HashSet<string>();
@@ -60,8 +62,16 @@ static BasicFormatter()
6062

6163
public virtual string Format(string source)
6264
{
63-
using (var fp = new FormatProcess(source))
64-
return fp.Perform();
65+
try
66+
{
67+
using (var fp = new FormatProcess(source))
68+
return fp.Perform();
69+
}
70+
catch (Exception e)
71+
{
72+
Logger.Warn(e, "Unable to format provided SQL: {0}", source);
73+
return source;
74+
}
6575
}
6676

6777
#endregion

src/NHibernate/AdoNet/Util/DdlFormatter.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Text;
43
using NHibernate.Util;
54

65
namespace NHibernate.AdoNet.Util
76
{
87
public class DdlFormatter: IFormatter
98
{
9+
private static readonly INHibernateLogger Logger = NHibernateLogger.For(typeof(DdlFormatter));
10+
1011
private const string Indent1 = "\n ";
1112
private const string Indent2 = "\n ";
1213
private const string Indent3 = "\n ";
@@ -19,21 +20,20 @@ public class DdlFormatter: IFormatter
1920
/// </summary>
2021
public virtual string Format(string sql)
2122
{
22-
if (sql.StartsWith("create table", StringComparison.OrdinalIgnoreCase))
23-
{
24-
return FormatCreateTable(sql);
25-
}
26-
else if (sql.StartsWith("alter table", StringComparison.OrdinalIgnoreCase))
23+
try
2724
{
28-
return FormatAlterTable(sql);
29-
}
30-
else if (sql.StartsWith("comment on", StringComparison.OrdinalIgnoreCase))
31-
{
32-
return FormatCommentOn(sql);
25+
if (sql.StartsWith("create table", StringComparison.OrdinalIgnoreCase))
26+
return FormatCreateTable(sql);
27+
if (sql.StartsWith("alter table", StringComparison.OrdinalIgnoreCase))
28+
return FormatAlterTable(sql);
29+
if (sql.StartsWith("comment on", StringComparison.OrdinalIgnoreCase))
30+
return FormatCommentOn(sql);
31+
return Indent1 + sql;
3332
}
34-
else
33+
catch (Exception e)
3534
{
36-
return Indent1 + sql;
35+
Logger.Warn(e, "Unable to format provided SQL: {0}", sql);
36+
return sql;
3737
}
3838
}
3939

src/NHibernate/AdoNet/Util/SqlStatementLogger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public string GetParameterLoggableValue(DbParameter parameter)
118118

119119
if (IsStringType(parameter.DbType))
120120
{
121-
return string.Concat("'", TruncateWithEllipsis(parameter.Value.ToString(), maxLoggableStringLength), "'");
121+
return $"'{TruncateWithEllipsis(parameter.Value.ToString(), maxLoggableStringLength).Replace("'", "''")}'";
122122
}
123123

124124
if (parameter.Value is DateTime)

0 commit comments

Comments
 (0)