Skip to content

Commit

Permalink
whitespace for auto-SP detection: use unicode spec via regex (#1987)
Browse files Browse the repository at this point in the history
* add fix and test for #1975

* wrong ticket number; is #1986
  • Loading branch information
mgravell authored Oct 19, 2023
1 parent b446241 commit cdadfa6
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
7 changes: 4 additions & 3 deletions Dapper/CommandDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Data;
using System.Reflection;
using System.Reflection.Emit;
using System.Text.RegularExpressions;
using System.Threading;

namespace Dapper
Expand Down Expand Up @@ -103,14 +104,14 @@ public CommandDefinition(string commandText, object? parameters = null, IDbTrans

static CommandType InferCommandType(string sql)
{
if (sql is null || sql.IndexOfAny(WhitespaceChars) >= 0) return System.Data.CommandType.Text;
if (sql is null || WhitespaceChars.IsMatch(sql)) return System.Data.CommandType.Text;
return System.Data.CommandType.StoredProcedure;
}
}

// if the sql contains any whitespace character (space/tab/cr/lf): interpret as ad-hoc; but "SomeName" should be treated as a stored-proc
// if the sql contains any whitespace character (space/tab/cr/lf/etc - via unicode): interpret as ad-hoc; but "SomeName" should be treated as a stored-proc
// (note TableDirect would need to be specified explicitly, but in reality providers don't usually support TableDirect anyway)
private static readonly char[] WhitespaceChars = new char[] { ' ', '\t', '\r', '\n' };
private static readonly Regex WhitespaceChars = new(@"\s", RegexOptions.Compiled);

private CommandDefinition(object? parameters) : this()
{
Expand Down
15 changes: 15 additions & 0 deletions tests/Dapper.Tests/ProcedureTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -302,5 +302,20 @@ select 1 as Num

Assert.Empty(result);
}

[Theory]
[InlineData(" ")]
[InlineData("\u00A0")] // nbsp
[InlineData("\u202F")] // narrow nbsp
[InlineData("\u2000")] // n quad
[InlineData("\t")]
[InlineData("\r")]
[InlineData("\n")]
public async Task Issue1986_AutoProc_Whitespace(string space)
{
var sql = "select!42".Replace("!", space);
var result = await connection.QuerySingleAsync<int>(sql);
Assert.Equal(42, result);
}
}
}

0 comments on commit cdadfa6

Please sign in to comment.