Set operations within an IN mustnt be simplified and must be encased within a SELECT

pull/257/head
Christopher Jolly 1 year ago
parent b5d3422022
commit e570dfbf0f

@ -67,6 +67,16 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
//_jetSqlExpressionFactory = jetSqlExpressionFactory;
}
protected override bool TryGenerateWithoutWrappingSelect(SelectExpression selectExpression)
{
parent.TryPeek(out var exp);
if (exp is InExpression)
{
return false;
}
return base.TryGenerateWithoutWrappingSelect(selectExpression);
}
protected override Expression VisitSelect(SelectExpression selectExpression)
{
// Copy & pasted from `QuerySqlGenerator` to implement Jet's non-standard JOIN syntax and DUAL table
@ -569,8 +579,9 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
}
}
}*/
parent.Push(inExpression);
base.GenerateIn(inExpression, negated);
parent.Pop();
}
protected override Expression VisitSqlConstant(SqlConstantExpression sqlConstantExpression)

@ -9862,26 +9862,26 @@ SELECT `s`.`Name`, (
INNER JOIN `Squads` AS `s0` ON `g2`.`SquadId` = `s0`.`Id`)
INNER JOIN `Cities` AS `c` ON `g2`.`CityOfBirthName` = `c`.`Name`
WHERE 'Marcus' IN (
SELECT `t0`.`Nickname`
SELECT `u0`.`Nickname`
FROM (
SELECT `g3`.`Nickname`, `g3`.`SquadId`, `g3`.`AssignedCityName`, `g3`.`CityOfBirthName`, `g3`.`Discriminator`, `g3`.`FullName`, `g3`.`HasSoulPatch`, `g3`.`LeaderNickname`, `g3`.`LeaderSquadId`, `g3`.`Rank`
SELECT `g3`.`Nickname`
FROM `Gears` AS `g3`
UNION ALL
SELECT `g4`.`Nickname`, `g4`.`SquadId`, `g4`.`AssignedCityName`, `g4`.`CityOfBirthName`, `g4`.`Discriminator`, `g4`.`FullName`, `g4`.`HasSoulPatch`, `g4`.`LeaderNickname`, `g4`.`LeaderSquadId`, `g4`.`Rank`
SELECT `g4`.`Nickname`
FROM `Gears` AS `g4`
) AS `t0`
) AS `u0`
) AND (`s`.`Name` = `s0`.`Name` OR (`s`.`Name` IS NULL AND `s0`.`Name` IS NULL))) AS `SumOfLengths`
FROM `Gears` AS `g`
INNER JOIN `Squads` AS `s` ON `g`.`SquadId` = `s`.`Id`
WHERE 'Marcus' IN (
SELECT `t`.`Nickname`
SELECT `u`.`Nickname`
FROM (
SELECT `g0`.`Nickname`, `g0`.`SquadId`, `g0`.`AssignedCityName`, `g0`.`CityOfBirthName`, `g0`.`Discriminator`, `g0`.`FullName`, `g0`.`HasSoulPatch`, `g0`.`LeaderNickname`, `g0`.`LeaderSquadId`, `g0`.`Rank`
SELECT `g0`.`Nickname`
FROM `Gears` AS `g0`
UNION ALL
SELECT `g1`.`Nickname`, `g1`.`SquadId`, `g1`.`AssignedCityName`, `g1`.`CityOfBirthName`, `g1`.`Discriminator`, `g1`.`FullName`, `g1`.`HasSoulPatch`, `g1`.`LeaderNickname`, `g1`.`LeaderSquadId`, `g1`.`Rank`
SELECT `g1`.`Nickname`
FROM `Gears` AS `g1`
) AS `t`
) AS `u`
)
GROUP BY `s`.`Name`
""");

@ -3500,26 +3500,26 @@ WHERE (`t`.`Note` <> 'K.I.A.' OR `t`.`Note` IS NULL) AND `u`.`HasSoulPatch` <> T
await base.Optional_navigation_type_compensation_works_with_contains(async);
AssertSql(
"""
SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note]
FROM [Tags] AS [t]
"""
SELECT `t`.`Id`, `t`.`GearNickName`, `t`.`GearSquadId`, `t`.`IssueDate`, `t`.`Note`
FROM `Tags` AS `t`
LEFT JOIN (
SELECT [g].[Nickname], [g].[SquadId]
FROM [Gears] AS [g]
SELECT `g`.`Nickname`, `g`.`SquadId`
FROM `Gears` AS `g`
UNION ALL
SELECT [o].[Nickname], [o].[SquadId]
FROM [Officers] AS [o]
) AS [t0] ON [t].[GearNickName] = [t0].[Nickname] AND [t].[GearSquadId] = [t0].[SquadId]
WHERE ([t].[Note] <> N'K.I.A.' OR ([t].[Note] IS NULL)) AND EXISTS (
SELECT 1
SELECT `o`.`Nickname`, `o`.`SquadId`
FROM `Officers` AS `o`
) AS `u` ON `t`.`GearNickName` = `u`.`Nickname` AND `t`.`GearSquadId` = `u`.`SquadId`
WHERE (`t`.`Note` <> 'K.I.A.' OR `t`.`Note` IS NULL) AND `u`.`SquadId` IN (
SELECT `u0`.`SquadId`
FROM (
SELECT [g0].[Nickname], [g0].[SquadId], [g0].[AssignedCityName], [g0].[CityOfBirthName], [g0].[FullName], [g0].[HasSoulPatch], [g0].[LeaderNickname], [g0].[LeaderSquadId], [g0].[Rank], N'Gear' AS [Discriminator]
FROM [Gears] AS [g0]
SELECT `g0`.`SquadId`
FROM `Gears` AS `g0`
UNION ALL
SELECT [o0].[Nickname], [o0].[SquadId], [o0].[AssignedCityName], [o0].[CityOfBirthName], [o0].[FullName], [o0].[HasSoulPatch], [o0].[LeaderNickname], [o0].[LeaderSquadId], [o0].[Rank], N'Officer' AS [Discriminator]
FROM [Officers] AS [o0]
) AS [t1]
WHERE [t1].[SquadId] = [t0].[SquadId])
SELECT `o0`.`SquadId`
FROM `Officers` AS `o0`
) AS `u0`
)
""");
}
@ -10527,25 +10527,25 @@ WHERE DATEPART(millisecond, [m].[Duration]) = 1
await base.Contains_on_collection_of_byte_subquery(async);
AssertSql(
"""
SELECT [t].[Name], [t].[LocustHordeId], [t].[ThreatLevel], [t].[ThreatLevelByte], [t].[ThreatLevelNullableByte], [t].[DefeatedByNickname], [t].[DefeatedBySquadId], [t].[HighCommandId], [t].[Discriminator]
"""
SELECT `u`.`Name`, `u`.`LocustHordeId`, `u`.`ThreatLevel`, `u`.`ThreatLevelByte`, `u`.`ThreatLevelNullableByte`, `u`.`DefeatedByNickname`, `u`.`DefeatedBySquadId`, `u`.`HighCommandId`, `u`.`Discriminator`
FROM (
SELECT [l].[Name], [l].[LocustHordeId], [l].[ThreatLevel], [l].[ThreatLevelByte], [l].[ThreatLevelNullableByte], NULL AS [DefeatedByNickname], NULL AS [DefeatedBySquadId], NULL AS [HighCommandId], N'LocustLeader' AS [Discriminator]
FROM [LocustLeaders] AS [l]
SELECT `l`.`Name`, `l`.`LocustHordeId`, `l`.`ThreatLevel`, `l`.`ThreatLevelByte`, `l`.`ThreatLevelNullableByte`, NULL AS `DefeatedByNickname`, CVar(NULL) AS `DefeatedBySquadId`, CVar(NULL) AS `HighCommandId`, 'LocustLeader' AS `Discriminator`
FROM `LocustLeaders` AS `l`
UNION ALL
SELECT [l0].[Name], [l0].[LocustHordeId], [l0].[ThreatLevel], [l0].[ThreatLevelByte], [l0].[ThreatLevelNullableByte], [l0].[DefeatedByNickname], [l0].[DefeatedBySquadId], [l0].[HighCommandId], N'LocustCommander' AS [Discriminator]
FROM [LocustCommanders] AS [l0]
) AS [t]
WHERE EXISTS (
SELECT 1
SELECT `l0`.`Name`, `l0`.`LocustHordeId`, `l0`.`ThreatLevel`, `l0`.`ThreatLevelByte`, `l0`.`ThreatLevelNullableByte`, `l0`.`DefeatedByNickname`, `l0`.`DefeatedBySquadId`, `l0`.`HighCommandId`, 'LocustCommander' AS `Discriminator`
FROM `LocustCommanders` AS `l0`
) AS `u`
WHERE `u`.`ThreatLevelByte` IN (
SELECT `u0`.`ThreatLevelByte`
FROM (
SELECT [l1].[Name], [l1].[LocustHordeId], [l1].[ThreatLevel], [l1].[ThreatLevelByte], [l1].[ThreatLevelNullableByte], NULL AS [DefeatedByNickname], NULL AS [DefeatedBySquadId], NULL AS [HighCommandId], N'LocustLeader' AS [Discriminator]
FROM [LocustLeaders] AS [l1]
SELECT `l1`.`ThreatLevelByte`
FROM `LocustLeaders` AS `l1`
UNION ALL
SELECT [l2].[Name], [l2].[LocustHordeId], [l2].[ThreatLevel], [l2].[ThreatLevelByte], [l2].[ThreatLevelNullableByte], [l2].[DefeatedByNickname], [l2].[DefeatedBySquadId], [l2].[HighCommandId], N'LocustCommander' AS [Discriminator]
FROM [LocustCommanders] AS [l2]
) AS [t0]
WHERE [t0].[ThreatLevelByte] = [t].[ThreatLevelByte])
SELECT `l2`.`ThreatLevelByte`
FROM `LocustCommanders` AS `l2`
) AS `u0`
)
""");
}
@ -13393,29 +13393,35 @@ ORDER BY `u`.`Nickname`, `u`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
SELECT `s`.`Name`, (
SELECT IIF(SUM(IIF(LEN(`c`.`Location`) IS NULL, NULL, CLNG(LEN(`c`.`Location`)))) IS NULL, 0, SUM(IIF(LEN(`c`.`Location`) IS NULL, NULL, CLNG(LEN(`c`.`Location`)))))
FROM ((
SELECT `g0`.`Nickname`, `g0`.`SquadId`, `g0`.`AssignedCityName`, `g0`.`CityOfBirthName`, `g0`.`FullName`, `g0`.`HasSoulPatch`, `g0`.`LeaderNickname`, `g0`.`LeaderSquadId`, `g0`.`Rank`, 'Gear' AS `Discriminator`
FROM `Gears` AS `g0`
SELECT `g2`.`SquadId`, `g2`.`CityOfBirthName`
FROM `Gears` AS `g2`
UNION ALL
SELECT `o0`.`Nickname`, `o0`.`SquadId`, `o0`.`AssignedCityName`, `o0`.`CityOfBirthName`, `o0`.`FullName`, `o0`.`HasSoulPatch`, `o0`.`LeaderNickname`, `o0`.`LeaderSquadId`, `o0`.`Rank`, 'Officer' AS `Discriminator`
FROM `Officers` AS `o0`
) AS `t3`
INNER JOIN `Squads` AS `s0` ON `t3`.`SquadId` = `s0`.`Id`)
INNER JOIN `Cities` AS `c` ON `t3`.`CityOfBirthName` = `c`.`Name`
SELECT `o2`.`SquadId`, `o2`.`CityOfBirthName`
FROM `Officers` AS `o2`
) AS `u3`
INNER JOIN `Squads` AS `s0` ON `u3`.`SquadId` = `s0`.`Id`)
INNER JOIN `Cities` AS `c` ON `u3`.`CityOfBirthName` = `c`.`Name`
WHERE 'Marcus' IN (
SELECT `t4`.`Nickname`
SELECT `u4`.`Nickname`
FROM (
SELECT `g1`.`Nickname`, `g1`.`SquadId`, `g1`.`AssignedCityName`, `g1`.`CityOfBirthName`, `g1`.`FullName`, `g1`.`HasSoulPatch`, `g1`.`LeaderNickname`, `g1`.`LeaderSquadId`, `g1`.`Rank`, 'Gear' AS `Discriminator`
FROM `Gears` AS `g1`
UNION ALL
SELECT `o1`.`Nickname`, `o1`.`SquadId`, `o1`.`AssignedCityName`, `o1`.`CityOfBirthName`, `o1`.`FullName`, `o1`.`HasSoulPatch`, `o1`.`LeaderNickname`, `o1`.`LeaderSquadId`, `o1`.`Rank`, 'Officer' AS `Discriminator`
FROM `Officers` AS `o1`
UNION ALL
SELECT `g2`.`Nickname`, `g2`.`SquadId`, `g2`.`AssignedCityName`, `g2`.`CityOfBirthName`, `g2`.`FullName`, `g2`.`HasSoulPatch`, `g2`.`LeaderNickname`, `g2`.`LeaderSquadId`, `g2`.`Rank`, 'Gear' AS `Discriminator`
FROM `Gears` AS `g2`
SELECT `u5`.`Nickname`
FROM (
SELECT `g3`.`Nickname`
FROM `Gears` AS `g3`
UNION ALL
SELECT `o3`.`Nickname`
FROM `Officers` AS `o3`
) AS `u5`
UNION ALL
SELECT `o2`.`Nickname`, `o2`.`SquadId`, `o2`.`AssignedCityName`, `o2`.`CityOfBirthName`, `o2`.`FullName`, `o2`.`HasSoulPatch`, `o2`.`LeaderNickname`, `o2`.`LeaderSquadId`, `o2`.`Rank`, 'Officer' AS `Discriminator`
FROM `Officers` AS `o2`
) AS `t4`
SELECT `u6`.`Nickname`
FROM (
SELECT `g4`.`Nickname`
FROM `Gears` AS `g4`
UNION ALL
SELECT `o4`.`Nickname`
FROM `Officers` AS `o4`
) AS `u6`
) AS `u4`
) AND (`s`.`Name` = `s0`.`Name` OR (`s`.`Name` IS NULL AND `s0`.`Name` IS NULL))) AS `SumOfLengths`
FROM (
SELECT `g`.`SquadId`
@ -13423,23 +13429,29 @@ FROM (
UNION ALL
SELECT `o`.`SquadId`
FROM `Officers` AS `o`
) AS `t`
INNER JOIN `Squads` AS `s` ON `t`.`SquadId` = `s`.`Id`
) AS `u`
INNER JOIN `Squads` AS `s` ON `u`.`SquadId` = `s`.`Id`
WHERE 'Marcus' IN (
SELECT `t0`.`Nickname`
SELECT `u2`.`Nickname`
FROM (
SELECT `g3`.`Nickname`, `g3`.`SquadId`, `g3`.`AssignedCityName`, `g3`.`CityOfBirthName`, `g3`.`FullName`, `g3`.`HasSoulPatch`, `g3`.`LeaderNickname`, `g3`.`LeaderSquadId`, `g3`.`Rank`, 'Gear' AS `Discriminator`
FROM `Gears` AS `g3`
UNION ALL
SELECT `o3`.`Nickname`, `o3`.`SquadId`, `o3`.`AssignedCityName`, `o3`.`CityOfBirthName`, `o3`.`FullName`, `o3`.`HasSoulPatch`, `o3`.`LeaderNickname`, `o3`.`LeaderSquadId`, `o3`.`Rank`, 'Officer' AS `Discriminator`
FROM `Officers` AS `o3`
UNION ALL
SELECT `g4`.`Nickname`, `g4`.`SquadId`, `g4`.`AssignedCityName`, `g4`.`CityOfBirthName`, `g4`.`FullName`, `g4`.`HasSoulPatch`, `g4`.`LeaderNickname`, `g4`.`LeaderSquadId`, `g4`.`Rank`, 'Gear' AS `Discriminator`
FROM `Gears` AS `g4`
SELECT `u0`.`Nickname`
FROM (
SELECT `g0`.`Nickname`
FROM `Gears` AS `g0`
UNION ALL
SELECT `o0`.`Nickname`
FROM `Officers` AS `o0`
) AS `u0`
UNION ALL
SELECT `o4`.`Nickname`, `o4`.`SquadId`, `o4`.`AssignedCityName`, `o4`.`CityOfBirthName`, `o4`.`FullName`, `o4`.`HasSoulPatch`, `o4`.`LeaderNickname`, `o4`.`LeaderSquadId`, `o4`.`Rank`, 'Officer' AS `Discriminator`
FROM `Officers` AS `o4`
) AS `t0`
SELECT `u1`.`Nickname`
FROM (
SELECT `g1`.`Nickname`
FROM `Gears` AS `g1`
UNION ALL
SELECT `o1`.`Nickname`
FROM `Officers` AS `o1`
) AS `u1`
) AS `u2`
)
GROUP BY `s`.`Name`
""");

