diff --git a/src/EFCore.Relational/Query/ISqlExpressionFactory.cs b/src/EFCore.Relational/Query/ISqlExpressionFactory.cs index 0bc538aaa1d..5cf4f57d573 100644 --- a/src/EFCore.Relational/Query/ISqlExpressionFactory.cs +++ b/src/EFCore.Relational/Query/ISqlExpressionFactory.cs @@ -252,8 +252,13 @@ public interface ISqlExpressionFactory /// An expression to compare with in . /// A list of to compare or evaluate and get result from. /// A value to return if no matches, if any. + /// An optional expression that can be re-used if it matches the new expression. /// An expression representing a CASE statement in a SQL tree. - SqlExpression Case(SqlExpression? operand, IReadOnlyList whenClauses, SqlExpression? elseResult); + SqlExpression Case( + SqlExpression? operand, + IReadOnlyList whenClauses, + SqlExpression? elseResult, + SqlExpression? existingExpr = null); /// /// Creates a new which represent a CASE statement in a SQL tree. diff --git a/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs b/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs index 025f66d438e..4d3277e86ea 100644 --- a/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs +++ b/src/EFCore.Relational/Query/Internal/RelationalValueConverterCompensatingExpressionVisitor.cs @@ -72,7 +72,7 @@ private Expression VisitCase(CaseExpression caseExpression) var elseResult = (SqlExpression?)Visit(caseExpression.ElseResult); - return caseExpression.Update(operand, whenClauses, elseResult); + return _sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression); } private Expression VisitSelect(SelectExpression selectExpression) diff --git a/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs b/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs index 731aa047a82..8b7cef3ab73 100644 --- a/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs +++ b/src/EFCore.Relational/Query/Internal/SqlExpressionSimplifyingExpressionVisitor.cs @@ -45,18 +45,6 @@ protected override Expression VisitExtension(Expression extensionExpression) return shapedQueryExpression.Update(newQueryExpression, newShaperExpression); } - // Only applies to 'CASE WHEN condition...' not 'CASE operand WHEN...' - if (extensionExpression is CaseExpression - { - Operand: null, ElseResult: CaseExpression { Operand: null } nestedCaseExpression - } caseExpression) - { - return VisitExtension( - _sqlExpressionFactory.Case( - caseExpression.WhenClauses.Union(nestedCaseExpression.WhenClauses).ToList(), - nestedCaseExpression.ElseResult)); - } - if (extensionExpression is SqlBinaryExpression sqlBinaryExpression) { return SimplifySqlBinary(sqlBinaryExpression); diff --git a/src/EFCore.Relational/Query/SqlExpressionFactory.cs b/src/EFCore.Relational/Query/SqlExpressionFactory.cs index 993803f8c54..2630ef75bfd 100644 --- a/src/EFCore.Relational/Query/SqlExpressionFactory.cs +++ b/src/EFCore.Relational/Query/SqlExpressionFactory.cs @@ -686,7 +686,11 @@ public virtual SqlExpression Negate(SqlExpression operand) => MakeUnary(ExpressionType.Negate, operand, operand.Type, operand.TypeMapping)!; /// - public virtual SqlExpression Case(SqlExpression? operand, IReadOnlyList whenClauses, SqlExpression? elseResult) + public virtual SqlExpression Case( + SqlExpression? operand, + IReadOnlyList whenClauses, + SqlExpression? elseResult, + SqlExpression? existingExpr = null) { RelationalTypeMapping? testTypeMapping; if (operand == null) @@ -714,13 +718,113 @@ public virtual SqlExpression Case(SqlExpression? operand, IReadOnlyList(); foreach (var caseWhenClause in whenClauses) { + var test = caseWhenClause.Test; + + if (operand == null && test is CaseExpression { Operand: null, WhenClauses: [var nestedSingleClause] } testExpr) + { + if (nestedSingleClause.Result is SqlConstantExpression { Value: true } + && testExpr.ElseResult is null or SqlConstantExpression { Value: false or null }) + { + // WHEN CASE + // WHEN x THEN TRUE + // ELSE FALSE/NULL + // END THEN y + // simplifies to + // WHEN x THEN y + test = nestedSingleClause.Test; + } + else if (nestedSingleClause.Result is SqlConstantExpression { Value: false or null } + && testExpr.ElseResult is SqlConstantExpression { Value: true }) + { + // same for the negated results + test = Not(nestedSingleClause.Test); + } + } + typeMappedWhenClauses.Add( new CaseWhenClause( - ApplyTypeMapping(caseWhenClause.Test, testTypeMapping), + ApplyTypeMapping(test, testTypeMapping), ApplyTypeMapping(caseWhenClause.Result, resultTypeMapping))); } - return new CaseExpression(operand, typeMappedWhenClauses, elseResult); + if (operand is null && elseResult is CaseExpression { Operand: null } nestedCaseExpression) + { + typeMappedWhenClauses.AddRange(nestedCaseExpression.WhenClauses); + elseResult = nestedCaseExpression.ElseResult; + } + + typeMappedWhenClauses = typeMappedWhenClauses + .Where(c => !IsSkipped(c)) + .TakeUpTo(IsMatched) + .DistinctBy(c => c.Test) + .ToList(); + + // CASE + // ... + // WHEN TRUE THEN a + // ELSE b + // END + // simplifies to + // CASE + // ... + // ELSE a + // END + if (typeMappedWhenClauses.Count > 0 && IsMatched(typeMappedWhenClauses[^1])) + { + elseResult = typeMappedWhenClauses[^1].Result; + typeMappedWhenClauses.RemoveAt(typeMappedWhenClauses.Count - 1); + } + + var nullResult = Constant(null, elseResult?.Type ?? whenClauses[0].Result.Type, resultTypeMapping); + + // if there are no whenClauses left (e.g. their tests evaluated to false): + // - if there is Else block, return it + // - if there is no Else block, return null + if (typeMappedWhenClauses.Count == 0) + { + return elseResult ?? nullResult; + } + + // omit `ELSE NULL` (this makes it easier to compare/reuse expressions) + if (elseResult is SqlConstantExpression { Value: null }) + { + elseResult = null; + } + + // CASE + // ... + // WHEN x THEN CASE + // WHEN y THEN a + // ELSE b + // END + // ELSE b + // END + // simplifies to + // CASE + // ... + // WHEN x AND y THEN a + // ELSE b + // END + if (operand == null + && typeMappedWhenClauses[^1].Result is CaseExpression { Operand: null, WhenClauses: [var lastClause] } lastCase + && Equals(elseResult, lastCase.ElseResult)) + { + typeMappedWhenClauses[^1] = new(AndAlso(typeMappedWhenClauses[^1].Test, lastClause.Test), lastClause.Result); + elseResult = lastCase.ElseResult; + } + + return existingExpr is CaseExpression expr + && operand == expr.Operand + && typeMappedWhenClauses.SequenceEqual(expr.WhenClauses) + && elseResult == expr.ElseResult + ? expr + : new CaseExpression(operand, typeMappedWhenClauses, elseResult); + + bool IsSkipped(CaseWhenClause clause) + => operand is null && clause.Test is SqlConstantExpression { Value: false or null }; + + bool IsMatched(CaseWhenClause clause) + => operand is null && clause.Test is SqlConstantExpression { Value: true }; } /// diff --git a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs index 20f898cb8ab..27927ad1ae7 100644 --- a/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs +++ b/src/EFCore.Relational/Query/SqlNullabilityProcessor.cs @@ -573,7 +573,7 @@ protected virtual SqlExpression VisitCase(CaseExpression caseExpression, bool al return elseResult ?? _sqlExpressionFactory.Constant(null, caseExpression.Type, caseExpression.TypeMapping); } - return caseExpression.Update(operand, whenClauses, elseResult); + return _sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression); } /// diff --git a/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs b/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs index f60f8e35d77..061c79d5822 100644 --- a/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs +++ b/src/EFCore.SqlServer/Query/Internal/SearchConditionConvertingExpressionVisitor.cs @@ -132,7 +132,7 @@ protected override Expression VisitCase(CaseExpression caseExpression) _isSearchCondition = parentSearchCondition; - return ApplyConversion(caseExpression.Update(operand, whenClauses, elseResult), condition: false); + return ApplyConversion(_sqlExpressionFactory.Case(operand, whenClauses, elseResult, caseExpression), condition: false); } /// diff --git a/src/Shared/EnumerableExtensions.cs b/src/Shared/EnumerableExtensions.cs index 7e7829c4dcb..ff5a9f33860 100644 --- a/src/Shared/EnumerableExtensions.cs +++ b/src/Shared/EnumerableExtensions.cs @@ -22,6 +22,18 @@ public static IEnumerable Distinct( where T : class => source.Distinct(new DynamicEqualityComparer(comparer)); + public static IEnumerable TakeUpTo(this IEnumerable source, Func predicate) + { + foreach (var item in source) + { + yield return item; + if (predicate(item)) + { + yield break; + } + } + } + private sealed class DynamicEqualityComparer : IEqualityComparer where T : class { diff --git a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs index e1a28039882..dff9c2e0838 100644 --- a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindSelectQueryCosmosTest.cs @@ -2012,6 +2012,62 @@ public override Task Select_over_10_nested_ternary_condition(bool async) SELECT ((c["CustomerID"] = "1") ? "01" : ((c["CustomerID"] = "2") ? "02" : ((c["CustomerID"] = "3") ? "03" : ((c["CustomerID"] = "4") ? "04" : ((c["CustomerID"] = "5") ? "05" : ((c["CustomerID"] = "6") ? "06" : ((c["CustomerID"] = "7") ? "07" : ((c["CustomerID"] = "8") ? "08" : ((c["CustomerID"] = "9") ? "09" : ((c["CustomerID"] = "10") ? "10" : ((c["CustomerID"] = "11") ? "11" : null))))))))))) AS c FROM root c WHERE (c["Discriminator"] = "Customer") +"""); + }); + + public override Task Select_conditional_drops_false(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Select_conditional_drops_false(a); + + AssertSql( + """ +SELECT (((c["OrderID"] % 2) = 0) ? c["OrderID"] : -(c["OrderID"])) AS c +FROM root c +WHERE (c["Discriminator"] = "Order") +"""); + }); + + public override Task Select_conditional_terminates_at_true(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Select_conditional_terminates_at_true(a); + + AssertSql( + """ +SELECT (((c["OrderID"] % 2) = 0) ? c["OrderID"] : 0) AS c +FROM root c +WHERE (c["Discriminator"] = "Order") +"""); + }); + + public override Task Select_conditional_flatten_nested_results(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Select_conditional_flatten_nested_results(a); + + AssertSql( + """ +SELECT (((c["OrderID"] % 2) = 0) ? (((c["OrderID"] % 5) = 0) ? -(c["OrderID"]) : c["OrderID"]) : c["OrderID"]) AS c +FROM root c +WHERE (c["Discriminator"] = "Order") +"""); + }); + + public override Task Select_conditional_flatten_nested_tests(bool async) + => Fixture.NoSyncTest( + async, async a => + { + await base.Select_conditional_flatten_nested_tests(a); + + AssertSql( + """ +SELECT ((((c["OrderID"] % 2) = 0) ? false : true) ? c["OrderID"] : -(c["OrderID"])) AS c +FROM root c +WHERE (c["Discriminator"] = "Order") """); }); diff --git a/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs index ce0c021e3ca..9e60a45a8f1 100644 --- a/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/NorthwindSelectQueryTestBase.cs @@ -766,6 +766,52 @@ public virtual Task Select_over_10_nested_ternary_condition(bool isAsync) ? "11" : null); + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Select_conditional_drops_false(bool async) + => AssertQueryScalar( + async, + ss => from o in ss.Set() + select o.OrderID % 2 == 0 + ? o.OrderID + : false + ? 0 + : -o.OrderID ); + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Select_conditional_terminates_at_true(bool async) + => AssertQueryScalar( + async, + ss => from o in ss.Set() + select o.OrderID % 2 == 0 + ? o.OrderID + : true + ? 0 + : -o.OrderID ); + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Select_conditional_flatten_nested_results(bool async) + => AssertQueryScalar( + async, + ss => from o in ss.Set() + select o.OrderID % 2 == 0 + ? o.OrderID % 5 == 0 + ? -o.OrderID + : o.OrderID + : o.OrderID); + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual Task Select_conditional_flatten_nested_tests(bool async) + => AssertQueryScalar( + async, + ss => from o in ss.Set() + select (o.OrderID % 2 == 0 ? false : true) + ? o.OrderID + : -o.OrderID); + [ConditionalTheory] [MemberData(nameof(IsAsyncData))] public virtual Task Projection_in_a_subquery_should_be_liftable(bool async) diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs index de969e5374e..16b371a33e7 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/AdHocMiscellaneousQuerySqlServerTest.cs @@ -1677,7 +1677,6 @@ public override async Task Conditional_expression_with_conditions_does_not_colla """ SELECT CASE WHEN [c0].[Id] IS NOT NULL THEN [c0].[Processed] ^ CAST(1 AS bit) - ELSE NULL END AS [Processing] FROM [Carts] AS [c] LEFT JOIN [Configuration] AS [c0] ON [c].[ConfigurationId] = [c0].[Id] @@ -2398,7 +2397,6 @@ FROM [Customers] AS [c] LEFT JOIN [Countries] AS [c1] ON [c0].[CountryId] = [c1].[Id] WHERE CASE WHEN [c0].[Id] IS NOT NULL THEN [c1].[CountryName] - ELSE NULL END = N'COUNTRY' """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs index fbef3cfbe2e..6ada8222c2e 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsQuerySqlServerTest.cs @@ -2990,7 +2990,6 @@ public override async Task Project_collection_and_nested_conditional(bool async) WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END FROM [LevelOne] AS [l] LEFT JOIN [LevelTwo] AS [l0] ON [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id] @@ -2998,7 +2997,6 @@ WHERE CASE WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END = N'02' ORDER BY [l].[Id], [l0].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs index b757fd90033..8e6aa9a6b77 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSharedTypeQuerySqlServerTest.cs @@ -3878,7 +3878,6 @@ public override async Task Project_collection_and_nested_conditional(bool async) WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END FROM [Level1] AS [l] LEFT JOIN ( @@ -3892,7 +3891,6 @@ WHERE CASE WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END = N'02' ORDER BY [l].[Id], [l1].[c] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs index 922133491db..fac384c0bcd 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/ComplexNavigationsCollectionsSplitQuerySqlServerTest.cs @@ -4425,14 +4425,12 @@ public override async Task Project_collection_and_nested_conditional(bool async) WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END FROM [LevelOne] AS [l] WHERE CASE WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END = N'02' ORDER BY [l].[Id] """, @@ -4445,7 +4443,6 @@ WHERE CASE WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END = N'02' ORDER BY [l].[Id], [l2].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs index de530e0f151..7ca1b124855 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/GearsOfWarQuerySqlServerTest.cs @@ -956,10 +956,8 @@ public override async Task Null_propagation_optimization2(bool async) FROM [Gears] AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NULL THEN NULL - ELSE CASE - WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -978,7 +976,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END = CAST(1 AS bit) """); } @@ -1010,7 +1007,6 @@ public override async Task Null_propagation_optimization5(bool async) FROM [Gears] AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1026,7 +1022,6 @@ public override async Task Null_propagation_optimization6(bool async) FROM [Gears] AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1040,7 +1035,6 @@ public override async Task Select_null_propagation_optimization7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname] - ELSE NULL END FROM [Gears] AS [g] """); @@ -1076,7 +1070,6 @@ public override async Task Select_null_propagation_negative1(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1090,7 +1083,6 @@ public override async Task Select_null_propagation_negative2(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [g0].[LeaderNickname] - ELSE NULL END FROM [Gears] AS [g] CROSS JOIN [Gears] AS [g0] @@ -1108,7 +1100,6 @@ WHEN [g0].[Nickname] IS NOT NULL AND [g0].[SquadId] IS NOT NULL THEN CASE WHEN [g0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END AS [Condition] FROM [Gears] AS [g] LEFT JOIN [Gears] AS [g0] ON [g].[HasSoulPatch] = CAST(1 AS bit) @@ -1156,7 +1147,6 @@ public override async Task Select_null_propagation_negative6(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1170,7 +1160,6 @@ public override async Task Select_null_propagation_negative7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1184,7 +1173,6 @@ public override async Task Select_null_propagation_negative8(bool async) """ SELECT CASE WHEN [s].[Id] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] @@ -1201,7 +1189,6 @@ public override async Task Select_null_propagation_negative9(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1227,7 +1214,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation """ SELECT CASE WHEN [c].[Name] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] @@ -3642,7 +3628,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async) """ SELECT CASE WHEN [f].[CommanderName] IS NOT NULL THEN [f].[CommanderName] - ELSE NULL END FROM [Factions] AS [f] """); @@ -3656,7 +3641,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo """ SELECT CASE WHEN [f].[CommanderName] IS NOT NULL THEN [f].[Eradicated] - ELSE NULL END FROM [Factions] AS [f] """); @@ -6315,13 +6299,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] ORDER BY CASE WHEN CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END @@ -7586,16 +7568,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte """ SELECT CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END AS [IsEradicated], [f].[CommanderName], [f].[Name] FROM [LocustLeaders] AS [l] INNER JOIN [Factions] AS [f] ON [l].[Name] = [f].[CommanderName] WHERE CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END = CAST(0 AS bit) OR CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END IS NULL """); } @@ -7707,16 +7686,13 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ 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 CASE - WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE - WHEN ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[HasSoulPatch] = @__prm_0 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); @@ -8654,7 +8630,6 @@ FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END = 1 """); } @@ -8673,7 +8648,6 @@ FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 = 2 """); } @@ -8686,13 +8660,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi """ SELECT [t].[Note], CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 AS [Value] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -8706,7 +8678,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit SELECT CASE WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END ELSE -1 END @@ -8723,7 +8694,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT SUBSTRING(CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END, 0 + 1, 3) FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] @@ -8738,13 +8708,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END) AS [Function] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -8757,19 +8725,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -8783,13 +8747,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END AS [Id] FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -8803,19 +8765,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -8832,10 +8790,8 @@ FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL AND CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[HasSoulPatch] - ELSE NULL END = CAST(0 AS bit) ORDER BY [t].[Note] """); @@ -8869,11 +8825,9 @@ FROM [Tags] AS [t] LEFT JOIN [Gears] AS [g] ON [t].[GearNickName] = [g].[Nickname] AND [t].[GearSquadId] = [g].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, [t].[Note] """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs index 047d9c29e53..d88fe6eedeb 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindMiscellaneousQuerySqlServerTest.cs @@ -1009,16 +1009,24 @@ ELSE CAST(0 AS bit) } public override async Task OrderBy_ternary_conditions(bool async) - => await base.OrderBy_ternary_conditions(async); + { + await base.OrderBy_ternary_conditions(async); + + AssertSql( + """ +SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock] +FROM [Products] AS [p] +ORDER BY CASE + WHEN [p].[UnitsInStock] > CAST(10 AS smallint) THEN CASE + WHEN [p].[ProductID] > 40 THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) + END + WHEN [p].[ProductID] <= 40 THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END, [p].[ProductID] +"""); + } - // issue #18774 - // AssertSql( - // @"SELECT [p].[ProductID], [p].[Discontinued], [p].[ProductName], [p].[SupplierID], [p].[UnitPrice], [p].[UnitsInStock] - //FROM [Products] AS [p] - //ORDER BY CASE - // WHEN (([p].[UnitsInStock] > CAST(10 AS smallint)) AND ([p].[ProductID] > 40)) OR (([p].[UnitsInStock] <= CAST(10 AS smallint)) AND ([p].[ProductID] <= 40)) - // THEN CAST(1 AS bit) ELSE CAST(0 AS bit) - //END, [p].[ProductID]"); public override async Task OrderBy_any(bool async) { await base.OrderBy_any(async); @@ -5873,7 +5881,6 @@ FROM [Orders] AS [o] SELECT TOP(1) [o0].[OrderDate] FROM [Orders] AS [o0] WHERE [c].[CustomerID] = [o0].[CustomerID]) - ELSE NULL END AS [OrderDate] FROM [Customers] AS [c] WHERE [c].[CustomerID] LIKE N'F%' diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs index 67f7f8464cd..30732589058 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NorthwindSelectQuerySqlServerTest.cs @@ -639,10 +639,8 @@ public override async Task Select_conditional_with_null_comparison_in_test(bool """ SELECT CASE WHEN [o].[CustomerID] IS NULL THEN CAST(1 AS bit) - ELSE CASE - WHEN [o].[OrderID] < 100 THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [o].[OrderID] < 100 THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END FROM [Orders] AS [o] WHERE [o].[CustomerID] = N'ALFKI' @@ -667,12 +665,67 @@ SELECT CASE WHEN [c].[CustomerID] = N'9' THEN N'09' WHEN [c].[CustomerID] = N'10' THEN N'10' WHEN [c].[CustomerID] = N'11' THEN N'11' - ELSE NULL END FROM [Customers] AS [c] """); } + public override async Task Select_conditional_drops_false(bool isAsync) + { + await base.Select_conditional_drops_false(isAsync); + + AssertSql( + """ +SELECT CASE + WHEN [o].[OrderID] % 2 = 0 THEN [o].[OrderID] + ELSE -[o].[OrderID] +END +FROM [Orders] AS [o] +"""); + } + + public override async Task Select_conditional_terminates_at_true(bool isAsync) + { + await base.Select_conditional_terminates_at_true(isAsync); + + AssertSql( + """ +SELECT CASE + WHEN [o].[OrderID] % 2 = 0 THEN [o].[OrderID] + ELSE 0 +END +FROM [Orders] AS [o] +"""); + } + + public override async Task Select_conditional_flatten_nested_results(bool isAsync) + { + await base.Select_conditional_flatten_nested_results(isAsync); + + AssertSql( + """ +SELECT CASE + WHEN [o].[OrderID] % 2 = 0 AND [o].[OrderID] % 5 = 0 THEN -[o].[OrderID] + ELSE [o].[OrderID] +END +FROM [Orders] AS [o] +"""); + } + + public override async Task Select_conditional_flatten_nested_tests(bool isAsync) + { + await base.Select_conditional_flatten_nested_tests(isAsync); + + AssertSql( + """ +SELECT CASE + WHEN [o].[OrderID] % 2 <> 0 THEN [o].[OrderID] + ELSE -[o].[OrderID] +END +FROM [Orders] AS [o] +"""); + } + public override async Task Projection_in_a_subquery_should_be_liftable(bool async) { await base.Projection_in_a_subquery_should_be_liftable(async); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs index 63b99397333..9b6e3004f16 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/NullSemanticsQuerySqlServerTest.cs @@ -2823,10 +2823,8 @@ ELSE CAST(0 AS bit) END ELSE [e].[BoolC] END <> [e].[BoolB] THEN [e].[BoolA] - ELSE CASE - WHEN ([e].[NullableBoolB] = [e].[NullableBoolC] AND [e].[NullableBoolB] IS NOT NULL AND [e].[NullableBoolC] IS NOT NULL) OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN ([e].[NullableBoolB] = [e].[NullableBoolC] AND [e].[NullableBoolB] IS NOT NULL AND [e].[NullableBoolC] IS NOT NULL) OR ([e].[NullableBoolB] IS NULL AND [e].[NullableBoolC] IS NULL) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """, // @@ -4327,10 +4325,8 @@ WHEN [e].[NullableStringA] IS NULL THEN CASE WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE CASE - WHEN ([e].[NullableStringA] <> [e].[NullableStringC] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN ([e].[NullableStringA] <> [e].[NullableStringC] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringC] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringC] IS NOT NULL) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -4349,10 +4345,8 @@ WHEN [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL THEN CASE WHEN ([e].[NullableStringA] = [e].[NullableStringB] AND [e].[NullableStringA] IS NOT NULL AND [e].[NullableStringB] IS NOT NULL) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE CASE - WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -4370,10 +4364,8 @@ WHERE CASE WHEN ([e].[NullableStringA] = [e].[NullableStringB] AND [e].[NullableStringA] IS NOT NULL AND [e].[NullableStringB] IS NOT NULL) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE CASE - WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN ([e].[NullableStringA] <> [e].[NullableStringB] OR [e].[NullableStringA] IS NULL OR [e].[NullableStringB] IS NULL) AND ([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -4392,10 +4384,8 @@ WHEN [e].[NullableBoolB] IS NULL THEN CASE WHEN [e].[NullableBoolB] <> [e].[NullableBoolA] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE CASE - WHEN [e].[NullableBoolA] <> [e].[NullableBoolB] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [e].[NullableBoolA] <> [e].[NullableBoolB] OR [e].[NullableBoolB] IS NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -4415,10 +4405,8 @@ WHEN [e].[NullableBoolC] IS NULL THEN CASE WHEN ([e].[NullableBoolA] <> [e].[NullableBoolC] OR [e].[NullableBoolA] IS NULL OR [e].[NullableBoolC] IS NULL) AND ([e].[NullableBoolA] IS NOT NULL OR [e].[NullableBoolC] IS NOT NULL) THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE CASE - WHEN ([e].[NullableBoolC] <> [e].[NullableBoolA] OR [e].[NullableBoolC] IS NULL OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN ([e].[NullableBoolC] <> [e].[NullableBoolA] OR [e].[NullableBoolC] IS NULL OR [e].[NullableBoolA] IS NULL) AND ([e].[NullableBoolC] IS NOT NULL OR [e].[NullableBoolA] IS NOT NULL) THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs index bfbb9d79f08..fb3d5eb4945 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPCGearsOfWarQuerySqlServerTest.cs @@ -1336,10 +1336,8 @@ FROM [Officers] AS [o] ) AS [u] WHERE CASE WHEN [u].[LeaderNickname] IS NULL THEN NULL - ELSE CASE - WHEN [u].[LeaderNickname] LIKE N'%us' AND [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [u].[LeaderNickname] LIKE N'%us' AND [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -1364,7 +1362,6 @@ WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE WHEN [u].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END = CAST(1 AS bit) """); } @@ -1408,7 +1405,6 @@ FROM [Officers] AS [o] ) AS [u] WHERE CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(LEN([u].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1430,7 +1426,6 @@ FROM [Officers] AS [o] ) AS [u] WHERE CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(LEN([u].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1444,7 +1439,6 @@ public override async Task Select_null_propagation_optimization7(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN [u].[LeaderNickname] + [u].[LeaderNickname] - ELSE NULL END FROM ( SELECT [g].[LeaderNickname] @@ -1498,7 +1492,6 @@ public override async Task Select_null_propagation_negative1(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM ( SELECT [g].[Nickname], [g].[LeaderNickname] @@ -1518,7 +1511,6 @@ public override async Task Select_null_propagation_negative2(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN [u0].[LeaderNickname] - ELSE NULL END FROM ( SELECT [g].[LeaderNickname] @@ -1548,7 +1540,6 @@ WHEN [u0].[Nickname] IS NOT NULL AND [u0].[SquadId] IS NOT NULL THEN CASE WHEN [u0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END AS [Condition] FROM ( SELECT [g].[HasSoulPatch] @@ -1632,7 +1623,6 @@ public override async Task Select_null_propagation_negative6(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit) - ELSE NULL END FROM ( SELECT [g].[LeaderNickname] @@ -1652,7 +1642,6 @@ public override async Task Select_null_propagation_negative7(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE NULL END FROM ( SELECT [g].[LeaderNickname] @@ -1672,7 +1661,6 @@ public override async Task Select_null_propagation_negative8(bool async) """ SELECT CASE WHEN [s].[Id] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN ( @@ -1695,7 +1683,6 @@ public override async Task Select_null_propagation_negative9(bool async) """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM ( SELECT [g].[Nickname], [g].[LeaderNickname] @@ -1733,7 +1720,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation """ SELECT CASE WHEN [c].[Name] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN ( @@ -4855,7 +4841,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async) """ SELECT CASE WHEN [l].[CommanderName] IS NOT NULL THEN [l].[CommanderName] - ELSE NULL END FROM [LocustHordes] AS [l] """); @@ -4869,7 +4854,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo """ SELECT CASE WHEN [l].[CommanderName] IS NOT NULL THEN [l].[Eradicated] - ELSE NULL END FROM [LocustHordes] AS [l] """); @@ -8593,7 +8577,6 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d """ SELECT CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM ( SELECT [g].[Nickname], [g].[LeaderNickname] @@ -8605,7 +8588,6 @@ FROM [Officers] AS [o] ORDER BY CASE WHEN CASE WHEN [u].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([u].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END @@ -10143,7 +10125,6 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte """ SELECT CASE WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END AS [IsEradicated], [l1].[CommanderName], [l1].[Name] FROM ( SELECT [l].[Name] @@ -10155,10 +10136,8 @@ FROM [LocustCommanders] AS [l0] INNER JOIN [LocustHordes] AS [l1] ON [u].[Name] = [l1].[CommanderName] WHERE CASE WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END = CAST(0 AS bit) OR CASE WHEN [l1].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END IS NULL """); } @@ -10282,16 +10261,13 @@ UNION ALL FROM [Officers] AS [o] ) AS [u] WHERE CASE - WHEN [u].[HasSoulPatch] = @__prm_0 THEN CASE - WHEN ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [u].[SquadId]) = @__prm2_1 AND ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [u].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [u].[HasSoulPatch] = @__prm_0 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [u].[SquadId]) = @__prm2_1 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [u].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); @@ -11413,7 +11389,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END = 1 """); } @@ -11438,7 +11413,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END + 1 = 2 """); } @@ -11451,7 +11425,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi """ SELECT [t].[Note], CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END + 1 AS [Value] FROM [Tags] AS [t] LEFT JOIN ( @@ -11463,7 +11436,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -11477,7 +11449,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit SELECT CASE WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END ELSE -1 END @@ -11500,7 +11471,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT SUBSTRING(CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END, 0 + 1, 3) FROM [Tags] AS [t] LEFT JOIN ( @@ -11521,7 +11491,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END) AS [Function] FROM [Tags] AS [t] LEFT JOIN ( @@ -11533,7 +11502,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -11546,13 +11514,10 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([u].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN ( @@ -11564,7 +11529,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -11578,7 +11542,6 @@ public override async Task Projecting_property_converted_to_nullable_into_member """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END AS [Id] FROM [Tags] AS [t] LEFT JOIN ( @@ -11590,7 +11553,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -11604,13 +11566,10 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([u].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN ( @@ -11622,7 +11581,6 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -11645,10 +11603,8 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL AND CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[HasSoulPatch] - ELSE NULL END = CAST(0 AS bit) ORDER BY [t].[Note] """); @@ -11694,11 +11650,9 @@ FROM [Officers] AS [o] ) AS [u] ON [t].[GearNickName] = [u].[Nickname] AND [t].[GearSquadId] = [u].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY CASE WHEN [t].[GearNickName] IS NOT NULL THEN [u].[SquadId] - ELSE NULL END, [t].[Note] """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs index 2421b566d30..634064306f1 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TPTGearsOfWarQuerySqlServerTest.cs @@ -1163,10 +1163,8 @@ FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] WHERE CASE WHEN [g].[LeaderNickname] IS NULL THEN NULL - ELSE CASE - WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -1188,7 +1186,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END = CAST(1 AS bit) """); } @@ -1226,7 +1223,6 @@ FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1245,7 +1241,6 @@ FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1259,7 +1254,6 @@ public override async Task Select_null_propagation_optimization7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname] - ELSE NULL END FROM [Gears] AS [g] """); @@ -1295,7 +1289,6 @@ public override async Task Select_null_propagation_negative1(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1309,7 +1302,6 @@ public override async Task Select_null_propagation_negative2(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [s].[LeaderNickname] - ELSE NULL END FROM [Gears] AS [g] CROSS JOIN ( @@ -1330,7 +1322,6 @@ WHEN [s].[Nickname] IS NOT NULL AND [s].[SquadId] IS NOT NULL THEN CASE WHEN [s].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END AS [Condition] FROM [Gears] AS [g] LEFT JOIN ( @@ -1387,7 +1378,6 @@ public override async Task Select_null_propagation_negative6(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1401,7 +1391,6 @@ public override async Task Select_null_propagation_negative7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1415,7 +1404,6 @@ public override async Task Select_null_propagation_negative8(bool async) """ SELECT CASE WHEN [s0].[Id] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN ( @@ -1435,7 +1423,6 @@ public override async Task Select_null_propagation_negative9(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] """); @@ -1464,7 +1451,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation """ SELECT CASE WHEN [c].[Name] IS NOT NULL THEN [c].[Name] - ELSE NULL END FROM [Tags] AS [t] LEFT JOIN ( @@ -4147,7 +4133,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async) """ SELECT CASE WHEN [l].[CommanderName] IS NOT NULL THEN [l].[CommanderName] - ELSE NULL END FROM [Factions] AS [f] LEFT JOIN [LocustHordes] AS [l] ON [f].[Id] = [l].[Id] @@ -4163,7 +4148,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo """ SELECT CASE WHEN [l].[CommanderName] IS NOT NULL THEN [l].[Eradicated] - ELSE NULL END FROM [Factions] AS [f] LEFT JOIN [LocustHordes] AS [l] ON [f].[Id] = [l].[Id] @@ -7198,13 +7182,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] AS [g] ORDER BY CASE WHEN CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END @@ -7826,10 +7808,7 @@ FROM [LocustLeaders] AS [l0] INNER JOIN [LocustCommanders] AS [l1] ON [l0].[Name] = [l1].[Name] ) AS [s] ON [l].[CommanderName] = [s].[Name] WHERE CASE - WHEN [l].[Id] IS NOT NULL THEN CASE - WHEN [s].[Name] IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [l].[Id] IS NOT NULL AND [s].[Name] IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); @@ -8613,7 +8592,6 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte """ SELECT CASE WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END AS [IsEradicated], [s].[CommanderName], [s].[Name] FROM [LocustLeaders] AS [l] INNER JOIN ( @@ -8624,10 +8602,8 @@ WHERE [l0].[Id] IS NOT NULL ) AS [s] ON [l].[Name] = [s].[CommanderName] WHERE CASE WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END = CAST(0 AS bit) OR CASE WHEN [s].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END IS NULL """); } @@ -8745,16 +8721,13 @@ END AS [Discriminator] FROM [Gears] AS [g] LEFT JOIN [Officers] AS [o] ON [g].[Nickname] = [o].[Nickname] AND [g].[SquadId] = [o].[SquadId] WHERE CASE - WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE - WHEN ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] AS [w] - WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[HasSoulPatch] = @__prm_0 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] AS [w] + WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); @@ -9668,7 +9641,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END = 1 """); } @@ -9690,7 +9662,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END + 1 = 2 """); } @@ -9703,7 +9674,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi """ SELECT [t].[Note], CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END + 1 AS [Value] FROM [Tags] AS [t] LEFT JOIN ( @@ -9712,7 +9682,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -9726,7 +9695,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit SELECT CASE WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END ELSE -1 END @@ -9746,7 +9714,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT SUBSTRING(CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END, 0 + 1, 3) FROM [Tags] AS [t] LEFT JOIN ( @@ -9764,7 +9731,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END) AS [Function] FROM [Tags] AS [t] LEFT JOIN ( @@ -9773,7 +9739,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -9786,13 +9751,10 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([s].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN ( @@ -9801,7 +9763,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -9815,7 +9776,6 @@ public override async Task Projecting_property_converted_to_nullable_into_member """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END AS [Id] FROM [Tags] AS [t] LEFT JOIN ( @@ -9824,7 +9784,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -9838,13 +9797,10 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([s].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END + 1 FROM [Tags] AS [t] LEFT JOIN ( @@ -9853,7 +9809,6 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -9873,10 +9828,8 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL AND CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[HasSoulPatch] - ELSE NULL END = CAST(0 AS bit) ORDER BY [t].[Note] """); @@ -9913,11 +9866,9 @@ FROM [Gears] AS [g] ) AS [s] ON [t].[GearNickName] = [s].[Nickname] AND [t].[GearSquadId] = [s].[SquadId] WHERE CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY CASE WHEN [t].[GearNickName] IS NOT NULL THEN [s].[SquadId] - ELSE NULL END, [t].[Note] """); } diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs index 655af6b5543..7115c32d5ee 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalComplexNavigationsCollectionsQuerySqlServerTest.cs @@ -3010,7 +3010,6 @@ public override async Task Project_collection_and_nested_conditional(bool async) WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END FROM [LevelOne] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l] LEFT JOIN [LevelTwo] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l0] ON [l].[Id] = [l0].[OneToMany_Optional_Inverse2Id] @@ -3018,7 +3017,6 @@ WHERE CASE WHEN [l].[Id] = 1 THEN N'01' WHEN [l].[Id] = 2 THEN N'02' WHEN [l].[Id] = 3 THEN N'03' - ELSE NULL END = N'02' ORDER BY [l].[Id], [l0].[Id] """); diff --git a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs index 5d33396a945..a7b9ce28a68 100644 --- a/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/Query/TemporalGearsOfWarQuerySqlServerTest.cs @@ -754,7 +754,6 @@ WHEN [g0].[Nickname] IS NOT NULL AND [g0].[SquadId] IS NOT NULL THEN CASE WHEN [g0].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END AS [Condition] 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].[HasSoulPatch] = CAST(1 AS bit) @@ -809,19 +808,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -1223,7 +1218,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit SELECT CASE WHEN [t].[Note] <> N'K.I.A.' OR [t].[Note] IS NULL THEN CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END ELSE -1 END @@ -1315,13 +1309,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi """ SELECT [t].[Note], CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 AS [Value] 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -1457,16 +1449,13 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ 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 CASE - WHEN [g].[HasSoulPatch] = @__prm_0 THEN CASE - WHEN ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] - WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( - SELECT TOP(1) [w].[Name] - FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] - WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[HasSoulPatch] = @__prm_0 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] + WHERE [w].[Id] = [g].[SquadId]) = @__prm2_1 AND ( + SELECT TOP(1) [w].[Name] + FROM [Weapons] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [w] + WHERE [w].[Id] = [g].[SquadId]) IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); @@ -1604,7 +1593,6 @@ public override async Task Null_propagation_optimization6(bool async) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -1786,7 +1774,6 @@ public override async Task Select_null_propagation_negative6(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(0 AS bit) - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); @@ -2029,7 +2016,6 @@ public override async Task Select_null_propagation_negative7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); @@ -2563,7 +2549,6 @@ public override async Task Select_null_propagation_negative1(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); @@ -2577,16 +2562,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte """ SELECT CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END AS [IsEradicated], [f].[CommanderName], [f].[Name] FROM [LocustLeaders] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [l] INNER JOIN [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f] ON [l].[Name] = [f].[CommanderName] WHERE CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END = CAST(0 AS bit) OR CASE WHEN [f].[Name] = N'Locust' THEN CAST(1 AS bit) - ELSE NULL END IS NULL """); } @@ -2658,7 +2640,6 @@ public override async Task Select_null_propagation_negative9(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); @@ -2692,7 +2673,6 @@ ELSE CAST(0 AS bit) 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 = 2 """); } @@ -2811,7 +2791,6 @@ ELSE CAST(0 AS bit) 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END = 1 """); } @@ -3093,19 +3072,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN CAST(LEN([g].[Nickname]) AS int) - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END + 1 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -3284,7 +3259,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT SUBSTRING(CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END, 0 + 1, 3) 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] @@ -4028,7 +4002,6 @@ public override async Task Null_propagation_optimization5(bool async) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(LEN([g].[LeaderNickname]) AS int) - ELSE NULL END = 5 """); } @@ -4913,13 +4886,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member """ SELECT CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END AS [Id] 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY [t].[Note] """); @@ -5163,7 +5134,6 @@ public override async Task Select_null_propagation_optimization7(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [g].[LeaderNickname] + [g].[LeaderNickname] - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] """); @@ -5272,11 +5242,9 @@ ELSE CAST(0 AS bit) 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL ORDER BY CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END, [t].[Note] """); } @@ -5493,7 +5461,6 @@ public override async Task Select_null_propagation_negative8(bool async) """ SELECT CASE WHEN [s].[Id] IS NOT NULL THEN [c].[Name] - ELSE NULL END 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] @@ -5830,7 +5797,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation """ SELECT CASE WHEN [c].[Name] IS NOT NULL THEN [c].[Name] - ELSE NULL END 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] @@ -6583,13 +6549,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT [t].[Note], SUBSTRING([t].[Note], 0 + 1, CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[SquadId] - ELSE NULL END) AS [Function] 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL """); } @@ -7063,7 +7027,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo """ SELECT CASE WHEN [f].[CommanderName] IS NOT NULL THEN [f].[Eradicated] - ELSE NULL END FROM [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f] """); @@ -7805,10 +7768,8 @@ public override async Task Null_propagation_optimization2(bool async) FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] WHERE CASE WHEN [g].[LeaderNickname] IS NULL THEN NULL - ELSE CASE - WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) - ELSE CAST(0 AS bit) - END + WHEN [g].[LeaderNickname] LIKE N'%us' AND [g].[LeaderNickname] IS NOT NULL THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) END = CAST(1 AS bit) """); } @@ -7867,7 +7828,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async) """ SELECT CASE WHEN [f].[CommanderName] IS NOT NULL THEN [f].[CommanderName] - ELSE NULL END FROM [Factions] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [f] """); @@ -8318,13 +8278,11 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] ORDER BY CASE WHEN CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN CAST(CAST(LEN([g].[Nickname]) AS int) ^ 5 AS bit) ^ CAST(1 AS bit) - ELSE NULL END IS NOT NULL THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END @@ -9204,7 +9162,6 @@ public override async Task Select_null_propagation_negative2(bool async) """ SELECT CASE WHEN [g].[LeaderNickname] IS NOT NULL THEN [g0].[LeaderNickname] - ELSE NULL END FROM [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g] CROSS JOIN [Gears] FOR SYSTEM_TIME AS OF '2010-01-01T00:00:00.0000000' AS [g0] @@ -9308,10 +9265,8 @@ SELECT [t].[Note] 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 CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[Nickname] - ELSE NULL END IS NOT NULL AND CASE WHEN [t].[GearNickName] IS NOT NULL THEN [g].[HasSoulPatch] - ELSE NULL END = CAST(0 AS bit) ORDER BY [t].[Note] """); @@ -9400,7 +9355,6 @@ WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE WHEN [g].[LeaderNickname] LIKE N'%us' THEN CAST(1 AS bit) ELSE CAST(0 AS bit) END - ELSE NULL END = CAST(1 AS bit) """); } diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs index e6bb1577742..cddc6d96f46 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs @@ -1065,7 +1065,6 @@ public override async Task Null_propagation_optimization6(bool async) FROM "Gears" AS "g" WHERE CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."LeaderNickname") - ELSE NULL END = 5 """); } @@ -1562,7 +1561,6 @@ public override async Task Null_propagation_optimization3(bool async) FROM "Gears" AS "g" WHERE CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN "g"."LeaderNickname" LIKE '%us' - ELSE NULL END """); } @@ -1772,7 +1770,6 @@ public override async Task Select_null_propagation_negative1(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5 - ELSE NULL END FROM "Gears" AS "g" """); @@ -2269,10 +2266,8 @@ public override async Task Projecting_property_converted_to_nullable_into_unary( LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL AND NOT (CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."HasSoulPatch" - ELSE NULL END) ORDER BY "t"."Note" """); @@ -2395,7 +2390,6 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT substr(CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END, 0 + 1, 3) FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" @@ -2738,7 +2732,6 @@ public override async Task Projecting_property_converted_to_nullable_with_additi LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END + 1 = 2 """); } @@ -2876,16 +2869,13 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte """ SELECT CASE WHEN "f"."Name" = 'Locust' THEN 1 - ELSE NULL END AS "IsEradicated", "f"."CommanderName", "f"."Name" FROM "LocustLeaders" AS "l" INNER JOIN "Factions" AS "f" ON "l"."Name" = "f"."CommanderName" WHERE CASE WHEN "f"."Name" = 'Locust' THEN 1 - ELSE NULL END = 0 OR CASE WHEN "f"."Name" = 'Locust' THEN 1 - ELSE NULL END IS NULL """); } @@ -3012,13 +3002,11 @@ public override async Task Projecting_property_converted_to_nullable_into_member """ SELECT CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END AS "Id" FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL ORDER BY "t"."Note" """); @@ -3205,7 +3193,6 @@ public override async Task Select_null_propagation_works_for_multiple_navigation """ SELECT CASE WHEN "c"."Name" IS NOT NULL THEN "c"."Name" - ELSE NULL END FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" @@ -3313,7 +3300,6 @@ public override async Task Select_null_propagation_negative9(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5 - ELSE NULL END FROM "Gears" AS "g" """); @@ -3647,19 +3633,15 @@ public override async Task Projecting_property_converted_to_nullable_into_elemen """ SELECT CASE WHEN "t"."GearNickName" IS NOT NULL THEN length("g"."Nickname") - ELSE NULL END, CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END, CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END + 1 FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL ORDER BY "t"."Note" """); @@ -3846,7 +3828,6 @@ public override async Task Select_null_propagation_negative6(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN 0 - ELSE NULL END FROM "Gears" AS "g" """); @@ -4616,7 +4597,6 @@ public override async Task Projecting_property_converted_to_nullable_with_compar LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END = 1 """); } @@ -4856,13 +4836,11 @@ public override async Task Projecting_property_converted_to_nullable_with_functi """ SELECT "t"."Note", substr("t"."Note", 0 + 1, CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END) AS "Function" FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL """); } @@ -4990,19 +4968,15 @@ public override async Task Projecting_property_converted_to_nullable_into_new_ar """ SELECT CASE WHEN "t"."GearNickName" IS NOT NULL THEN length("g"."Nickname") - ELSE NULL END, CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END, CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END + 1 FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL ORDER BY "t"."Note" """); @@ -5289,7 +5263,6 @@ public override async Task Select_null_propagation_negative3(bool async) """ SELECT "g0"."Nickname", CASE WHEN "g0"."Nickname" IS NOT NULL AND "g0"."SquadId" IS NOT NULL THEN "g0"."LeaderNickname" IS NOT NULL - ELSE NULL END AS "Condition" FROM "Gears" AS "g" LEFT JOIN "Gears" AS "g0" ON "g"."HasSoulPatch" @@ -5642,7 +5615,6 @@ public override async Task Select_null_propagation_negative8(bool async) """ SELECT CASE WHEN "s"."Id" IS NOT NULL THEN "c"."Name" - ELSE NULL END FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" @@ -5820,7 +5792,6 @@ public override async Task Select_null_propagation_optimization7(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN "g"."LeaderNickname" || "g"."LeaderNickname" - ELSE NULL END FROM "Gears" AS "g" """); @@ -6471,7 +6442,6 @@ public override async Task Select_null_conditional_with_inheritance(bool async) """ SELECT CASE WHEN "f"."CommanderName" IS NOT NULL THEN "f"."CommanderName" - ELSE NULL END FROM "Factions" AS "f" """); @@ -6732,11 +6702,9 @@ public override async Task Projecting_property_converted_to_nullable_and_use_it_ LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL ORDER BY CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END, "t"."Note" """); } @@ -7417,7 +7385,6 @@ public override async Task Select_null_propagation_negative7(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN 1 - ELSE NULL END FROM "Gears" AS "g" """); @@ -7552,7 +7519,6 @@ public override async Task Null_propagation_optimization5(bool async) FROM "Gears" AS "g" WHERE CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."LeaderNickname") - ELSE NULL END = 5 """); } @@ -8144,13 +8110,11 @@ public override async Task Projecting_property_converted_to_nullable_with_additi """ SELECT "t"."Note", CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END + 1 AS "Value" FROM "Tags" AS "t" LEFT JOIN "Gears" AS "g" ON "t"."GearNickName" = "g"."Nickname" AND "t"."GearSquadId" = "g"."SquadId" WHERE CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."Nickname" - ELSE NULL END IS NOT NULL """); } @@ -8182,7 +8146,6 @@ public override async Task Select_null_conditional_with_inheritance_negative(boo """ SELECT CASE WHEN "f"."CommanderName" IS NOT NULL THEN "f"."Eradicated" - ELSE NULL END FROM "Factions" AS "f" """); @@ -8226,12 +8189,10 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5 - ELSE NULL END FROM "Gears" AS "g" ORDER BY CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN length("g"."Nickname") = 5 - ELSE NULL END IS NOT NULL """); } @@ -8635,7 +8596,6 @@ public override async Task Select_null_propagation_negative2(bool async) """ SELECT CASE WHEN "g"."LeaderNickname" IS NOT NULL THEN "g0"."LeaderNickname" - ELSE NULL END FROM "Gears" AS "g" CROSS JOIN "Gears" AS "g0" @@ -8934,7 +8894,6 @@ public override async Task Projecting_property_converted_to_nullable_with_condit SELECT CASE WHEN "t"."Note" <> 'K.I.A.' OR "t"."Note" IS NULL THEN CASE WHEN "t"."GearNickName" IS NOT NULL THEN "g"."SquadId" - ELSE NULL END ELSE -1 END