From f364295511cb8023ad155617fdc54608705020be Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Wed, 23 Apr 2025 21:02:22 +0200 Subject: [PATCH 1/3] Test additional cases of imprecise typemapping computation --- .../NorthwindMiscellaneousQueryCosmosTest.cs | 34 ++++++++++++++++++- .../NorthwindMiscellaneousQueryTestBase.cs | 17 ++++++++++ ...orthwindMiscellaneousQuerySqlServerTest.cs | 28 +++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs index 6e123d8488b..fea479034fe 100644 --- a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs @@ -3269,6 +3269,38 @@ public override Task Coalesce_Correct_TypeMapping_String(bool async) SELECT VALUE ((c["Region"] != null) ? c["Region"] : "no region specified") FROM root c ORDER BY c["id"] +"""); + }); + + public override Task Coalesce_Correct_TypeMapping_String_Sum(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Coalesce_Correct_TypeMapping_String_Sum(async); + + AssertSql( + """ +SELECT VALUE ((((c["Region"] != null) ? ("R" || c["Region"]) : null) != null) ? ((c["Region"] != null) ? ("R" || c["Region"]) : null) : "no region specified") +FROM root c +ORDER BY c["id"] +"""); + }); + + public override Task Coalesce_Correct_TypeMapping_String_Join(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Coalesce_Correct_TypeMapping_String_Join(async); + + AssertSql( + """ +SELECT VALUE +{ + "c" : (c["Region"] != null), + "c0" : ["R", c["Region"]] +} +FROM root c +ORDER BY c["id"] """); }); @@ -3390,7 +3422,7 @@ public override async Task SelectMany_primitive_select_subquery(bool async) // Cosmos client evaluation. Issue #17246. Assert.Equal( CoreStrings.ExpressionParameterizationExceptionSensitive( - "value(Microsoft.EntityFrameworkCore.Query.NorthwindMiscellaneousQueryTestBase`1+<>c__DisplayClass175_0[Microsoft.EntityFrameworkCore.Query.NorthwindQueryCosmosFixture`1[Microsoft.EntityFrameworkCore.TestUtilities.NoopModelCustomizer]]).ss.Set().Any()"), + "value(Microsoft.EntityFrameworkCore.Query.NorthwindMiscellaneousQueryTestBase`1+<>c__DisplayClass177_0[Microsoft.EntityFrameworkCore.Query.NorthwindQueryCosmosFixture`1[Microsoft.EntityFrameworkCore.TestUtilities.NoopModelCustomizer]]).ss.Set().Any()"), (await Assert.ThrowsAsync( () => base.SelectMany_primitive_select_subquery(async))).Message); diff --git a/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs index fc017f483ce..2833607ee29 100644 --- a/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs @@ -748,6 +748,23 @@ public virtual Task Coalesce_Correct_TypeMapping_String(bool async) ss => ss.Set().OrderBy(c => c.CustomerID).Select(c => c.Region ?? "no region specified"), assertOrder: true); + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Coalesce_Correct_TypeMapping_String_Sum(bool async) + => AssertQuery( + async, + ss => ss.Set().OrderBy(c => c.CustomerID).Select(c => (c.Region != null ? "R" + c.Region : null) ?? "no region specified"), + assertOrder: true); + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Coalesce_Correct_TypeMapping_String_Join(bool async) + => AssertQuery( + async, + ss => ss.Set().OrderBy(c => c.CustomerID) + .Select(c => (c.Region != null ? string.Join("|", new[] { "R", c.Region }) : null) ?? "no region specified"), + assertOrder: true); + [ConditionalTheory] [MemberData(nameof(IsAsyncData))] public virtual Task Null_Coalesce_Short_Circuit(bool async) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs index ca5d72b7221..ca6a415114b 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs @@ -2879,6 +2879,34 @@ ORDER BY [c].[CustomerID] """); } + public override async Task Coalesce_Correct_TypeMapping_String_Sum(bool async) + { + await base.Coalesce_Correct_TypeMapping_String_Sum(async); + + AssertSql( + """ +SELECT COALESCE(CASE + WHEN [c].[Region] IS NOT NULL THEN N'R' + [c].[Region] +END, N'no region specified') +FROM [Customers] AS [c] +ORDER BY [c].[CustomerID] +"""); + } + + public override async Task Coalesce_Correct_TypeMapping_String_Join(bool async) + { + await base.Coalesce_Correct_TypeMapping_String_Join(async); + + AssertSql( + """ +SELECT COALESCE(CASE + WHEN [c].[Region] IS NOT NULL THEN CONCAT_WS(N'|', N'R', [c].[Region]) +END, N'no region specified') +FROM [Customers] AS [c] +ORDER BY [c].[CustomerID] +"""); + } + public override async Task Null_Coalesce_Short_Circuit(bool async) { await base.Null_Coalesce_Short_Circuit(async); From 67422147eaf70e3b5dad081f880e7c67649a1c0c Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Wed, 23 Apr 2025 20:56:21 +0200 Subject: [PATCH 2/3] Translate more COALESCE uses as ISNULL --- .../Internal/SqlServerQuerySqlGenerator.cs | 74 ++++++++++++------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs b/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs index 73fd75e37c8..54d8e9427bc 100644 --- a/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs +++ b/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs @@ -213,37 +213,59 @@ protected override Expression VisitSqlFunction(SqlFunctionExpression sqlFunction if (sqlFunctionExpression is { IsBuiltIn: true, Arguments: not null } && string.Equals(sqlFunctionExpression.Name, "COALESCE", StringComparison.OrdinalIgnoreCase)) { - var type = sqlFunctionExpression.Type; - var typeMapping = sqlFunctionExpression.TypeMapping; - var defaultTypeMapping = _typeMappingSource.FindMapping(type); - // ISNULL always return a value having the same type as its first // argument. Ideally we would convert the argument to have the // desired type and type mapping, but currently EFCore has some // trouble in computing types of non-homogeneous expressions - // (tracked in https://github.com/dotnet/efcore/issues/15586). To - // stay on the safe side we only use ISNULL if: - // - all sub-expressions have the same type as the expression - // - all sub-expressions have the same type mapping as the expression - // - the expression is using the default type mapping (combined - // with the two above, this implies that all of the expressions - // are using the default type mapping of the type) - if (defaultTypeMapping == typeMapping - && sqlFunctionExpression.Arguments.All(a => a.Type == type && a.TypeMapping == typeMapping)) { - - var head = sqlFunctionExpression.Arguments[0]; - sqlFunctionExpression = (SqlFunctionExpression)sqlFunctionExpression - .Arguments - .Skip(1) - .Aggregate(head, (l, r) => new SqlFunctionExpression( - "ISNULL", - arguments: [l, r], - nullable: true, - argumentsPropagateNullability: [false, false], - sqlFunctionExpression.Type, - sqlFunctionExpression.TypeMapping - )); + // (tracked in https://github.com/dotnet/efcore/issues/15586). + // + // The main issue is the sizing of the type, which is expanded to + // the maximum supported size with an approach similar to that used + // in SqlServerStringAggregateMethodTranslator. This might result in + // unneeded conversions, but should produce the correct results. + + var typeMapping = sqlFunctionExpression.TypeMapping switch + { + { StoreTypeNameBase: "nvarchar", Size: >= 0 and < 4000 } => _typeMappingSource.FindMapping( + typeof(string), + sqlFunctionExpression.TypeMapping.StoreTypeNameBase, + unicode: true, + size: 4000), + { StoreType: "varchar" or "varbinary", Size: >= 0 and < 8000 } => _typeMappingSource.FindMapping( + typeof(string), + sqlFunctionExpression.TypeMapping.StoreTypeNameBase, + unicode: false, + size: 8000), + var t => t, + }; + + var result = sqlFunctionExpression.Arguments[0]; + if (result.TypeMapping?.StoreType != typeMapping?.StoreType) + { + result = new SqlUnaryExpression( + ExpressionType.Convert, + result, + sqlFunctionExpression.Type, + typeMapping + ); } + + var length = sqlFunctionExpression.Arguments.Count; + for (var i = 1; i < length; i++) + { + // propagate type and type mapping from the first argument, + // nullability from COALESCE + result = new SqlFunctionExpression( + "ISNULL", + arguments: [result, sqlFunctionExpression.Arguments[i]], + nullable: i == length - 1 ? sqlFunctionExpression.IsNullable : true, + argumentsPropagateNullability: [false, false], + result.Type, + result.TypeMapping + ); + } + + sqlFunctionExpression = (SqlFunctionExpression)result; } return base.VisitSqlFunction(sqlFunctionExpression); From 4f4a019536753c3945130a6324468d039f05ef72 Mon Sep 17 00:00:00 2001 From: Andrea Canciani Date: Wed, 23 Apr 2025 21:18:42 +0200 Subject: [PATCH 3/3] Update baselines --- .../NonSharedModelBulkUpdatesSqlServerTest.cs | 6 +- .../NorthwindBulkUpdatesSqlServerTest.cs | 10 +- .../AdHocMiscellaneousQuerySqlServerTest.cs | 6 +- .../AdHocNavigationsQuerySqlServerTest.cs | 4 +- ...ComplexNavigationsQuerySqlServer160Test.cs | 24 +-- .../ComplexNavigationsQuerySqlServerTest.cs | 24 +-- ...igationsSharedTypeQuerySqlServer160Test.cs | 26 +-- ...NavigationsSharedTypeQuerySqlServerTest.cs | 26 +-- .../Query/Ef6GroupBySqlServerTest.cs | 8 +- .../Query/GearsOfWarQuerySqlServerTest.cs | 84 ++++----- .../ManyToManyNoTrackingQuerySqlServerTest.cs | 4 +- .../Query/ManyToManyQuerySqlServerTest.cs | 4 +- ...indAggregateOperatorsQuerySqlServerTest.cs | 68 ++++---- ...rthwindDbFunctionsQuerySqlServer160Test.cs | 12 +- .../NorthwindDbFunctionsQuerySqlServerTest.cs | 12 +- ...NorthwindFunctionsQuerySqlServer160Test.cs | 8 +- .../NorthwindFunctionsQuerySqlServerTest.cs | 8 +- .../NorthwindGroupByQuerySqlServerTest.cs | 160 +++++++++--------- .../Query/NorthwindJoinQuerySqlServerTest.cs | 10 +- ...orthwindMiscellaneousQuerySqlServerTest.cs | 94 +++++----- .../NorthwindNavigationsQuerySqlServerTest.cs | 8 +- .../NorthwindSelectQuerySqlServerTest.cs | 26 +-- .../Query/NullSemanticsQuerySqlServerTest.cs | 36 ++-- .../Query/OwnedEntityQuerySqlServerTest.cs | 2 +- .../Query/OwnedQuerySqlServerTest.cs | 4 +- .../Query/PrecompiledQuerySqlServerTest.cs | 16 +- ...imitiveCollectionsQuerySqlServer160Test.cs | 4 +- .../PrimitiveCollectionsQuerySqlServerTest.cs | 4 +- .../Query/TPCGearsOfWarQuerySqlServerTest.cs | 84 ++++----- ...CManyToManyNoTrackingQuerySqlServerTest.cs | 4 +- .../Query/TPCManyToManyQuerySqlServerTest.cs | 4 +- .../Query/TPTGearsOfWarQuerySqlServerTest.cs | 84 ++++----- ...TManyToManyNoTrackingQuerySqlServerTest.cs | 4 +- .../Query/TPTManyToManyQuerySqlServerTest.cs | 4 +- .../TemporalGearsOfWarQuerySqlServerTest.cs | 84 ++++----- .../TemporalManyToManyQuerySqlServerTest.cs | 4 +- .../Query/TemporalOwnedQuerySqlServerTest.cs | 4 +- ...aneousOperatorTranslationsSqlServerTest.cs | 2 +- .../StringTranslationsSqlServerTest.cs | 12 +- 39 files changed, 495 insertions(+), 493 deletions(-) diff --git a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs index dbd19852f1b..5ad7aaee88d 100644 --- a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs @@ -98,7 +98,7 @@ public override async Task Update_non_owned_property_on_entity_with_owned2(bool AssertSql( """ UPDATE [o] -SET [o].[Title] = COALESCE([o].[Title], N'') + N'_Suffix' +SET [o].[Title] = ISNULL([o].[Title], N'') + N'_Suffix' FROM [Owner] AS [o] """); } @@ -125,7 +125,7 @@ public override async Task Update_owned_and_non_owned_properties_with_table_shar AssertSql( """ UPDATE [o] -SET [o].[Title] = COALESCE(CONVERT(varchar(11), [o].[OwnedReference_Number]), ''), +SET [o].[Title] = ISNULL(CONVERT(varchar(11), [o].[OwnedReference_Number]), ''), [o].[OwnedReference_Number] = CAST(LEN([o].[Title]) AS int) FROM [Owner] AS [o] """); @@ -190,7 +190,7 @@ public override async Task Update_with_alias_uniquification_in_setter_subquery(b """ UPDATE [o] SET [o].[Total] = ( - SELECT COALESCE(SUM([o0].[Amount]), 0) + SELECT ISNULL(SUM([o0].[Amount]), 0) FROM [OrderProduct] AS [o0] WHERE [o].[Id] = [o0].[OrderId]) FROM [Orders] AS [o] diff --git a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs index 075ff9f74fe..7f591e4350c 100644 --- a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs @@ -1110,7 +1110,7 @@ public override async Task Update_Where_set_property_plus_constant(bool async) AssertExecuteUpdateSql( """ UPDATE [c] -SET [c].[ContactName] = COALESCE([c].[ContactName], N'') + N'Abc' +SET [c].[ContactName] = ISNULL(CAST([c].[ContactName] AS nvarchar(4000)), N'') + N'Abc' FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); @@ -1125,7 +1125,7 @@ public override async Task Update_Where_set_property_plus_parameter(bool async) @value='Abc' (Size = 4000) UPDATE [c] -SET [c].[ContactName] = COALESCE([c].[ContactName], N'') + @value +SET [c].[ContactName] = ISNULL(CAST([c].[ContactName] AS nvarchar(4000)), N'') + @value FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); @@ -1138,7 +1138,7 @@ public override async Task Update_Where_set_property_plus_property(bool async) AssertExecuteUpdateSql( """ UPDATE [c] -SET [c].[ContactName] = COALESCE([c].[ContactName], N'') + [c].[CustomerID] +SET [c].[ContactName] = ISNULL(CAST([c].[ContactName] AS nvarchar(4000)), N'') + [c].[CustomerID] FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); @@ -1560,7 +1560,7 @@ public override async Task Update_Where_Join_set_property_from_joined_single_res AssertExecuteUpdateSql( """ UPDATE [c] -SET [c].[City] = COALESCE(CONVERT(varchar(11), DATEPART(year, ( +SET [c].[City] = ISNULL(CONVERT(varchar(11), DATEPART(year, ( SELECT TOP(1) [o].[OrderDate] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] @@ -1595,7 +1595,7 @@ public override async Task Update_Where_Join_set_property_from_joined_single_res AssertExecuteUpdateSql( """ UPDATE [c] -SET [c].[City] = COALESCE(CONVERT(varchar(11), DATEPART(year, ( +SET [c].[City] = ISNULL(CONVERT(varchar(11), DATEPART(year, ( SELECT TOP(1) [o].[OrderDate] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs index 8d59ea02a37..10f3e00b4de 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs @@ -2202,7 +2202,7 @@ public override async Task Enum_with_value_converter_matching_take_value(bool as @orderItemType='MyType1' (Nullable = false) (Size = 4000) @p='1' -SELECT [o1].[Id], COALESCE(( +SELECT [o1].[Id], ISNULL(( SELECT TOP(1) [o3].[Price] FROM [OrderItems] AS [o3] WHERE [o1].[Id] = [o3].[OrderId] AND [o3].[Type] = @orderItemType), 0.0E0) AS [SpecialSum] @@ -2284,8 +2284,8 @@ public override async Task Group_by_aggregate_in_subquery_projection_after_group AssertSql( """ -SELECT [t].[Value] AS [A], COALESCE(SUM([t].[Id]), 0) AS [B], COALESCE(( - SELECT TOP(1) COALESCE(SUM([t].[Id]), 0) + COALESCE(SUM([t0].[Id]), 0) +SELECT [t].[Value] AS [A], ISNULL(SUM([t].[Id]), 0) AS [B], ISNULL(( + SELECT TOP(1) ISNULL(SUM([t].[Id]), 0) + ISNULL(SUM([t0].[Id]), 0) FROM [Tables] AS [t0] GROUP BY [t0].[Value] ORDER BY (SELECT 1)), 0) AS [C] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocNavigationsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocNavigationsQuerySqlServerTest.cs index a1831786ee1..06e388c7250 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocNavigationsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocNavigationsQuerySqlServerTest.cs @@ -337,14 +337,14 @@ FROM [CompetitionSeasons] AS [c1] SELECT [a].[Id], [a].[ActivityTypeId], [a].[DateTime], [a].[Points], ( SELECT TOP(1) [c].[Id] FROM [CompetitionSeasons] AS [c] - WHERE [c].[StartDate] <= [a].[DateTime] AND [a].[DateTime] < [c].[EndDate]) AS [CompetitionSeasonId], COALESCE([a].[Points], ( + WHERE [c].[StartDate] <= [a].[DateTime] AND [a].[DateTime] < [c].[EndDate]) AS [CompetitionSeasonId], ISNULL(ISNULL([a].[Points], ( SELECT TOP(1) [a1].[Points] FROM [ActivityTypePoints] AS [a1] INNER JOIN [CompetitionSeasons] AS [c0] ON [a1].[CompetitionSeasonId] = [c0].[Id] WHERE [a0].[Id] = [a1].[ActivityTypeId] AND [c0].[Id] = ( SELECT TOP(1) [c1].[Id] FROM [CompetitionSeasons] AS [c1] - WHERE [c1].[StartDate] <= [a].[DateTime] AND [a].[DateTime] < [c1].[EndDate])), 0) AS [Points] + WHERE [c1].[StartDate] <= [a].[DateTime] AND [a].[DateTime] < [c1].[EndDate]))), 0) AS [Points] FROM [Activities] AS [a] INNER JOIN [ActivityType] AS [a0] ON [a].[ActivityTypeId] = [a0].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs index 23a69d6f6c0..c6c7d397424 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs @@ -1099,7 +1099,7 @@ public override async Task Result_operator_nav_prop_reference_optional_Sum(bool AssertSql( """ -SELECT COALESCE(SUM([l0].[Level1_Required_Id]), 0) +SELECT ISNULL(SUM([l0].[Level1_Required_Id]), 0) FROM [LevelOne] AS [l] LEFT JOIN [LevelTwo] AS [l0] ON [l].[Id] = [l0].[Level1_Optional_Id] """); @@ -1171,7 +1171,7 @@ public override async Task Result_operator_nav_prop_reference_optional_via_Defau AssertSql( """ -SELECT COALESCE(SUM(CASE +SELECT ISNULL(SUM(CASE WHEN [l0].[Id] IS NULL THEN 0 ELSE [l0].[Level1_Required_Id] END), 0) @@ -2031,7 +2031,7 @@ public override async Task Select_join_with_key_selector_being_a_subquery(bool a """ SELECT [l].[Id], [l].[Date], [l].[Name], [l].[OneToMany_Optional_Self_Inverse1Id], [l].[OneToMany_Required_Self_Inverse1Id], [l].[OneToOne_Optional_Self1Id], [l0].[Id], [l0].[Date], [l0].[Level1_Optional_Id], [l0].[Level1_Required_Id], [l0].[Name], [l0].[OneToMany_Optional_Inverse2Id], [l0].[OneToMany_Optional_Self_Inverse2Id], [l0].[OneToMany_Required_Inverse2Id], [l0].[OneToMany_Required_Self_Inverse2Id], [l0].[OneToOne_Optional_PK_Inverse2Id], [l0].[OneToOne_Optional_Self2Id] FROM [LevelOne] AS [l] -INNER JOIN [LevelTwo] AS [l0] ON [l].[Id] = COALESCE(( +INNER JOIN [LevelTwo] AS [l0] ON [l].[Id] = ISNULL(( SELECT TOP(1) [l1].[Id] FROM [LevelTwo] AS [l1] ORDER BY [l1].[Id]), 0) @@ -2943,7 +2943,7 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL([l].[Name], N'') + N' ' + ISNULL(CASE WHEN [l1].[Id] IS NOT NULL THEN [l1].[Name] ELSE N'NULL' END, N'') @@ -3807,7 +3807,7 @@ public override async Task Sum_with_selector_cast_using_as(bool async) AssertSql( """ -SELECT COALESCE(SUM([l].[Id]), 0) +SELECT ISNULL(SUM([l].[Id]), 0) FROM [LevelOne] AS [l] """); } @@ -3821,7 +3821,7 @@ public override async Task Sum_with_filter_with_include_selector_cast_using_as(b SELECT [l].[Id], [l].[Date], [l].[Name], [l].[OneToMany_Optional_Self_Inverse1Id], [l].[OneToMany_Required_Self_Inverse1Id], [l].[OneToOne_Optional_Self1Id] FROM [LevelOne] AS [l] WHERE [l].[Id] > ( - SELECT COALESCE(SUM([l0].[Id]), 0) + SELECT ISNULL(SUM([l0].[Id]), 0) FROM [LevelTwo] AS [l0] WHERE [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id]) """); @@ -3965,7 +3965,7 @@ FROM [LevelOne] AS [l] LEFT JOIN [LevelThree] AS [l1] ON [l0].[Id] = [l1].[Id] GROUP BY [l1].[Name] HAVING ( - SELECT MIN(COALESCE([l5].[Id], 0) + COALESCE([l5].[Id], 0)) + SELECT MIN(ISNULL([l5].[Id], 0) + ISNULL([l5].[Id], 0)) FROM [LevelOne] AS [l2] LEFT JOIN [LevelTwo] AS [l3] ON [l2].[Id] = [l3].[Id] LEFT JOIN [LevelThree] AS [l4] ON [l3].[Id] = [l4].[Id] @@ -4106,7 +4106,7 @@ public override async Task Composite_key_join_on_groupby_aggregate_projecting_on SELECT [l2].[Key] FROM [LevelOne] AS [l] INNER JOIN ( - SELECT [l1].[Key], COALESCE(SUM([l1].[Id]), 0) AS [Sum] + SELECT [l1].[Key], ISNULL(SUM([l1].[Id]), 0) AS [Sum] FROM ( SELECT [l0].[Id], [l0].[Id] % 3 AS [Key] FROM [LevelTwo] AS [l0] @@ -4125,7 +4125,7 @@ public override async Task Composite_key_join_on_groupby_aggregate_projecting_on SELECT [l2].[Key] FROM [LevelOne] AS [l] INNER JOIN ( - SELECT [l1].[Key], COALESCE(SUM([l1].[Id]), 0) AS [Sum] + SELECT [l1].[Key], ISNULL(SUM([l1].[Id]), 0) AS [Sum] FROM ( SELECT [l0].[Id], [l0].[Id] % 3 AS [Key] FROM [LevelTwo] AS [l0] @@ -4341,7 +4341,7 @@ WHERE [l].[Id] < 5 CROSS APPLY ( SELECT [l1].[Id], [l1].[Date], [l1].[Name], [l1].[OneToMany_Optional_Self_Inverse1Id], [l1].[OneToMany_Required_Self_Inverse1Id], [l1].[OneToOne_Optional_Self1Id] FROM [LevelOne] AS [l1] - WHERE [l1].[Id] <> COALESCE([l0].[Level1_Required_Id], 0) + WHERE [l1].[Id] <> ISNULL([l0].[Level1_Required_Id], 0) ) AS [l2] """); } @@ -4449,7 +4449,7 @@ FROM [LevelOne] AS [l] LEFT JOIN [LevelThree] AS [l1] ON [l0].[Id] = [l1].[Id] GROUP BY [l1].[Name] HAVING ( - SELECT MIN(COALESCE([l5].[Id], 0)) + SELECT MIN(ISNULL([l5].[Id], 0)) FROM [LevelOne] AS [l2] LEFT JOIN [LevelTwo] AS [l3] ON [l2].[Id] = [l3].[Id] LEFT JOIN [LevelThree] AS [l4] ON [l3].[Id] = [l4].[Id] @@ -4831,7 +4831,7 @@ ORDER BY [l].[Id] ) AS [l4] LEFT JOIN ( SELECT [l0].[Id], [l1].[Id] AS [Id0], [l2].[Id] AS [Id1], CASE - WHEN COALESCE(( + WHEN ISNULL(( SELECT MAX([l3].[Id]) FROM [LevelFour] AS [l3] WHERE [l1].[Id] IS NOT NULL AND [l1].[Id] = [l3].[OneToMany_Optional_Inverse4Id]), 0) > 1 THEN CAST(1 AS bit) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs index 12eff52e794..eadb7a155e5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs @@ -1099,7 +1099,7 @@ public override async Task Result_operator_nav_prop_reference_optional_Sum(bool AssertSql( """ -SELECT COALESCE(SUM([l0].[Level1_Required_Id]), 0) +SELECT ISNULL(SUM([l0].[Level1_Required_Id]), 0) FROM [LevelOne] AS [l] LEFT JOIN [LevelTwo] AS [l0] ON [l].[Id] = [l0].[Level1_Optional_Id] """); @@ -1171,7 +1171,7 @@ public override async Task Result_operator_nav_prop_reference_optional_via_Defau AssertSql( """ -SELECT COALESCE(SUM(CASE +SELECT ISNULL(SUM(CASE WHEN [l0].[Id] IS NULL THEN 0 ELSE [l0].[Level1_Required_Id] END), 0) @@ -2031,7 +2031,7 @@ public override async Task Select_join_with_key_selector_being_a_subquery(bool a """ SELECT [l].[Id], [l].[Date], [l].[Name], [l].[OneToMany_Optional_Self_Inverse1Id], [l].[OneToMany_Required_Self_Inverse1Id], [l].[OneToOne_Optional_Self1Id], [l0].[Id], [l0].[Date], [l0].[Level1_Optional_Id], [l0].[Level1_Required_Id], [l0].[Name], [l0].[OneToMany_Optional_Inverse2Id], [l0].[OneToMany_Optional_Self_Inverse2Id], [l0].[OneToMany_Required_Inverse2Id], [l0].[OneToMany_Required_Self_Inverse2Id], [l0].[OneToOne_Optional_PK_Inverse2Id], [l0].[OneToOne_Optional_Self2Id] FROM [LevelOne] AS [l] -INNER JOIN [LevelTwo] AS [l0] ON [l].[Id] = COALESCE(( +INNER JOIN [LevelTwo] AS [l0] ON [l].[Id] = ISNULL(( SELECT TOP(1) [l1].[Id] FROM [LevelTwo] AS [l1] ORDER BY [l1].[Id]), 0) @@ -2943,7 +2943,7 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL([l].[Name], N'') + N' ' + ISNULL(CASE WHEN [l1].[Id] IS NOT NULL THEN [l1].[Name] ELSE N'NULL' END, N'') @@ -3807,7 +3807,7 @@ public override async Task Sum_with_selector_cast_using_as(bool async) AssertSql( """ -SELECT COALESCE(SUM([l].[Id]), 0) +SELECT ISNULL(SUM([l].[Id]), 0) FROM [LevelOne] AS [l] """); } @@ -3821,7 +3821,7 @@ public override async Task Sum_with_filter_with_include_selector_cast_using_as(b SELECT [l].[Id], [l].[Date], [l].[Name], [l].[OneToMany_Optional_Self_Inverse1Id], [l].[OneToMany_Required_Self_Inverse1Id], [l].[OneToOne_Optional_Self1Id] FROM [LevelOne] AS [l] WHERE [l].[Id] > ( - SELECT COALESCE(SUM([l0].[Id]), 0) + SELECT ISNULL(SUM([l0].[Id]), 0) FROM [LevelTwo] AS [l0] WHERE [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id]) """); @@ -3965,7 +3965,7 @@ FROM [LevelOne] AS [l] LEFT JOIN [LevelThree] AS [l1] ON [l0].[Id] = [l1].[Id] GROUP BY [l1].[Name] HAVING ( - SELECT MIN(COALESCE([l5].[Id], 0) + COALESCE([l5].[Id], 0)) + SELECT MIN(ISNULL([l5].[Id], 0) + ISNULL([l5].[Id], 0)) FROM [LevelOne] AS [l2] LEFT JOIN [LevelTwo] AS [l3] ON [l2].[Id] = [l3].[Id] LEFT JOIN [LevelThree] AS [l4] ON [l3].[Id] = [l4].[Id] @@ -4106,7 +4106,7 @@ public override async Task Composite_key_join_on_groupby_aggregate_projecting_on SELECT [l2].[Key] FROM [LevelOne] AS [l] INNER JOIN ( - SELECT [l1].[Key], COALESCE(SUM([l1].[Id]), 0) AS [Sum] + SELECT [l1].[Key], ISNULL(SUM([l1].[Id]), 0) AS [Sum] FROM ( SELECT [l0].[Id], [l0].[Id] % 3 AS [Key] FROM [LevelTwo] AS [l0] @@ -4125,7 +4125,7 @@ public override async Task Composite_key_join_on_groupby_aggregate_projecting_on SELECT [l2].[Key] FROM [LevelOne] AS [l] INNER JOIN ( - SELECT [l1].[Key], COALESCE(SUM([l1].[Id]), 0) AS [Sum] + SELECT [l1].[Key], ISNULL(SUM([l1].[Id]), 0) AS [Sum] FROM ( SELECT [l0].[Id], [l0].[Id] % 3 AS [Key] FROM [LevelTwo] AS [l0] @@ -4341,7 +4341,7 @@ WHERE [l].[Id] < 5 CROSS APPLY ( SELECT [l1].[Id], [l1].[Date], [l1].[Name], [l1].[OneToMany_Optional_Self_Inverse1Id], [l1].[OneToMany_Required_Self_Inverse1Id], [l1].[OneToOne_Optional_Self1Id] FROM [LevelOne] AS [l1] - WHERE [l1].[Id] <> COALESCE([l0].[Level1_Required_Id], 0) + WHERE [l1].[Id] <> ISNULL([l0].[Level1_Required_Id], 0) ) AS [l2] """); } @@ -4449,7 +4449,7 @@ FROM [LevelOne] AS [l] LEFT JOIN [LevelThree] AS [l1] ON [l0].[Id] = [l1].[Id] GROUP BY [l1].[Name] HAVING ( - SELECT MIN(COALESCE([l5].[Id], 0)) + SELECT MIN(ISNULL([l5].[Id], 0)) FROM [LevelOne] AS [l2] LEFT JOIN [LevelTwo] AS [l3] ON [l2].[Id] = [l3].[Id] LEFT JOIN [LevelThree] AS [l4] ON [l3].[Id] = [l4].[Id] @@ -4831,7 +4831,7 @@ ORDER BY [l].[Id] ) AS [l4] LEFT JOIN ( SELECT [l0].[Id], [l1].[Id] AS [Id0], [l2].[Id] AS [Id1], CASE - WHEN COALESCE(( + WHEN ISNULL(( SELECT MAX([l3].[Id]) FROM [LevelFour] AS [l3] WHERE [l1].[Id] IS NOT NULL AND [l1].[Id] = [l3].[OneToMany_Optional_Inverse4Id]), 0) > 1 THEN CAST(1 AS bit) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs index e1e3b9b920f..d05ac9888ec 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs @@ -224,7 +224,7 @@ WHEN [l3].[Level2_Required_Id] IS NOT NULL AND [l3].[OneToMany_Required_Inverse3 END GROUP BY [l3].[Level3_Name] HAVING ( - SELECT MIN(COALESCE(CASE + SELECT MIN(ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] END, 0)) FROM [Level1] AS [l4] @@ -368,7 +368,7 @@ public override async Task Result_operator_nav_prop_reference_optional_via_Defau AssertSql( """ -SELECT COALESCE(SUM(CASE +SELECT ISNULL(SUM(CASE WHEN [s].[OneToOne_Required_PK_Date] IS NULL OR [s].[Level1_Required_Id] IS NULL OR [s].[OneToMany_Required_Inverse2Id] IS NULL THEN 0 ELSE [s].[Level1_Required_Id] END), 0) @@ -537,9 +537,9 @@ WHEN [l3].[Level2_Required_Id] IS NOT NULL AND [l3].[OneToMany_Required_Inverse3 END GROUP BY [l3].[Level3_Name] HAVING ( - SELECT MIN(COALESCE(CASE + SELECT MIN(ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] - END, 0) + COALESCE(CASE + END, 0) + ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] END, 0)) FROM [Level1] AS [l4] @@ -576,7 +576,7 @@ public override async Task Sum_with_selector_cast_using_as(bool async) AssertSql( """ -SELECT COALESCE(SUM([l].[Id]), 0) +SELECT ISNULL(SUM([l].[Id]), 0) FROM [Level1] AS [l] """); } @@ -590,7 +590,7 @@ public override async Task Sum_with_filter_with_include_selector_cast_using_as(b SELECT [l].[Id], [l].[Date], [l].[Name] FROM [Level1] AS [l] WHERE [l].[Id] > ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l0].[OneToOne_Required_PK_Date] IS NOT NULL AND [l0].[Level1_Required_Id] IS NOT NULL AND [l0].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l0].[Id] END), 0) FROM [Level1] AS [l0] @@ -877,7 +877,7 @@ SELECT [s1].[Key] FROM [Level1] AS [l] INNER JOIN ( SELECT [s].[Key], ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l7].[OneToOne_Required_PK_Date] IS NOT NULL AND [l7].[Level1_Required_Id] IS NOT NULL AND [l7].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l7].[Id] END), 0) FROM ( @@ -931,7 +931,7 @@ SELECT [s1].[Key] FROM [Level1] AS [l] INNER JOIN ( SELECT [s].[Key], ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l7].[OneToOne_Required_PK_Date] IS NOT NULL AND [l7].[Level1_Required_Id] IS NOT NULL AND [l7].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l7].[Id] END), 0) FROM ( @@ -1618,7 +1618,7 @@ WHERE [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] CROSS APPLY ( SELECT [l2].[Id], [l2].[Date], [l2].[Name] FROM [Level1] AS [l2] - WHERE [l2].[Id] <> COALESCE([s].[Level1_Required_Id], 0) + WHERE [l2].[Id] <> ISNULL([s].[Level1_Required_Id], 0) ) AS [l3] """); } @@ -1904,7 +1904,7 @@ WHERE [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] WHEN [l2].[OneToOne_Required_PK_Date] IS NOT NULL AND [l2].[Level1_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l2].[Id] END WHERE [l2].[OneToOne_Required_PK_Date] IS NOT NULL AND [l2].[Level1_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse2Id] IS NOT NULL -) AS [s] ON [l].[Id] = COALESCE(( +) AS [s] ON [l].[Id] = ISNULL(( SELECT TOP(1) CASE WHEN [l5].[OneToOne_Required_PK_Date] IS NOT NULL AND [l5].[Level1_Required_Id] IS NOT NULL AND [l5].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l5].[Id] END @@ -3648,7 +3648,7 @@ public override async Task Result_operator_nav_prop_reference_optional_Sum(bool AssertSql( """ -SELECT COALESCE(SUM([l1].[Level1_Required_Id]), 0) +SELECT ISNULL(SUM([l1].[Level1_Required_Id]), 0) FROM [Level1] AS [l] LEFT JOIN ( SELECT [l0].[Level1_Optional_Id], [l0].[Level1_Required_Id] @@ -5896,7 +5896,7 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL([l].[Name], N'') + N' ' + ISNULL(CASE WHEN [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] IS NOT NULL AND [l1].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l1].[Level2_Name] ELSE N'NULL' END, N'') @@ -8386,7 +8386,7 @@ WHEN [l2].[Level2_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse3 END AS [Id0], CASE WHEN [l4].[Level3_Required_Id] IS NOT NULL AND [l4].[OneToMany_Required_Inverse4Id] IS NOT NULL THEN [l4].[Id] END AS [Id1], CASE - WHEN COALESCE(( + WHEN ISNULL(( SELECT MAX(CASE WHEN [l5].[Level3_Required_Id] IS NOT NULL AND [l5].[OneToMany_Required_Inverse4Id] IS NOT NULL THEN [l5].[Id] END) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs index c0d96ba5534..0a53ff39e47 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs @@ -226,7 +226,7 @@ WHEN [l3].[Level2_Required_Id] IS NOT NULL AND [l3].[OneToMany_Required_Inverse3 END GROUP BY [l3].[Level3_Name] HAVING ( - SELECT MIN(COALESCE(CASE + SELECT MIN(ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] END, 0)) FROM [Level1] AS [l4] @@ -370,7 +370,7 @@ public override async Task Result_operator_nav_prop_reference_optional_via_Defau AssertSql( """ -SELECT COALESCE(SUM(CASE +SELECT ISNULL(SUM(CASE WHEN [s].[OneToOne_Required_PK_Date] IS NULL OR [s].[Level1_Required_Id] IS NULL OR [s].[OneToMany_Required_Inverse2Id] IS NULL THEN 0 ELSE [s].[Level1_Required_Id] END), 0) @@ -539,9 +539,9 @@ WHEN [l3].[Level2_Required_Id] IS NOT NULL AND [l3].[OneToMany_Required_Inverse3 END GROUP BY [l3].[Level3_Name] HAVING ( - SELECT MIN(COALESCE(CASE + SELECT MIN(ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] - END, 0) + COALESCE(CASE + END, 0) + ISNULL(CASE WHEN [l10].[OneToOne_Required_PK_Date] IS NOT NULL AND [l10].[Level1_Required_Id] IS NOT NULL AND [l10].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l10].[Id] END, 0)) FROM [Level1] AS [l4] @@ -578,7 +578,7 @@ public override async Task Sum_with_selector_cast_using_as(bool async) AssertSql( """ -SELECT COALESCE(SUM([l].[Id]), 0) +SELECT ISNULL(SUM([l].[Id]), 0) FROM [Level1] AS [l] """); } @@ -592,7 +592,7 @@ public override async Task Sum_with_filter_with_include_selector_cast_using_as(b SELECT [l].[Id], [l].[Date], [l].[Name] FROM [Level1] AS [l] WHERE [l].[Id] > ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l0].[OneToOne_Required_PK_Date] IS NOT NULL AND [l0].[Level1_Required_Id] IS NOT NULL AND [l0].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l0].[Id] END), 0) FROM [Level1] AS [l0] @@ -879,7 +879,7 @@ SELECT [s1].[Key] FROM [Level1] AS [l] INNER JOIN ( SELECT [s].[Key], ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l7].[OneToOne_Required_PK_Date] IS NOT NULL AND [l7].[Level1_Required_Id] IS NOT NULL AND [l7].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l7].[Id] END), 0) FROM ( @@ -933,7 +933,7 @@ SELECT [s1].[Key] FROM [Level1] AS [l] INNER JOIN ( SELECT [s].[Key], ( - SELECT COALESCE(SUM(CASE + SELECT ISNULL(SUM(CASE WHEN [l7].[OneToOne_Required_PK_Date] IS NOT NULL AND [l7].[Level1_Required_Id] IS NOT NULL AND [l7].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l7].[Id] END), 0) FROM ( @@ -1620,7 +1620,7 @@ WHERE [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] CROSS APPLY ( SELECT [l2].[Id], [l2].[Date], [l2].[Name] FROM [Level1] AS [l2] - WHERE [l2].[Id] <> COALESCE([s].[Level1_Required_Id], 0) + WHERE [l2].[Id] <> ISNULL([s].[Level1_Required_Id], 0) ) AS [l3] """); } @@ -1906,7 +1906,7 @@ WHERE [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] WHEN [l2].[OneToOne_Required_PK_Date] IS NOT NULL AND [l2].[Level1_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l2].[Id] END WHERE [l2].[OneToOne_Required_PK_Date] IS NOT NULL AND [l2].[Level1_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse2Id] IS NOT NULL -) AS [s] ON [l].[Id] = COALESCE(( +) AS [s] ON [l].[Id] = ISNULL(( SELECT TOP(1) CASE WHEN [l5].[OneToOne_Required_PK_Date] IS NOT NULL AND [l5].[Level1_Required_Id] IS NOT NULL AND [l5].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l5].[Id] END @@ -3650,7 +3650,7 @@ public override async Task Result_operator_nav_prop_reference_optional_Sum(bool AssertSql( """ -SELECT COALESCE(SUM([l1].[Level1_Required_Id]), 0) +SELECT ISNULL(SUM([l1].[Level1_Required_Id]), 0) FROM [Level1] AS [l] LEFT JOIN ( SELECT [l0].[Level1_Optional_Id], [l0].[Level1_Required_Id] @@ -5898,7 +5898,7 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL([l].[Name], N'') + N' ' + ISNULL(CASE WHEN [l1].[OneToOne_Required_PK_Date] IS NOT NULL AND [l1].[Level1_Required_Id] IS NOT NULL AND [l1].[OneToMany_Required_Inverse2Id] IS NOT NULL THEN [l1].[Level2_Name] ELSE N'NULL' END, N'') @@ -8387,7 +8387,7 @@ WHEN [l2].[Level2_Required_Id] IS NOT NULL AND [l2].[OneToMany_Required_Inverse3 END AS [Id0], CASE WHEN [l4].[Level3_Required_Id] IS NOT NULL AND [l4].[OneToMany_Required_Inverse4Id] IS NOT NULL THEN [l4].[Id] END AS [Id1], CASE - WHEN COALESCE(( + WHEN ISNULL(( SELECT MAX(CASE WHEN [l5].[Level3_Required_Id] IS NOT NULL AND [l5].[OneToMany_Required_Inverse4Id] IS NOT NULL THEN [l5].[Id] END) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Ef6GroupBySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Ef6GroupBySqlServerTest.cs index c389821b466..d9ecec8a3c3 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Ef6GroupBySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Ef6GroupBySqlServerTest.cs @@ -413,7 +413,7 @@ public override async Task Grouping_by_all_columns_with_aggregate_function_works AssertSql( """ -SELECT [a].[Id], COALESCE(SUM([a].[Id]), 0) AS [Sum], COUNT(*) AS [Count] +SELECT [a].[Id], ISNULL(SUM([a].[Id]), 0) AS [Sum], COUNT(*) AS [Count] FROM [ArubaOwner] AS [a] GROUP BY [a].[Id], [a].[Alias], [a].[FirstName], [a].[LastName] """); @@ -722,7 +722,7 @@ ORDER BY [p].[FirstName] LEFT JOIN ( SELECT [p2].[FirstName], [p2].[FullName], [p2].[c] FROM ( - SELECT [p0].[FirstName], COALESCE([p0].[FirstName], N'') + N' ' + COALESCE([p0].[MiddleInitial], N'') + N' ' + COALESCE([p0].[LastName], N'') AS [FullName], 1 AS [c], ROW_NUMBER() OVER(PARTITION BY [p0].[FirstName] ORDER BY [p0].[Id]) AS [row] + SELECT [p0].[FirstName], ISNULL([p0].[FirstName], N'') + N' ' + ISNULL([p0].[MiddleInitial], N'') + N' ' + ISNULL([p0].[LastName], N'') AS [FullName], 1 AS [c], ROW_NUMBER() OVER(PARTITION BY [p0].[FirstName] ORDER BY [p0].[Id]) AS [row] FROM [Person] AS [p0] ) AS [p2] WHERE [p2].[row] <= 1 @@ -785,7 +785,7 @@ public override async Task Sum_Grouped_from_LINQ_101(bool async) AssertSql( """ -SELECT [p].[Category], COALESCE(SUM([p].[UnitsInStock]), 0) AS [TotalUnitsInStock] +SELECT [p].[Category], ISNULL(SUM([p].[UnitsInStock]), 0) AS [TotalUnitsInStock] FROM [ProductForLinq] AS [p] GROUP BY [p].[Category] """); @@ -810,7 +810,7 @@ public override async Task Whats_new_2021_sample_9(bool async) AssertSql( """ SELECT [p].[FirstName] AS [Feet], ( - SELECT COALESCE(SUM([f].[Size]), 0) + SELECT ISNULL(SUM([f].[Size]), 0) FROM [Person] AS [p0] LEFT JOIN [Feet] AS [f] ON [p0].[Id] = [f].[Id] WHERE [p].[FirstName] = [p0].[FirstName] OR ([p].[FirstName] IS NULL AND [p0].[FirstName] IS NULL)) AS [Total] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs index 48c87e39da4..dcddf367754 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs @@ -689,7 +689,7 @@ public override async Task Select_null_propagation_optimization8(bool async) AssertSql( """ -SELECT COALESCE([g].[LeaderNickname], N'') + COALESCE([g].[LeaderNickname], N'') +SELECT ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') FROM [Gears] AS [g] """); } @@ -1080,7 +1080,7 @@ public override async Task Optional_Navigation_Null_Coalesce_To_Clr_Type(bool as AssertSql( """ -SELECT TOP(1) COALESCE([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] +SELECT TOP(1) ISNULL([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] ORDER BY [w].[Id] @@ -1095,7 +1095,7 @@ public override async Task Where_subquery_boolean(bool async) """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -1127,7 +1127,7 @@ public override async Task Where_subquery_distinct_firstordefault_boolean(bool a """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1185,7 +1185,7 @@ public override async Task Where_subquery_distinct_singleordefault_boolean1(bool """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1204,7 +1204,7 @@ public override async Task Where_subquery_distinct_singleordefault_boolean2(bool """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) = CAST(1 AS bit) @@ -1279,7 +1279,7 @@ public override async Task Where_subquery_distinct_orderby_firstordefault_boolea """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[Rank] FROM [Gears] AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1763,7 +1763,7 @@ public override async Task Unicode_string_literals_is_used_for_non_unicode_colum """ SELECT [c].[Name], [c].[Location], [c].[Nation] FROM [Cities] AS [c] -WHERE COALESCE([c].[Location], N'') + N'Added' LIKE N'%Add%' +WHERE ISNULL([c].[Location], N'') + N'Added' LIKE N'%Add%' """); } @@ -1901,7 +1901,7 @@ public override async Task Coalesce_operator_in_predicate(bool async) SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] -WHERE COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -1914,7 +1914,7 @@ public override async Task Coalesce_operator_in_predicate_with_other_conditions( SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] -WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -1925,7 +1925,7 @@ public override async Task Coalesce_operator_in_projection_with_other_conditions AssertSql( """ SELECT CASE - WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) + WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END FROM [Tags] AS [t] @@ -2428,7 +2428,7 @@ public override async Task Sum_with_optional_navigation_is_translated_to_sql(boo AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] WHERE [t].[Note] <> N'Foo' OR [t].[Note] IS NULL @@ -4608,7 +4608,7 @@ public override async Task Negated_bool_ternary_inside_anonymous_type_in_project """ SELECT ~CASE WHEN [g].[HasSoulPatch] = CAST(1 AS bit) THEN CAST(1 AS bit) - ELSE COALESCE([g].[HasSoulPatch], CAST(1 AS bit)) + ELSE ISNULL([g].[HasSoulPatch], CAST(1 AS bit)) END AS [c] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] @@ -4817,7 +4817,7 @@ public override async Task Project_one_value_type_from_empty_collection(bool asy AssertSql( """ -SELECT [s].[Name], COALESCE(( +SELECT [s].[Name], ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) AS [SquadId] @@ -4870,7 +4870,7 @@ public override async Task Filter_on_subquery_projecting_one_value_type_from_emp """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Kilo' AND COALESCE(( +WHERE [s].[Name] = N'Kilo' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) <> 0 @@ -5070,7 +5070,7 @@ public override async Task Include_collection_with_complex_OrderBy3(bool async) FROM [Gears] AS [g] LEFT JOIN [Gears] AS [g0] ON [g].[Nickname] = [g0].[LeaderNickname] AND [g].[SquadId] = [g0].[LeaderSquadId] WHERE [g].[Discriminator] = N'Officer' -ORDER BY COALESCE(( +ORDER BY ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5116,7 +5116,7 @@ FROM [Gears] AS [g1] ORDER BY ( SELECT COUNT(*) FROM [Weapons] AS [w] - WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = COALESCE(( + WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = ISNULL(( SELECT TOP(1) [g0].[HasSoulPatch] FROM [Gears] AS [g0] WHERE [g0].[Nickname] = N'Marcus'), CAST(0 AS bit))), [g].[Nickname], [g].[SquadId], [g2].[Nickname] @@ -5141,7 +5141,7 @@ public override async Task Select_subquery_boolean(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5171,7 +5171,7 @@ public override async Task Select_subquery_int_with_inside_cast_and_coalesce(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5186,7 +5186,7 @@ public override async Task Select_subquery_int_with_outside_cast_and_coalesce(bo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5201,7 +5201,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce(bool a AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5216,7 +5216,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce2(bool AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5235,7 +5235,7 @@ public override async Task Select_subquery_boolean_empty(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG' @@ -5265,7 +5265,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean1(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -5283,7 +5283,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean2(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) @@ -5316,7 +5316,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -5334,7 +5334,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG'), CAST(0 AS bit)) @@ -5523,7 +5523,7 @@ public override async Task String_concat_with_null_conditional_argument(bool asy SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + CAST(5 AS nvarchar(max)) +ORDER BY ISNULL([w0].[Name], N'') + CAST(5 AS nvarchar(max)) """); } @@ -5536,7 +5536,7 @@ public override async Task String_concat_with_null_conditional_argument2(bool as SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + N'Marcus'' Lancer' +ORDER BY ISNULL([w0].[Name], N'') + N'Marcus'' Lancer' """); } @@ -5571,7 +5571,7 @@ public override async Task GroupBy_Property_Include_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] AS [g] GROUP BY [g].[Rank] """); @@ -5770,7 +5770,7 @@ public override async Task GetValueOrDefault_in_projection(bool async) AssertSql( """ -SELECT COALESCE([w].[SynergyWithId], 0) +SELECT ISNULL([w].[SynergyWithId], 0) FROM [Weapons] AS [w] """); } @@ -5783,7 +5783,7 @@ public override async Task GetValueOrDefault_in_filter(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], 0) = 0 +WHERE ISNULL([w].[SynergyWithId], 0) = 0 """); } @@ -5807,7 +5807,7 @@ public override async Task GetValueOrDefault_in_order_by(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -ORDER BY COALESCE([w].[SynergyWithId], 0), [w].[Id] +ORDER BY ISNULL([w].[SynergyWithId], 0), [w].[Id] """); } @@ -5819,7 +5819,7 @@ public override async Task GetValueOrDefault_with_argument(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], [w].[Id]) = 1 +WHERE ISNULL([w].[SynergyWithId], [w].[Id]) = 1 """); } @@ -5831,7 +5831,7 @@ public override async Task GetValueOrDefault_with_argument_complex(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 +WHERE ISNULL([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 """); } @@ -7429,7 +7429,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL([c].[Location], 'Unknown') FROM [Cities] AS [c] """); } @@ -7570,7 +7570,7 @@ public override async Task FirstOrDefault_over_int_compared_to_zero(bool async) """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Delta' AND COALESCE(( +WHERE [s].[Name] = N'Delta' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit) @@ -7654,14 +7654,14 @@ public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_sub AssertSql( """ -SELECT [g].[Nickname], COALESCE(( +SELECT [g].[Nickname], ISNULL(( SELECT TOP(1) [t1].[IssueDate] FROM [Tags] AS [t1] WHERE [t1].[GearNickName] = [g].[FullName] ORDER BY [t1].[Id]), '0001-01-01T00:00:00.0000000') AS [invalidTagIssueDate] FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[IssueDate] > COALESCE(( +WHERE [t].[IssueDate] > ISNULL(( SELECT TOP(1) [t0].[IssueDate] FROM [Tags] AS [t0] WHERE [t0].[GearNickName] = [g].[FullName] @@ -8469,7 +8469,7 @@ public override async Task GroupBy_Select_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] GROUP BY [m].[CodeName] """); @@ -8481,7 +8481,7 @@ public override async Task String_concat_nullable_expressions_are_coalesced(bool AssertSql( """ -SELECT [g].[FullName] + N'' + COALESCE([g].[LeaderNickname], N'') + N'' +SELECT [g].[FullName] + N'' + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + N'' FROM [Gears] AS [g] """); } @@ -8565,7 +8565,7 @@ public override async Task Sum_with_no_data_nullable_double(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] WHERE [m].[CodeName] = N'Operation Foobar' """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyNoTrackingQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyNoTrackingQuerySqlServerTest.cs index 100b0c96828..55081d73238 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyNoTrackingQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyNoTrackingQuerySqlServerTest.cs @@ -201,7 +201,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM [EntityRoots] AS [e] INNER JOIN ( SELECT [e1].[Key1], [e0].[RootSkipSharedId] @@ -264,7 +264,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyQuerySqlServerTest.cs index 86ec23e25b8..d19bae992f2 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ManyToManyQuerySqlServerTest.cs @@ -200,7 +200,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM [EntityRoots] AS [e] INNER JOIN ( SELECT [e1].[Key1], [e0].[RootSkipSharedId] @@ -263,7 +263,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs index 1a306cc84aa..f2443a83be5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs @@ -110,7 +110,7 @@ public override async Task Sum_over_empty_returns_zero(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [o].[OrderID] = 42 """); @@ -158,7 +158,7 @@ public override async Task Average_after_default_if_empty_does_not_throw(bool as AssertSql( """ -SELECT AVG(CAST(COALESCE([o0].[OrderID], 0) AS float)) +SELECT AVG(CAST(ISNULL([o0].[OrderID], 0) AS float)) FROM ( SELECT 1 AS empty ) AS [e] @@ -176,7 +176,7 @@ public override async Task Max_after_default_if_empty_does_not_throw(bool async) AssertSql( """ -SELECT MAX(COALESCE([o0].[OrderID], 0)) +SELECT MAX(ISNULL([o0].[OrderID], 0)) FROM ( SELECT 1 AS empty ) AS [e] @@ -194,7 +194,7 @@ public override async Task Min_after_default_if_empty_does_not_throw(bool async) AssertSql( """ -SELECT MIN(COALESCE([o0].[OrderID], 0)) +SELECT MIN(ISNULL([o0].[OrderID], 0)) FROM ( SELECT 1 AS empty ) AS [e] @@ -212,7 +212,7 @@ public override async Task Sum_with_no_data_cast_to_nullable(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [o].[OrderID] < 0 """); @@ -224,7 +224,7 @@ public override async Task Sum_with_no_data_nullable(bool async) AssertSql( """ -SELECT COALESCE(SUM([p].[SupplierID]), 0) +SELECT ISNULL(SUM([p].[SupplierID]), 0) FROM [Products] AS [p] """); } @@ -235,7 +235,7 @@ public override async Task Sum_with_no_arg_empty(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [o].[OrderID] = 42 """); @@ -632,7 +632,7 @@ public override async Task Sum_with_no_arg(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] """); } @@ -643,7 +643,7 @@ public override async Task Sum_with_binary_expression(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] * 2), 0) +SELECT ISNULL(SUM([o].[OrderID] * 2), 0) FROM [Orders] AS [o] """); } @@ -654,7 +654,7 @@ public override async Task Sum_with_arg(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] """); } @@ -665,7 +665,7 @@ public override async Task Sum_with_arg_expression(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] + [o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID] + [o].[OrderID]), 0) FROM [Orders] AS [o] """); } @@ -676,7 +676,7 @@ public override async Task Sum_with_division_on_decimal(bool async) AssertSql( """ -SELECT COALESCE(SUM(CAST([o].[Quantity] AS decimal(18,2)) / 2.09), 0.0) +SELECT ISNULL(SUM(CAST([o].[Quantity] AS decimal(18,2)) / 2.09), 0.0) FROM [Order Details] AS [o] """); } @@ -687,7 +687,7 @@ public override async Task Sum_with_division_on_decimal_no_significant_digits(bo AssertSql( """ -SELECT COALESCE(SUM(CAST([o].[Quantity] AS decimal(18,2)) / 2.0), 0.0) +SELECT ISNULL(SUM(CAST([o].[Quantity] AS decimal(18,2)) / 2.0), 0.0) FROM [Order Details] AS [o] """); } @@ -698,7 +698,7 @@ public override async Task Sum_with_coalesce(bool async) AssertSql( """ -SELECT COALESCE(SUM(COALESCE([p].[UnitPrice], 0.0)), 0.0) +SELECT ISNULL(SUM(ISNULL([p].[UnitPrice], 0.0)), 0.0) FROM [Products] AS [p] WHERE [p].[ProductID] < 40 """); @@ -711,10 +711,10 @@ public override async Task Sum_over_subquery(bool async) // #34256: rewrite query to avoid "Cannot perform an aggregate function on an expression containing an aggregate or a subquery" AssertSql( """ -SELECT COALESCE(SUM([s].[value]), 0) +SELECT ISNULL(SUM([s].[value]), 0) FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [value] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [value] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] ) AS [s] @@ -728,14 +728,14 @@ public override async Task Sum_over_nested_subquery(bool async) // #34256: rewrite query to avoid "Cannot perform an aggregate function on an expression containing an aggregate or a subquery" AssertSql( """ -SELECT COALESCE(SUM([s0].[value]), 0) +SELECT ISNULL(SUM([s0].[value]), 0) FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([s].[value]), 0) AS [value] + SELECT ISNULL(SUM([s].[value]), 0) AS [value] FROM [Orders] AS [o] OUTER APPLY ( SELECT 5 + ( - SELECT COALESCE(SUM([o0].[ProductID]), 0) + SELECT ISNULL(SUM([o0].[ProductID]), 0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [value] ) AS [s] @@ -751,10 +751,10 @@ public override async Task Sum_over_min_subquery(bool async) // #34256: rewrite query to avoid "Cannot perform an aggregate function on an expression containing an aggregate or a subquery" AssertSql( """ -SELECT COALESCE(SUM([s0].[value]), 0) +SELECT ISNULL(SUM([s0].[value]), 0) FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([s].[value]), 0) AS [value] + SELECT ISNULL(SUM([s].[value]), 0) AS [value] FROM [Orders] AS [o] OUTER APPLY ( SELECT 5 + ( @@ -774,7 +774,7 @@ public override async Task Sum_over_scalar_returning_subquery(bool async) // #34256: rewrite query to avoid "Cannot perform an aggregate function on an expression containing an aggregate or a subquery" AssertSql( """ -SELECT COALESCE(SUM([s].[OrderID]), 0) +SELECT ISNULL(SUM([s].[OrderID]), 0) FROM [Customers] AS [c] OUTER APPLY ( SELECT TOP(1) [o].[OrderID] @@ -791,7 +791,7 @@ public override async Task Sum_over_Any_subquery(bool async) // #34256: rewrite query to avoid "Cannot perform an aggregate function on an expression containing an aggregate or a subquery" AssertSql( """ -SELECT COALESCE(SUM([s].[value]), 0) +SELECT ISNULL(SUM([s].[value]), 0) FROM [Customers] AS [c] OUTER APPLY ( SELECT CASE @@ -831,7 +831,7 @@ public override async Task Sum_on_float_column(bool async) AssertSql( """ -SELECT CAST(COALESCE(SUM([o].[Discount]), 0.0E0) AS real) +SELECT CAST(ISNULL(SUM([o].[Discount]), 0.0E0) AS real) FROM [Order Details] AS [o] WHERE [o].[ProductID] = 1 """); @@ -844,7 +844,7 @@ public override async Task Sum_on_float_column_in_subquery(bool async) AssertSql( """ SELECT [o].[OrderID], ( - SELECT CAST(COALESCE(SUM([o0].[Discount]), 0.0E0) AS real) + SELECT CAST(ISNULL(SUM([o0].[Discount]), 0.0E0) AS real) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -924,7 +924,7 @@ public override async Task Average_with_coalesce(bool async) AssertSql( """ -SELECT AVG(COALESCE([p].[UnitPrice], 0.0)) +SELECT AVG(ISNULL([p].[UnitPrice], 0.0)) FROM [Products] AS [p] WHERE [p].[ProductID] < 40 """); @@ -941,7 +941,7 @@ SELECT AVG([s].[value]) FROM [Customers] AS [c] OUTER APPLY ( SELECT CAST(( - SELECT COALESCE(SUM([o].[OrderID]), 0) + SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID]) AS float) AS [value] ) AS [s] @@ -1084,7 +1084,7 @@ public override async Task Min_with_coalesce(bool async) AssertSql( """ -SELECT MIN(COALESCE([p].[UnitPrice], 0.0)) +SELECT MIN(ISNULL([p].[UnitPrice], 0.0)) FROM [Products] AS [p] WHERE [p].[ProductID] < 40 """); @@ -1100,7 +1100,7 @@ public override async Task Min_over_subquery(bool async) SELECT MIN([s].[value]) FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [value] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [value] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] ) AS [s] @@ -1193,7 +1193,7 @@ public override async Task Max_with_coalesce(bool async) AssertSql( """ -SELECT MAX(COALESCE([p].[UnitPrice], 0.0)) +SELECT MAX(ISNULL([p].[UnitPrice], 0.0)) FROM [Products] AS [p] WHERE [p].[ProductID] < 40 """); @@ -1209,7 +1209,7 @@ public override async Task Max_over_subquery(bool async) SELECT MAX([s].[value]) FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [value] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [value] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] ) AS [s] @@ -1265,7 +1265,7 @@ SELECT MAX([s].[value]) AS [value] FROM [Orders] AS [o] OUTER APPLY ( SELECT 5 + ( - SELECT COALESCE(SUM([o0].[ProductID]), 0) + SELECT ISNULL(SUM([o0].[ProductID]), 0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [value] ) AS [s] @@ -2951,7 +2951,7 @@ public override async Task Sum_over_explicit_cast_over_column(bool async) AssertSql( """ -SELECT COALESCE(SUM(CAST([o].[OrderID] AS bigint)), CAST(0 AS bigint)) +SELECT ISNULL(SUM(CAST([o].[OrderID] AS bigint)), CAST(0 AS bigint)) FROM [Orders] AS [o] """); } @@ -3223,7 +3223,7 @@ public override async Task Type_casting_inside_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM(CAST([o].[Discount] AS decimal(18,2))), 0.0) +SELECT ISNULL(SUM(CAST([o].[Discount] AS decimal(18,2))), 0.0) FROM [Order Details] AS [o] """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs index e07a410ed2c..45afdfd464b 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs @@ -871,9 +871,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) +SELECT CAST(ISDATE(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) FROM [Orders] AS [o] -WHERE CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) = CAST(1 AS bit) +WHERE CAST(ISDATE(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) = CAST(1 AS bit) """); } @@ -892,7 +892,7 @@ await AssertCount( """ SELECT COUNT(*) FROM [Orders] AS [o] -WHERE CAST(ISDATE(COALESCE([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) AS bit) = CAST(1 AS bit) +WHERE CAST(ISDATE(ISNULL([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) AS bit) = CAST(1 AS bit) """); } @@ -919,9 +919,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT ~CAST(ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) +SELECT ~CAST(ISNUMERIC(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 +WHERE ISNUMERIC(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 """); } @@ -959,7 +959,7 @@ await AssertCount( """ SELECT COUNT(*) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) = 1 +WHERE ISNUMERIC(ISNULL([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) = 1 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs index 17098b8f986..57e1d059b99 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs @@ -838,9 +838,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) +SELECT CAST(ISDATE(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) FROM [Orders] AS [o] -WHERE CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) = CAST(1 AS bit) +WHERE CAST(ISDATE(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) = CAST(1 AS bit) """); } @@ -859,7 +859,7 @@ await AssertCount( """ SELECT COUNT(*) FROM [Orders] AS [o] -WHERE CAST(ISDATE(COALESCE([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) AS bit) = CAST(1 AS bit) +WHERE CAST(ISDATE(ISNULL([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) AS bit) = CAST(1 AS bit) """); } @@ -886,9 +886,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT ~CAST(ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) +SELECT ~CAST(ISNUMERIC(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 +WHERE ISNUMERIC(ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 """); } @@ -926,7 +926,7 @@ await AssertCount( """ SELECT COUNT(*) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) = 1 +WHERE ISNUMERIC(ISNULL([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max))) = 1 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServer160Test.cs index 43d006ca396..18ea773ed99 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServer160Test.cs @@ -40,7 +40,7 @@ public override async Task Sum_over_round_works_correctly_in_projection(bool asy AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice], 2)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice], 2)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -55,7 +55,7 @@ public override async Task Sum_over_round_works_correctly_in_projection_2(bool a AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 2)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 2)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -70,7 +70,7 @@ public override async Task Sum_over_truncate_works_correctly_in_projection(bool AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice], 0, 1)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice], 0, 1)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -85,7 +85,7 @@ public override async Task Sum_over_truncate_works_correctly_in_projection_2(boo AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 0, 1)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 0, 1)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs index 865c6f77c6f..51b7258ed0f 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindFunctionsQuerySqlServerTest.cs @@ -42,7 +42,7 @@ public override async Task Sum_over_round_works_correctly_in_projection(bool asy AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice], 2)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice], 2)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -57,7 +57,7 @@ public override async Task Sum_over_round_works_correctly_in_projection_2(bool a AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 2)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 2)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -97,7 +97,7 @@ public override async Task Sum_over_truncate_works_correctly_in_projection(bool AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice], 0, 1)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice], 0, 1)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] @@ -112,7 +112,7 @@ public override async Task Sum_over_truncate_works_correctly_in_projection_2(boo AssertSql( """ SELECT [o].[OrderID], ( - SELECT COALESCE(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 0, 1)), 0.0) + SELECT ISNULL(SUM(ROUND([o0].[UnitPrice] * [o0].[UnitPrice], 0, 1)), 0.0) FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID]) AS [Sum] FROM [Orders] AS [o] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindGroupByQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindGroupByQuerySqlServerTest.cs index 34d120cfd8e..772d65d5957 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindGroupByQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindGroupByQuerySqlServerTest.cs @@ -123,7 +123,7 @@ public override async Task GroupBy_Property_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -135,7 +135,7 @@ public override async Task GroupBy_Property_Select_Sum_Min_Max_Avg(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -207,7 +207,7 @@ public override async Task GroupBy_Property_Select_Key_Sum(bool async) AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -219,7 +219,7 @@ public override async Task GroupBy_Property_Select_Key_Sum_Min_Max_Avg(bool asyn AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -231,7 +231,7 @@ public override async Task GroupBy_Property_Select_Sum_Min_Key_Max_Avg(bool asyn AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID] AS [Key], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID] AS [Key], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -243,7 +243,7 @@ public override async Task GroupBy_Property_Select_key_multiple_times_and_aggreg AssertSql( """ -SELECT [o].[CustomerID] AS [Key1], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key1], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -291,7 +291,7 @@ public override async Task GroupBy_aggregate_projecting_conditional_expression_b SELECT CASE WHEN [o].[OrderDate] IS NULL THEN N'is null' ELSE N'is not null' -END AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +END AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[OrderDate] """); @@ -363,7 +363,7 @@ public override async Task GroupBy_anonymous_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -375,7 +375,7 @@ public override async Task GroupBy_anonymous_Select_Sum_Min_Max_Avg(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -387,7 +387,7 @@ public override async Task GroupBy_anonymous_with_alias_Select_Key_Sum(bool asyn AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -459,7 +459,7 @@ public override async Task GroupBy_Composite_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -471,7 +471,7 @@ public override async Task GroupBy_Composite_Select_Sum_Min_Max_Avg(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -543,7 +543,7 @@ public override async Task GroupBy_Composite_Select_Key_Sum(bool async) AssertSql( """ -SELECT [o].[CustomerID], [o].[EmployeeID], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID], [o].[EmployeeID], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -555,7 +555,7 @@ public override async Task GroupBy_Composite_Select_Key_Sum_Min_Max_Avg(bool asy AssertSql( """ -SELECT [o].[CustomerID], [o].[EmployeeID], COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT [o].[CustomerID], [o].[EmployeeID], ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -567,7 +567,7 @@ public override async Task GroupBy_Composite_Select_Sum_Min_Key_Max_Avg(bool asy AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], [o].[EmployeeID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], [o].[EmployeeID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -579,7 +579,7 @@ public override async Task GroupBy_Composite_Select_Sum_Min_Key_flattened_Max_Av AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], [o].[EmployeeID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], [o].[EmployeeID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -591,7 +591,7 @@ public override async Task GroupBy_Dto_as_key_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID], [o].[EmployeeID] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID], [o].[EmployeeID] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -603,7 +603,7 @@ public override async Task GroupBy_Dto_as_element_selector_Select_Sum(bool async AssertSql( """ -SELECT COALESCE(SUM(CAST([o].[EmployeeID] AS bigint)), CAST(0 AS bigint)) AS [Sum], [o].[CustomerID] AS [Key] +SELECT ISNULL(SUM(CAST([o].[EmployeeID] AS bigint)), CAST(0 AS bigint)) AS [Sum], [o].[CustomerID] AS [Key] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -615,7 +615,7 @@ public override async Task GroupBy_Composite_Select_Dto_Sum_Min_Key_flattened_Ma AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID] AS [CustomerId], [o].[EmployeeID] AS [EmployeeId], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID] AS [CustomerId], [o].[EmployeeID] AS [EmployeeId], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -627,7 +627,7 @@ public override async Task GroupBy_Composite_Select_Sum_Min_part_Key_flattened_M AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], [o].[CustomerID], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID], [o].[EmployeeID] """); @@ -639,7 +639,7 @@ public override async Task GroupBy_Constant_Select_Sum_Min_Key_Max_Avg(bool asyn AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -654,7 +654,7 @@ public override async Task GroupBy_Constant_with_element_selector_Select_Sum(boo AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -669,7 +669,7 @@ public override async Task GroupBy_Constant_with_element_selector_Select_Sum2(bo AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -684,7 +684,7 @@ public override async Task GroupBy_Constant_with_element_selector_Select_Sum3(bo AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -699,7 +699,7 @@ public override async Task GroupBy_after_predicate_Constant_Select_Sum_Min_Key_M AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key] AS [Random], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key] AS [Random], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -715,7 +715,7 @@ public override async Task GroupBy_Constant_with_element_selector_Select_Sum_Min AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum], [o0].[Key] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum], [o0].[Key] FROM ( SELECT [o].[OrderID], 2 AS [Key] FROM [Orders] AS [o] @@ -734,7 +734,7 @@ SELECT MIN(CASE WHEN 1 = [o0].[Key] THEN [o0].[OrderDate] END) AS [Min], MAX(CASE WHEN 1 = [o0].[Key] THEN [o0].[OrderDate] -END) AS [Max], COALESCE(SUM(CASE +END) AS [Max], ISNULL(SUM(CASE WHEN 1 = [o0].[Key] THEN [o0].[OrderID] END), 0) AS [Sum], AVG(CASE WHEN 1 = [o0].[Key] THEN CAST([o0].[OrderID] AS float) @@ -756,7 +756,7 @@ public override async Task GroupBy_param_Select_Sum_Min_Key_Max_Avg(bool async) """ @a='2' -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum], MIN([o0].[OrderID]) AS [Min], [o0].[Key], MAX([o0].[OrderID]) AS [Max], AVG(CAST([o0].[OrderID] AS float)) AS [Avg] FROM ( SELECT [o].[OrderID], @a AS [Key] FROM [Orders] AS [o] @@ -773,7 +773,7 @@ public override async Task GroupBy_param_with_element_selector_Select_Sum(bool a """ @a='2' -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], @a AS [Key] FROM [Orders] AS [o] @@ -790,7 +790,7 @@ public override async Task GroupBy_param_with_element_selector_Select_Sum2(bool """ @a='2' -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], @a AS [Key] FROM [Orders] AS [o] @@ -807,7 +807,7 @@ public override async Task GroupBy_param_with_element_selector_Select_Sum3(bool """ @a='2' -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], @a AS [Key] FROM [Orders] AS [o] @@ -824,7 +824,7 @@ public override async Task GroupBy_param_with_element_selector_Select_Sum_Min_Ke """ @a='2' -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum], [o0].[Key] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum], [o0].[Key] FROM ( SELECT [o].[OrderID], @a AS [Key] FROM [Orders] AS [o] @@ -915,7 +915,7 @@ public override async Task GroupBy_Property_scalar_element_selector_Sum(bool asy AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -927,7 +927,7 @@ public override async Task GroupBy_Property_scalar_element_selector_Sum_Min_Max_ AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -999,7 +999,7 @@ public override async Task GroupBy_Property_anonymous_element_selector_Sum(bool AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1011,7 +1011,7 @@ public override async Task GroupBy_Property_anonymous_element_selector_Sum_Min_M AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[EmployeeID]) AS [Min], MAX([o].[EmployeeID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[EmployeeID]) AS [Min], MAX([o].[EmployeeID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1023,7 +1023,7 @@ public override async Task GroupBy_element_selector_complex_aggregate(bool async AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] + 1), 0) +SELECT ISNULL(SUM([o].[OrderID] + 1), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1035,7 +1035,7 @@ public override async Task GroupBy_element_selector_complex_aggregate2(bool asyn AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] + 1), 0) +SELECT ISNULL(SUM([o].[OrderID] + 1), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1047,7 +1047,7 @@ public override async Task GroupBy_element_selector_complex_aggregate3(bool asyn AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] + 1), 0) +SELECT ISNULL(SUM([o].[OrderID] + 1), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1059,7 +1059,7 @@ public override async Task GroupBy_element_selector_complex_aggregate4(bool asyn AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID] + 1), 0) +SELECT ISNULL(SUM([o].[OrderID] + 1), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1071,7 +1071,7 @@ public override async Task Element_selector_with_case_block_repeated_inside_anot AssertSql( """ -SELECT [o].[OrderID], COALESCE(SUM(CASE +SELECT [o].[OrderID], ISNULL(SUM(CASE WHEN [o].[CustomerID] = N'ALFKI' THEN CASE WHEN [o].[OrderID] > 1000 THEN [o].[OrderID] ELSE -[o].[OrderID] @@ -1107,7 +1107,7 @@ public override async Task GroupBy_empty_key_Aggregate(bool async) AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) +SELECT ISNULL(SUM([o0].[OrderID]), 0) FROM ( SELECT [o].[OrderID], 1 AS [Key] FROM [Orders] AS [o] @@ -1122,7 +1122,7 @@ public override async Task GroupBy_empty_key_Aggregate_Key(bool async) AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) AS [Sum] +SELECT ISNULL(SUM([o0].[OrderID]), 0) AS [Sum] FROM ( SELECT [o].[OrderID], 1 AS [Key] FROM [Orders] AS [o] @@ -1137,7 +1137,7 @@ public override async Task OrderBy_GroupBy_Aggregate(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) +SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1459,7 +1459,7 @@ public override async Task Select_anonymous_GroupBy_Aggregate(bool async) AssertSql( """ -SELECT MIN([o].[OrderDate]) AS [Min], MAX([o].[OrderDate]) AS [Max], COALESCE(SUM([o].[OrderID]), 0) AS [Sum], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT MIN([o].[OrderDate]) AS [Min], MAX([o].[OrderDate]) AS [Max], ISNULL(SUM([o].[OrderID]), 0) AS [Sum], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] WHERE [o].[OrderID] < 10300 GROUP BY [o].[CustomerID] @@ -1516,8 +1516,8 @@ public override async Task GroupBy_complex_key_aggregate_2(bool async) AssertSql( """ -SELECT [o0].[Key] AS [Month], COALESCE(SUM([o0].[OrderID]), 0) AS [Total], ( - SELECT COALESCE(SUM([o1].[OrderID]), 0) +SELECT [o0].[Key] AS [Month], ISNULL(SUM([o0].[OrderID]), 0) AS [Total], ( + SELECT ISNULL(SUM([o1].[OrderID]), 0) FROM [Orders] AS [o1] WHERE DATEPART(month, [o1].[OrderDate]) = [o0].[Key] OR ([o1].[OrderDate] IS NULL AND [o0].[Key] IS NULL)) AS [Payment] FROM ( @@ -1572,7 +1572,7 @@ public override async Task GroupBy_OrderBy_count_Select_sum(bool async) AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] ORDER BY COUNT(*), [o].[CustomerID] @@ -1731,7 +1731,7 @@ public override async Task GroupBy_filter_count_OrderBy_count_Select_sum(bool as AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COUNT(*) AS [Count], COALESCE(SUM([o].[OrderID]), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], COUNT(*) AS [Count], ISNULL(SUM([o].[OrderID]), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] HAVING COUNT(*) > 4 @@ -1927,7 +1927,7 @@ public override async Task GroupBy_with_result_selector(bool async) AssertSql( """ -SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] +SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], MIN([o].[OrderID]) AS [Min], MAX([o].[OrderID]) AS [Max], AVG(CAST([o].[OrderID] AS float)) AS [Avg] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -1951,7 +1951,7 @@ public override async Task GroupBy_Sum_constant_cast(bool async) AssertSql( """ -SELECT COALESCE(SUM(CAST(1 AS bigint)), CAST(0 AS bigint)) +SELECT ISNULL(SUM(CAST(1 AS bigint)), CAST(0 AS bigint)) FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -2132,7 +2132,7 @@ public override async Task GroupBy_Where_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM(CASE +SELECT ISNULL(SUM(CASE WHEN [o].[OrderID] < 10300 THEN [o].[OrderID] END), 0) FROM [Orders] AS [o] @@ -2218,10 +2218,10 @@ public override async Task GroupBy_multiple_Sum_with_conditional_projection(bool AssertSql( """ -SELECT [o].[CustomerID], COALESCE(SUM(CASE +SELECT [o].[CustomerID], ISNULL(SUM(CASE WHEN [o].[OrderID] < 11000 THEN [o].[OrderID] ELSE 0 -END), 0) AS [TenK], COALESCE(SUM(CASE +END), 0) AS [TenK], ISNULL(SUM(CASE WHEN [o].[OrderID] >= 11000 THEN [o].[OrderID] ELSE 0 END), 0) AS [EleventK] @@ -2236,10 +2236,10 @@ public override async Task GroupBy_multiple_Sum_with_Select_conditional_projecti AssertSql( """ -SELECT [o].[CustomerID], COALESCE(SUM(CASE +SELECT [o].[CustomerID], ISNULL(SUM(CASE WHEN [o].[OrderID] < 11000 THEN [o].[OrderID] ELSE 0 -END), 0) AS [TenK], COALESCE(SUM(CASE +END), 0) AS [TenK], ISNULL(SUM(CASE WHEN [o].[OrderID] >= 11000 THEN [o].[OrderID] ELSE 0 END), 0) AS [EleventK] @@ -2475,7 +2475,7 @@ public override async Task GroupBy_Select_Distinct_aggregate(bool async) AssertSql( """ -SELECT [o].[CustomerID] AS [Key], AVG(DISTINCT (CAST([o].[OrderID] AS float))) AS [Average], COUNT(DISTINCT ([o].[EmployeeID])) AS [Count], COUNT_BIG(DISTINCT ([o].[EmployeeID])) AS [LongCount], MAX([o].[OrderDate]) AS [Max], MIN([o].[OrderDate]) AS [Min], COALESCE(SUM(DISTINCT ([o].[OrderID])), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], AVG(DISTINCT (CAST([o].[OrderID] AS float))) AS [Average], COUNT(DISTINCT ([o].[EmployeeID])) AS [Count], COUNT_BIG(DISTINCT ([o].[EmployeeID])) AS [LongCount], MAX([o].[OrderDate]) AS [Max], MIN([o].[OrderDate]) AS [Min], ISNULL(SUM(DISTINCT ([o].[OrderID])), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -2515,7 +2515,7 @@ public override async Task MinMax_after_GroupBy_aggregate(bool async) """ SELECT MIN([o0].[c]) FROM ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [c] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [c] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] ) AS [o0] @@ -2524,7 +2524,7 @@ GROUP BY [o].[CustomerID] """ SELECT MAX([o0].[c]) FROM ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [c] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [c] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] ) AS [o0] @@ -2559,7 +2559,7 @@ WHEN NOT EXISTS ( SELECT 1 FROM [Orders] AS [o] GROUP BY [o].[CustomerID] - HAVING COALESCE(SUM([o].[OrderID]), 0) < 0) THEN CAST(1 AS bit) + HAVING ISNULL(SUM([o].[OrderID]), 0) < 0) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END """); @@ -2803,7 +2803,7 @@ public override async Task Odata_groupby_empty_key(bool async) AssertSql( """ -SELECT N'TotalAmount' AS [Name], COALESCE(SUM(CAST([o0].[OrderID] AS decimal(18,2))), 0.0) AS [Value] +SELECT N'TotalAmount' AS [Name], ISNULL(SUM(CAST([o0].[OrderID] AS decimal(18,2))), 0.0) AS [Value] FROM ( SELECT [o].[OrderID], 1 AS [Key] FROM [Orders] AS [o] @@ -2818,7 +2818,7 @@ public override async Task GroupBy_with_group_key_access_thru_navigation(bool as AssertSql( """ -SELECT [o0].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Aggregate] +SELECT [o0].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Aggregate] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] GROUP BY [o0].[CustomerID] @@ -2831,7 +2831,7 @@ public override async Task GroupBy_with_group_key_access_thru_nested_navigation( AssertSql( """ -SELECT [c].[Country] AS [Key], COALESCE(SUM([o].[OrderID]), 0) AS [Aggregate] +SELECT [c].[Country] AS [Key], ISNULL(SUM([o].[OrderID]), 0) AS [Aggregate] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] LEFT JOIN [Customers] AS [c] ON [o0].[CustomerID] = [c].[CustomerID] @@ -2845,7 +2845,7 @@ public override async Task GroupBy_with_group_key_being_navigation(bool async) AssertSql( """ -SELECT [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate], COALESCE(SUM([o].[OrderID]), 0) AS [Aggregate] +SELECT [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate], ISNULL(SUM([o].[OrderID]), 0) AS [Aggregate] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] GROUP BY [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate] @@ -2858,7 +2858,7 @@ public override async Task GroupBy_with_group_key_being_nested_navigation(bool a AssertSql( """ -SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], COALESCE(SUM([o].[OrderID]), 0) AS [Aggregate] +SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], ISNULL(SUM([o].[OrderID]), 0) AS [Aggregate] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] LEFT JOIN [Customers] AS [c] ON [o0].[CustomerID] = [c].[CustomerID] @@ -2894,7 +2894,7 @@ public override async Task GroupBy_with_order_by_skip_and_another_order_by(bool """ @p='80' -SELECT COALESCE(SUM([o0].[OrderID]), 0) +SELECT ISNULL(SUM([o0].[OrderID]), 0) FROM ( SELECT [o].[OrderID], [o].[CustomerID] FROM [Orders] AS [o] @@ -2939,7 +2939,7 @@ public override async Task GroupBy_orderby_projection_with_coalesce_operation(bo AssertSql( """ -SELECT COALESCE([c].[City], N'Unknown') AS [Locality], COUNT(*) AS [Count] +SELECT ISNULL(CAST([c].[City] AS nvarchar(4000)), N'Unknown') AS [Locality], COUNT(*) AS [Count] FROM [Customers] AS [c] GROUP BY [c].[City] ORDER BY COUNT(*) DESC, [c].[City] @@ -3208,7 +3208,7 @@ public override async Task GroupBy_with_cast_inside_grouping_aggregate(bool asyn AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COUNT(*) AS [Count], COALESCE(SUM(CAST([o].[OrderID] AS bigint)), CAST(0 AS bigint)) AS [Sum] +SELECT [o].[CustomerID] AS [Key], COUNT(*) AS [Count], ISNULL(SUM(CAST([o].[OrderID] AS bigint)), CAST(0 AS bigint)) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -3223,7 +3223,7 @@ public override async Task Complex_query_with_groupBy_in_subquery1(bool async) SELECT [c].[CustomerID], [o0].[Sum], [o0].[CustomerID] FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] + SELECT ISNULL(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] GROUP BY [o].[CustomerID] @@ -3241,7 +3241,7 @@ public override async Task Complex_query_with_groupBy_in_subquery2(bool async) SELECT [c].[CustomerID], [o0].[Max], [o0].[Sum], [o0].[CustomerID] FROM [Customers] AS [c] OUTER APPLY ( - SELECT MAX(CAST(LEN([o].[CustomerID]) AS int)) AS [Max], COALESCE(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] + SELECT MAX(CAST(LEN([o].[CustomerID]) AS int)) AS [Max], ISNULL(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] GROUP BY [o].[CustomerID] @@ -3259,7 +3259,7 @@ public override async Task Complex_query_with_groupBy_in_subquery3(bool async) SELECT [c].[CustomerID], [o0].[Max], [o0].[Sum], [o0].[CustomerID] FROM [Customers] AS [c] OUTER APPLY ( - SELECT MAX(CAST(LEN([o].[CustomerID]) AS int)) AS [Max], COALESCE(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] + SELECT MAX(CAST(LEN([o].[CustomerID]) AS int)) AS [Max], ISNULL(SUM([o].[OrderID]), 0) AS [Sum], [o].[CustomerID] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] ) AS [o0] @@ -3285,10 +3285,10 @@ public override async Task Where_select_function_groupby_followed_by_another_sel AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM(CASE +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM(CASE WHEN 2020 - DATEPART(year, [o].[OrderDate]) <= 30 THEN [o].[OrderID] ELSE 0 -END), 0) AS [Sum1], COALESCE(SUM(CASE +END), 0) AS [Sum1], ISNULL(SUM(CASE WHEN 2020 - DATEPART(year, [o].[OrderDate]) > 30 AND 2020 - DATEPART(year, [o].[OrderDate]) <= 60 THEN [o].[OrderID] ELSE 0 END), 0) AS [Sum2] @@ -3330,7 +3330,7 @@ public override async Task Group_by_with_arithmetic_operation_inside_aggregate(b AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(SUM([o].[OrderID] + CAST(LEN([o].[CustomerID]) AS int)), 0) AS [Sum] +SELECT [o].[CustomerID] AS [Key], ISNULL(SUM([o].[OrderID] + CAST(LEN([o].[CustomerID]) AS int)), 0) AS [Sum] FROM [Orders] AS [o] GROUP BY [o].[CustomerID] """); @@ -3416,7 +3416,7 @@ public override async Task GroupBy_aggregate_from_multiple_query_in_same_project AssertSql( """ -SELECT [o].[CustomerID] AS [Key], COALESCE(( +SELECT [o].[CustomerID] AS [Key], ISNULL(( SELECT TOP(1) COUNT(*) + MIN([o].[OrderID]) FROM [Employees] AS [e] WHERE [e].[City] = N'Seattle' @@ -3541,7 +3541,7 @@ public override async Task Complex_query_with_group_by_in_subquery5(bool async) """ SELECT [s].[c], [s].[ProductID], [c1].[CustomerID], [c1].[City] FROM ( - SELECT COALESCE(SUM([o].[ProductID] + [o].[OrderID] * 1000), 0) AS [c], [o].[ProductID], MIN([o].[OrderID] / 100) AS [c0] + SELECT ISNULL(SUM([o].[ProductID] + [o].[OrderID] * 1000), 0) AS [c], [o].[ProductID], MIN([o].[OrderID] / 100) AS [c0] FROM [Order Details] AS [o] INNER JOIN [Orders] AS [o0] ON [o].[OrderID] = [o0].[OrderID] LEFT JOIN [Customers] AS [c] ON [o0].[CustomerID] = [c].[CustomerID] @@ -3566,18 +3566,18 @@ public override async Task Complex_query_with_groupBy_in_subquery4(bool async) SELECT [c].[CustomerID], [s1].[Sum], [s1].[Count], [s1].[Key] FROM [Customers] AS [c] OUTER APPLY ( - SELECT COALESCE(SUM([s].[OrderID]), 0) AS [Sum], ( + SELECT ISNULL(SUM([s].[OrderID]), 0) AS [Sum], ( SELECT COUNT(*) FROM ( - SELECT [o0].[CustomerID], COALESCE([c1].[City], N'') + COALESCE([o0].[CustomerID], N'') AS [Key] + SELECT [o0].[CustomerID], ISNULL(CAST([c1].[City] AS nvarchar(4000)), N'') + ISNULL([o0].[CustomerID], N'') AS [Key] FROM [Orders] AS [o0] LEFT JOIN [Customers] AS [c1] ON [o0].[CustomerID] = [c1].[CustomerID] WHERE [c].[CustomerID] = [o0].[CustomerID] ) AS [s0] LEFT JOIN [Customers] AS [c2] ON [s0].[CustomerID] = [c2].[CustomerID] - WHERE ([s].[Key] = [s0].[Key] OR ([s].[Key] IS NULL AND [s0].[Key] IS NULL)) AND COALESCE([c2].[City], N'') + COALESCE([s0].[CustomerID], N'') LIKE N'Lon%') AS [Count], [s].[Key] + WHERE ([s].[Key] = [s0].[Key] OR ([s].[Key] IS NULL AND [s0].[Key] IS NULL)) AND ISNULL(CAST([c2].[City] AS nvarchar(4000)), N'') + ISNULL([s0].[CustomerID], N'') LIKE N'Lon%') AS [Count], [s].[Key] FROM ( - SELECT [o].[OrderID], COALESCE([c0].[City], N'') + COALESCE([o].[CustomerID], N'') AS [Key] + SELECT [o].[OrderID], ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'') + ISNULL([o].[CustomerID], N'') AS [Key] FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c0] ON [o].[CustomerID] = [c0].[CustomerID] WHERE [c].[CustomerID] = [o].[CustomerID] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindJoinQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindJoinQuerySqlServerTest.cs index c4e3126bb1f..7991583d1a0 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindJoinQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindJoinQuerySqlServerTest.cs @@ -786,7 +786,7 @@ public override async Task SelectMany_with_selecting_outer_element(bool async) SELECT [o0].[c] FROM [Customers] AS [c] CROSS APPLY ( - SELECT [c].[CustomerID] + COALESCE([c].[City], N'') AS [c] + SELECT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [c] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] ) AS [o0] @@ -823,7 +823,7 @@ FROM [Customers] AS [c] INNER JOIN ( SELECT [c1].[CustomerID], [c1].[Address], [c1].[City], [c1].[CompanyName], [c1].[ContactName], [c1].[ContactTitle], [c1].[Country], [c1].[Fax], [c1].[Phone], [c1].[PostalCode], [c1].[Region] FROM ( - SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + COALESCE([c0].[City], N'')) AS [row] + SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'')) AS [row] FROM [Customers] AS [c0] ) AS [c1] WHERE [c1].[row] <= 2 @@ -845,7 +845,7 @@ FROM [Customers] AS [c] INNER JOIN ( SELECT [c1].[CustomerID], [c1].[Address], [c1].[City], [c1].[CompanyName], [c1].[ContactName], [c1].[ContactTitle], [c1].[Country], [c1].[Fax], [c1].[Phone], [c1].[PostalCode], [c1].[Region] FROM ( - SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + COALESCE([c0].[City], N'')) AS [row] + SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'')) AS [row] FROM [Customers] AS [c0] ) AS [c1] WHERE [c1].[row] <= 2 @@ -867,7 +867,7 @@ FROM [Customers] AS [c] INNER JOIN ( SELECT [c1].[CustomerID], [c1].[Address], [c1].[City], [c1].[CompanyName], [c1].[ContactName], [c1].[ContactTitle], [c1].[Country], [c1].[Fax], [c1].[Phone], [c1].[PostalCode], [c1].[Region] FROM ( - SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + COALESCE([c0].[City], N'')) AS [row] + SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'')) AS [row] FROM [Customers] AS [c0] ) AS [c1] WHERE [c1].[row] <= 2 @@ -892,7 +892,7 @@ ORDER BY [c].[CustomerID] INNER JOIN ( SELECT [c1].[CustomerID], [c1].[Address], [c1].[City], [c1].[CompanyName], [c1].[ContactName], [c1].[ContactTitle], [c1].[Country], [c1].[Fax], [c1].[Phone], [c1].[PostalCode], [c1].[Region] FROM ( - SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + COALESCE([c0].[City], N'')) AS [row] + SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region], ROW_NUMBER() OVER(PARTITION BY [c0].[CustomerID] ORDER BY [c0].[CustomerID] + ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'')) AS [row] FROM [Customers] AS [c0] ) AS [c1] WHERE [c1].[row] <= 2 diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs index ca6a415114b..30d82369eb4 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs @@ -467,7 +467,7 @@ public override async Task Default_if_empty_top_level_projection(bool async) AssertSql( """ -SELECT COALESCE([e1].[EmployeeID], 0) +SELECT ISNULL([e1].[EmployeeID], 0) FROM ( SELECT 1 AS empty ) AS [e0] @@ -1149,7 +1149,7 @@ public override async Task Join_Customers_Orders_Projection_With_String_Concat_S @p='10' @p0='5' -SELECT COALESCE([c].[ContactName], N'') + N' ' + COALESCE([c].[ContactTitle], N'') AS [Contact], [o].[OrderID] +SELECT ISNULL(CAST([c].[ContactName] AS nvarchar(4000)), N'') + N' ' + ISNULL([c].[ContactTitle], N'') AS [Contact], [o].[OrderID] FROM [Customers] AS [c] INNER JOIN [Orders] AS [o] ON [c].[CustomerID] = [o].[CustomerID] ORDER BY [o].[OrderID] @@ -2817,7 +2817,7 @@ public override async Task OrderBy_null_coalesce_operator(bool async) """ SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] FROM [Customers] AS [c] -ORDER BY COALESCE([c].[Region], N'ZZ'), [c].[CustomerID] +ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ'), [c].[CustomerID] """); } @@ -2873,7 +2873,7 @@ public override async Task Coalesce_Correct_TypeMapping_String(bool async) AssertSql( """ -SELECT COALESCE([c].[Region], N'no region specified') +SELECT ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'no region specified') FROM [Customers] AS [c] ORDER BY [c].[CustomerID] """); @@ -2885,8 +2885,9 @@ public override async Task Coalesce_Correct_TypeMapping_String_Sum(bool async) AssertSql( """ -SELECT COALESCE(CASE - WHEN [c].[Region] IS NOT NULL THEN N'R' + [c].[Region] +SELECT ISNULL(CASE + WHEN [c].[Region] IS NULL THEN NULL + ELSE N'R' + ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'') END, N'no region specified') FROM [Customers] AS [c] ORDER BY [c].[CustomerID] @@ -2899,8 +2900,9 @@ public override async Task Coalesce_Correct_TypeMapping_String_Join(bool async) AssertSql( """ -SELECT COALESCE(CASE - WHEN [c].[Region] IS NOT NULL THEN CONCAT_WS(N'|', N'R', [c].[Region]) +SELECT ISNULL(CASE + WHEN [c].[Region] IS NULL THEN NULL + ELSE CONCAT_WS(N'|', N'R', ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'')) END, N'no region specified') FROM [Customers] AS [c] ORDER BY [c].[CustomerID] @@ -2965,7 +2967,7 @@ public override async Task Projection_null_coalesce_operator(bool async) AssertSql( """ -SELECT [c].[CustomerID], [c].[CompanyName], COALESCE([c].[Region], N'ZZ') AS [Region] +SELECT [c].[CustomerID], [c].[CompanyName], ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') AS [Region] FROM [Customers] AS [c] """); } @@ -2978,7 +2980,7 @@ public override async Task Filter_coalesce_operator(bool async) """ SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] FROM [Customers] AS [c] -WHERE COALESCE([c].[ContactName], [c].[CompanyName]) = N'Liz Nixon' +WHERE ISNULL(CAST([c].[ContactName] AS nvarchar(4000)), [c].[CompanyName]) = N'Liz Nixon' """); } @@ -2995,9 +2997,9 @@ public override async Task Take_skip_null_coalesce_operator(bool async) FROM ( SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region] FROM ( - SELECT TOP(@p) [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], COALESCE([c].[Region], N'ZZ') AS [c] + SELECT TOP(@p) [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') AS [c] FROM [Customers] AS [c] - ORDER BY COALESCE([c].[Region], N'ZZ') + ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') ) AS [c0] ORDER BY [c0].[c] OFFSET @p0 ROWS @@ -3023,11 +3025,11 @@ public override async Task Select_take_skip_null_coalesce_operator(bool async) @p='10' @p0='5' -SELECT [c0].[CustomerID], [c0].[CompanyName], COALESCE([c0].[Region], N'ZZ') AS [Region] +SELECT [c0].[CustomerID], [c0].[CompanyName], ISNULL(CAST([c0].[Region] AS nvarchar(4000)), N'ZZ') AS [Region] FROM ( - SELECT TOP(@p) [c].[CustomerID], [c].[CompanyName], [c].[Region], COALESCE([c].[Region], N'ZZ') AS [c] + SELECT TOP(@p) [c].[CustomerID], [c].[CompanyName], [c].[Region], ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') AS [c] FROM [Customers] AS [c] - ORDER BY COALESCE([c].[Region], N'ZZ') + ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') ) AS [c0] ORDER BY [c0].[c] OFFSET @p0 ROWS @@ -3045,9 +3047,9 @@ public override async Task Select_take_skip_null_coalesce_operator2(bool async) SELECT [c0].[CustomerID], [c0].[CompanyName], [c0].[Region] FROM ( - SELECT TOP(@p) [c].[CustomerID], [c].[CompanyName], [c].[Region], COALESCE([c].[Region], N'ZZ') AS [c] + SELECT TOP(@p) [c].[CustomerID], [c].[CompanyName], [c].[Region], ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') AS [c] FROM [Customers] AS [c] - ORDER BY COALESCE([c].[Region], N'ZZ') + ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') ) AS [c0] ORDER BY [c0].[c] OFFSET @p0 ROWS @@ -3065,9 +3067,9 @@ public override async Task Select_take_skip_null_coalesce_operator3(bool async) SELECT [c0].[CustomerID], [c0].[Address], [c0].[City], [c0].[CompanyName], [c0].[ContactName], [c0].[ContactTitle], [c0].[Country], [c0].[Fax], [c0].[Phone], [c0].[PostalCode], [c0].[Region] FROM ( - SELECT TOP(@p) [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], COALESCE([c].[Region], N'ZZ') AS [c] + SELECT TOP(@p) [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region], ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') AS [c] FROM [Customers] AS [c] - ORDER BY COALESCE([c].[Region], N'ZZ') + ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') ) AS [c0] ORDER BY [c0].[c] OFFSET @p0 ROWS @@ -3082,7 +3084,7 @@ public override async Task Selected_column_can_coalesce(bool async) """ SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] FROM [Customers] AS [c] -ORDER BY COALESCE([c].[Region], N'ZZ') +ORDER BY ISNULL(CAST([c].[Region] AS nvarchar(4000)), N'ZZ') """); } @@ -3107,7 +3109,7 @@ public override async Task Concat_string_int(bool async) AssertSql( """ -SELECT CAST([o].[OrderID] AS nvarchar(max)) + COALESCE([o].[CustomerID], N'') +SELECT CAST([o].[OrderID] AS nvarchar(max)) + ISNULL([o].[CustomerID], N'') FROM [Orders] AS [o] """); } @@ -3118,7 +3120,7 @@ public override async Task Concat_int_string(bool async) AssertSql( """ -SELECT COALESCE([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max)) +SELECT ISNULL([o].[CustomerID], N'') + CAST([o].[OrderID] AS nvarchar(max)) FROM [Orders] AS [o] """); } @@ -3153,7 +3155,7 @@ public override async Task String_concat_with_navigation1(bool async) AssertSql( """ -SELECT COALESCE([o].[CustomerID], N'') + N' ' + COALESCE([c].[City], N'') +SELECT ISNULL([o].[CustomerID], N'') + N' ' + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c] ON [o].[CustomerID] = [c].[CustomerID] """); @@ -3165,7 +3167,7 @@ public override async Task String_concat_with_navigation2(bool async) AssertSql( """ -SELECT COALESCE([c].[City], N'') + N' ' + COALESCE([c].[City], N'') +SELECT ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') + N' ' + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c] ON [o].[CustomerID] = [c].[CustomerID] """); @@ -3303,7 +3305,7 @@ public override async Task Query_expression_with_to_string_and_contains(bool asy """ SELECT [o].[CustomerID] FROM [Orders] AS [o] -WHERE [o].[OrderDate] IS NOT NULL AND COALESCE(CONVERT(varchar(10), [o].[EmployeeID]), '') LIKE '%7%' +WHERE [o].[OrderDate] IS NOT NULL AND ISNULL(CONVERT(varchar(10), [o].[EmployeeID]), '') LIKE '%7%' """); } @@ -3355,7 +3357,7 @@ public override async Task Select_expression_other_to_string(bool async) AssertSql( """ -SELECT COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '') AS [ShipName] +SELECT ISNULL(CONVERT(varchar(100), [o].[OrderDate]), '') AS [ShipName] FROM [Orders] AS [o] WHERE [o].[OrderDate] IS NOT NULL """); @@ -3742,7 +3744,7 @@ public override async Task OrderBy_coalesce_take_distinct(bool async) FROM ( SELECT TOP(@p) [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock] FROM [Products] AS [p] - ORDER BY COALESCE([p].[UnitPrice], 0.0) + ORDER BY ISNULL([p].[UnitPrice], 0.0) ) AS [p0] """); } @@ -3760,7 +3762,7 @@ public override async Task OrderBy_coalesce_skip_take_distinct(bool async) FROM ( SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock] FROM [Products] AS [p] - ORDER BY COALESCE([p].[UnitPrice], 0.0) + ORDER BY ISNULL([p].[UnitPrice], 0.0) OFFSET @p ROWS FETCH NEXT @p0 ROWS ONLY ) AS [p0] """); @@ -3779,7 +3781,7 @@ SELECT DISTINCT TOP(@p) [p0].[ProductID], [p0].[Discontinued], [p0].[ProductName FROM ( SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock] FROM [Products] AS [p] - ORDER BY COALESCE([p].[UnitPrice], 0.0) + ORDER BY ISNULL([p].[UnitPrice], 0.0) OFFSET @p ROWS FETCH NEXT @p0 ROWS ONLY ) AS [p0] """); @@ -3985,9 +3987,9 @@ public override async Task Anonymous_complex_distinct_where(bool async) AssertSql( """ -SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [A] +SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [A] FROM [Customers] AS [c] -WHERE [c].[CustomerID] + COALESCE([c].[City], N'') = N'ALFKIBerlin' +WHERE [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') = N'ALFKIBerlin' """); } @@ -3999,7 +4001,7 @@ public override async Task Anonymous_complex_distinct_orderby(bool async) """ SELECT [c0].[A] FROM ( - SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [A] + SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [A] FROM [Customers] AS [c] ) AS [c0] ORDER BY [c0].[A] @@ -4014,9 +4016,9 @@ public override async Task Anonymous_complex_distinct_result(bool async) """ SELECT COUNT(*) FROM ( - SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [A] + SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [A] FROM [Customers] AS [c] - WHERE [c].[CustomerID] + COALESCE([c].[City], N'') LIKE N'A%' + WHERE [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') LIKE N'A%' ) AS [c0] """); } @@ -4027,9 +4029,9 @@ public override async Task Anonymous_complex_orderby(bool async) AssertSql( """ -SELECT [c].[CustomerID] + COALESCE([c].[City], N'') AS [A] +SELECT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [A] FROM [Customers] AS [c] -ORDER BY [c].[CustomerID] + COALESCE([c].[City], N'') +ORDER BY [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') """); } @@ -4105,9 +4107,9 @@ public override async Task DTO_complex_distinct_where(bool async) AssertSql( """ -SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [Property] +SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [Property] FROM [Customers] AS [c] -WHERE [c].[CustomerID] + COALESCE([c].[City], N'') = N'ALFKIBerlin' +WHERE [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') = N'ALFKIBerlin' """); } @@ -4119,7 +4121,7 @@ public override async Task DTO_complex_distinct_orderby(bool async) """ SELECT [c0].[Property] FROM ( - SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [Property] + SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [Property] FROM [Customers] AS [c] ) AS [c0] ORDER BY [c0].[Property] @@ -4134,9 +4136,9 @@ public override async Task DTO_complex_distinct_result(bool async) """ SELECT COUNT(*) FROM ( - SELECT DISTINCT [c].[CustomerID] + COALESCE([c].[City], N'') AS [Property] + SELECT DISTINCT [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [Property] FROM [Customers] AS [c] - WHERE [c].[CustomerID] + COALESCE([c].[City], N'') LIKE N'A%' + WHERE [c].[CustomerID] + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') LIKE N'A%' ) AS [c0] """); } @@ -4364,7 +4366,7 @@ public override async Task Select_take_sum(bool async) """ @p='10' -SELECT COALESCE(SUM([o0].[OrderID]), 0) +SELECT ISNULL(SUM([o0].[OrderID]), 0) FROM ( SELECT TOP(@p) [o].[OrderID] FROM [Orders] AS [o] @@ -4507,7 +4509,7 @@ public override async Task Select_skip_sum(bool async) """ @p='10' -SELECT COALESCE(SUM([o0].[OrderID]), 0) +SELECT ISNULL(SUM([o0].[OrderID]), 0) FROM ( SELECT [o].[OrderID] FROM [Orders] AS [o] @@ -4587,7 +4589,7 @@ public override async Task Select_distinct_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([o0].[OrderID]), 0) +SELECT ISNULL(SUM([o0].[OrderID]), 0) FROM ( SELECT DISTINCT [o].[OrderID] FROM [Orders] AS [o] @@ -5668,7 +5670,7 @@ public override async Task DefaultIfEmpty_Sum_over_collection_navigation(bool as AssertSql( """ SELECT [c].[CustomerID], ( - SELECT COALESCE(SUM(COALESCE([o0].[OrderID], 0)), 0) + SELECT ISNULL(SUM(ISNULL([o0].[OrderID], 0)), 0) FROM ( SELECT 1 AS empty ) AS [e] @@ -7134,7 +7136,7 @@ public override async Task Contains_over_concatenated_columns_both_fixed_length( SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] FROM [Orders] AS [o] LEFT JOIN [Customers] AS [c] ON [o].[CustomerID] = [c].[CustomerID] -WHERE COALESCE([o].[CustomerID], N'') + COALESCE([c].[CustomerID], N'') IN ( +WHERE ISNULL([o].[CustomerID], N'') + ISNULL([c].[CustomerID], N'') IN ( SELECT [d].[value] FROM OPENJSON(@data) WITH ([value] nchar(10) '$') AS [d] ) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs index e1f57a950f9..faeea70a9a8 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs @@ -711,7 +711,7 @@ public override async Task Collection_select_nav_prop_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([o].[OrderID]), 0) + SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID]) AS [Sum] FROM [Customers] AS [c] @@ -725,7 +725,7 @@ public override async Task Collection_select_nav_prop_sum_plus_one(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([o].[OrderID]), 0) + SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID]) + 1 AS [Sum] FROM [Customers] AS [c] @@ -741,7 +741,7 @@ public override async Task Collection_where_nav_prop_sum(bool async) SELECT [c].[CustomerID], [c].[Address], [c].[City], [c].[CompanyName], [c].[ContactName], [c].[ContactTitle], [c].[Country], [c].[Fax], [c].[Phone], [c].[PostalCode], [c].[Region] FROM [Customers] AS [c] WHERE ( - SELECT COALESCE(SUM([o].[OrderID]), 0) + SELECT ISNULL(SUM([o].[OrderID]), 0) FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID]) > 1000 """); @@ -990,7 +990,7 @@ public override async Task Project_single_scalar_value_subquery_in_query_with_op """ @p='3' -SELECT [o0].[OrderID], COALESCE(( +SELECT [o0].[OrderID], ISNULL(( SELECT TOP(1) [o1].[OrderID] FROM [Order Details] AS [o1] WHERE [o0].[OrderID] = [o1].[OrderID] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs index 4475683bd2b..e799ef1f80c 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs @@ -418,8 +418,8 @@ public override async Task Select_nested_collection_multi_level5(bool async) AssertSql( """ -SELECT COALESCE(( - SELECT TOP(1) COALESCE(( +SELECT ISNULL(( + SELECT TOP(1) ISNULL(( SELECT TOP(1) [o0].[ProductID] FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID] AND ([o0].[OrderID] <> ( @@ -445,8 +445,8 @@ public override async Task Select_nested_collection_multi_level6(bool async) AssertSql( """ -SELECT COALESCE(( - SELECT TOP(1) COALESCE(( +SELECT ISNULL(( + SELECT TOP(1) ISNULL(( SELECT TOP(1) [o0].[ProductID] FROM [Order Details] AS [o0] WHERE [o].[OrderID] = [o0].[OrderID] AND [o0].[OrderID] <> CAST(LEN([c].[CustomerID]) AS int) @@ -909,7 +909,7 @@ public override async Task Project_single_element_from_collection_with_OrderBy_o AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [o0].[OrderID] FROM [Order Details] AS [o0] INNER JOIN [Products] AS [p] ON [o0].[ProductID] = [p].[ProductID] @@ -1354,7 +1354,7 @@ public override async Task FirstOrDefault_over_empty_collection_of_value_type_re AssertSql( """ -SELECT [c].[CustomerID], COALESCE(( +SELECT [c].[CustomerID], ISNULL(( SELECT TOP(1) [o].[OrderID] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] @@ -1627,7 +1627,7 @@ public override async Task Coalesce_over_nullable_uint(bool async) AssertSql( """ -SELECT COALESCE([o].[EmployeeID], 0) +SELECT ISNULL([o].[EmployeeID], 0) FROM [Orders] AS [o] """); } @@ -1892,7 +1892,7 @@ public override async Task Reverse_in_projection_scalar_subquery(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [o].[OrderID] FROM [Orders] AS [o] ORDER BY [o].[OrderDate] DESC, [o].[OrderID]), 0) @@ -2031,7 +2031,7 @@ public override async Task Projection_take_projection_doesnt_project_intermitten """ @p='10' -SELECT TOP(@p) [c].[CustomerID] + N' ' + COALESCE([c].[City], N'') AS [Aggregate] +SELECT TOP(@p) [c].[CustomerID] + N' ' + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [Aggregate] FROM [Customers] AS [c] ORDER BY [c].[CustomerID] """); @@ -2045,7 +2045,7 @@ public override async Task Projection_skip_projection_doesnt_project_intermitten """ @p='7' -SELECT [c].[CustomerID] + N' ' + COALESCE([c].[City], N'') AS [Aggregate] +SELECT [c].[CustomerID] + N' ' + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') AS [Aggregate] FROM [Customers] AS [c] ORDER BY [c].[CustomerID] OFFSET @p ROWS @@ -2058,7 +2058,7 @@ public override async Task Projection_Distinct_projection_preserves_columns_used AssertSql( """ -SELECT COALESCE([c0].[FirstLetter], N'') + N' ' + [c0].[Foo] AS [Aggregate] +SELECT ISNULL([c0].[FirstLetter], N'') + N' ' + [c0].[Foo] AS [Aggregate] FROM ( SELECT DISTINCT [c].[CustomerID], SUBSTRING([c].[CustomerID], 0 + 1, 1) AS [FirstLetter], N'Foo' AS [Foo] FROM [Customers] AS [c] @@ -2074,7 +2074,7 @@ public override async Task Projection_take_predicate_projection(bool async) """ @p='10' -SELECT [c0].[CustomerID] + N' ' + COALESCE([c0].[City], N'') AS [Aggregate] +SELECT [c0].[CustomerID] + N' ' + ISNULL(CAST([c0].[City] AS nvarchar(4000)), N'') AS [Aggregate] FROM ( SELECT TOP(@p) [c].[CustomerID], [c].[City] FROM [Customers] AS [c] @@ -2449,7 +2449,7 @@ public override async Task Client_projection_with_string_initialization_with_sca SELECT [c].[CustomerID], ( SELECT TOP(1) [o].[OrderDate] FROM [Orders] AS [o] - WHERE [c].[CustomerID] = [o].[CustomerID] AND [o].[OrderID] < 11000), [c].[City], N'test' + COALESCE([c].[City], N'') + WHERE [c].[CustomerID] = [o].[CustomerID] AND [o].[OrderID] < 11000), [c].[City], N'test' + ISNULL(CAST([c].[City] AS nvarchar(4000)), N'') FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs index f0b0191919b..9648932e215 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs @@ -2864,7 +2864,7 @@ public override async Task Where_coalesce(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableBoolA], CAST(1 AS bit)) = CAST(1 AS bit) +WHERE ISNULL([e].[NullableBoolA], CAST(1 AS bit)) = CAST(1 AS bit) """); } @@ -2888,7 +2888,7 @@ public override async Task Where_coalesce_shortcircuit_many(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableBoolA], CASE +WHERE ISNULL([e].[NullableBoolA], CASE WHEN [e].[BoolA] = CAST(1 AS bit) OR [e].[BoolB] = CAST(1 AS bit) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END) = CAST(1 AS bit) @@ -2927,7 +2927,7 @@ public override async Task Where_equal_with_coalesce(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableStringA], [e].[NullableStringB]) = [e].[NullableStringC] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL AND [e].[NullableStringC] IS NULL) +WHERE ISNULL([e].[NullableStringA], [e].[NullableStringB]) = [e].[NullableStringC] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL AND [e].[NullableStringC] IS NULL) """); } @@ -2939,7 +2939,7 @@ public override async Task Where_not_equal_with_coalesce(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE (COALESCE([e].[NullableStringA], [e].[NullableStringB]) <> [e].[NullableStringC] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) +WHERE (ISNULL([e].[NullableStringA], [e].[NullableStringB]) <> [e].[NullableStringC] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) """); } @@ -2951,7 +2951,7 @@ public override async Task Where_equal_with_coalesce_both_sides(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableStringA], [e].[NullableStringB]) = COALESCE([e].[NullableStringC], [e].[StringA]) +WHERE ISNULL([e].[NullableStringA], [e].[NullableStringB]) = ISNULL([e].[NullableStringC], [e].[StringA]) """); } @@ -2963,7 +2963,7 @@ public override async Task Where_not_equal_with_coalesce_both_sides(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE (COALESCE([e].[NullableIntA], [e].[NullableIntB]) <> COALESCE([e].[NullableIntC], [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) OR ([e].[NullableIntC] IS NULL AND [e].[NullableIntB] IS NULL)) AND ([e].[NullableIntA] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL OR [e].[NullableIntC] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL) +WHERE (ISNULL([e].[NullableIntA], [e].[NullableIntB]) <> ISNULL([e].[NullableIntC], [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) OR ([e].[NullableIntC] IS NULL AND [e].[NullableIntB] IS NULL)) AND ([e].[NullableIntA] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL OR [e].[NullableIntC] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL) """); } @@ -3414,7 +3414,7 @@ public override async Task Projecting_nullable_bool_with_coalesce(bool async) AssertSql( """ -SELECT [e].[Id], COALESCE([e].[NullableBoolA], CAST(0 AS bit)) AS [Coalesce] +SELECT [e].[Id], ISNULL([e].[NullableBoolA], CAST(0 AS bit)) AS [Coalesce] FROM [Entities1] AS [e] """); } @@ -3425,12 +3425,12 @@ public override async Task Projecting_nullable_bool_with_coalesce_nested(bool as AssertSql( """ -SELECT [e].[Id], COALESCE([e].[NullableBoolA], [e].[NullableBoolB], CAST(0 AS bit)) AS [Coalesce] +SELECT [e].[Id], ISNULL(ISNULL([e].[NullableBoolA], [e].[NullableBoolB]), CAST(0 AS bit)) AS [Coalesce] FROM [Entities1] AS [e] """, // """ -SELECT [e].[Id], COALESCE([e].[NullableBoolA], [e].[NullableBoolB], CAST(0 AS bit)) AS [Coalesce] +SELECT [e].[Id], ISNULL(ISNULL([e].[NullableBoolA], [e].[NullableBoolB]), CAST(0 AS bit)) AS [Coalesce] FROM [Entities1] AS [e] """); } @@ -3537,25 +3537,25 @@ public override async Task Null_semantics_coalesce(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE [e].[NullableBoolA] = COALESCE([e].[NullableBoolB], [e].[BoolC]) +WHERE [e].[NullableBoolA] = ISNULL([e].[NullableBoolB], [e].[BoolC]) """, // """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE [e].[NullableBoolA] = COALESCE([e].[NullableBoolB], [e].[NullableBoolC]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) +WHERE [e].[NullableBoolA] = ISNULL([e].[NullableBoolB], [e].[NullableBoolC]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) """, // """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableBoolB], [e].[BoolC]) <> [e].[NullableBoolA] OR [e].[NullableBoolA] IS NULL +WHERE ISNULL([e].[NullableBoolB], [e].[BoolC]) <> [e].[NullableBoolA] OR [e].[NullableBoolA] IS NULL """, // """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE (COALESCE([e].[NullableBoolB], [e].[NullableBoolC]) <> [e].[NullableBoolA] OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolB] IS NOT NULL OR [e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) +WHERE (ISNULL([e].[NullableBoolB], [e].[NullableBoolC]) <> [e].[NullableBoolA] OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolB] IS NOT NULL OR [e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) """); } @@ -3633,7 +3633,7 @@ FROM [Entities1] AS [e] INNER JOIN [Entities2] AS [e0] ON ([e].[NullableStringA] = [e0].[NullableStringB] OR ([e].[NullableStringA] IS NULL AND [e0].[NullableStringB] IS NULL)) AND CASE WHEN ([e].[NullableStringB] <> [e].[NullableStringC] OR [e].[NullableStringB] IS NULL OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringB] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) -END = COALESCE([e0].[NullableBoolA], [e0].[BoolC]) +END = ISNULL([e0].[NullableBoolA], [e0].[BoolC]) """); } @@ -4324,7 +4324,7 @@ public override async Task Coalesce_not_equal(bool async) """ SELECT [e].[Id] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableIntA], 0) <> 0 +WHERE ISNULL([e].[NullableIntA], 0) <> 0 """); } @@ -5194,7 +5194,7 @@ public override async Task Sum_function_is_always_considered_non_nullable(bool a AssertSql( """ SELECT [e].[NullableIntA] AS [Key], CASE - WHEN COALESCE(SUM([e].[IntA]), 0) <> [e].[NullableIntA] OR [e].[NullableIntA] IS NULL THEN CAST(1 AS bit) + WHEN ISNULL(SUM([e].[IntA]), 0) <> [e].[NullableIntA] OR [e].[NullableIntA] IS NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END AS [Sum] FROM [Entities1] AS [e] @@ -5210,7 +5210,7 @@ public override async Task Nullability_is_computed_correctly_for_chained_coalesc """ SELECT [e].[Id], [e].[BoolA], [e].[BoolB], [e].[BoolC], [e].[IntA], [e].[IntB], [e].[IntC], [e].[NullableBoolA], [e].[NullableBoolB], [e].[NullableBoolC], [e].[NullableIntA], [e].[NullableIntB], [e].[NullableIntC], [e].[NullableStringA], [e].[NullableStringB], [e].[NullableStringC], [e].[StringA], [e].[StringB], [e].[StringC] FROM [Entities1] AS [e] -WHERE COALESCE([e].[NullableIntA], [e].[NullableIntB], [e].[IntC]) <> [e].[NullableIntC] OR [e].[NullableIntC] IS NULL +WHERE ISNULL(ISNULL([e].[NullableIntA], [e].[NullableIntB]), [e].[IntC]) <> [e].[NullableIntC] OR [e].[NullableIntC] IS NULL """); } @@ -5249,7 +5249,7 @@ public override async Task Coalesce_deeply_nested(bool async) AssertSql( """ -SELECT COALESCE([e].[NullableIntA], [e].[NullableIntB], [e0].[NullableIntC], [e0].[NullableIntB], [e].[NullableIntC], [e0].[NullableIntA]) +SELECT ISNULL(ISNULL(ISNULL(ISNULL(ISNULL([e].[NullableIntA], [e].[NullableIntB]), [e0].[NullableIntC]), [e0].[NullableIntB]), [e].[NullableIntC]), [e0].[NullableIntA]) FROM [Entities1] AS [e] INNER JOIN [Entities2] AS [e0] ON [e].[Id] = [e0].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs index 9ca825bc5c9..6de286ab60a 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs @@ -550,7 +550,7 @@ public override async Task Projecting_owned_collection_and_aggregate(bool async) AssertSql( """ SELECT [b].[Id], ( - SELECT COALESCE(SUM([p].[CommentsCount]), 0) + SELECT ISNULL(SUM([p].[CommentsCount]), 0) FROM [Post] AS [p] WHERE [b].[Id] = [p].[BlogId]), [p0].[Title], [p0].[CommentsCount], [p0].[BlogId], [p0].[Id] FROM [Blog] AS [b] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/OwnedQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/OwnedQuerySqlServerTest.cs index e35bd90e128..5113b7cac76 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/OwnedQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/OwnedQuerySqlServerTest.cs @@ -1320,7 +1320,7 @@ FROM [OwnedPerson] AS [o2] LEFT JOIN [Planet] AS [p] ON [o1].[PersonAddress_Country_PlanetId] = [p].[Id] LEFT JOIN [Star] AS [s] ON [p].[StarId] = [s].[Id] WHERE [o0].[Key] = [o1].[Key]) AS [p1], ( - SELECT COALESCE(SUM([s0].[Id]), 0) + SELECT ISNULL(SUM([s0].[Id]), 0) FROM ( SELECT 1 AS [Key], [o4].[PersonAddress_Country_PlanetId] FROM [OwnedPerson] AS [o4] @@ -1500,7 +1500,7 @@ public override async Task GroupBy_aggregate_on_owned_navigation_in_aggregate_se AssertSql( """ SELECT [o].[Id] AS [Key], ( - SELECT COALESCE(SUM([o0].[PersonAddress_Country_PlanetId]), 0) + SELECT ISNULL(SUM([o0].[PersonAddress_Country_PlanetId]), 0) FROM [OwnedPerson] AS [o0] WHERE [o].[Id] = [o0].[Id]) AS [Sum] FROM [OwnedPerson] AS [o] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/PrecompiledQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/PrecompiledQuerySqlServerTest.cs index b06bd80a435..99737689e5b 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/PrecompiledQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/PrecompiledQuerySqlServerTest.cs @@ -360,7 +360,7 @@ public override async Task Select_anonymous_object() AssertSql( """ -SELECT COALESCE([b].[Name], N'') + N'Foo' AS [Foo] +SELECT ISNULL([b].[Name], N'') + N'Foo' AS [Foo] FROM [Blogs] AS [b] """); } @@ -1453,12 +1453,12 @@ public override async Task Terminating_Sum() AssertSql( """ -SELECT COALESCE(SUM([b].[Id]), 0) +SELECT ISNULL(SUM([b].[Id]), 0) FROM [Blogs] AS [b] """, // """ -SELECT COALESCE(SUM([b].[Id]), 0) +SELECT ISNULL(SUM([b].[Id]), 0) FROM [Blogs] AS [b] """); } @@ -1469,12 +1469,12 @@ public override async Task Terminating_SumAsync() AssertSql( """ -SELECT COALESCE(SUM([b].[Id]), 0) +SELECT ISNULL(SUM([b].[Id]), 0) FROM [Blogs] AS [b] """, // """ -SELECT COALESCE(SUM([b].[Id]), 0) +SELECT ISNULL(SUM([b].[Id]), 0) FROM [Blogs] AS [b] """); } @@ -1522,7 +1522,7 @@ public override async Task Terminating_ExecuteUpdate_with_lambda() @suffix='Suffix' (Size = 4000) UPDATE [b] -SET [b].[Name] = COALESCE([b].[Name], N'') + @suffix +SET [b].[Name] = ISNULL([b].[Name], N'') + @suffix FROM [Blogs] AS [b] WHERE [b].[Id] > 8 """, @@ -1564,7 +1564,7 @@ public override async Task Terminating_ExecuteUpdateAsync_with_lambda() @suffix='Suffix' (Size = 4000) UPDATE [b] -SET [b].[Name] = COALESCE([b].[Name], N'') + @suffix +SET [b].[Name] = ISNULL([b].[Name], N'') + @suffix FROM [Blogs] AS [b] WHERE [b].[Id] > 8 """, @@ -1856,7 +1856,7 @@ await Test( AssertSql( """ -SELECT COALESCE(STRING_AGG(COALESCE([b].[Name], N''), N', ') WITHIN GROUP (ORDER BY [b].[Name]), N'') +SELECT ISNULL(STRING_AGG(ISNULL([b].[Name], N''), N', ') WITHIN GROUP (ORDER BY [b].[Name]), N'') FROM [Blogs] AS [b] GROUP BY [b].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs index 4bd605ae90a..25f7fc08350 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs @@ -1213,7 +1213,7 @@ public override async Task Column_collection_FirstOrDefault(bool async) """ SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[NullableWrappedId], [p].[NullableWrappedIdWithNullableComparer], [p].[String], [p].[Strings], [p].[WrappedId] FROM [PrimitiveCollectionsEntity] AS [p] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) CAST([i].[value] AS int) AS [value] FROM OPENJSON([p].[Ints]) AS [i] ORDER BY CAST([i].[key] AS int)), 0) = 1 @@ -1243,7 +1243,7 @@ public override async Task Column_collection_SingleOrDefault(bool async) """ SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[NullableWrappedId], [p].[NullableWrappedIdWithNullableComparer], [p].[String], [p].[Strings], [p].[WrappedId] FROM [PrimitiveCollectionsEntity] AS [p] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) CAST([i].[value] AS int) AS [value] FROM OPENJSON([p].[Ints]) AS [i] ORDER BY CAST([i].[key] AS int)), 0) = 1 diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs index becd3a60035..0f302466b05 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs @@ -1236,7 +1236,7 @@ public override async Task Column_collection_FirstOrDefault(bool async) """ SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[NullableWrappedId], [p].[NullableWrappedIdWithNullableComparer], [p].[String], [p].[Strings], [p].[WrappedId] FROM [PrimitiveCollectionsEntity] AS [p] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) CAST([i].[value] AS int) AS [value] FROM OPENJSON([p].[Ints]) AS [i] ORDER BY CAST([i].[key] AS int)), 0) = 1 @@ -1266,7 +1266,7 @@ public override async Task Column_collection_SingleOrDefault(bool async) """ SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[NullableWrappedId], [p].[NullableWrappedIdWithNullableComparer], [p].[String], [p].[Strings], [p].[WrappedId] FROM [PrimitiveCollectionsEntity] AS [p] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) CAST([i].[value] AS int) AS [value] FROM OPENJSON([p].[Ints]) AS [i] ORDER BY CAST([i].[key] AS int)), 0) = 1 diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs index dab41cd54b4..9588c6ea38b 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs @@ -895,7 +895,7 @@ public override async Task Select_null_propagation_optimization8(bool async) AssertSql( """ -SELECT COALESCE([u].[LeaderNickname], N'') + COALESCE([u].[LeaderNickname], N'') +SELECT ISNULL(CAST([u].[LeaderNickname] AS nvarchar(4000)), N'') + ISNULL(CAST([u].[LeaderNickname] AS nvarchar(4000)), N'') FROM ( SELECT [g].[Nickname], [g].[SquadId], [g].[LeaderNickname] FROM [Gears] AS [g] @@ -1502,7 +1502,7 @@ public override async Task Optional_Navigation_Null_Coalesce_To_Clr_Type(bool as AssertSql( """ -SELECT TOP(1) COALESCE([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] +SELECT TOP(1) ISNULL([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] ORDER BY [w].[Id] @@ -1523,7 +1523,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[AssignedCityName], [o].[CityOfBirthName], [o].[FullName], [o].[HasSoulPatch], [o].[LeaderNickname], [o].[LeaderSquadId], [o].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o] ) AS [u] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -1567,7 +1567,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[AssignedCityName], [o].[CityOfBirthName], [o].[FullName], [o].[HasSoulPatch], [o].[LeaderNickname], [o].[LeaderSquadId], [o].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o] ) AS [u] -WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1643,7 +1643,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[AssignedCityName], [o].[CityOfBirthName], [o].[FullName], [o].[HasSoulPatch], [o].[LeaderNickname], [o].[LeaderSquadId], [o].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o] ) AS [u] -WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1668,7 +1668,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[AssignedCityName], [o].[CityOfBirthName], [o].[FullName], [o].[HasSoulPatch], [o].[LeaderNickname], [o].[LeaderSquadId], [o].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o] ) AS [u] -WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) = CAST(1 AS bit) @@ -1767,7 +1767,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[AssignedCityName], [o].[CityOfBirthName], [o].[FullName], [o].[HasSoulPatch], [o].[LeaderNickname], [o].[LeaderSquadId], [o].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o] ) AS [u] -WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [u].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -2404,7 +2404,7 @@ public override async Task Unicode_string_literals_is_used_for_non_unicode_colum """ SELECT [c].[Name], [c].[Location], [c].[Nation] FROM [Cities] AS [c] -WHERE COALESCE([c].[Location], N'') + N'Added' LIKE N'%Add%' +WHERE ISNULL([c].[Location], N'') + N'Added' LIKE N'%Add%' """); } @@ -2625,7 +2625,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[HasSoulPatch] FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] -WHERE COALESCE([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ISNULL([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -2644,7 +2644,7 @@ UNION ALL SELECT [o].[Nickname], [o].[SquadId], [o].[HasSoulPatch] FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] -WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -2655,7 +2655,7 @@ public override async Task Coalesce_operator_in_projection_with_other_conditions AssertSql( """ SELECT CASE - WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) + WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([u].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END FROM [Tags] AS [t] @@ -3259,7 +3259,7 @@ public override async Task Sum_with_optional_navigation_is_translated_to_sql(boo AssertSql( """ -SELECT COALESCE(SUM([u].[SquadId]), 0) +SELECT ISNULL(SUM([u].[SquadId]), 0) FROM ( SELECT [g].[Nickname], [g].[SquadId] FROM [Gears] AS [g] @@ -6273,7 +6273,7 @@ public override async Task Negated_bool_ternary_inside_anonymous_type_in_project """ SELECT ~CASE WHEN [u].[HasSoulPatch] = CAST(1 AS bit) THEN CAST(1 AS bit) - ELSE COALESCE([u].[HasSoulPatch], CAST(1 AS bit)) + ELSE ISNULL([u].[HasSoulPatch], CAST(1 AS bit)) END AS [c] FROM [Tags] AS [t] LEFT JOIN ( @@ -6561,7 +6561,7 @@ public override async Task Project_one_value_type_from_empty_collection(bool asy AssertSql( """ -SELECT [s].[Name], COALESCE(( +SELECT [s].[Name], ISNULL(( SELECT TOP(1) [u].[SquadId] FROM ( SELECT [g].[SquadId], [g].[HasSoulPatch] @@ -6632,7 +6632,7 @@ public override async Task Filter_on_subquery_projecting_one_value_type_from_emp """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Kilo' AND COALESCE(( +WHERE [s].[Name] = N'Kilo' AND ISNULL(( SELECT TOP(1) [u].[SquadId] FROM ( SELECT [g].[SquadId], [g].[HasSoulPatch] @@ -6916,7 +6916,7 @@ UNION ALL SELECT [o0].[Nickname], [o0].[SquadId], [o0].[AssignedCityName], [o0].[CityOfBirthName], [o0].[FullName], [o0].[HasSoulPatch], [o0].[LeaderNickname], [o0].[LeaderSquadId], [o0].[Rank], N'Officer' AS [Discriminator] FROM [Officers] AS [o0] ) AS [u0] ON [u].[Nickname] = [u0].[LeaderNickname] AND [u].[SquadId] = [u0].[LeaderSquadId] -ORDER BY COALESCE(( +ORDER BY ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -6978,7 +6978,7 @@ FROM [Officers] AS [o1] ORDER BY ( SELECT COUNT(*) FROM [Weapons] AS [w] - WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = COALESCE(( + WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = ISNULL(( SELECT TOP(1) [u0].[HasSoulPatch] FROM ( SELECT [g].[Nickname], [g].[HasSoulPatch] @@ -7008,7 +7008,7 @@ public override async Task Select_subquery_boolean(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -7050,7 +7050,7 @@ public override async Task Select_subquery_int_with_inside_cast_and_coalesce(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -7071,7 +7071,7 @@ public override async Task Select_subquery_int_with_outside_cast_and_coalesce(bo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -7092,7 +7092,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce(bool a AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -7113,7 +7113,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce2(bool AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] @@ -7138,7 +7138,7 @@ public override async Task Select_subquery_boolean_empty(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG' @@ -7180,7 +7180,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean1(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -7204,7 +7204,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean2(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) @@ -7249,7 +7249,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -7273,7 +7273,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [u].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG'), CAST(0 AS bit)) @@ -7492,7 +7492,7 @@ public override async Task String_concat_with_null_conditional_argument(bool asy SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + CAST(5 AS nvarchar(max)) +ORDER BY ISNULL([w0].[Name], N'') + CAST(5 AS nvarchar(max)) """); } @@ -7505,7 +7505,7 @@ public override async Task String_concat_with_null_conditional_argument2(bool as SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + N'Marcus'' Lancer' +ORDER BY ISNULL([w0].[Name], N'') + N'Marcus'' Lancer' """); } @@ -7552,7 +7552,7 @@ public override async Task GroupBy_Property_Include_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([u].[SquadId]), 0) +SELECT ISNULL(SUM([u].[SquadId]), 0) FROM ( SELECT [g].[SquadId], [g].[Rank] FROM [Gears] AS [g] @@ -7837,7 +7837,7 @@ public override async Task GetValueOrDefault_in_projection(bool async) AssertSql( """ -SELECT COALESCE([w].[SynergyWithId], 0) +SELECT ISNULL([w].[SynergyWithId], 0) FROM [Weapons] AS [w] """); } @@ -7850,7 +7850,7 @@ public override async Task GetValueOrDefault_in_filter(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], 0) = 0 +WHERE ISNULL([w].[SynergyWithId], 0) = 0 """); } @@ -7874,7 +7874,7 @@ public override async Task GetValueOrDefault_in_order_by(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -ORDER BY COALESCE([w].[SynergyWithId], 0), [w].[Id] +ORDER BY ISNULL([w].[SynergyWithId], 0), [w].[Id] """); } @@ -7886,7 +7886,7 @@ public override async Task GetValueOrDefault_with_argument(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], [w].[Id]) = 1 +WHERE ISNULL([w].[SynergyWithId], [w].[Id]) = 1 """); } @@ -7898,7 +7898,7 @@ public override async Task GetValueOrDefault_with_argument_complex(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 +WHERE ISNULL([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 """); } @@ -9967,7 +9967,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL([c].[Location], 'Unknown') FROM [Cities] AS [c] """); } @@ -10162,7 +10162,7 @@ public override async Task FirstOrDefault_over_int_compared_to_zero(bool async) """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Delta' AND COALESCE(( +WHERE [s].[Name] = N'Delta' AND ISNULL(( SELECT TOP(1) [u].[SquadId] FROM ( SELECT [g].[SquadId], [g].[FullName], [g].[HasSoulPatch] @@ -11070,7 +11070,7 @@ public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_sub AssertSql( """ -SELECT [u].[Nickname], COALESCE(( +SELECT [u].[Nickname], ISNULL(( SELECT TOP(1) [t1].[IssueDate] FROM [Tags] AS [t1] WHERE [t1].[GearNickName] = [u].[FullName] @@ -11083,7 +11083,7 @@ UNION ALL FROM [Officers] AS [o] ) AS [u] LEFT JOIN [Tags] AS [t] ON [u].[Nickname] = [t].[GearNickName] AND [u].[SquadId] = [t].[GearSquadId] -WHERE [t].[IssueDate] > COALESCE(( +WHERE [t].[IssueDate] > ISNULL(( SELECT TOP(1) [t0].[IssueDate] FROM [Tags] AS [t0] WHERE [t0].[GearNickName] = [u].[FullName] @@ -11125,7 +11125,7 @@ public override async Task Sum_with_no_data_nullable_double(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] WHERE [m].[CodeName] = N'Operation Foobar' """); @@ -11332,7 +11332,7 @@ public override async Task GroupBy_Select_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] GROUP BY [m].[CodeName] """); @@ -11450,7 +11450,7 @@ public override async Task String_concat_nullable_expressions_are_coalesced(bool AssertSql( """ -SELECT [u].[FullName] + N'' + COALESCE([u].[LeaderNickname], N'') + N'' +SELECT [u].[FullName] + N'' + ISNULL(CAST([u].[LeaderNickname] AS nvarchar(4000)), N'') + N'' FROM ( SELECT [g].[FullName], [g].[LeaderNickname] FROM [Gears] AS [g] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyNoTrackingQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyNoTrackingQuerySqlServerTest.cs index 34fee9860a0..bc639559771 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyNoTrackingQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyNoTrackingQuerySqlServerTest.cs @@ -218,7 +218,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM ( SELECT [r].[Id] FROM [Roots] AS [r] @@ -292,7 +292,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyQuerySqlServerTest.cs index 81ee7a2b2c9..faf3f95df6f 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCManyToManyQuerySqlServerTest.cs @@ -218,7 +218,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM ( SELECT [r].[Id] FROM [Roots] AS [r] @@ -292,7 +292,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs index 433caeeebc2..36b600431e3 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs @@ -851,7 +851,7 @@ public override async Task Select_null_propagation_optimization8(bool async) AssertSql( """ -SELECT COALESCE([g].[LeaderNickname], N'') + COALESCE([g].[LeaderNickname], N'') +SELECT ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') FROM [Gears] AS [g] """); } @@ -1299,7 +1299,7 @@ public override async Task Optional_Navigation_Null_Coalesce_To_Clr_Type(bool as AssertSql( """ -SELECT TOP(1) COALESCE([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] +SELECT TOP(1) ISNULL([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] ORDER BY [w].[Id] @@ -1317,7 +1317,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -1355,7 +1355,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1422,7 +1422,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -1444,7 +1444,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) = CAST(1 AS bit) @@ -1531,7 +1531,7 @@ WHEN [o].[Nickname] IS NOT NULL THEN N'Officer' END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -2064,7 +2064,7 @@ public override async Task Unicode_string_literals_is_used_for_non_unicode_colum """ SELECT [c].[Name], [c].[Location], [c].[Nation] FROM [Cities] AS [c] -WHERE COALESCE([c].[Location], N'') + N'Added' LIKE N'%Add%' +WHERE ISNULL([c].[Location], N'') + N'Added' LIKE N'%Add%' """); } @@ -2265,7 +2265,7 @@ LEFT JOIN ( SELECT [g].[Nickname], [g].[SquadId], [g].[HasSoulPatch] FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] -WHERE COALESCE([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ISNULL([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -2281,7 +2281,7 @@ LEFT JOIN ( SELECT [g].[Nickname], [g].[SquadId], [g].[HasSoulPatch] FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] -WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -2292,7 +2292,7 @@ public override async Task Coalesce_operator_in_projection_with_other_conditions AssertSql( """ SELECT CASE - WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) + WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([s].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END FROM [Tags] AS [t] @@ -2802,7 +2802,7 @@ public override async Task Sum_with_optional_navigation_is_translated_to_sql(boo AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] WHERE [t].[Note] <> N'Foo' OR [t].[Note] IS NULL @@ -5324,7 +5324,7 @@ public override async Task Negated_bool_ternary_inside_anonymous_type_in_project """ SELECT ~CASE WHEN [s].[HasSoulPatch] = CAST(1 AS bit) THEN CAST(1 AS bit) - ELSE COALESCE([s].[HasSoulPatch], CAST(1 AS bit)) + ELSE ISNULL([s].[HasSoulPatch], CAST(1 AS bit)) END AS [c] FROM [Tags] AS [t] LEFT JOIN ( @@ -5556,7 +5556,7 @@ public override async Task Project_one_value_type_from_empty_collection(bool asy AssertSql( """ -SELECT [s].[Name], COALESCE(( +SELECT [s].[Name], ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) AS [SquadId] @@ -5609,7 +5609,7 @@ public override async Task Filter_on_subquery_projecting_one_value_type_from_emp """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Kilo' AND COALESCE(( +WHERE [s].[Name] = N'Kilo' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) <> 0 @@ -5842,7 +5842,7 @@ FROM [Gears] AS [g0] LEFT JOIN [Officers] AS [o0] ON [g0].[Nickname] = [o0].[Nickname] AND [g0].[SquadId] = [o0].[SquadId] ) AS [s] ON [g].[Nickname] = [s].[LeaderNickname] AND [g].[SquadId] = [s].[LeaderSquadId] WHERE [o].[Nickname] IS NOT NULL -ORDER BY COALESCE(( +ORDER BY ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5896,7 +5896,7 @@ WHERE [o].[Nickname] IS NOT NULL ORDER BY ( SELECT COUNT(*) FROM [Weapons] AS [w] - WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = COALESCE(( + WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = ISNULL(( SELECT TOP(1) [g0].[HasSoulPatch] FROM [Gears] AS [g0] WHERE [g0].[Nickname] = N'Marcus'), CAST(0 AS bit))), [g].[Nickname], [g].[SquadId], [s].[Nickname] @@ -5924,7 +5924,7 @@ public override async Task Select_subquery_boolean(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5954,7 +5954,7 @@ public override async Task Select_subquery_int_with_inside_cast_and_coalesce(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5969,7 +5969,7 @@ public override async Task Select_subquery_int_with_outside_cast_and_coalesce(bo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5984,7 +5984,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce(bool a AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -5999,7 +5999,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce2(bool AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -6018,7 +6018,7 @@ public override async Task Select_subquery_boolean_empty(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG' @@ -6048,7 +6048,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean1(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -6066,7 +6066,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean2(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) @@ -6099,7 +6099,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] @@ -6117,7 +6117,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG'), CAST(0 AS bit)) @@ -6312,7 +6312,7 @@ public override async Task String_concat_with_null_conditional_argument(bool asy SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + CAST(5 AS nvarchar(max)) +ORDER BY ISNULL([w0].[Name], N'') + CAST(5 AS nvarchar(max)) """); } @@ -6325,7 +6325,7 @@ public override async Task String_concat_with_null_conditional_argument2(bool as SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[SynergyWithId] FROM [Weapons] AS [w] LEFT JOIN [Weapons] AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + N'Marcus'' Lancer' +ORDER BY ISNULL([w0].[Name], N'') + N'Marcus'' Lancer' """); } @@ -6360,7 +6360,7 @@ public override async Task GroupBy_Property_Include_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] AS [g] GROUP BY [g].[Rank] """); @@ -6577,7 +6577,7 @@ public override async Task GetValueOrDefault_in_projection(bool async) AssertSql( """ -SELECT COALESCE([w].[SynergyWithId], 0) +SELECT ISNULL([w].[SynergyWithId], 0) FROM [Weapons] AS [w] """); } @@ -6590,7 +6590,7 @@ public override async Task GetValueOrDefault_in_filter(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], 0) = 0 +WHERE ISNULL([w].[SynergyWithId], 0) = 0 """); } @@ -6614,7 +6614,7 @@ public override async Task GetValueOrDefault_in_order_by(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -ORDER BY COALESCE([w].[SynergyWithId], 0), [w].[Id] +ORDER BY ISNULL([w].[SynergyWithId], 0), [w].[Id] """); } @@ -6626,7 +6626,7 @@ public override async Task GetValueOrDefault_with_argument(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], [w].[Id]) = 1 +WHERE ISNULL([w].[SynergyWithId], [w].[Id]) = 1 """); } @@ -6638,7 +6638,7 @@ public override async Task GetValueOrDefault_with_argument_complex(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[SynergyWithId] FROM [Weapons] AS [w] -WHERE COALESCE([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 +WHERE ISNULL([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 """); } @@ -8427,7 +8427,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL([c].[Location], 'Unknown') FROM [Cities] AS [c] """); } @@ -8583,7 +8583,7 @@ public override async Task FirstOrDefault_over_int_compared_to_zero(bool async) """ SELECT [s].[Name] FROM [Squads] AS [s] -WHERE [s].[Name] = N'Delta' AND COALESCE(( +WHERE [s].[Name] = N'Delta' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit) @@ -9362,14 +9362,14 @@ public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_sub AssertSql( """ -SELECT [g].[Nickname], COALESCE(( +SELECT [g].[Nickname], ISNULL(( SELECT TOP(1) [t1].[IssueDate] FROM [Tags] AS [t1] WHERE [t1].[GearNickName] = [g].[FullName] ORDER BY [t1].[Id]), '0001-01-01T00:00:00.0000000') AS [invalidTagIssueDate] FROM [Gears] AS [g] LEFT JOIN [Tags] AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[IssueDate] > COALESCE(( +WHERE [t].[IssueDate] > ISNULL(( SELECT TOP(1) [t0].[IssueDate] FROM [Tags] AS [t0] WHERE [t0].[GearNickName] = [g].[FullName] @@ -9430,7 +9430,7 @@ public override async Task Sum_with_no_data_nullable_double(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] WHERE [m].[CodeName] = N'Operation Foobar' """); @@ -9612,7 +9612,7 @@ public override async Task GroupBy_Select_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] AS [m] GROUP BY [m].[CodeName] """); @@ -9730,7 +9730,7 @@ public override async Task String_concat_nullable_expressions_are_coalesced(bool AssertSql( """ -SELECT [g].[FullName] + N'' + COALESCE([g].[LeaderNickname], N'') + N'' +SELECT [g].[FullName] + N'' + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + N'' FROM [Gears] AS [g] """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyNoTrackingQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyNoTrackingQuerySqlServerTest.cs index 510bfc06e16..37af3f7613f 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyNoTrackingQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyNoTrackingQuerySqlServerTest.cs @@ -208,7 +208,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM [Roots] AS [r] INNER JOIN ( SELECT [e0].[Key1], [e].[RootSkipSharedId] @@ -272,7 +272,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyQuerySqlServerTest.cs index c67b573d2f7..2814a9bc216 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTManyToManyQuerySqlServerTest.cs @@ -207,7 +207,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM [Roots] AS [r] INNER JOIN ( SELECT [e0].[Key1], [e].[RootSkipSharedId] @@ -271,7 +271,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] AS [e0] INNER JOIN [EntityOnes] AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs index df6e31c2bed..b28e95de6e1 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs @@ -454,7 +454,7 @@ public override async Task String_concat_with_null_conditional_argument(bool asy SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[PeriodEnd], [w0].[PeriodStart], [w0].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] LEFT JOIN [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + CAST(5 AS nvarchar(max)) +ORDER BY ISNULL([w0].[Name], N'') + CAST(5 AS nvarchar(max)) """); } @@ -526,7 +526,7 @@ public override async Task Select_subquery_int_with_outside_cast_and_coalesce(bo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -1087,7 +1087,7 @@ public override async Task String_concat_with_null_conditional_argument2(bool as SELECT [w0].[Id], [w0].[AmmunitionType], [w0].[IsAutomatic], [w0].[Name], [w0].[OwnerFullName], [w0].[PeriodEnd], [w0].[PeriodStart], [w0].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] LEFT JOIN [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w0] ON [w].[SynergyWithId] = [w0].[Id] -ORDER BY COALESCE([w0].[Name], N'') + N'Marcus'' Lancer' +ORDER BY ISNULL([w0].[Name], N'') + N'Marcus'' Lancer' """); } @@ -1126,7 +1126,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean2(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) @@ -1397,7 +1397,7 @@ public override async Task Project_one_value_type_from_empty_collection(bool asy AssertSql( """ -SELECT [s].[Name], COALESCE(( +SELECT [s].[Name], ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) AS [SquadId] @@ -1636,7 +1636,7 @@ public override async Task Where_subquery_boolean(bool async) """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] -WHERE COALESCE(( +WHERE ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -1958,7 +1958,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce(bool a AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -1973,7 +1973,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG'), CAST(0 AS bit)) @@ -2416,7 +2416,7 @@ public override async Task GetValueOrDefault_in_order_by(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] -ORDER BY COALESCE([w].[SynergyWithId], 0), [w].[Id] +ORDER BY ISNULL([w].[SynergyWithId], 0), [w].[Id] """); } @@ -2426,7 +2426,7 @@ public override async Task GroupBy_Property_Include_Select_Sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] GROUP BY [g].[Rank] """); @@ -2816,7 +2816,7 @@ public override async Task GetValueOrDefault_in_projection(bool async) AssertSql( """ -SELECT COALESCE([w].[SynergyWithId], 0) +SELECT ISNULL([w].[SynergyWithId], 0) FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] """); } @@ -2915,7 +2915,7 @@ public override async Task Include_collection_with_complex_OrderBy3(bool async) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g0] ON [g].[Nickname] = [g0].[LeaderNickname] AND [g].[SquadId] = [g0].[LeaderSquadId] WHERE [g].[Discriminator] = N'Officer' -ORDER BY COALESCE(( +ORDER BY ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -3221,7 +3221,7 @@ public override async Task GetValueOrDefault_with_argument_complex(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] -WHERE COALESCE([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 +WHERE ISNULL([w].[SynergyWithId], CAST(LEN([w].[Name]) AS int) + 42) > 10 """); } @@ -3313,7 +3313,7 @@ public override async Task Filter_on_subquery_projecting_one_value_type_from_emp """ SELECT [s].[Name] FROM [Squads] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [s] -WHERE [s].[Name] = N'Kilo' AND COALESCE(( +WHERE [s].[Name] = N'Kilo' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit)), 0) <> 0 @@ -3364,7 +3364,7 @@ public override async Task GroupBy_Select_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [m] GROUP BY [m].[CodeName] """); @@ -3401,7 +3401,7 @@ public override async Task Select_subquery_boolean_empty(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] = N'BFG' @@ -3555,7 +3555,7 @@ public override async Task Optional_Navigation_Null_Coalesce_To_Clr_Type(bool as AssertSql( """ -SELECT TOP(1) COALESCE([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] +SELECT TOP(1) ISNULL([w0].[IsAutomatic], CAST(0 AS bit)) AS [IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] LEFT JOIN [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w0] ON [w].[SynergyWithId] = [w0].[Id] ORDER BY [w].[Id] @@ -3639,7 +3639,7 @@ public override async Task Select_subquery_int_with_inside_cast_and_coalesce(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -3826,7 +3826,7 @@ public override async Task Negated_bool_ternary_inside_anonymous_type_in_project """ SELECT ~CASE WHEN [g].[HasSoulPatch] = CAST(1 AS bit) THEN CAST(1 AS bit) - ELSE COALESCE([g].[HasSoulPatch], CAST(1 AS bit)) + ELSE ISNULL([g].[HasSoulPatch], CAST(1 AS bit)) END AS [c] FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] @@ -4079,7 +4079,7 @@ public override async Task Where_subquery_distinct_firstordefault_boolean(bool a """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] @@ -4446,7 +4446,7 @@ public override async Task Coalesce_operator_in_predicate_with_other_conditions( SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note], [t].[PeriodEnd], [t].[PeriodStart] FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] -WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -4643,7 +4643,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean1(boo AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] @@ -4899,7 +4899,7 @@ public override async Task Unicode_string_literals_is_used_for_non_unicode_colum """ SELECT [c].[Name], [c].[Location], [c].[Nation], [c].[PeriodEnd], [c].[PeriodStart] FROM [Cities] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [c] -WHERE COALESCE([c].[Location], N'') + N'Added' LIKE N'%Add%' +WHERE ISNULL([c].[Location], N'') + N'Added' LIKE N'%Add%' """); } @@ -4930,7 +4930,7 @@ public override async Task Sum_with_optional_navigation_is_translated_to_sql(boo AssertSql( """ -SELECT COALESCE(SUM([g].[SquadId]), 0) +SELECT ISNULL(SUM([g].[SquadId]), 0) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] LEFT JOIN [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] WHERE [t].[Note] <> N'Foo' OR [t].[Note] IS NULL @@ -5133,7 +5133,7 @@ public override async Task GetValueOrDefault_in_filter(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] -WHERE COALESCE([w].[SynergyWithId], 0) = 0 +WHERE ISNULL([w].[SynergyWithId], 0) = 0 """); } @@ -5236,7 +5236,7 @@ public override async Task Where_subquery_distinct_singleordefault_boolean1(bool """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] @@ -5455,14 +5455,14 @@ public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_sub AssertSql( """ -SELECT [g].[Nickname], COALESCE(( +SELECT [g].[Nickname], ISNULL(( SELECT TOP(1) [t1].[IssueDate] FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t1] WHERE [t1].[GearNickName] = [g].[FullName] ORDER BY [t1].[Id]), '0001-01-01T00:00:00.0000000') AS [invalidTagIssueDate] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] LEFT JOIN [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] ON [g].[Nickname] = [t].[GearNickName] AND [g].[SquadId] = [t].[GearSquadId] -WHERE [t].[IssueDate] > COALESCE(( +WHERE [t].[IssueDate] > ISNULL(( SELECT TOP(1) [t0].[IssueDate] FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t0] WHERE [t0].[GearNickName] = [g].[FullName] @@ -5479,7 +5479,7 @@ public override async Task Coalesce_operator_in_predicate(bool async) SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note], [t].[PeriodEnd], [t].[PeriodStart] FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] LEFT JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] -WHERE COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) +WHERE ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) """); } @@ -5770,7 +5770,7 @@ public override async Task Where_subquery_distinct_singleordefault_boolean2(bool """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[Name] LIKE N'%Lancer%'), CAST(0 AS bit)) = CAST(1 AS bit) @@ -5845,7 +5845,7 @@ public override async Task Where_subquery_distinct_orderby_firstordefault_boolea """ SELECT [g].[Nickname], [g].[SquadId], [g].[AssignedCityName], [g].[CityOfBirthName], [g].[Discriminator], [g].[FullName], [g].[HasSoulPatch], [g].[LeaderNickname], [g].[LeaderSquadId], [g].[PeriodEnd], [g].[PeriodStart], [g].[Rank] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] -WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND COALESCE(( +WHERE [g].[HasSoulPatch] = CAST(1 AS bit) AND ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] @@ -6234,7 +6234,7 @@ public override async Task Select_subquery_boolean(bool async) AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[IsAutomatic] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -6313,7 +6313,7 @@ public override async Task Select_subquery_int_with_pushdown_and_coalesce2(bool AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w].[Id] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] WHERE [g].[FullName] = [w].[OwnerFullName] @@ -6651,7 +6651,7 @@ public override async Task Select_subquery_distinct_singleordefault_boolean_empt AssertSql( """ -SELECT COALESCE(( +SELECT ISNULL(( SELECT TOP(1) [w0].[IsAutomatic] FROM ( SELECT DISTINCT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] @@ -7554,7 +7554,7 @@ public override async Task Coalesce_operator_in_projection_with_other_conditions AssertSql( """ SELECT CASE - WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND COALESCE([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) + WHEN ([t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL) AND ISNULL([g].[HasSoulPatch], CAST(0 AS bit)) = CAST(1 AS bit) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END FROM [Tags] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [t] @@ -7668,7 +7668,7 @@ public override async Task GetValueOrDefault_with_argument(bool async) """ SELECT [w].[Id], [w].[AmmunitionType], [w].[IsAutomatic], [w].[Name], [w].[OwnerFullName], [w].[PeriodEnd], [w].[PeriodStart], [w].[SynergyWithId] FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] -WHERE COALESCE([w].[SynergyWithId], [w].[Id]) = 1 +WHERE ISNULL([w].[SynergyWithId], [w].[Id]) = 1 """); } @@ -7873,7 +7873,7 @@ public override async Task String_concat_nullable_expressions_are_coalesced(bool AssertSql( """ -SELECT [g].[FullName] + N'' + COALESCE([g].[LeaderNickname], N'') + N'' +SELECT [g].[FullName] + N'' + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + N'' FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); } @@ -7884,7 +7884,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL([c].[Location], 'Unknown') FROM [Cities] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [c] """); } @@ -7895,7 +7895,7 @@ public override async Task Select_null_propagation_optimization8(bool async) AssertSql( """ -SELECT COALESCE([g].[LeaderNickname], N'') + COALESCE([g].[LeaderNickname], N'') +SELECT ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') + ISNULL(CAST([g].[LeaderNickname] AS nvarchar(4000)), N'') FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); } @@ -8094,7 +8094,7 @@ public override async Task Sum_with_no_data_nullable_double(bool async) AssertSql( """ -SELECT COALESCE(SUM([m].[Rating]), 0.0E0) +SELECT ISNULL(SUM([m].[Rating]), 0.0E0) FROM [Missions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [m] WHERE [m].[CodeName] = N'Operation Foobar' """); @@ -8290,7 +8290,7 @@ LEFT JOIN ( ORDER BY ( SELECT COUNT(*) FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] - WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = COALESCE(( + WHERE [g].[FullName] = [w].[OwnerFullName] AND [w].[IsAutomatic] = ISNULL(( SELECT TOP(1) [g0].[HasSoulPatch] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g0] WHERE [g0].[Nickname] = N'Marcus'), CAST(0 AS bit))), [g].[Nickname], [g].[SquadId], [g2].[Nickname] @@ -8464,7 +8464,7 @@ public override async Task FirstOrDefault_over_int_compared_to_zero(bool async) """ SELECT [s].[Name] FROM [Squads] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [s] -WHERE [s].[Name] = N'Delta' AND COALESCE(( +WHERE [s].[Name] = N'Delta' AND ISNULL(( SELECT TOP(1) [g].[SquadId] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE [s].[Id] = [g].[SquadId] AND [g].[HasSoulPatch] = CAST(1 AS bit) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalManyToManyQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalManyToManyQuerySqlServerTest.cs index 0dd2d3faa06..c3d42db6c69 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalManyToManyQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalManyToManyQuerySqlServerTest.cs @@ -234,7 +234,7 @@ public override async Task Skip_navigation_select_many_sum(bool async) AssertSql( """ -SELECT COALESCE(SUM([s].[Key1]), 0) +SELECT ISNULL(SUM([s].[Key1]), 0) FROM [EntityRoots] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [e] INNER JOIN ( SELECT [e1].[Key1], [e0].[RootSkipSharedId] @@ -297,7 +297,7 @@ public override async Task Skip_navigation_select_subquery_sum(bool async) AssertSql( """ SELECT ( - SELECT COALESCE(SUM([e1].[Id]), 0) + SELECT ISNULL(SUM([e1].[Id]), 0) FROM [EntityOneEntityTwo] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [e0] INNER JOIN [EntityOnes] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [e1] ON [e0].[OneSkipSharedId] = [e1].[Id] WHERE [e].[Id] = [e0].[TwoSkipSharedId]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs index 7bf74ec7db7..e79e2792b6c 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs @@ -1298,7 +1298,7 @@ SELECT AVG(CAST([s].[Id] AS float)) LEFT JOIN [Planet] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [p] ON [o1].[PersonAddress_Country_PlanetId] = [p].[Id] LEFT JOIN [Star] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [s] ON [p].[StarId] = [s].[Id] WHERE [o0].[Key] = [o1].[Key]) AS [p1], ( - SELECT COALESCE(SUM([s0].[Id]), 0) + SELECT ISNULL(SUM([s0].[Id]), 0) FROM ( SELECT 1 AS [Key], [o4].[PersonAddress_Country_PlanetId] FROM [OwnedPerson] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [o4] @@ -1472,7 +1472,7 @@ public override async Task GroupBy_aggregate_on_owned_navigation_in_aggregate_se AssertSql( """ SELECT [o].[Id] AS [Key], ( - SELECT COALESCE(SUM([o0].[PersonAddress_Country_PlanetId]), 0) + SELECT ISNULL(SUM([o0].[PersonAddress_Country_PlanetId]), 0) FROM [OwnedPerson] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [o0] WHERE [o].[Id] = [o0].[Id]) AS [Sum] FROM [OwnedPerson] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [o] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Translations/Operators/MiscellaneousOperatorTranslationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Translations/Operators/MiscellaneousOperatorTranslationsSqlServerTest.cs index 4418fc857b8..5646f4c2455 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Translations/Operators/MiscellaneousOperatorTranslationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Translations/Operators/MiscellaneousOperatorTranslationsSqlServerTest.cs @@ -35,7 +35,7 @@ public override async Task Coalesce(bool async) """ SELECT [n].[Id], [n].[Bool], [n].[Byte], [n].[ByteArray], [n].[DateOnly], [n].[DateTime], [n].[DateTimeOffset], [n].[Decimal], [n].[Double], [n].[Enum], [n].[FlagsEnum], [n].[Float], [n].[Guid], [n].[Int], [n].[Long], [n].[Short], [n].[String], [n].[TimeOnly], [n].[TimeSpan] FROM [NullableBasicTypesEntities] AS [n] -WHERE COALESCE([n].[String], N'Unknown') = N'Seattle' +WHERE ISNULL([n].[String], N'Unknown') = N'Seattle' """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs index 3681a4e4f55..92403b7ded9 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs @@ -1336,7 +1336,7 @@ public override async Task Join_over_non_nullable_column(bool async) AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG([b].[String], N'|'), N'') AS [Strings] +SELECT [b].[Int] AS [Key], ISNULL(STRING_AGG([b].[String], N'|'), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """); @@ -1349,9 +1349,9 @@ public override async Task Join_over_nullable_column(bool async) AssertSql( """ -SELECT [n0].[Key], COALESCE(STRING_AGG(COALESCE([n0].[String], N''), N'|'), N'') AS [Regions] +SELECT [n0].[Key], ISNULL(STRING_AGG(ISNULL([n0].[String], N''), N'|'), N'') AS [Regions] FROM ( - SELECT [n].[String], COALESCE([n].[Int], 0) AS [Key] + SELECT [n].[String], ISNULL([n].[Int], 0) AS [Key] FROM [NullableBasicTypesEntities] AS [n] ) AS [n0] GROUP BY [n0].[Key] @@ -1365,7 +1365,7 @@ public override async Task Join_with_predicate(bool async) AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG(CASE +SELECT [b].[Int] AS [Key], ISNULL(STRING_AGG(CASE WHEN CAST(LEN([b].[String]) AS int) > 6 THEN [b].[String] END, N'|'), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] @@ -1380,7 +1380,7 @@ public override async Task Join_with_ordering(bool async) AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG([b].[String], N'|') WITHIN GROUP (ORDER BY [b].[Id] DESC), N'') AS [Strings] +SELECT [b].[Int] AS [Key], ISNULL(STRING_AGG([b].[String], N'|') WITHIN GROUP (ORDER BY [b].[Id] DESC), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """); @@ -1424,7 +1424,7 @@ public override async Task Concat_aggregate(bool async) AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG([b].[String], N''), N'') AS [BasicTypesEntitys] +SELECT [b].[Int] AS [Key], ISNULL(STRING_AGG([b].[String], N''), N'') AS [BasicTypesEntitys] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """);