Skip to content

Commit d12ef77

Browse files
committed
Throw exception when stored procedure doesn't exist.
1 parent a9eb0eb commit d12ef77

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

src/MySqlConnector/Core/CachedProcedure.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,26 @@ internal sealed class CachedProcedure
1515
public static async Task<CachedProcedure> FillAsync(IOBehavior ioBehavior, MySqlConnection connection, string schema, string component, CancellationToken cancellationToken)
1616
{
1717
var parameters = new List<CachedParameter>();
18+
int routineCount;
1819
using (var cmd = connection.CreateCommand())
1920
{
2021
cmd.Transaction = connection.CurrentTransaction;
21-
cmd.CommandText = @"SELECT ORDINAL_POSITION, PARAMETER_MODE, PARAMETER_NAME, DATA_TYPE, DTD_IDENTIFIER
22+
cmd.CommandText = @"SELECT COUNT(*)
23+
FROM information_schema.routines
24+
WHERE ROUTINE_SCHEMA = @schema AND ROUTINE_NAME = @component;
25+
SELECT ORDINAL_POSITION, PARAMETER_MODE, PARAMETER_NAME, DATA_TYPE, DTD_IDENTIFIER
2226
FROM information_schema.parameters
2327
WHERE SPECIFIC_SCHEMA = @schema AND SPECIFIC_NAME = @component
2428
ORDER BY ORDINAL_POSITION";
25-
cmd.Parameters.Add(new MySqlParameter
26-
{
27-
ParameterName = "@schema",
28-
Value = schema
29-
});
30-
cmd.Parameters.Add(new MySqlParameter
31-
{
32-
ParameterName = "@component",
33-
Value = component
34-
});
29+
cmd.Parameters.AddWithValue("@schema", schema);
30+
cmd.Parameters.AddWithValue("@component", component);
3531

3632
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false))
3733
{
34+
await reader.ReadAsync(cancellationToken).ConfigureAwait(false);
35+
routineCount = reader.GetInt32(0);
36+
await reader.NextResultAsync(cancellationToken).ConfigureAwait(false);
37+
3838
while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
3939
{
4040
parameters.Add(new CachedParameter(
@@ -48,7 +48,7 @@ FROM information_schema.parameters
4848
}
4949
}
5050

51-
return parameters.Count == 0 ? null : new CachedProcedure(schema, component, parameters.AsReadOnly());
51+
return routineCount == 0 ? null : new CachedProcedure(schema, component, parameters.AsReadOnly());
5252
}
5353

5454
public ReadOnlyCollection<CachedParameter> Parameters { get; }

src/MySqlConnector/MySql.Data.MySqlClient/MySqlCommandBuilder.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,17 @@ private static async Task DeriveParametersAsync(IOBehavior ioBehavior, MySqlComm
3333
throw new NotSupportedException("MySQL Server {0} doesn't support INFORMATION_SCHEMA".FormatInvariant(command.Connection.Session.ServerVersion.OriginalString));
3434

3535
var cachedProcedure = await command.Connection.GetCachedProcedure(ioBehavior, command.CommandText, cancellationToken).ConfigureAwait(false);
36+
if (cachedProcedure == null)
37+
{
38+
var name = NormalizedSchema.MustNormalize(command.CommandText, command.Connection.Database);
39+
throw new MySqlException("Procedure or function '{0}' cannot be found in database '{1}'.".FormatInvariant(name.Component, name.Schema));
40+
}
41+
3642
command.Parameters.Clear();
37-
if (cachedProcedure != null)
43+
foreach (var cachedParameter in cachedProcedure.Parameters)
3844
{
39-
foreach (var cachedParameter in cachedProcedure.Parameters)
40-
{
41-
var parameter = command.Parameters.Add("@" + cachedParameter.Name, cachedParameter.MySqlDbType);
42-
parameter.Direction = cachedParameter.Direction;
43-
}
45+
var parameter = command.Parameters.Add("@" + cachedParameter.Name, cachedParameter.MySqlDbType);
46+
parameter.Direction = cachedParameter.Direction;
4447
}
4548
}
4649

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,16 @@ public void DeriveParametersRemovesExisting()
500500
}
501501
}
502502

503+
[Fact]
504+
public void DeriveParametersDoesNotExist()
505+
{
506+
using (var cmd = new MySqlCommand("xx_does_not_exist", m_database.Connection))
507+
{
508+
cmd.CommandType = CommandType.StoredProcedure;
509+
Assert.Throws<MySqlException>(() => MySqlCommandBuilder.DeriveParameters(cmd));
510+
}
511+
}
512+
503513
[SkippableFact(ServerFeatures.Json, Baseline = "https://bugs.mysql.com/bug.php?id=89335")]
504514
public void DeriveParametersSetJson()
505515
{

0 commit comments

Comments
 (0)