Skip to content

Commit 793d78b

Browse files
committed
Remove SimplifyLogicalSqlBinaryExpression
Its simplifications are already performed by the `SqlExpressionFactory`.
1 parent 2be205d commit 793d78b

File tree

1 file changed

+36
-103
lines changed

1 file changed

+36
-103
lines changed

src/EFCore.Relational/Query/SqlNullabilityProcessor.cs

+36-103
Original file line numberDiff line numberDiff line change
@@ -1358,8 +1358,14 @@ or ExpressionType.LessThan
13581358
}
13591359

13601360
return result is SqlBinaryExpression sqlBinaryResult
1361-
&& sqlBinaryExpression.OperatorType is ExpressionType.AndAlso or ExpressionType.OrElse
1362-
? SimplifyLogicalSqlBinaryExpression(sqlBinaryResult)
1361+
&& sqlBinaryResult.OperatorType is ExpressionType.AndAlso or ExpressionType.OrElse
1362+
? _sqlExpressionFactory.MakeBinary( // invoke MakeBinary simplifications
1363+
sqlBinaryResult.OperatorType,
1364+
sqlBinaryResult.Left,
1365+
sqlBinaryResult.Right,
1366+
sqlBinaryResult.TypeMapping,
1367+
sqlBinaryResult
1368+
)!
13631369
: result;
13641370

13651371
SqlExpression AddNullConcatenationProtection(SqlExpression argument, RelationalTypeMapping typeMapping)
@@ -1796,26 +1802,16 @@ private SqlExpression RewriteNullSemantics(
17961802
{
17971803
nullable = leftNullable || rightNullable;
17981804

1799-
return SimplifyLogicalSqlBinaryExpression(
1800-
_sqlExpressionFactory.OrElse(
1801-
body,
1802-
SimplifyLogicalSqlBinaryExpression(
1803-
_sqlExpressionFactory.AndAlso(leftIsNull, rightIsNull))));
1805+
return _sqlExpressionFactory.OrElse(body, _sqlExpressionFactory.AndAlso(leftIsNull, rightIsNull));
18041806
}
18051807

18061808
// doing a full null semantics rewrite - removing all nulls from truth table
18071809
nullable = false;
18081810

18091811
// (a == b && (a != null && b != null)) || (a == null && b == null)
1810-
body = SimplifyLogicalSqlBinaryExpression(
1811-
_sqlExpressionFactory.OrElse(
1812-
SimplifyLogicalSqlBinaryExpression(
1813-
_sqlExpressionFactory.AndAlso(
1814-
body,
1815-
SimplifyLogicalSqlBinaryExpression(
1816-
_sqlExpressionFactory.AndAlso(leftIsNotNull, rightIsNotNull)))),
1817-
SimplifyLogicalSqlBinaryExpression(
1818-
_sqlExpressionFactory.AndAlso(leftIsNull, rightIsNull))));
1812+
body = _sqlExpressionFactory.OrElse(
1813+
_sqlExpressionFactory.AndAlso(body, _sqlExpressionFactory.AndAlso(leftIsNotNull, rightIsNotNull)),
1814+
_sqlExpressionFactory.AndAlso(leftIsNull, rightIsNull));
18191815

18201816
if (sqlBinaryExpression.OperatorType == ExpressionType.NotEqual)
18211817
{
@@ -1826,65 +1822,6 @@ private SqlExpression RewriteNullSemantics(
18261822
return body;
18271823
}
18281824

1829-
private SqlExpression SimplifyLogicalSqlBinaryExpression(SqlExpression expression)
1830-
{
1831-
if (expression is not SqlBinaryExpression sqlBinaryExpression)
1832-
{
1833-
return expression;
1834-
}
1835-
1836-
if (sqlBinaryExpression is
1837-
{
1838-
Left: SqlUnaryExpression { OperatorType: ExpressionType.Equal or ExpressionType.NotEqual } leftUnary,
1839-
Right: SqlUnaryExpression { OperatorType: ExpressionType.Equal or ExpressionType.NotEqual } rightUnary
1840-
}
1841-
&& leftUnary.Operand.Equals(rightUnary.Operand))
1842-
{
1843-
// a is null || a is null -> a is null
1844-
// a is not null || a is not null -> a is not null
1845-
// a is null && a is null -> a is null
1846-
// a is not null && a is not null -> a is not null
1847-
// a is null || a is not null -> true
1848-
// a is null && a is not null -> false
1849-
return leftUnary.OperatorType == rightUnary.OperatorType
1850-
? leftUnary
1851-
: _sqlExpressionFactory.Constant(
1852-
sqlBinaryExpression.OperatorType == ExpressionType.OrElse, sqlBinaryExpression.TypeMapping);
1853-
}
1854-
1855-
// true && a -> a
1856-
// true || a -> true
1857-
// false && a -> false
1858-
// false || a -> a
1859-
if (sqlBinaryExpression.Left is SqlConstantExpression { Value: bool leftBoolValue } newLeftConstant)
1860-
{
1861-
return sqlBinaryExpression.OperatorType == ExpressionType.AndAlso
1862-
? leftBoolValue
1863-
? sqlBinaryExpression.Right
1864-
: newLeftConstant
1865-
: leftBoolValue
1866-
? newLeftConstant
1867-
: sqlBinaryExpression.Right;
1868-
}
1869-
1870-
if (sqlBinaryExpression.Right is SqlConstantExpression { Value: bool rightBoolValue } newRightConstant)
1871-
{
1872-
// a && true -> a
1873-
// a || true -> true
1874-
// a && false -> false
1875-
// a || false -> a
1876-
return sqlBinaryExpression.OperatorType == ExpressionType.AndAlso
1877-
? rightBoolValue
1878-
? sqlBinaryExpression.Left
1879-
: newRightConstant
1880-
: rightBoolValue
1881-
? newRightConstant
1882-
: sqlBinaryExpression.Left;
1883-
}
1884-
1885-
return sqlBinaryExpression;
1886-
}
1887-
18881825
/// <summary>
18891826
/// Attempts to simplify a unary not operation on a non-nullable operand.
18901827
/// </summary>
@@ -1938,14 +1875,13 @@ protected virtual SqlExpression OptimizeNonNullableNotExpression(SqlExpression e
19381875
var left = OptimizeNonNullableNotExpression(_sqlExpressionFactory.Not(sqlBinaryOperand.Left));
19391876
var right = OptimizeNonNullableNotExpression(_sqlExpressionFactory.Not(sqlBinaryOperand.Right));
19401877

1941-
return SimplifyLogicalSqlBinaryExpression(
1942-
_sqlExpressionFactory.MakeBinary(
1943-
sqlBinaryOperand.OperatorType == ExpressionType.AndAlso
1944-
? ExpressionType.OrElse
1945-
: ExpressionType.AndAlso,
1946-
left,
1947-
right,
1948-
sqlBinaryOperand.TypeMapping)!);
1878+
return _sqlExpressionFactory.MakeBinary(
1879+
sqlBinaryOperand.OperatorType == ExpressionType.AndAlso
1880+
? ExpressionType.OrElse
1881+
: ExpressionType.AndAlso,
1882+
left,
1883+
right,
1884+
sqlBinaryOperand.TypeMapping)!;
19491885
}
19501886

19511887
// use equality where possible
@@ -2266,14 +2202,13 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
22662202
sqlUnaryExpression.TypeMapping)!,
22672203
operandNullable);
22682204

