diff --git a/test/EFCore.MySql.FunctionalTests/Query/ComplexNavigationsQueryMySqlTest.cs b/test/EFCore.MySql.FunctionalTests/Query/ComplexNavigationsQueryMySqlTest.cs index d049aba20..8cd04b29c 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/ComplexNavigationsQueryMySqlTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/ComplexNavigationsQueryMySqlTest.cs @@ -76,24 +76,36 @@ await Assert.ThrowsAsync( public override async Task Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(bool async) { // DefaultIfEmpty on child collection. Issue #19095. - await Assert.ThrowsAsync( - async () => await base.Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(async)); + // Query now works correctly in MySQL 8.0.40+ + await base.Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(async); - AssertSql( -""" + AssertSql( + """ SELECT `s0`.`l1Name`, `s0`.`l2Name`, `s0`.`l3Name` FROM `LevelOne` AS `l` -LEFT JOIN LATERAL ( +JOIN LATERAL ( SELECT `s`.`l1Name`, `s`.`l2Name`, `s`.`l3Name` - FROM `LevelTwo` AS `l0` - LEFT JOIN `LevelThree` AS `l1` ON `l0`.`Id` = `l1`.`Id` + FROM ( + SELECT 1 + ) AS `e` + LEFT JOIN ( + SELECT `l0`.`Id` + FROM `LevelTwo` AS `l0` + WHERE `l`.`Id` = `l0`.`OneToMany_Optional_Inverse2Id` + ) AS `l1` ON TRUE + LEFT JOIN `LevelThree` AS `l2` ON `l1`.`Id` = `l2`.`Id` JOIN LATERAL ( - SELECT `l`.`Name` AS `l1Name`, `l1`.`Name` AS `l2Name`, `l3`.`Name` AS `l3Name` - FROM `LevelFour` AS `l2` - LEFT JOIN `LevelThree` AS `l3` ON `l2`.`OneToOne_Optional_PK_Inverse4Id` = `l3`.`Id` - WHERE `l1`.`Id` IS NOT NULL AND (`l1`.`Id` = `l2`.`OneToMany_Optional_Inverse4Id`) + SELECT `l`.`Name` AS `l1Name`, `l2`.`Name` AS `l2Name`, `l5`.`Name` AS `l3Name` + FROM ( + SELECT 1 + ) AS `e0` + LEFT JOIN ( + SELECT `l3`.`OneToOne_Optional_PK_Inverse4Id` + FROM `LevelFour` AS `l3` + WHERE `l2`.`Id` IS NOT NULL AND (`l2`.`Id` = `l3`.`OneToMany_Optional_Inverse4Id`) + ) AS `l4` ON TRUE + LEFT JOIN `LevelThree` AS `l5` ON `l4`.`OneToOne_Optional_PK_Inverse4Id` = `l5`.`Id` ) AS `s` ON TRUE - WHERE `l`.`Id` = `l0`.`OneToMany_Optional_Inverse2Id` ) AS `s0` ON TRUE """); } diff --git a/test/EFCore.MySql.FunctionalTests/Query/NorthwindMiscellaneousQueryMySqlTest.cs b/test/EFCore.MySql.FunctionalTests/Query/NorthwindMiscellaneousQueryMySqlTest.cs index ceb1c6a17..4c76eb319 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/NorthwindMiscellaneousQueryMySqlTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/NorthwindMiscellaneousQueryMySqlTest.cs @@ -2165,7 +2165,25 @@ public override async Task Select_correlated_subquery_ordered(bool async) { await base.Select_correlated_subquery_ordered(async); - AssertSql(); + AssertSql( + """ +@p='3' + +SELECT `c0`.`CustomerID`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate` +FROM ( + SELECT `c`.`CustomerID` + FROM `Customers` AS `c` + ORDER BY `c`.`CustomerID` + LIMIT @p +) AS `c0` +LEFT JOIN LATERAL ( + SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c0`.`CustomerID` AS `CustomerID0` + FROM `Orders` AS `o` + ORDER BY `o`.`OrderID`, `c0`.`CustomerID` + LIMIT 2 OFFSET 100 +) AS `o0` ON TRUE +ORDER BY `c0`.`CustomerID`, `o0`.`OrderID`, `o0`.`CustomerID0` +"""); } public override async Task Select_nested_collection_in_anonymous_type_returning_ordered_queryable(bool async) @@ -2204,7 +2222,17 @@ public override async Task Select_subquery_recursive_trivial(bool async) { await base.Select_subquery_recursive_trivial(async); - AssertSql(); + AssertSql( + """ +SELECT `e`.`EmployeeID`, `s`.`EmployeeID`, `s`.`EmployeeID0`, `s`.`City`, `s`.`Country`, `s`.`FirstName`, `s`.`ReportsTo`, `s`.`Title` +FROM `Employees` AS `e` +LEFT JOIN LATERAL ( + SELECT `e0`.`EmployeeID`, `e1`.`EmployeeID` AS `EmployeeID0`, `e1`.`City`, `e1`.`Country`, `e1`.`FirstName`, `e1`.`ReportsTo`, `e1`.`Title` + FROM `Employees` AS `e0` + LEFT JOIN `Employees` AS `e1` ON TRUE +) AS `s` ON TRUE +ORDER BY `e`.`EmployeeID`, `s`.`EmployeeID`, `s`.`EmployeeID0` +"""); } public override async Task Where_subquery_on_bool(bool async) @@ -2767,14 +2795,49 @@ public override async Task SelectMany_correlated_with_Select_value_type_and_Defa { await base.SelectMany_correlated_with_Select_value_type_and_DefaultIfEmpty_in_selector(async); - AssertSql(); + AssertSql( + """ +SELECT COALESCE(`o0`.`OrderID`, 0) +FROM `Customers` AS `c` +LEFT JOIN LATERAL ( + SELECT `o`.`OrderID` + FROM `Orders` AS `o` + WHERE (`c`.`CustomerID` = `o`.`CustomerID`) AND (`o`.`CustomerID` = 'NONEXISTENT') + LIMIT 2 +) AS `o0` ON TRUE +"""); } public override async Task SelectMany_correlated_subquery_hard(bool async) { await base.SelectMany_correlated_subquery_hard(async); - AssertSql(); + AssertSql( + """ +@p='91' + +SELECT `c1`.`City` AS `c1`, `e0`.`City`, `e0`.`c1` +FROM ( + SELECT DISTINCT `c0`.`City` + FROM ( + SELECT `c`.`City` + FROM `Customers` AS `c` + LIMIT @p + ) AS `c0` +) AS `c1` +JOIN LATERAL ( + SELECT `e`.`City`, `c1`.`City` AS `c1` + FROM `Employees` AS `e` + WHERE (`c1`.`City` = `e`.`City`) OR (`c1`.`City` IS NULL AND (`e`.`City` IS NULL)) + LIMIT 9 +) AS `e0` ON TRUE +JOIN LATERAL ( + SELECT 1 + FROM `Employees` AS `e1` + WHERE (`e0`.`City` = `e1`.`City`) OR (`e0`.`City` IS NULL AND (`e1`.`City` IS NULL)) + LIMIT 9 +) AS `e2` ON TRUE +"""); } public override async Task SelectMany_cartesian_product_with_ordering(bool async) @@ -4588,7 +4651,29 @@ public override async Task DefaultIfEmpty_in_subquery_nested_filter_order_compar { await base.DefaultIfEmpty_in_subquery_nested_filter_order_comparison(async); - AssertSql(); + AssertSql( + """ +SELECT `c`.`CustomerID`, `s`.`OrderID`, `o2`.`OrderDate` +FROM `Customers` AS `c` +CROSS JOIN ( + SELECT `o0`.`OrderID` + FROM ( + SELECT 1 + ) AS `e` + LEFT JOIN ( + SELECT `o`.`OrderID` + FROM `Orders` AS `o` + WHERE `o`.`OrderID` > 11050 + ) AS `o0` ON TRUE +) AS `s` +LEFT JOIN LATERAL ( + SELECT `o1`.`OrderID`, `o1`.`OrderDate` + FROM `Orders` AS `o1` + WHERE `o1`.`OrderID` <= (CHAR_LENGTH(`c`.`CustomerID`) + 10250) +) AS `o2` ON TRUE +WHERE (`c`.`City` = 'Seattle') AND (`s`.`OrderID` IS NOT NULL AND (`o2`.`OrderID` IS NOT NULL)) +ORDER BY `s`.`OrderID`, `o2`.`OrderDate` +"""); } public override async Task OrderBy_skip_take(bool async)