Skip to content

Commit d3242c3

Browse files
committed
Test (and fix) handling of undefined parameters.
1 parent 4608941 commit d3242c3

File tree

4 files changed

+122
-0
lines changed

4 files changed

+122
-0
lines changed

src/MySqlConnector/Core/PreparedStatementCommandExecutor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ private PayloadData CreateQueryPayload(PreparedStatement preparedStatement, MySq
6868
{
6969
var parameterName = preparedStatement.Statement.ParameterNames[i];
7070
var parameterIndex = parameterName != null ? parameterCollection.NormalizedIndexOf(parameterName) : preparedStatement.Statement.ParameterIndexes[i];
71+
if (parameterIndex == -1 && parameterName != null)
72+
throw new MySqlException("Parameter '{0}' must be defined.".FormatInvariant(parameterName));
73+
else if (parameterIndex < 0 || parameterIndex >= parameterCollection.Count)
74+
throw new MySqlException("Parameter index {0} is invalid when only {1} parameter{2} defined.".FormatInvariant(parameterIndex, parameterCollection.Count, parameterCollection.Count == 1 ? " is" : "s are"));
7175
parameters[i] = parameterCollection[parameterIndex];
7276
}
7377

src/MySqlConnector/Core/StatementPreparer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ private int GetParameterIndex(string name)
5353

5454
private MySqlParameter GetInputParameter(int index)
5555
{
56+
if (index >= m_parameters.Count)
57+
throw new MySqlException("Parameter index {0} is invalid when only {1} parameter{2} defined.".FormatInvariant(index, m_parameters.Count, m_parameters.Count == 1 ? " is" : "s are"));
5658
var parameter = m_parameters[index];
5759
if (parameter.Direction != ParameterDirection.Input && (m_options & StatementPreparerOptions.AllowOutputParameters) == 0)
5860
throw new MySqlException("Only ParameterDirection.Input is supported when CommandType is Text (parameter name: {0})".FormatInvariant(parameter.ParameterName));

tests/SideBySide/CommandTests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,68 @@ public void IgnoreCommandTransactionIgnoresDifferentTransaction()
172172
}
173173
}
174174

175+
[Fact]
176+
public void ThrowsIfNamedParameterUsedButNoParametersDefined()
177+
{
178+
using (var connection = new MySqlConnection(AppConfig.ConnectionString))
179+
{
180+
connection.Open();
181+
using (var cmd = new MySqlCommand("SELECT @param;", connection))
182+
{
183+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
184+
}
185+
}
186+
}
187+
188+
[Fact]
189+
public void ThrowsIfUnnamedParameterUsedButNoParametersDefined()
190+
{
191+
using (var connection = new MySqlConnection(AppConfig.ConnectionString))
192+
{
193+
connection.Open();
194+
using (var cmd = new MySqlCommand("SELECT ?;", connection))
195+
{
196+
#if BASELINE
197+
Assert.Throws<IndexOutOfRangeException>(() => cmd.ExecuteScalar());
198+
#else
199+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
200+
#endif
201+
}
202+
}
203+
}
204+
205+
[Fact]
206+
public void ThrowsIfUndefinedNamedParameterUsed()
207+
{
208+
using (var connection = new MySqlConnection(AppConfig.ConnectionString))
209+
{
210+
connection.Open();
211+
using (var cmd = new MySqlCommand("SELECT @param;", connection))
212+
{
213+
cmd.Parameters.AddWithValue("@name", "test");
214+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
215+
}
216+
}
217+
}
218+
219+
[Fact]
220+
public void ThrowsIfTooManyUnnamedParametersUsed()
221+
{
222+
using (var connection = new MySqlConnection(AppConfig.ConnectionString))
223+
{
224+
connection.Open();
225+
using (var cmd = new MySqlCommand("SELECT ?, ?;", connection))
226+
{
227+
cmd.Parameters.Add(new MySqlParameter { Value = 1 });
228+
#if BASELINE
229+
Assert.Throws<IndexOutOfRangeException>(() => cmd.ExecuteScalar());
230+
#else
231+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
232+
#endif
233+
}
234+
}
235+
}
236+
175237
private static string GetIgnoreCommandTransactionConnectionString()
176238
{
177239
#if BASELINE

tests/SideBySide/PreparedCommandTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,60 @@ public void PreparedCommandIsCached()
166166
}
167167
}
168168

169+
[Fact]
170+
public void ThrowsIfNamedParameterUsedButNoParametersDefined()
171+
{
172+
using (var connection = CreatePrepareConnection())
173+
using (var cmd = new MySqlCommand("SELECT @param;", connection))
174+
{
175+
#if BASELINE
176+
Assert.Throws<InvalidOperationException>(() => cmd.Prepare());
177+
#else
178+
cmd.Prepare();
179+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
180+
#endif
181+
}
182+
}
183+
184+
[Fact]
185+
public void ThrowsIfUnnamedParameterUsedButNoParametersDefined()
186+
{
187+
using (var connection = CreatePrepareConnection())
188+
using (var cmd = new MySqlCommand("SELECT ?;", connection))
189+
{
190+
cmd.Prepare();
191+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
192+
}
193+
}
194+
195+
[Fact]
196+
public void ThrowsIfUndefinedNamedParameterUsed()
197+
{
198+
using (var connection = CreatePrepareConnection())
199+
using (var cmd = new MySqlCommand("SELECT @param;", connection))
200+
{
201+
cmd.Parameters.AddWithValue("@name", "test");
202+
#if BASELINE
203+
Assert.Throws<InvalidOperationException>(() => cmd.Prepare());
204+
#else
205+
cmd.Prepare();
206+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
207+
#endif
208+
}
209+
}
210+
211+
[Fact]
212+
public void ThrowsIfTooManyUnnamedParametersUsed()
213+
{
214+
using (var connection = CreatePrepareConnection())
215+
using (var cmd = new MySqlCommand("SELECT ?, ?;", connection))
216+
{
217+
cmd.Parameters.Add(new MySqlParameter { Value = 1 });
218+
cmd.Prepare();
219+
Assert.Throws<MySqlException>(() => cmd.ExecuteScalar());
220+
}
221+
}
222+
169223
public static IEnumerable<object[]> GetInsertAndQueryData()
170224
{
171225
foreach (var isPrepared in new[] { false, true })

0 commit comments

Comments
 (0)