Skip to content

Commit b87e6f3

Browse files
authored
Merge pull request #109 from microting/copilot/fix-failing-tests-issue
Fix EF Core 10 API breaking changes in query processor and modification command batch
2 parents eddcb2d + 2c4520d commit b87e6f3

File tree

4 files changed

+21
-52
lines changed

4 files changed

+21
-52
lines changed

src/EFCore.MySql/Query/ExpressionVisitors/Internal/MySqlParameterInliningExpressionVisitor.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ public class MySqlParameterInliningExpressionVisitor : ExpressionVisitor
2323
private readonly ISqlExpressionFactory _sqlExpressionFactory;
2424
private readonly IMySqlOptions _options;
2525

26-
private IReadOnlyDictionary<string, object> _parametersValues;
27-
private bool _canCache;
26+
private ParametersCacheDecorator _parametersDecorator;
2827

2928
private bool _shouldInlineParameters;
3029

@@ -38,18 +37,15 @@ public MySqlParameterInliningExpressionVisitor(
3837
_options = options;
3938
}
4039

41-
public virtual Expression Process(Expression expression, IReadOnlyDictionary<string, object> parametersValues, out bool canCache)
40+
public virtual Expression Process(Expression expression, ParametersCacheDecorator parametersDecorator)
4241
{
4342
Check.NotNull(expression, nameof(expression));
4443

45-
_parametersValues = parametersValues;
46-
_canCache = true;
44+
_parametersDecorator = parametersDecorator;
4745
_shouldInlineParameters = false;
4846

4947
var result = Visit(expression);
5048

51-
canCache = _canCache;
52-
5349
return result;
5450
}
5551

@@ -103,12 +99,12 @@ protected virtual Expression VisitSqlParameter(SqlParameterExpression sqlParamet
10399
return sqlParameterExpression;
104100
}
105101

106-
_canCache = false;
102+
var parameterValues = _parametersDecorator.GetAndDisableCaching();
107103

108104
return new MySqlInlinedParameterExpression(
109105
sqlParameterExpression,
110106
(SqlConstantExpression)_sqlExpressionFactory.Constant(
111-
_parametersValues[sqlParameterExpression.Name],
107+
parameterValues[sqlParameterExpression.Name],
112108
sqlParameterExpression.TypeMapping));
113109
}
114110

src/EFCore.MySql/Query/Internal/MySqlParameterBasedSqlProcessor.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
#nullable enable
55

6-
using System;
7-
using System.Collections.Generic;
86
using System.Linq.Expressions;
97
using Microsoft.EntityFrameworkCore.Query;
108
using Microsoft.EntityFrameworkCore.Utilities;
@@ -26,20 +24,14 @@ public MySqlParameterBasedSqlProcessor(
2624
_options = options;
2725
}
2826

29-
[Obsolete]
30-
public override Expression Optimize(
31-
Expression queryExpression,
32-
IReadOnlyDictionary<string, object?> parametersValues,
33-
out bool canCache)
27+
public override Expression Process(Expression queryExpression, ParametersCacheDecorator parametersDecorator)
3428
{
35-
queryExpression = base.Optimize(queryExpression, parametersValues, out canCache);
29+
queryExpression = base.Process(queryExpression, parametersDecorator);
3630

3731
if (_options.ServerVersion.Supports.MySqlBugLimit0Offset0ExistsWorkaround)
3832
{
3933
queryExpression = new SkipTakeCollapsingExpressionVisitor(Dependencies.SqlExpressionFactory)
40-
.Process(queryExpression, parametersValues, out var canCache2);
41-
42-
canCache &= canCache2;
34+
.Process(queryExpression, parametersDecorator);
4335
}
4436

4537
if (_options.IndexOptimizedBooleanColumns)
@@ -51,14 +43,16 @@ public override Expression Optimize(
5143
queryExpression = new MySqlParameterInliningExpressionVisitor(
5244
Dependencies.TypeMappingSource,
5345
Dependencies.SqlExpressionFactory,
54-
_options).Process(queryExpression, parametersValues, out var canCache3);
55-
56-
canCache &= canCache3;
46+
_options).Process(queryExpression, parametersDecorator);
5747

5848
// Run the compatibility checks as late in the query pipeline (before the actual SQL translation happens) as reasonable.
5949
queryExpression = new MySqlCompatibilityExpressionVisitor(_options).Visit(queryExpression);
6050

6151
return queryExpression;
6252
}
53+
54+
/// <inheritdoc />
55+
protected override Expression ProcessSqlNullability(Expression selectExpression, ParametersCacheDecorator parametersDecorator)
56+
=> new MySqlSqlNullabilityProcessor(Dependencies, Parameters).Process(selectExpression, parametersDecorator);
6357
}
6458
}