@ -10832,38 +10832,33 @@ ORDER BY `g`.`Nickname`, `g`.`SquadId`, `s`.`Id`, `s1`.`SquadId`
await base.Set_operator_with_navigation_in_projection_groupby_aggregate(async);
AssertSql(
"""
"""
SELECT `s`.`Name`, (
SELECT IIF(SUM(IIF(LEN(`c`.`Location`) IS NULL, NULL, CLNG(LEN(`c`.`Location`)))) IS NULL, 0, SUM(IIF(LEN(`c`.`Location`) IS NULL, NULL, CLNG(LEN(`c`.`Location`)))))
FROM ((`Gears` AS `g2`
LEFT JOIN `Officers` AS `o2` ON `g2`.`Nickname` = `o2`.`Nickname` AND `g2`.`SquadId` = `o2`.`SquadId`)
FROM (`Gears` AS `g2`
INNER JOIN `Squads` AS `s0` ON `g2`.`SquadId` = `s0`.`Id`)
INNER JOIN `Cities` AS `c` ON `g2`.`CityOfBirthName` = `c`.`Name`
WHERE 'Marcus' IN (
SELECT `t0`.`Nickname`
SELECT `u0`.`Nickname`
FROM (
SELECT `g3`.`Nickname`, `g3`.`SquadId`, `g3`.`AssignedCityName`, `g3`.`CityOfBirthName`, `g3`.`FullName`, `g3`.`HasSoulPatch`, `g3`.`LeaderNickname`, `g3`.`LeaderSquadId`, `g3`.`Rank`, IIF(`o3`.`Nickname` IS NOT NULL, 'Officer', NULL) AS `Discriminator`
SELECT `g3`.`Nickname`
FROM `Gears` AS `g3`
LEFT JOIN `Officers` AS `o3` ON `g3`.`Nickname` = `o3`.`Nickname` AND `g3`.`SquadId` = `o3`.`SquadId`
UNION ALL
SELECT `g4`.`Nickname`, `g4`.`SquadId`, `g4`.`AssignedCityName`, `g4`.`CityOfBirthName`, `g4`.`FullName`, `g4`.`HasSoulPatch`, `g4`.`LeaderNickname`, `g4`.`LeaderSquadId`, `g4`.`Rank`, IIF(`o4`.`Nickname` IS NOT NULL, 'Officer', NULL) AS `Discriminator`
SELECT `g4`.`Nickname`
FROM `Gears` AS `g4`
LEFT JOIN `Officers` AS `o4` ON `g4`.`Nickname` = `o4`.`Nickname` AND `g4`.`SquadId` = `o4`.`SquadId`
) AS `t0`
) AS `u0`
) AND (`s`.`Name` = `s0`.`Name` OR (`s`.`Name` IS NULL AND `s0`.`Name` IS NULL))) AS `SumOfLengths`
FROM `Gears` AS `g`
INNER JOIN `Squads` AS `s` ON `g`.`SquadId` = `s`.`Id`
WHERE 'Marcus' IN (
SELECT `t`.`Nickname`
SELECT `u`.`Nickname`
FROM (
SELECT `g0`.`Nickname`, `g0`.`SquadId`, `g0`.`AssignedCityName`, `g0`.`CityOfBirthName`, `g0`.`FullName`, `g0`.`HasSoulPatch`, `g0`.`LeaderNickname`, `g0`.`LeaderSquadId`, `g0`.`Rank`, IIF(`o0`.`Nickname` IS NOT NULL, 'Officer', NULL) AS `Discriminator`
SELECT `g0`.`Nickname`
FROM `Gears` AS `g0`
LEFT JOIN `Officers` AS `o0` ON `g0`.`Nickname` = `o0`.`Nickname` AND `g0`.`SquadId` = `o0`.`SquadId`
UNION ALL
SELECT `g1`.`Nickname`, `g1`.`SquadId`, `g1`.`AssignedCityName`, `g1`.`CityOfBirthName`, `g1`.`FullName`, `g1`.`HasSoulPatch`, `g1`.`LeaderNickname`, `g1`.`LeaderSquadId`, `g1`.`Rank`, IIF(`o1`.`Nickname` IS NOT NULL, 'Officer', NULL) AS `Discriminator`
SELECT `g1`.`Nickname`
FROM `Gears` AS `g1`
LEFT JOIN `Officers` AS `o1` ON `g1`.`Nickname` = `o1`.`Nickname` AND `g1`.`SquadId` = `o1`.`SquadId`
) AS `t`
) AS `u`
)
GROUP BY `s`.`Name`
""");

Loading…
Cancel
Save