Skip to content

Commit 9ccfb88

Browse files
authored
Merge pull request #232 from microting/copilot/fix-assert-empty-failure-yet-again
Fix MySQL 8.0.40+ query evaluation and test baseline updates
2 parents 0633298 + 3108617 commit 9ccfb88

File tree

2 files changed

+114
-17
lines changed

2 files changed

+114
-17
lines changed

test/EFCore.MySql.FunctionalTests/Query/ComplexNavigationsQueryMySqlTest.cs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,24 +76,36 @@ await Assert.ThrowsAsync<ArgumentException>(
7676
public override async Task Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(bool async)
7777
{
7878
// DefaultIfEmpty on child collection. Issue #19095.
79-
await Assert.ThrowsAsync<EqualException>(
80-
async () => await base.Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(async));
79+
// Query now works correctly in MySQL 8.0.40+
80+
await base.Nested_SelectMany_correlated_with_join_table_correctly_translated_to_apply(async);
8181

82-
AssertSql(
83-
"""
82+
AssertSql(
83+
"""
8484
SELECT `s0`.`l1Name`, `s0`.`l2Name`, `s0`.`l3Name`
8585
FROM `LevelOne` AS `l`
86-
LEFT JOIN LATERAL (
86+
JOIN LATERAL (
8787
SELECT `s`.`l1Name`, `s`.`l2Name`, `s`.`l3Name`
88-
FROM `LevelTwo` AS `l0`
89-
LEFT JOIN `LevelThree` AS `l1` ON `l0`.`Id` = `l1`.`Id`
88+
FROM (
89+
SELECT 1
90+
) AS `e`
91+
LEFT JOIN (
92+
SELECT `l0`.`Id`
93+
FROM `LevelTwo` AS `l0`
94+
WHERE `l`.`Id` = `l0`.`OneToMany_Optional_Inverse2Id`
95+
) AS `l1` ON TRUE
96+
LEFT JOIN `LevelThree` AS `l2` ON `l1`.`Id` = `l2`.`Id`
9097
JOIN LATERAL (
91-
SELECT `l`.`Name` AS `l1Name`, `l1`.`Name` AS `l2Name`, `l3`.`Name` AS `l3Name`
92-
FROM `LevelFour` AS `l2`
93-
LEFT JOIN `LevelThree` AS `l3` ON `l2`.`OneToOne_Optional_PK_Inverse4Id` = `l3`.`Id`
94-
WHERE `l1`.`Id` IS NOT NULL AND (`l1`.`Id` = `l2`.`OneToMany_Optional_Inverse4Id`)
98+
SELECT `l`.`Name` AS `l1Name`, `l2`.`Name` AS `l2Name`, `l5`.`Name` AS `l3Name`
99+
FROM (
100+
SELECT 1
101+
) AS `e0`
102+
LEFT JOIN (
103+
SELECT `l3`.`OneToOne_Optional_PK_Inverse4Id`
104+
FROM `LevelFour` AS `l3`
105+
WHERE `l2`.`Id` IS NOT NULL AND (`l2`.`Id` = `l3`.`OneToMany_Optional_Inverse4Id`)
106+
) AS `l4` ON TRUE
107+
LEFT JOIN `LevelThree` AS `l5` ON `l4`.`OneToOne_Optional_PK_Inverse4Id` = `l5`.`Id`
95108
) AS `s` ON TRUE
96-
WHERE `l`.`Id` = `l0`.`OneToMany_Optional_Inverse2Id`
97109
) AS `s0` ON TRUE
98110
""");
99111
}

test/EFCore.MySql.FunctionalTests/Query/NorthwindMiscellaneousQueryMySqlTest.cs

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2165,7 +2165,25 @@ public override async Task Select_correlated_subquery_ordered(bool async)
21652165
{
21662166
await base.Select_correlated_subquery_ordered(async);
21672167

2168-
AssertSql();
2168+
AssertSql(
2169+
"""
2170+
@p='3'
2171+
2172+
SELECT `c0`.`CustomerID`, `o0`.`OrderID`, `o0`.`CustomerID`, `o0`.`EmployeeID`, `o0`.`OrderDate`
2173+
FROM (
2174+
SELECT `c`.`CustomerID`
2175+
FROM `Customers` AS `c`
2176+
ORDER BY `c`.`CustomerID`
2177+
LIMIT @p
2178+
) AS `c0`
2179+
LEFT JOIN LATERAL (
2180+
SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate`, `c0`.`CustomerID` AS `CustomerID0`
2181+
FROM `Orders` AS `o`
2182+
ORDER BY `o`.`OrderID`, `c0`.`CustomerID`
2183+
LIMIT 2 OFFSET 100
2184+
) AS `o0` ON TRUE
2185+
ORDER BY `c0`.`CustomerID`, `o0`.`OrderID`, `o0`.`CustomerID0`
2186+
""");
21692187
}
21702188

21712189
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)
22042222
{
22052223
await base.Select_subquery_recursive_trivial(async);
22062224

2207-
AssertSql();
2225+
AssertSql(
2226+
"""
2227+
SELECT `e`.`EmployeeID`, `s`.`EmployeeID`, `s`.`EmployeeID0`, `s`.`City`, `s`.`Country`, `s`.`FirstName`, `s`.`ReportsTo`, `s`.`Title`
2228+
FROM `Employees` AS `e`
2229+
LEFT JOIN LATERAL (
2230+
SELECT `e0`.`EmployeeID`, `e1`.`EmployeeID` AS `EmployeeID0`, `e1`.`City`, `e1`.`Country`, `e1`.`FirstName`, `e1`.`ReportsTo`, `e1`.`Title`
2231+
FROM `Employees` AS `e0`
2232+
LEFT JOIN `Employees` AS `e1` ON TRUE
2233+
) AS `s` ON TRUE
2234+
ORDER BY `e`.`EmployeeID`, `s`.`EmployeeID`, `s`.`EmployeeID0`
2235+
""");
22082236
}
22092237

22102238
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
27672795
{
27682796
await base.SelectMany_correlated_with_Select_value_type_and_DefaultIfEmpty_in_selector(async);
27692797

2770-
AssertSql();
2798+
AssertSql(
2799+
"""
2800+
SELECT COALESCE(`o0`.`OrderID`, 0)
2801+
FROM `Customers` AS `c`
2802+
LEFT JOIN LATERAL (
2803+
SELECT `o`.`OrderID`
2804+
FROM `Orders` AS `o`
2805+
WHERE (`c`.`CustomerID` = `o`.`CustomerID`) AND (`o`.`CustomerID` = 'NONEXISTENT')
2806+
LIMIT 2
2807+
) AS `o0` ON TRUE
2808+
""");
27712809
}
27722810

27732811
public override async Task SelectMany_correlated_subquery_hard(bool async)
27742812
{
27752813
await base.SelectMany_correlated_subquery_hard(async);
27762814

2777-
AssertSql();
2815+
AssertSql(
2816+
"""
2817+
@p='91'
2818+
2819+
SELECT `c1`.`City` AS `c1`, `e0`.`City`, `e0`.`c1`
2820+
FROM (
2821+
SELECT DISTINCT `c0`.`City`
2822+
FROM (
2823+
SELECT `c`.`City`
2824+
FROM `Customers` AS `c`
2825+
LIMIT @p
2826+
) AS `c0`
2827+
) AS `c1`
2828+
JOIN LATERAL (
2829+
SELECT `e`.`City`, `c1`.`City` AS `c1`
2830+
FROM `Employees` AS `e`
2831+
WHERE (`c1`.`City` = `e`.`City`) OR (`c1`.`City` IS NULL AND (`e`.`City` IS NULL))
2832+
LIMIT 9
2833+
) AS `e0` ON TRUE
2834+
JOIN LATERAL (
2835+
SELECT 1
2836+
FROM `Employees` AS `e1`
2837+
WHERE (`e0`.`City` = `e1`.`City`) OR (`e0`.`City` IS NULL AND (`e1`.`City` IS NULL))
2838+
LIMIT 9
2839+
) AS `e2` ON TRUE
2840+
""");
27782841
}
27792842

27802843
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
45884651
{
45894652
await base.DefaultIfEmpty_in_subquery_nested_filter_order_comparison(async);
45904653

4591-
AssertSql();
4654+
AssertSql(
4655+
"""
4656+
SELECT `c`.`CustomerID`, `s`.`OrderID`, `o2`.`OrderDate`
4657+
FROM `Customers` AS `c`
4658+
CROSS JOIN (
4659+
SELECT `o0`.`OrderID`
4660+
FROM (
4661+
SELECT 1
4662+
) AS `e`
4663+
LEFT JOIN (
4664+
SELECT `o`.`OrderID`
4665+
FROM `Orders` AS `o`
4666+
WHERE `o`.`OrderID` > 11050
4667+
) AS `o0` ON TRUE
4668+
) AS `s`
4669+
LEFT JOIN LATERAL (
4670+
SELECT `o1`.`OrderID`, `o1`.`OrderDate`
4671+
FROM `Orders` AS `o1`
4672+
WHERE `o1`.`OrderID` <= (CHAR_LENGTH(`c`.`CustomerID`) + 10250)
4673+
) AS `o2` ON TRUE
4674+
WHERE (`c`.`City` = 'Seattle') AND (`s`.`OrderID` IS NOT NULL AND (`o2`.`OrderID` IS NOT NULL))
4675+
ORDER BY `s`.`OrderID`, `o2`.`OrderDate`
4676+
""");
45924677
}
45934678

45944679
public override async Task OrderBy_skip_take(bool async)

0 commit comments

Comments
 (0)