diff --git a/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs b/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs index baf5c10b1df..5bee2c32332 100644 --- a/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs +++ b/src/EFCore.SqlServer/Query/Internal/SqlServerQuerySqlGenerator.cs @@ -258,40 +258,62 @@ protected override Expression VisitSqlFunction(SqlFunctionExpression sqlFunction case { IsBuiltIn: true, Arguments: not null } when 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)) + // (tracked in https://github.com/dotnet/efcore/issues/15586). + // + // The main issue is the sizing of the type. Since sometimes the + // computed size is wrong, stay on the safe side by expanding 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 forceCast = sqlFunctionExpression.TypeMapping?.StoreTypeNameBase is + "nvarchar" or "varchar" or "varbinary"; + + var typeMapping = sqlFunctionExpression.TypeMapping switch + { + { StoreTypeNameBase: "nvarchar", Size: >= 0 and < 4000 } => _typeMappingSource.FindMapping( + typeof(string), + sqlFunctionExpression.TypeMapping.StoreTypeNameBase, + unicode: true, + size: 4000), + { StoreTypeNameBase: "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 (forceCast || 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++) { - 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 - )); + // 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 + ); } - return base.VisitSqlFunction(sqlFunctionExpression); + return base.VisitSqlFunction((SqlFunctionExpression)result); } case SqlServerJsonObjectExpression jsonObject: diff --git a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs index 68f49771494..4f5963eefe3 100644 --- a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindMiscellaneousQueryCosmosTest.cs @@ -3250,6 +3250,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"] """); }); @@ -3367,7 +3399,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__DisplayClass177_0[Microsoft.EntityFrameworkCore.Query.NorthwindQueryCosmosFixture`1[Microsoft.EntityFrameworkCore.TestUtilities.NoopModelCustomizer]]).ss.Set().Any()"), + "value(Microsoft.EntityFrameworkCore.Query.NorthwindMiscellaneousQueryTestBase`1+<>c__DisplayClass179_0[Microsoft.EntityFrameworkCore.Query.NorthwindQueryCosmosFixture`1[Microsoft.EntityFrameworkCore.TestUtilities.NoopModelCustomizer]]).ss.Set().Any()"), (await Assert.ThrowsAsync(() => base.SelectMany_primitive_select_subquery(async))).Message); AssertSql(); diff --git a/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs index 9e9773a0b65..a3f032ec6db 100644 --- a/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/NorthwindMiscellaneousQueryTestBase.cs @@ -683,6 +683,21 @@ 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/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NonSharedModelBulkUpdatesSqlServerTest.cs index dbd19852f1b..219fdf7e16f 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(CAST([o].[Title] AS nvarchar(max)), 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(CAST(CONVERT(varchar(11), [o].[OwnedReference_Number]) AS varchar(8000)), ''), [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 c45b5cdc925..09bb58e96d5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSqlServerTest.cs @@ -1124,7 +1124,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%' """); @@ -1139,7 +1139,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%' """); @@ -1152,7 +1152,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%' """); @@ -1574,11 +1574,11 @@ 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(CAST(CONVERT(varchar(11), DATEPART(year, ( SELECT TOP(1) [o].[OrderDate] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] - ORDER BY [o].[OrderDate] DESC))), '') + ORDER BY [o].[OrderDate] DESC))) AS varchar(8000)), '') FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); @@ -1609,11 +1609,11 @@ 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(CAST(CONVERT(varchar(11), DATEPART(year, ( SELECT TOP(1) [o].[OrderDate] FROM [Orders] AS [o] WHERE [c].[CustomerID] = [o].[CustomerID] - ORDER BY [o].[OrderDate] DESC))), '') + ORDER BY [o].[OrderDate] DESC))) AS varchar(8000)), '') FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs index 5c316aa0047..98dd123de2f 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs @@ -2356,7 +2356,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] @@ -2438,8 +2438,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/Associations/ComplexJson/ComplexJsonCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonCollectionSqlServerTest.cs index 23d6d89e192..fc0bdda6849 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonCollectionSqlServerTest.cs @@ -306,7 +306,7 @@ public override async Task GroupBy() SELECT [r].[Id], [r].[Name], [r].[AssociateCollection], [r].[OptionalAssociate], [r].[RequiredAssociate] FROM [RootEntity] AS [r] WHERE 16 IN ( - SELECT COALESCE(SUM([a].[Int]), 0) + SELECT ISNULL(SUM([a].[Int]), 0) FROM OPENJSON([r].[AssociateCollection], '$') WITH ( [Int] int '$.Int', [String] nvarchar(max) '$.String' @@ -341,7 +341,7 @@ FROM [RootEntity] AS [r] AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM OPENJSON([r].[AssociateCollection], '$') WITH ([NestedCollection] nvarchar(max) '$.NestedCollection' AS JSON) AS [a] OUTER APPLY ( SELECT MAX([n].[Int]) AS [value] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonPrimitiveCollectionSqlServerTest.cs index 4b124a5daad..5a7d91eaa7e 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonPrimitiveCollectionSqlServerTest.cs @@ -95,11 +95,11 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([i0].[value]), 0) + SELECT ISNULL(SUM([i0].[value]), 0) FROM OPENJSON(JSON_QUERY([r].[RequiredAssociate], '$.Ints')) WITH ([value] int '$') AS [i0]) FROM [RootEntity] AS [r] WHERE ( - SELECT COALESCE(SUM([i].[value]), 0) + SELECT ISNULL(SUM([i].[value]), 0) FROM OPENJSON(JSON_QUERY([r].[RequiredAssociate], '$.Ints')) WITH ([value] int '$') AS [i]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonSetOperationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonSetOperationsSqlServerTest.cs index 4e43889203e..4f03dd9a494 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonSetOperationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexJson/ComplexJsonSetOperationsSqlServerTest.cs @@ -72,7 +72,7 @@ FROM [RootEntity] AS [r] AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM ( SELECT [a].[NestedCollection] AS [NestedCollection] FROM OPENJSON([r].[AssociateCollection], '$') WITH ( @@ -89,7 +89,7 @@ [NestedCollection] nvarchar(max) '$.NestedCollection' AS JSON WHERE [a0].[String] = N'foo' ) AS [u] OUTER APPLY ( - SELECT COALESCE(SUM([n].[Int]), 0) AS [value] + SELECT ISNULL(SUM([n].[Int]), 0) AS [value] FROM OPENJSON([u].[NestedCollection], '$') WITH ([Int] int '$.Int') AS [n] ) AS [s]) FROM [RootEntity] AS [r] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexTableSplitting/ComplexTableSplittingPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexTableSplitting/ComplexTableSplittingPrimitiveCollectionSqlServerTest.cs index eaef360d3f5..c8be2298af5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexTableSplitting/ComplexTableSplittingPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/ComplexTableSplitting/ComplexTableSplittingPrimitiveCollectionSqlServerTest.cs @@ -85,11 +85,11 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([r1].[value]), 0) + SELECT ISNULL(SUM([r1].[value]), 0) FROM OPENJSON([r].[RequiredAssociate_Ints]) WITH ([value] int '$') AS [r1]) FROM [RootEntity] AS [r] WHERE ( - SELECT COALESCE(SUM([r0].[value]), 0) + SELECT ISNULL(SUM([r0].[value]), 0) FROM OPENJSON([r].[RequiredAssociate_Ints]) WITH ([value] int '$') AS [r0]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsCollectionSqlServerTest.cs index 4d672656a85..8496bcb3715 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsCollectionSqlServerTest.cs @@ -242,7 +242,7 @@ FROM [AssociateType] AS [a2] LEFT JOIN [NestedAssociateType] AS [n6] ON [a0].[Id] = [n6].[CollectionAssociateId] LEFT JOIN [NestedAssociateType] AS [n7] ON [a1].[Id] = [n7].[CollectionAssociateId] WHERE 16 IN ( - SELECT COALESCE(SUM([a].[Int]), 0) + SELECT ISNULL(SUM([a].[Int]), 0) FROM [AssociateType] AS [a] WHERE [r].[Id] = [a].[CollectionRootId] GROUP BY [a].[String] @@ -260,7 +260,7 @@ public override async Task Select_within_Select_within_Select_with_aggregates() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM [AssociateType] AS [a] OUTER APPLY ( SELECT MAX([n].[Int]) AS [value] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsPrimitiveCollectionSqlServerTest.cs index acbd2f5ed51..b8fa705eae5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsPrimitiveCollectionSqlServerTest.cs @@ -163,12 +163,12 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([i0].[value]), 0) + SELECT ISNULL(SUM([i0].[value]), 0) FROM OPENJSON([a].[Ints]) WITH ([value] int '$') AS [i0]) FROM [RootEntity] AS [r] INNER JOIN [AssociateType] AS [a] ON [r].[RequiredAssociateId] = [a].[Id] WHERE ( - SELECT COALESCE(SUM([i].[value]), 0) + SELECT ISNULL(SUM([i].[value]), 0) FROM OPENJSON([a].[Ints]) WITH ([value] int '$') AS [i]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsSetOperationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsSetOperationsSqlServerTest.cs index 3ea1f502fac..2cdabdbdc41 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsSetOperationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/Navigations/NavigationsSetOperationsSqlServerTest.cs @@ -60,7 +60,7 @@ public override async Task Over_assocate_collection_Select_nested_with_aggregate AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM ( SELECT [a].[Id] FROM [AssociateType] AS [a] @@ -71,7 +71,7 @@ FROM [AssociateType] AS [a0] WHERE [r].[Id] = [a0].[CollectionRootId] AND [a0].[String] = N'foo' ) AS [u] OUTER APPLY ( - SELECT COALESCE(SUM([n].[Int]), 0) AS [value] + SELECT ISNULL(SUM([n].[Int]), 0) AS [value] FROM [NestedAssociateType] AS [n] WHERE [u].[Id] = [n].[CollectionAssociateId] ) AS [s]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonCollectionSqlServerTest.cs index 22977341c9f..ef8b32a80d6 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonCollectionSqlServerTest.cs @@ -403,7 +403,7 @@ GROUP BY [a0].[Key0] SELECT [r].[Id], [r].[Name], [r].[AssociateCollection], [r].[OptionalAssociate], [r].[RequiredAssociate] FROM [RootEntity] AS [r] WHERE 16 IN ( - SELECT COALESCE(SUM([a0].[Int]), 0) + SELECT ISNULL(SUM([a0].[Int]), 0) FROM ( SELECT [a].[Id] AS [Id0], [a].[Int], [a].[Ints], [a].[Name], [a].[String], [a].[String] AS [Key0] FROM OPENJSON([r].[AssociateCollection], '$') WITH ( @@ -451,7 +451,7 @@ FROM [RootEntity] AS [r] AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM OPENJSON([r].[AssociateCollection], '$') WITH ([NestedCollection] nvarchar(max) '$.NestedCollection' AS JSON) AS [a] OUTER APPLY ( SELECT MAX([n].[Int]) AS [value] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonPrimitiveCollectionSqlServerTest.cs index cdd9ba0b0b4..c965e21350c 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedJson/OwnedJsonPrimitiveCollectionSqlServerTest.cs @@ -95,11 +95,11 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([i0].[value]), 0) + SELECT ISNULL(SUM([i0].[value]), 0) FROM OPENJSON(JSON_QUERY([r].[RequiredAssociate], '$.Ints')) WITH ([value] int '$') AS [i0]) FROM [RootEntity] AS [r] WHERE ( - SELECT COALESCE(SUM([i].[value]), 0) + SELECT ISNULL(SUM([i].[value]), 0) FROM OPENJSON(JSON_QUERY([r].[RequiredAssociate], '$.Ints')) WITH ([value] int '$') AS [i]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsCollectionSqlServerTest.cs index 06fa9a4be73..5ddc90a48ab 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsCollectionSqlServerTest.cs @@ -245,7 +245,7 @@ FROM [RelatedCollection] AS [r4] LEFT JOIN [OptionalRelated_NestedCollection] AS [o2] ON [o].[RootEntityId] = [o2].[AssociateTypeRootEntityId] LEFT JOIN [RequiredRelated_NestedCollection] AS [r8] ON [r1].[RootEntityId] = [r8].[AssociateTypeRootEntityId] WHERE 16 IN ( - SELECT COALESCE(SUM([r0].[Int]), 0) + SELECT ISNULL(SUM([r0].[Int]), 0) FROM [RelatedCollection] AS [r0] WHERE [r].[Id] = [r0].[RootEntityId] GROUP BY [r0].[String] @@ -263,7 +263,7 @@ public override async Task Select_within_Select_within_Select_with_aggregates() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM [RelatedCollection] AS [r0] OUTER APPLY ( SELECT MAX([r1].[Int]) AS [value] diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsPrimitiveCollectionSqlServerTest.cs index e6f8e9c6210..aec571cdfa9 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsPrimitiveCollectionSqlServerTest.cs @@ -163,12 +163,12 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([i0].[value]), 0) + SELECT ISNULL(SUM([i0].[value]), 0) FROM OPENJSON([r0].[Ints]) WITH ([value] int '$') AS [i0]) FROM [RootEntity] AS [r] LEFT JOIN [RequiredRelated] AS [r0] ON [r].[Id] = [r0].[RootEntityId] WHERE ( - SELECT COALESCE(SUM([i].[value]), 0) + SELECT ISNULL(SUM([i].[value]), 0) FROM OPENJSON([r0].[Ints]) WITH ([value] int '$') AS [i]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsSetOperationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsSetOperationsSqlServerTest.cs index ec602b0201d..e5b4a737259 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsSetOperationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedNavigations/OwnedNavigationsSetOperationsSqlServerTest.cs @@ -56,7 +56,7 @@ public override async Task Over_assocate_collection_Select_nested_with_aggregate AssertSql( """ SELECT ( - SELECT COALESCE(SUM([s].[value]), 0) + SELECT ISNULL(SUM([s].[value]), 0) FROM ( SELECT [r0].[RootEntityId], [r0].[Id] FROM [RelatedCollection] AS [r0] @@ -67,7 +67,7 @@ FROM [RelatedCollection] AS [r1] WHERE [r].[Id] = [r1].[RootEntityId] AND [r1].[String] = N'foo' ) AS [u] OUTER APPLY ( - SELECT COALESCE(SUM([r2].[Int]), 0) AS [value] + SELECT ISNULL(SUM([r2].[Int]), 0) AS [value] FROM [RelatedCollection_NestedCollection] AS [r2] WHERE [u].[RootEntityId] = [r2].[AssociateTypeRootEntityId] AND [u].[Id] = [r2].[AssociateTypeId] ) AS [s]) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedTableSplitting/OwnedTableSplittingPrimitiveCollectionSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedTableSplitting/OwnedTableSplittingPrimitiveCollectionSqlServerTest.cs index 8d5cbb697b9..bbfff36efbe 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedTableSplitting/OwnedTableSplittingPrimitiveCollectionSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Associations/OwnedTableSplitting/OwnedTableSplittingPrimitiveCollectionSqlServerTest.cs @@ -135,11 +135,11 @@ public override async Task Select_Sum() AssertSql( """ SELECT ( - SELECT COALESCE(SUM([r1].[value]), 0) + SELECT ISNULL(SUM([r1].[value]), 0) FROM OPENJSON([r].[RequiredAssociate_Ints]) WITH ([value] int '$') AS [r1]) FROM [RootEntity] AS [r] WHERE ( - SELECT COALESCE(SUM([r0].[value]), 0) + SELECT ISNULL(SUM([r0].[value]), 0) FROM OPENJSON([r].[RequiredAssociate_Ints]) WITH ([value] int '$') AS [r0]) >= 6 """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs index fe9a0aeafb4..4ced85f2586 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServer160Test.cs @@ -1092,7 +1092,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] """); @@ -1164,7 +1164,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) @@ -2024,7 +2024,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) @@ -2936,10 +2936,10 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL(CAST([l].[Name] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST(CASE WHEN [l1].[Id] IS NOT NULL THEN [l1].[Name] ELSE N'NULL' -END, N'') +END AS nvarchar(max)), N'') FROM [LevelOne] AS [l] LEFT JOIN ( SELECT [l0].[Id], [l0].[Name], [l0].[OneToMany_Optional_Inverse2Id] @@ -3798,7 +3798,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] """); } @@ -3812,7 +3812,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]) """); @@ -3966,7 +3966,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] @@ -4107,7 +4107,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] @@ -4126,7 +4126,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] @@ -4342,7 +4342,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] """); } @@ -4450,7 +4450,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] @@ -4832,7 +4832,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 4aca7e0eecc..1f33b5ba121 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsQuerySqlServerTest.cs @@ -1092,7 +1092,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] """); @@ -1164,7 +1164,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) @@ -2024,7 +2024,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) @@ -2936,10 +2936,10 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL(CAST([l].[Name] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST(CASE WHEN [l1].[Id] IS NOT NULL THEN [l1].[Name] ELSE N'NULL' -END, N'') +END AS nvarchar(max)), N'') FROM [LevelOne] AS [l] LEFT JOIN ( SELECT [l0].[Id], [l0].[Name], [l0].[OneToMany_Optional_Inverse2Id] @@ -3798,7 +3798,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] """); } @@ -3812,7 +3812,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]) """); @@ -3966,7 +3966,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] @@ -4107,7 +4107,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] @@ -4126,7 +4126,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] @@ -4342,7 +4342,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] """); } @@ -4450,7 +4450,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] @@ -4832,7 +4832,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 107f79fece0..aac085709db 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServer160Test.cs @@ -215,7 +215,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] @@ -359,7 +359,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) @@ -538,9 +538,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] @@ -577,7 +577,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] """); } @@ -591,7 +591,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] @@ -878,7 +878,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 ( @@ -932,7 +932,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 ( @@ -1619,7 +1619,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] """); } @@ -1905,7 +1905,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 @@ -3649,7 +3649,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] @@ -5895,10 +5895,10 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL(CAST([l].[Name] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST(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'') +END AS nvarchar(max)), N'') FROM [Level1] AS [l] LEFT JOIN ( SELECT [l0].[OneToOne_Required_PK_Date], [l0].[Level1_Required_Id], [l0].[Level2_Name], [l0].[OneToMany_Optional_Inverse2Id], [l0].[OneToMany_Required_Inverse2Id] @@ -8385,7 +8385,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 c0173005f97..96649c63273 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsSharedTypeQuerySqlServerTest.cs @@ -217,7 +217,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] @@ -361,7 +361,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) @@ -540,9 +540,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] @@ -579,7 +579,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] """); } @@ -593,7 +593,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] @@ -880,7 +880,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 ( @@ -934,7 +934,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 ( @@ -1621,7 +1621,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] """); } @@ -1907,7 +1907,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 @@ -3651,7 +3651,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] @@ -5897,10 +5897,10 @@ public override async Task Select_optional_navigation_property_string_concat(boo AssertSql( """ -SELECT COALESCE([l].[Name], N'') + N' ' + COALESCE(CASE +SELECT ISNULL(CAST([l].[Name] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST(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'') +END AS nvarchar(max)), N'') FROM [Level1] AS [l] LEFT JOIN ( SELECT [l0].[OneToOne_Required_PK_Date], [l0].[Level1_Required_Id], [l0].[Level2_Name], [l0].[OneToMany_Optional_Inverse2Id], [l0].[OneToMany_Required_Inverse2Id] @@ -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/Ef6GroupBySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/Ef6GroupBySqlServerTest.cs index c389821b466..0e2f4c94720 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(CAST([p0].[FirstName] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST([p0].[MiddleInitial] AS nvarchar(max)), N'') + N' ' + ISNULL(CAST([p0].[LastName] AS nvarchar(max)), 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 b8857a39bbc..2d7986a8f61 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs @@ -707,7 +707,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] """); } @@ -1153,7 +1153,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] @@ -1168,7 +1168,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] @@ -1200,7 +1200,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] @@ -1258,7 +1258,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] @@ -1277,7 +1277,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) @@ -1352,7 +1352,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] @@ -1835,7 +1835,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(CAST([c].[Location] AS varchar(8000)), N'') + N'Added' LIKE N'%Add%' """); } @@ -1973,7 +1973,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) """); } @@ -1986,7 +1986,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) """); } @@ -1997,7 +1997,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] @@ -2494,7 +2494,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 @@ -3537,7 +3537,7 @@ public override async Task ToString_nullable_enum_property_projection(bool async SELECT CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END FROM [Weapons] AS [w] """); @@ -3566,7 +3566,7 @@ FROM [Weapons] AS [w] WHERE CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END LIKE N'%Cart%' """); } @@ -4670,7 +4670,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] @@ -4879,7 +4879,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] @@ -4932,7 +4932,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 @@ -5132,7 +5132,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] @@ -5178,7 +5178,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] @@ -5203,7 +5203,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] @@ -5233,7 +5233,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] @@ -5248,7 +5248,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] @@ -5263,7 +5263,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] @@ -5278,7 +5278,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] @@ -5297,7 +5297,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' @@ -5327,7 +5327,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] @@ -5345,7 +5345,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)) @@ -5378,7 +5378,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] @@ -5396,7 +5396,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)) @@ -5577,7 +5577,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(CAST([w0].[Name] AS nvarchar(max)), N'') + CAST(5 AS nvarchar(max)) """); } @@ -5590,7 +5590,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(CAST([w0].[Name] AS nvarchar(max)), N'') + N'Marcus'' Lancer' """); } @@ -5600,7 +5600,7 @@ public override async Task String_concat_on_various_types(bool async) AssertSql( """ -SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST([m].[Rating] AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] +SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST(CAST([m].[Rating] AS nvarchar(max)) AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] FROM [Gears] AS [g] CROSS JOIN [Missions] AS [m] ORDER BY [g].[Nickname], [m].[Id] @@ -5625,7 +5625,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] """); @@ -5822,7 +5822,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] """); } @@ -5835,7 +5835,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 """); } @@ -5859,7 +5859,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] """); } @@ -5871,7 +5871,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 """); } @@ -5883,7 +5883,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 """); } @@ -7462,7 +7462,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL(CAST([c].[Location] AS varchar(8000)), 'Unknown') FROM [Cities] AS [c] """); } @@ -7603,7 +7603,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) @@ -7687,14 +7687,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] @@ -8494,7 +8494,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] """); @@ -8506,7 +8506,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] """); } @@ -8590,7 +8590,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 fe73be2f481..e6ae1cddbd3 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 2542abbca90..242934bb3f7 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 a279a963c73..3c85c9e74ff 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindAggregateOperatorsQuerySqlServerTest.cs @@ -107,7 +107,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 """); @@ -155,7 +155,7 @@ public override async Task Average_after_DefaultIfEmpty_does_not_throw(bool asyn 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] @@ -173,7 +173,7 @@ public override async Task Max_after_DefaultIfEmpty_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] @@ -191,7 +191,7 @@ public override async Task Min_after_DefaultIfEmpty_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] @@ -209,7 +209,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 """); @@ -221,7 +221,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] """); } @@ -232,7 +232,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 """); @@ -629,7 +629,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] """); } @@ -640,7 +640,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] """); } @@ -651,7 +651,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] """); } @@ -662,7 +662,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] """); } @@ -673,7 +673,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] """); } @@ -684,7 +684,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] """); } @@ -695,7 +695,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 """); @@ -708,10 +708,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] @@ -725,14 +725,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] @@ -748,10 +748,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 + ( @@ -771,7 +771,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] @@ -788,7 +788,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 @@ -828,7 +828,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 """); @@ -841,7 +841,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] @@ -921,7 +921,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 """); @@ -938,7 +938,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] @@ -1081,7 +1081,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 """); @@ -1097,7 +1097,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] @@ -1190,7 +1190,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 """); @@ -1206,7 +1206,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] @@ -1262,7 +1262,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] @@ -2842,7 +2842,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] """); } @@ -3085,7 +3085,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 5adfc86600b..844157ca0ac 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServer160Test.cs @@ -823,9 +823,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) +SELECT CAST(ISDATE(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) 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(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) AS bit) = CAST(1 AS bit) """); } @@ -843,7 +843,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) """); } @@ -869,9 +869,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT ~CAST(ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) +SELECT ~CAST(ISNUMERIC(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) ^ 1 AS bit) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 +WHERE ISNUMERIC(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) <> 1 """); } @@ -907,7 +907,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 39fc06a897f..f2559c26be5 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindDbFunctionsQuerySqlServerTest.cs @@ -790,9 +790,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT CAST(ISDATE(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) AS bit) +SELECT CAST(ISDATE(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) 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(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) AS bit) = CAST(1 AS bit) """); } @@ -810,7 +810,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) """); } @@ -836,9 +836,9 @@ await AssertQueryScalar( AssertSql( """ -SELECT ~CAST(ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) ^ 1 AS bit) +SELECT ~CAST(ISNUMERIC(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) ^ 1 AS bit) FROM [Orders] AS [o] -WHERE ISNUMERIC(COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '')) <> 1 +WHERE ISNUMERIC(ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '')) <> 1 """); } @@ -874,7 +874,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 be057ce8786..b2d6156a1ae 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 0d054715000..4fc04f9111d 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 5af43749bcc..28f2059fbb1 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 381263ebc48..3d230a026da 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs @@ -485,7 +485,7 @@ public override async Task DefaultIfEmpty_top_level_projection(bool async) AssertSql( """ -SELECT COALESCE([e1].[EmployeeID], 0) +SELECT ISNULL([e1].[EmployeeID], 0) FROM ( SELECT 1 AS empty ) AS [e0] @@ -1167,7 +1167,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] @@ -2834,7 +2834,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] """); } @@ -2890,7 +2890,35 @@ 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] +"""); + } + + public override async Task Coalesce_Correct_TypeMapping_String_Sum(bool async) + { + await base.Coalesce_Correct_TypeMapping_String_Sum(async); + + AssertSql( + """ +SELECT ISNULL(CAST(CASE + WHEN [c].[Region] IS NOT NULL THEN N'R' + [c].[Region] +END AS nvarchar(max)), 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 ISNULL(CAST(CASE + WHEN [c].[Region] IS NOT NULL THEN CONCAT_WS(N'|', N'R', [c].[Region]) +END AS nvarchar(max)), N'no region specified') FROM [Customers] AS [c] ORDER BY [c].[CustomerID] """); @@ -2954,7 +2982,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] """); } @@ -2967,7 +2995,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' """); } @@ -2984,9 +3012,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 @@ -3012,11 +3040,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 @@ -3034,9 +3062,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 @@ -3054,9 +3082,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 @@ -3071,7 +3099,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') """); } @@ -3096,7 +3124,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] """); } @@ -3107,7 +3135,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] """); } @@ -3142,7 +3170,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] """); @@ -3154,7 +3182,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] """); @@ -3292,7 +3320,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(CAST(CONVERT(varchar(10), [o].[EmployeeID]) AS varchar(8000)), '') LIKE '%7%' """); } @@ -3344,7 +3372,7 @@ public override async Task Select_expression_other_to_string(bool async) AssertSql( """ -SELECT COALESCE(CONVERT(varchar(100), [o].[OrderDate]), '') AS [ShipName] +SELECT ISNULL(CAST(CONVERT(varchar(100), [o].[OrderDate]) AS varchar(8000)), '') AS [ShipName] FROM [Orders] AS [o] WHERE [o].[OrderDate] IS NOT NULL """); @@ -3731,7 +3759,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] """); } @@ -3749,7 +3777,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] """); @@ -3768,7 +3796,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] """); @@ -3969,9 +3997,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' """); } @@ -3983,7 +4011,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] @@ -3998,9 +4026,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] """); } @@ -4011,9 +4039,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'') """); } @@ -4089,9 +4117,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' """); } @@ -4103,7 +4131,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] @@ -4118,9 +4146,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] """); } @@ -4348,7 +4376,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] @@ -4491,7 +4519,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] @@ -4571,7 +4599,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] @@ -5636,7 +5664,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] @@ -6343,7 +6371,7 @@ public override async Task SelectMany_correlated_with_Select_value_type_and_Defa AssertSql( """ -SELECT COALESCE([o0].[OrderID], 0) +SELECT ISNULL([o0].[OrderID], 0) FROM [Customers] AS [c] OUTER APPLY ( SELECT TOP(2) [o].[OrderID] @@ -7128,7 +7156,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 (@data1, @data2, @data3, @data4) +WHERE ISNULL([o].[CustomerID], N'') + ISNULL([c].[CustomerID], N'') IN (@data1, @data2, @data3, @data4) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindNavigationsQuerySqlServerTest.cs index fd188f8f064..b2707a8b642 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 """); @@ -996,7 +996,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 25799a1f8dd..d12cf0d9664 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) @@ -928,7 +928,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] @@ -1390,7 +1390,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] @@ -1662,7 +1662,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] """); } @@ -1927,7 +1927,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) @@ -2066,7 +2066,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] """); @@ -2080,7 +2080,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 @@ -2093,7 +2093,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] @@ -2109,7 +2109,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] @@ -2480,7 +2480,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 8ccabaa8127..81d372243a6 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs @@ -2852,7 +2852,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) """); } @@ -2876,7 +2876,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) @@ -2915,7 +2915,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(CAST([e].[NullableStringA] AS nvarchar(max)), [e].[NullableStringB]) = [e].[NullableStringC] OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL AND [e].[NullableStringC] IS NULL) """); } @@ -2927,7 +2927,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(CAST([e].[NullableStringA] AS nvarchar(max)), [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) """); } @@ -2939,7 +2939,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(CAST([e].[NullableStringA] AS nvarchar(max)), [e].[NullableStringB]) = ISNULL(CAST([e].[NullableStringC] AS nvarchar(max)), [e].[StringA]) """); } @@ -2951,7 +2951,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) """); } @@ -3402,7 +3402,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] """); } @@ -3413,12 +3413,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] """); } @@ -3525,25 +3525,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) """); } @@ -3630,7 +3630,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]) """); } @@ -4259,7 +4259,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 """); } @@ -5129,7 +5129,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] @@ -5145,7 +5145,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 """); } @@ -5184,7 +5184,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 46955dd7e06..256ef0d007d 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/OwnedEntityQuerySqlServerTest.cs @@ -549,7 +549,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 f7d013e0b75..4eef4de88ff 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(CAST([b].[Name] AS nvarchar(max)), 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(CAST([b].[Name] AS nvarchar(max)), 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(CAST([b].[Name] AS nvarchar(max)), N'') + @suffix FROM [Blogs] AS [b] WHERE [b].[Id] > 8 """, @@ -1854,7 +1854,7 @@ await Test( AssertSql( """ -SELECT COALESCE(STRING_AGG(COALESCE([b].[Name], N''), N', ') WITHIN GROUP (ORDER BY [b].[Name]), N'') +SELECT ISNULL(CAST(STRING_AGG(ISNULL(CAST([b].[Name] AS nvarchar(max)), N''), N', ') WITHIN GROUP (ORDER BY [b].[Name]) AS nvarchar(max)), 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 44b6a25938d..f70cef0605e 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServer160Test.cs @@ -1253,7 +1253,7 @@ public override async Task Column_collection_FirstOrDefault() """ 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 @@ -1283,7 +1283,7 @@ public override async Task Column_collection_SingleOrDefault() """ 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 b44fc89feba..7a8b297c3d0 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/PrimitiveCollectionsQuerySqlServerTest.cs @@ -1276,7 +1276,7 @@ public override async Task Column_collection_FirstOrDefault() """ 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 @@ -1306,7 +1306,7 @@ public override async Task Column_collection_SingleOrDefault() """ 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 b30436603b4..76566a00c7b 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs @@ -913,7 +913,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] @@ -1589,7 +1589,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] @@ -1610,7 +1610,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] @@ -1654,7 +1654,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] @@ -1730,7 +1730,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] @@ -1755,7 +1755,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) @@ -1854,7 +1854,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] @@ -2490,7 +2490,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(CAST([c].[Location] AS varchar(8000)), N'') + N'Added' LIKE N'%Add%' """); } @@ -2711,7 +2711,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) """); } @@ -2730,7 +2730,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) """); } @@ -2741,7 +2741,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] @@ -3345,7 +3345,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] @@ -4721,7 +4721,7 @@ public override async Task ToString_nullable_enum_property_projection(bool async SELECT CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END FROM [Weapons] AS [w] """); @@ -4750,7 +4750,7 @@ FROM [Weapons] AS [w] WHERE CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END LIKE N'%Cart%' """); } @@ -6355,7 +6355,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 ( @@ -6643,7 +6643,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] @@ -6714,7 +6714,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] @@ -6998,7 +6998,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] @@ -7060,7 +7060,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] @@ -7090,7 +7090,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] @@ -7132,7 +7132,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] @@ -7153,7 +7153,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] @@ -7174,7 +7174,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] @@ -7195,7 +7195,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] @@ -7220,7 +7220,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' @@ -7262,7 +7262,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] @@ -7286,7 +7286,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)) @@ -7331,7 +7331,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] @@ -7355,7 +7355,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)) @@ -7566,7 +7566,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(CAST([w0].[Name] AS nvarchar(max)), N'') + CAST(5 AS nvarchar(max)) """); } @@ -7579,7 +7579,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(CAST([w0].[Name] AS nvarchar(max)), N'') + N'Marcus'' Lancer' """); } @@ -7589,7 +7589,7 @@ public override async Task String_concat_on_various_types(bool async) AssertSql( """ -SELECT N'HasSoulPatch ' + CAST([u].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([u].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([u].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST([m].[Rating] AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] +SELECT N'HasSoulPatch ' + CAST([u].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([u].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([u].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST(CAST([m].[Rating] AS nvarchar(max)) AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] FROM ( SELECT [g].[Nickname], [g].[SquadId], [g].[HasSoulPatch], [g].[Rank] FROM [Gears] AS [g] @@ -7626,7 +7626,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] @@ -7909,7 +7909,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] """); } @@ -7922,7 +7922,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 """); } @@ -7946,7 +7946,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] """); } @@ -7958,7 +7958,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 """); } @@ -7970,7 +7970,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 """); } @@ -10020,7 +10020,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL(CAST([c].[Location] AS varchar(8000)), 'Unknown') FROM [Cities] AS [c] """); } @@ -10215,7 +10215,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] @@ -11120,7 +11120,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] @@ -11133,7 +11133,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] @@ -11175,7 +11175,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' """); @@ -11382,7 +11382,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] """); @@ -11500,7 +11500,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 8deb12b89b3..90c0b734f11 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 3624806fcdb..b61a5027266 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 03f657b04e0..6cafdb16459 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs @@ -869,7 +869,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] """); } @@ -1376,7 +1376,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] @@ -1394,7 +1394,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] @@ -1432,7 +1432,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] @@ -1499,7 +1499,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] @@ -1521,7 +1521,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) @@ -1608,7 +1608,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] @@ -2140,7 +2140,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(CAST([c].[Location] AS varchar(8000)), N'') + N'Added' LIKE N'%Add%' """); } @@ -2341,7 +2341,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) """); } @@ -2357,7 +2357,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) """); } @@ -2368,7 +2368,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] @@ -2878,7 +2878,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 @@ -4130,7 +4130,7 @@ public override async Task ToString_nullable_enum_property_projection(bool async SELECT CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END FROM [Weapons] AS [w] """); @@ -4159,7 +4159,7 @@ FROM [Weapons] AS [w] WHERE CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END LIKE N'%Cart%' """); } @@ -5396,7 +5396,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 ( @@ -5628,7 +5628,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] @@ -5681,7 +5681,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 @@ -5914,7 +5914,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] @@ -5968,7 +5968,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] @@ -5996,7 +5996,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] @@ -6026,7 +6026,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] @@ -6041,7 +6041,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] @@ -6056,7 +6056,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] @@ -6071,7 +6071,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] @@ -6090,7 +6090,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' @@ -6120,7 +6120,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] @@ -6138,7 +6138,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)) @@ -6171,7 +6171,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] @@ -6189,7 +6189,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)) @@ -6376,7 +6376,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(CAST([w0].[Name] AS nvarchar(max)), N'') + CAST(5 AS nvarchar(max)) """); } @@ -6389,7 +6389,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(CAST([w0].[Name] AS nvarchar(max)), N'') + N'Marcus'' Lancer' """); } @@ -6399,7 +6399,7 @@ public override async Task String_concat_on_various_types(bool async) AssertSql( """ -SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST([m].[Rating] AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] +SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST(CAST([m].[Rating] AS nvarchar(max)) AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] FROM [Gears] AS [g] CROSS JOIN [Missions] AS [m] ORDER BY [g].[Nickname], [m].[Id] @@ -6424,7 +6424,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] """); @@ -6639,7 +6639,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] """); } @@ -6652,7 +6652,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 """); } @@ -6676,7 +6676,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] """); } @@ -6688,7 +6688,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 """); } @@ -6700,7 +6700,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 """); } @@ -8470,7 +8470,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL(CAST([c].[Location] AS varchar(8000)), 'Unknown') FROM [Cities] AS [c] """); } @@ -8626,7 +8626,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) @@ -9402,14 +9402,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] @@ -9470,7 +9470,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' """); @@ -9652,7 +9652,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] """); @@ -9770,7 +9770,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 87e198a7634..dbc0b36762f 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 5ef3f83f8b4..67de5fcb845 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 24ec36328d3..06db30565b2 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs @@ -432,7 +432,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(CAST([w0].[Name] AS nvarchar(max)), N'') + CAST(5 AS nvarchar(max)) """); } @@ -504,7 +504,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] @@ -1065,7 +1065,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(CAST([w0].[Name] AS nvarchar(max)), N'') + N'Marcus'' Lancer' """); } @@ -1104,7 +1104,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)) @@ -1373,7 +1373,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] @@ -1609,7 +1609,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] @@ -1931,7 +1931,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] @@ -1946,7 +1946,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)) @@ -2389,7 +2389,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] """); } @@ -2399,7 +2399,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] """); @@ -2844,7 +2844,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] """); } @@ -2944,7 +2944,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] @@ -3250,7 +3250,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 """); } @@ -3342,7 +3342,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 @@ -3393,7 +3393,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] """); @@ -3430,7 +3430,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' @@ -3584,7 +3584,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] @@ -3668,7 +3668,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] @@ -3855,7 +3855,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] @@ -4108,7 +4108,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] @@ -4177,7 +4177,7 @@ public override async Task ToString_nullable_enum_property_projection(bool async SELECT CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] """); @@ -4206,7 +4206,7 @@ SELECT [w].[Name] WHERE CASE [w].[AmmunitionType] WHEN 1 THEN N'Cartridge' WHEN 2 THEN N'Shell' - ELSE ISNULL(CAST([w].[AmmunitionType] AS nvarchar(max)), N'') + ELSE ISNULL(CAST(CAST([w].[AmmunitionType] AS nvarchar(max)) AS nvarchar(max)), N'') END LIKE N'%Cart%' """); } @@ -4475,7 +4475,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) """); } @@ -4672,7 +4672,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] @@ -4928,7 +4928,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(CAST([c].[Location] AS varchar(8000)), N'') + N'Added' LIKE N'%Add%' """); } @@ -4953,7 +4953,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 @@ -5156,7 +5156,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 """); } @@ -5259,7 +5259,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] @@ -5469,14 +5469,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] @@ -5493,7 +5493,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) """); } @@ -5781,7 +5781,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) @@ -5856,7 +5856,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] @@ -6244,7 +6244,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] @@ -6323,7 +6323,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] @@ -6661,7 +6661,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] @@ -7520,7 +7520,7 @@ public override async Task String_concat_on_various_types(bool async) AssertSql( """ -SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST([m].[Rating] AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] +SELECT N'HasSoulPatch ' + CAST([g].[HasSoulPatch] AS nvarchar(max)) + N' HasSoulPatch' AS [HasSoulPatch], N'Rank ' + CAST([g].[Rank] AS nvarchar(max)) + N' Rank' AS [Rank], N'SquadId ' + CAST([g].[SquadId] AS nvarchar(max)) + N' SquadId' AS [SquadId], N'Rating ' + ISNULL(CAST(CAST([m].[Rating] AS nvarchar(max)) AS nvarchar(max)), N'') + N' Rating' AS [Rating], N'Timeline ' + CAST([m].[Timeline] AS nvarchar(max)) + N' Timeline' AS [Timeline] FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] CROSS JOIN [Missions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [m] ORDER BY [g].[Nickname], [m].[Id] @@ -7553,7 +7553,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] @@ -7667,7 +7667,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 """); } @@ -7872,7 +7872,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] """); } @@ -7883,7 +7883,7 @@ public override async Task Coalesce_used_with_non_unicode_string_column_and_cons AssertSql( """ -SELECT COALESCE([c].[Location], 'Unknown') +SELECT ISNULL(CAST([c].[Location] AS varchar(8000)), 'Unknown') FROM [Cities] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [c] """); } @@ -7894,7 +7894,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] """); } @@ -8091,7 +8091,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' """); @@ -8287,7 +8287,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] @@ -8461,7 +8461,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 5b0a7279b80..2a20a7d5c89 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 b23fa1336df..9798f1e2220 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalOwnedQuerySqlServerTest.cs @@ -1296,7 +1296,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] @@ -1470,7 +1470,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 f54135b2b4d..1a058e9cdd8 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() """ 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(CAST([n].[String] AS nvarchar(max)), 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 55d118bfeae..6ac8f8df8e1 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/Translations/StringTranslationsSqlServerTest.cs @@ -1329,7 +1329,7 @@ public override async Task Join_over_non_nullable_column() AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG([b].[String], N'|'), N'') AS [Strings] +SELECT [b].[Int] AS [Key], ISNULL(CAST(STRING_AGG([b].[String], N'|') AS nvarchar(max)), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """); @@ -1342,9 +1342,9 @@ public override async Task Join_over_nullable_column() AssertSql( """ -SELECT [n0].[Key], COALESCE(STRING_AGG(COALESCE([n0].[String], N''), N'|'), N'') AS [Regions] +SELECT [n0].[Key], ISNULL(CAST(STRING_AGG(ISNULL(CAST([n0].[String] AS nvarchar(max)), N''), N'|') AS nvarchar(max)), 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] @@ -1358,9 +1358,9 @@ public override async Task Join_with_predicate() AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG(CASE +SELECT [b].[Int] AS [Key], ISNULL(CAST(STRING_AGG(CASE WHEN CAST(LEN([b].[String]) AS int) > 6 THEN [b].[String] -END, N'|'), N'') AS [Strings] +END, N'|') AS nvarchar(max)), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """); @@ -1373,7 +1373,7 @@ public override async Task Join_with_ordering() 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(CAST(STRING_AGG([b].[String], N'|') WITHIN GROUP (ORDER BY [b].[Id] DESC) AS nvarchar(max)), N'') AS [Strings] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """); @@ -1417,7 +1417,7 @@ public override async Task Concat_aggregate() AssertSql( """ -SELECT [b].[Int] AS [Key], COALESCE(STRING_AGG([b].[String], N''), N'') AS [BasicTypesEntitys] +SELECT [b].[Int] AS [Key], ISNULL(CAST(STRING_AGG([b].[String], N'') AS nvarchar(max)), N'') AS [BasicTypesEntitys] FROM [BasicTypesEntities] AS [b] GROUP BY [b].[Int] """);