Skip to content

Commit

Permalink
Simplify COALESCE
Browse files Browse the repository at this point in the history
Drop all of the arguments after the first non-nullable sub-expressions.
Simplify unary `COALESCE` to its argument.
  • Loading branch information
ranma42 committed Jun 18, 2024
1 parent fccedab commit eba8571
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions src/EFCore.Relational/Query/SqlNullabilityProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,12 +1422,33 @@ protected virtual SqlExpression VisitSqlFunction(
foreach (var argument in sqlFunctionExpression.Arguments)
{
coalesceArguments.Add(Visit(argument, out var argumentNullable));
coalesceNullable = coalesceNullable && argumentNullable;
if (!argumentNullable)
{
coalesceNullable = false;
break;
}
}

nullable = coalesceNullable;

return sqlFunctionExpression.Update(sqlFunctionExpression.Instance, coalesceArguments);
if (coalesceArguments.Count == 1)
{
return coalesceArguments[0];
}
else if (coalesceArguments.Count == sqlFunctionExpression.Arguments.Count)
{
return sqlFunctionExpression.Update(sqlFunctionExpression.Instance, coalesceArguments);
}
else
{
return _sqlExpressionFactory.Function(
sqlFunctionExpression.Name,
coalesceArguments,
sqlFunctionExpression.IsNullable,
argumentsPropagateNullability: coalesceArguments.Select(_ => false).ToArray(),
sqlFunctionExpression.Type,
sqlFunctionExpression.TypeMapping);
}
}

var useNullabilityPropagation = sqlFunctionExpression is { InstancePropagatesNullability: true };
Expand Down

0 comments on commit eba8571

Please sign in to comment.