src/EFCore.MySql/Query/Internal/SkipTakeCollapsingExpressionVisitor.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,27 @@ public class SkipTakeCollapsingExpressionVisitor : ExpressionVisitor
1515
{
1616
private readonly ISqlExpressionFactory _sqlExpressionFactory;
1717

18-
private IReadOnlyDictionary<string, object?> _parameterValues;
19-
private bool _canCache;
18+
private ParametersCacheDecorator _parametersDecorator;
2019

2120
public SkipTakeCollapsingExpressionVisitor(ISqlExpressionFactory sqlExpressionFactory)
2221
{
2322
Check.NotNull(sqlExpressionFactory, nameof(sqlExpressionFactory));
2423

2524
_sqlExpressionFactory = sqlExpressionFactory;
26-
_parameterValues = null!;
25+
_parametersDecorator = null!;
2726
}
2827

2928
public virtual Expression Process(
3029
Expression selectExpression,
31-
IReadOnlyDictionary<string, object?> parametersValues,
32-
out bool canCache)
30+
ParametersCacheDecorator parametersDecorator)
3331
{
3432
Check.NotNull(selectExpression, nameof(selectExpression));
35-
Check.NotNull(parametersValues, nameof(parametersValues));
33+
Check.NotNull(parametersDecorator, nameof(parametersDecorator));
3634

37-
_parameterValues = parametersValues;
38-
_canCache = true;
35+
_parametersDecorator = parametersDecorator;
3936

4037
var result = Visit(selectExpression);
4138

42-
canCache = _canCache;
43-
4439
return result;
4540
}
4641

@@ -74,8 +69,8 @@ bool IsZero(SqlExpression? sqlExpression)
7469
when constant.Value is int intValue:
7570
return intValue == 0;
7671
case SqlParameterExpression parameter:
77-
_canCache = false;
78-
return _parameterValues[parameter.Name] is int value && value == 0;
72+
var parameterValues = _parametersDecorator.GetAndDisableCaching();
73+
return parameterValues[parameter.Name] is int value && value == 0;
7974

8075
default:
8176
return false;

src/EFCore.MySql/Update/Internal/MySqlModificationCommandBatch.cs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ namespace Pomelo.EntityFrameworkCore.MySql.Update.Internal;
2626
public class MySqlModificationCommandBatch : AffectedCountModificationCommandBatch
2727
{
2828
private readonly List<IReadOnlyModificationCommand> _pendingBulkInsertCommands = new();
29-
private readonly Dictionary<string, object> _parameterValues = new();
3029

3130
public MySqlModificationCommandBatch(
3231
ModificationCommandBatchFactoryDependencies dependencies,
@@ -45,21 +44,6 @@ protected override void RollbackLastCommand(IReadOnlyModificationCommand modific
4544
_pendingBulkInsertCommands.RemoveAt(_pendingBulkInsertCommands.Count - 1);
4645
}
4746

48-
//////
49-
// Pulled up from the base implementation to support our _pendingParameters field:
50-
51-
for (var i = 0; i < _pendingParameters; i++)
52-
{
53-
var parameterIndex = RelationalCommandBuilder.Parameters.Count - 1;
54-
var parameter = RelationalCommandBuilder.Parameters[parameterIndex];
55-
56-
RelationalCommandBuilder.RemoveParameterAt(parameterIndex);
57-
_parameterValues.Remove(parameter.InvariantName);
58-
}
59-
60-
//
61-
//////
62-
6347
base.RollbackLastCommand(modificationCommand);
6448
}
6549

@@ -364,7 +348,7 @@ void AddParameterCore(string name, object value)
364348
columnModification.IsNullable,
365349
direction);
366350

367-
_parameterValues.Add(name, value);
351+
ParameterValues.Add(name, value);
368352

369353
_pendingParameters++;
370354
}

0 commit comments

Comments
 (0)