From 38d9f0f110a025d693bf5d804d9aec5a4b5868c1 Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Sun, 16 Jun 2024 11:32:09 +0200 Subject: [PATCH] Simplify `COALESCE` Drop all of the arguments after the first non-nullable sub-expressions. Simplify unary `COALESCE` to its argument. --- .../Query/SqlNullabilityProcessor.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs index 4b2b44773c1..11cef72197c 100644 --- a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs +++ b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs @@ -1422,12 +1422,25 @@ 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); + return coalesceArguments switch + { + [var singleArgument] => singleArgument, + + _ => sqlFunctionExpression.Update( + sqlFunctionExpression.Instance, + coalesceArguments, + argumentsPropagateNullability: coalesceArguments.Select(_ => false).ToArray() + ), + }; } var useNullabilityPropagation = sqlFunctionExpression is { InstancePropagatesNullability: true };