Skip to content

Commit b0b97a0

Browse files
committed
Fix parsing of ENUM procedure parameters. Fixes #812
1 parent 73532d9 commit b0b97a0

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

src/MySqlConnector/Core/CachedProcedure.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ internal static List<CachedParameter> ParseParameters(string parametersSql)
157157
// strip precision specifier containing comma
158158
parametersSql = Regex.Replace(parametersSql, @"(DECIMAL|DEC|FIXED|NUMERIC|FLOAT|DOUBLE PRECISION|DOUBLE|REAL)\s*\(\d+(,\s*\d+)\)", @"$1", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
159159

160+
// strip enum values containing commas (these would have been stripped by ParseDataType anyway)
161+
parametersSql = Regex.Replace(parametersSql, @"ENUM\s*\([^)]+\)", "ENUM", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
162+
160163
var parameters = parametersSql.Split(',');
161164
var cachedParameters = new List<CachedParameter>(parameters.Length);
162165
for (var i = 0; i < parameters.Length; i++)
@@ -202,6 +205,7 @@ internal static string ParseDataType(string sql, out bool unsigned, out int leng
202205
}
203206
sql = Regex.Replace(sql, " (CHARSET|CHARACTER SET) [A-Za-z0-9_]+", "", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
204207
sql = Regex.Replace(sql, " (COLLATE) [A-Za-z0-9_]+", "", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
208+
sql = Regex.Replace(sql, @"ENUM\s*\([^)]+\)", "ENUM", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
205209

206210
length = 0;
207211
var match = Regex.Match(sql, @"\s*\(\s*(\d+)\s*(?:,\s*\d+\s*)?\)");

tests/MySqlConnector.Tests/CachedProcedureTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ public static IEnumerable<object[]> CreateParseableParameters()
121121
}
122122
},
123123
new object[]
124+
{
125+
"IN input enum ('One', 'Two', 'Three')", new object[]
126+
{
127+
new CachedParameter(1, "IN", "input", "ENUM", false, 0),
128+
}
129+
},
130+
new object[]
124131
{
125132
"OUT param DECIMAL(10,5)", new object[]
126133
{
@@ -190,6 +197,7 @@ param4 INTEGER(3)
190197
[InlineData("VARCHAR(300) COLLATE ascii_general_ci", "VARCHAR", false, 300)]
191198
[InlineData("BINARY(16)", "BINARY", false, 16)]
192199
[InlineData("CHAR(36)", "CHAR", false, 36)]
200+
[InlineData("ENUM('a','b','c')", "ENUM", false, 0)]
193201
public void ParseDataType(string sql, string expectedDataType, bool expectedUnsigned, int expectedLength)
194202
{
195203
var dataType = CachedProcedure.ParseDataType(sql, out var unsigned, out var length);

tests/SideBySide/StoredProcedureFixture.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,14 @@ create procedure number_lister (inout high int)
124124
CREATE PROCEDURE `GetTime`(OUT OutTime TIME)
125125
BEGIN
126126
SET OutTime = CURTIME();
127-
END;");
127+
END;
128+
129+
DROP PROCEDURE IF EXISTS EnumProcedure;
130+
CREATE PROCEDURE EnumProcedure(IN input enum ('One', 'Two', 'Three'))
131+
BEGIN
132+
SELECT input;
133+
END;
134+
");
128135

129136
if (AppConfig.SupportsJson)
130137
{

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,18 @@ public void OutputTimeParameter()
669669
Assert.IsType<TimeSpan>(parameter.Value);
670670
}
671671

672+
[Fact]
673+
public void EnumProcedure()
674+
{
675+
using var command = new MySqlCommand("EnumProcedure", m_database.Connection);
676+
command.CommandType = CommandType.StoredProcedure;
677+
command.Parameters.AddWithValue("@input", "One");
678+
using var reader = command.ExecuteReader();
679+
Assert.True(reader.Read());
680+
Assert.Equal("One", reader.GetString(0));
681+
Assert.False(reader.Read());
682+
}
683+
672684
private static string NormalizeSpaces(string input)
673685
{
674686
input = input.Replace('\r', ' ');

0 commit comments

Comments
 (0)