Skip to content

Commit e3d0357

Browse files
authored
Merge pull request #1252 from neuecc/improve-prepared-execution
Avoid normalize parameter every operation in prepared query.
2 parents da20515 + 11f6941 commit e3d0357

File tree

4 files changed

+15
-3
lines changed

4 files changed

+15
-3
lines changed

src/MySqlConnector/Core/ParsedStatement.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ internal sealed class ParsedStatement
1717
/// </summary>
1818
public List<string?> ParameterNames { get; } = new();
1919

20+
/// <summary>
21+
/// The normalized names of the parameters (if known) of the parameters in the prepared statement. There
22+
/// is one entry in this list for each parameter, which will be <c>null</c> if the name is unknown.
23+
/// </summary>
24+
public List<string?> NormalizedParameterNames { get; } = new();
25+
2026
/// <summary>
2127
/// The indexes of the parameters in the prepared statement. There is one entry in this list for
2228
/// each parameter; it will be <c>-1</c> if the parameter is named.

src/MySqlConnector/Core/SingleCommandPayloadCreator.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ private static void WritePreparedStatement(IMySqlCommand command, PreparedStatem
116116
var parameters = new MySqlParameter[commandParameterCount + attributeCount];
117117
for (var i = 0; i < commandParameterCount; i++)
118118
{
119-
var parameterName = preparedStatement.Statement.ParameterNames![i];
120-
var parameterIndex = parameterName is not null ? (parameterCollection?.NormalizedIndexOf(parameterName) ?? -1) : preparedStatement.Statement.ParameterIndexes[i];
119+
var parameterName = preparedStatement.Statement.NormalizedParameterNames![i];
120+
var parameterIndex = parameterName is not null ? (parameterCollection?.UnsafeIndexOf(parameterName) ?? -1) : preparedStatement.Statement.ParameterIndexes[i];
121121
if (parameterIndex == -1 && parameterName is not null)
122-
throw new MySqlException("Parameter '{0}' must be defined.".FormatInvariant(parameterName));
122+
throw new MySqlException("Parameter '{0}' must be defined.".FormatInvariant(preparedStatement.Statement.ParameterNames![i]));
123123
else if (parameterIndex < 0 || parameterIndex >= (parameterCollection?.Count ?? 0))
124124
throw new MySqlException("Parameter index {0} is invalid when only {1} parameter{2} defined.".FormatInvariant(parameterIndex, parameterCollection?.Count ?? 0, parameterCollection?.Count == 1 ? " is" : "s are"));
125125
parameters[i] = parameterCollection![parameterIndex];

src/MySqlConnector/Core/StatementPreparer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ private void DoAppendParameter(string? parameterName, int parameterIndex, int te
147147

148148
// store the parameter index
149149
m_statements[m_statements.Count - 1].ParameterNames.Add(parameterName);
150+
m_statements[m_statements.Count - 1].NormalizedParameterNames.Add(parameterName == null ? null : MySqlParameter.NormalizeParameterName(parameterName));
150151
m_statements[m_statements.Count - 1].ParameterIndexes.Add(parameterIndex);
151152
}
152153

src/MySqlConnector/MySqlParameterCollection.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ internal int NormalizedIndexOf(string? parameterName)
9696
return m_nameToIndex.TryGetValue(normalizedName, out var index) ? index : -1;
9797
}
9898

99+
internal int UnsafeIndexOf(string? normalizedParameterName)
100+
{
101+
return m_nameToIndex.TryGetValue(normalizedParameterName ?? "", out var index) ? index : -1;
102+
}
103+
99104
public override void Insert(int index, object value) => AddParameter((MySqlParameter) (value ?? throw new ArgumentNullException(nameof(value))), index);
100105

101106
public override bool IsFixedSize => false;

0 commit comments

Comments
 (0)