Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SQL Server: Use XOR to translate more == and != expressions #34168

Merged
merged 3 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update baselines
  • Loading branch information
ranma42 committed Jul 5, 2024
commit 7b29e48a1f534e75f2e3a1de906b1e6b3ab6a81c
Original file line number Diff line number Diff line change
Expand Up @@ -553,13 +553,7 @@ public override async Task Bitwise_projects_values_in_select(bool async)

AssertSql(
"""
SELECT TOP(1) CASE
WHEN [g].[Rank] & 2 = 2 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [BitwiseTrue], CASE
WHEN [g].[Rank] & 2 = 4 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [BitwiseFalse], [g].[Rank] & 2 AS [BitwiseValue]
SELECT TOP(1) CAST(([g].[Rank] & 2) ^ 2 AS bit) ^ CAST(1 AS bit) AS [BitwiseTrue], CAST(([g].[Rank] & 2) ^ 4 AS bit) ^ CAST(1 AS bit) AS [BitwiseFalse], [g].[Rank] & 2 AS [BitwiseValue]
FROM [Gears] AS [g]
WHERE [g].[Rank] & 2 = 2
""");
Expand Down Expand Up @@ -722,13 +716,7 @@ public override async Task Select_enum_has_flag(bool async)

AssertSql(
"""
SELECT TOP(1) CASE
WHEN [g].[Rank] & 2 = 2 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [hasFlagTrue], CASE
WHEN [g].[Rank] & 4 = 4 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [hasFlagFalse]
SELECT TOP(1) CAST(([g].[Rank] & 2) ^ 2 AS bit) ^ CAST(1 AS bit) AS [hasFlagTrue], CAST(([g].[Rank] & 4) ^ 4 AS bit) ^ CAST(1 AS bit) AS [hasFlagFalse]
FROM [Gears] AS [g]
WHERE [g].[Rank] & 2 = 2
""");
Expand Down Expand Up @@ -1087,10 +1075,7 @@ public override async Task Select_null_propagation_negative1(bool async)
AssertSql(
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([g].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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]
Expand Down Expand Up @@ -1215,10 +1200,7 @@ public override async Task Select_null_propagation_negative9(bool async)
AssertSql(
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([g].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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]
Expand Down Expand Up @@ -6332,19 +6314,13 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
AssertSql(
"""
SELECT CASE
WHEN [g].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([g].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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 CASE
WHEN CAST(LEN([g].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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)
Expand Down Expand Up @@ -7511,20 +7487,14 @@ WHERE [g].[Rank] & @__ranks_0 <> 0
"""
@__ranks_0='134'

SELECT CASE
WHEN [g].[Rank] | @__ranks_0 = @__ranks_0 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(([g].[Rank] | @__ranks_0) ^ @__ranks_0 AS bit) ^ CAST(1 AS bit)
FROM [Gears] AS [g]
""",
//
"""
@__ranks_0='134'

SELECT CASE
WHEN [g].[Rank] | [g].[Rank] | @__ranks_0 | [g].[Rank] | @__ranks_0 = @__ranks_0 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(([g].[Rank] | [g].[Rank] | @__ranks_0 | [g].[Rank] | @__ranks_0) ^ @__ranks_0 AS bit) ^ CAST(1 AS bit)
FROM [Gears] AS [g]
""");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -888,10 +888,7 @@ await AssertQueryScalar(

AssertSql(
"""
SELECT CASE
WHEN ISNUMERIC(CONVERT(varchar(100), [o].[OrderDate])) = 1 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(ISNUMERIC(CONVERT(varchar(100), [o].[OrderDate])) ^ 1 AS bit) ^ CAST(1 AS bit)
FROM [Orders] AS [o]
WHERE ISNUMERIC(CONVERT(varchar(100), [o].[OrderDate])) <> 1
""");
Expand All @@ -910,10 +907,7 @@ await AssertQueryScalar(

AssertSql(
"""
SELECT CASE
WHEN ISNUMERIC(CONVERT(varchar(100), [o].[UnitPrice])) = 1 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(ISNUMERIC(CONVERT(varchar(100), [o].[UnitPrice])) ^ 1 AS bit) ^ CAST(1 AS bit)
FROM [Order Details] AS [o]
WHERE ISNUMERIC(CONVERT(varchar(100), [o].[UnitPrice])) = 1
""");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@ public override async Task Rewrite_compare_int_with_int(bool async)

AssertSql(
"""
SELECT [e].[Id], CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [X]
SELECT [e].[Id], CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit) AS [X]
FROM [Entities1] AS [e]
""",
//
Expand Down Expand Up @@ -78,10 +75,7 @@ FROM [Entities1] AS [e]
""",
//
"""
SELECT [e].[Id], CASE
WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [X]
SELECT [e].[Id], CAST([e].[IntA] ^ [e].[IntB] AS bit) AS [X]
FROM [Entities1] AS [e]
""",
//
Expand Down Expand Up @@ -134,10 +128,7 @@ FROM [Entities1] AS [e]
""",
//
"""
SELECT [e].[Id], CASE
WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [X]
SELECT [e].[Id], CAST([e].[IntA] ^ [e].[IntB] AS bit) AS [X]
FROM [Entities1] AS [e]
""",
//
Expand Down Expand Up @@ -190,10 +181,7 @@ FROM [Entities1] AS [e]
""",
//
"""
SELECT [e].[Id], CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [X]
SELECT [e].[Id], CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit) AS [X]
FROM [Entities1] AS [e]
""",
//
Expand Down Expand Up @@ -1708,10 +1696,7 @@ public override async Task Compare_complex_equal_equal_equal(bool async)
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] ^ CAST(1 AS bit) = CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] ^ CAST(1 AS bit) = CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit)
""",
//
"""
Expand Down Expand Up @@ -1747,10 +1732,7 @@ public override async Task Compare_complex_equal_not_equal_equal(bool async)
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] ^ CAST(1 AS bit) <> CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] ^ CAST(1 AS bit) <> CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit)
""",
//
"""
Expand Down Expand Up @@ -1786,10 +1768,7 @@ public override async Task Compare_complex_not_equal_equal_equal(bool async)
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] = CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] = CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit)
""",
//
"""
Expand Down Expand Up @@ -1825,10 +1804,7 @@ public override async Task Compare_complex_not_equal_not_equal_equal(bool async)
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] <> CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] <> CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit)
""",
//
"""
Expand Down Expand Up @@ -1864,10 +1840,7 @@ public override async Task Compare_complex_not_equal_equal_not_equal(bool async)
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] = CASE
WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] = CAST([e].[IntA] ^ [e].[IntB] AS bit)
""",
//
"""
Expand Down Expand Up @@ -1903,10 +1876,7 @@ public override async Task Compare_complex_not_equal_not_equal_not_equal(bool as
"""
SELECT [e].[Id]
FROM [Entities1] AS [e]
WHERE [e].[BoolA] ^ [e].[BoolB] <> CASE
WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
WHERE [e].[BoolA] ^ [e].[BoolB] <> CAST([e].[IntA] ^ [e].[IntB] AS bit)
""",
//
"""
Expand Down Expand Up @@ -4279,10 +4249,7 @@ public override async Task Comparison_compared_to_null_check_on_bool(bool async)
"""
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 CASE
WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END <> CASE
WHERE CAST([e].[IntA] ^ [e].[IntB] AS bit) ^ CAST(1 AS bit) <> CASE
WHEN [e].[NullableBoolA] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
Expand All @@ -4291,10 +4258,7 @@ ELSE CAST(0 AS bit)
"""
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 CASE
WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END = CASE
WHERE CAST([e].[IntA] ^ [e].[IntB] AS bit) = CASE
WHEN [e].[NullableBoolA] IS NOT NULL THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,10 +273,7 @@ public override async Task Navigation_rewrite_on_owned_collection_with_compositi
AssertSql(
"""
SELECT COALESCE((
SELECT TOP(1) CASE
WHEN [o0].[Id] <> 42 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT TOP(1) CAST([o0].[Id] ^ 42 AS bit)
FROM [Order] AS [o0]
WHERE [o].[Id] = [o0].[ClientId]
ORDER BY [o0].[Id]), CAST(0 AS bit))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -747,13 +747,7 @@ public override async Task Bitwise_projects_values_in_select(bool async)

AssertSql(
"""
SELECT TOP(1) CASE
WHEN [u].[Rank] & 2 = 2 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [BitwiseTrue], CASE
WHEN [u].[Rank] & 2 = 4 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [BitwiseFalse], [u].[Rank] & 2 AS [BitwiseValue]
SELECT TOP(1) CAST(([u].[Rank] & 2) ^ 2 AS bit) ^ CAST(1 AS bit) AS [BitwiseTrue], CAST(([u].[Rank] & 2) ^ 4 AS bit) ^ CAST(1 AS bit) AS [BitwiseFalse], [u].[Rank] & 2 AS [BitwiseValue]
FROM (
SELECT [g].[Rank]
FROM [Gears] AS [g]
Expand Down Expand Up @@ -1072,13 +1066,7 @@ public override async Task Select_enum_has_flag(bool async)

AssertSql(
"""
SELECT TOP(1) CASE
WHEN [u].[Rank] & 2 = 2 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [hasFlagTrue], CASE
WHEN [u].[Rank] & 4 = 4 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END AS [hasFlagFalse]
SELECT TOP(1) CAST(([u].[Rank] & 2) ^ 2 AS bit) ^ CAST(1 AS bit) AS [hasFlagTrue], CAST(([u].[Rank] & 4) ^ 4 AS bit) ^ CAST(1 AS bit) AS [hasFlagFalse]
FROM (
SELECT [g].[Rank]
FROM [Gears] AS [g]
Expand Down Expand Up @@ -1509,10 +1497,7 @@ public override async Task Select_null_propagation_negative1(bool async)
AssertSql(
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([u].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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 (
Expand Down Expand Up @@ -1709,10 +1694,7 @@ public override async Task Select_null_propagation_negative9(bool async)
AssertSql(
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([u].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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 (
Expand Down Expand Up @@ -8610,10 +8592,7 @@ public override async Task OrderBy_same_expression_containing_IsNull_correctly_d
AssertSql(
"""
SELECT CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([u].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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 (
Expand All @@ -8625,10 +8604,7 @@ FROM [Officers] AS [o]
) AS [u]
ORDER BY CASE
WHEN CASE
WHEN [u].[LeaderNickname] IS NOT NULL THEN CASE
WHEN CAST(LEN([u].[Nickname]) AS int) = 5 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
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)
Expand Down Expand Up @@ -10045,10 +10021,7 @@ WHERE [u].[Rank] & @__ranks_0 <> 0
"""
@__ranks_0='134'

SELECT CASE
WHEN [u].[Rank] | @__ranks_0 = @__ranks_0 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(([u].[Rank] | @__ranks_0) ^ @__ranks_0 AS bit) ^ CAST(1 AS bit)
FROM (
SELECT [g].[Rank]
FROM [Gears] AS [g]
Expand All @@ -10061,10 +10034,7 @@ FROM [Officers] AS [o]
"""
@__ranks_0='134'

SELECT CASE
WHEN [u].[Rank] | [u].[Rank] | @__ranks_0 | [u].[Rank] | @__ranks_0 = @__ranks_0 THEN CAST(1 AS bit)
ELSE CAST(0 AS bit)
END
SELECT CAST(([u].[Rank] | [u].[Rank] | @__ranks_0 | [u].[Rank] | @__ranks_0) ^ @__ranks_0 AS bit) ^ CAST(1 AS bit)
FROM (
SELECT [g].[Rank]
FROM [Gears] AS [g]
Expand Down
Loading