2269-
return SimplifyLogicalSqlBinaryExpression(
2270-
_sqlExpressionFactory.MakeBinary(
2271-
sqlUnaryExpression.OperatorType == ExpressionType.Equal
2272-
? ExpressionType.OrElse
2273-
: ExpressionType.AndAlso,
2274-
left,
2275-
right,
2276-
sqlUnaryExpression.TypeMapping)!);
2205+
return _sqlExpressionFactory.MakeBinary(
2206+
sqlUnaryExpression.OperatorType == ExpressionType.Equal
2207+
? ExpressionType.OrElse
2208+
: ExpressionType.AndAlso,
2209+
left,
2210+
right,
2211+
sqlUnaryExpression.TypeMapping)!;
22772212
}
22782213

22792214
case SqlFunctionExpression sqlFunctionExpression:
@@ -2295,14 +2230,13 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
22952230
sqlUnaryExpression.TypeMapping)!,
22962231
operandNullable))
22972232
.Aggregate(
2298-
(l, r) => SimplifyLogicalSqlBinaryExpression(
2299-
_sqlExpressionFactory.MakeBinary(
2300-
sqlUnaryExpression.OperatorType == ExpressionType.Equal
2301-
? ExpressionType.AndAlso
2302-
: ExpressionType.OrElse,
2303-
l,
2304-
r,
2305-
sqlUnaryExpression.TypeMapping)!));
2233+
(l, r) => _sqlExpressionFactory.MakeBinary(
2234+
sqlUnaryExpression.OperatorType == ExpressionType.Equal
2235+
? ExpressionType.AndAlso
2236+
: ExpressionType.OrElse,
2237+
l,
2238+
r,
2239+
sqlUnaryExpression.TypeMapping)!);
23062240
}
23072241

23082242
if (!sqlFunctionExpression.IsNullable)
@@ -2348,10 +2282,9 @@ private SqlExpression ProcessNullNotNull(SqlExpression sqlExpression, bool opera
23482282
sqlUnaryExpression.TypeMapping)!,
23492283
operandNullable))
23502284
.Aggregate(
2351-
(r, e) => SimplifyLogicalSqlBinaryExpression(
2352-
sqlUnaryExpression.OperatorType == ExpressionType.Equal
2353-
? _sqlExpressionFactory.OrElse(r, e)
2354-
: _sqlExpressionFactory.AndAlso(r, e)));
2285+
(r, e) => sqlUnaryExpression.OperatorType == ExpressionType.Equal
2286+
? _sqlExpressionFactory.OrElse(r, e)
2287+
: _sqlExpressionFactory.AndAlso(r, e));
23552288

23562289
return result;
23572290
}

0 commit comments

Comments
 (0)