Skip to content

Commit b340298

Browse files
Copilotrenemadsen
andcommitted
Fix additional DELETE tests with self-referencing subqueries in NorthwindBulkUpdatesMySqlTest
Co-authored-by: renemadsen <76994+renemadsen@users.noreply.github.com>
1 parent 43049cb commit b340298

File tree

1 file changed

+234
-16
lines changed

1 file changed

+234
-16
lines changed

test/EFCore.MySql.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesMySqlTest.cs

Lines changed: 234 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,14 @@ WHERE FALSE
7676

7777
public override async Task Delete_Where_OrderBy(bool async)
7878
{
79-
await base.Delete_Where_OrderBy(async);
79+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
80+
{
81+
// Not supported by MySQL and older MariaDB versions:
82+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
83+
await Assert.ThrowsAsync<MySqlException>(
84+
() => base.Delete_Where_OrderBy(async));
8085

81-
AssertSql(
86+
AssertSql(
8287
"""
8388
DELETE `o`
8489
FROM `Order Details` AS `o`
@@ -87,13 +92,33 @@ SELECT 1
8792
FROM `Order Details` AS `o0`
8893
WHERE (`o0`.`OrderID` < 10300) AND ((`o0`.`OrderID` = `o`.`OrderID`) AND (`o0`.`ProductID` = `o`.`ProductID`)))
8994
""");
95+
}
96+
else
97+
{
98+
await base.Delete_Where_OrderBy(async);
99+
100+
AssertSql(
101+
"""
102+
DELETE `o`
103+
FROM `Order Details` AS `o`
104+
WHERE EXISTS (
105+
SELECT 1
106+
FROM `Order Details` AS `o0`
107+
WHERE (`o0`.`OrderID` < 10300) AND ((`o0`.`OrderID` = `o`.`OrderID`) AND (`o0`.`ProductID` = `o`.`ProductID`)))
108+
""");
109+
}
90110
}
91111

92112
public override async Task Delete_Where_OrderBy_Skip(bool async)
93113
{
94-
await base.Delete_Where_OrderBy_Skip(async);
114+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
115+
{
116+
// Not supported by MySQL and older MariaDB versions:
117+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
118+
await Assert.ThrowsAsync<MySqlException>(
119+
() => base.Delete_Where_OrderBy_Skip(async));
95120

96-
AssertSql(
121+
AssertSql(
97122
"""
98123
@p='100'
99124
@@ -110,13 +135,41 @@ LIMIT 18446744073709551610 OFFSET @p
110135
) AS `o1`
111136
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
112137
""");
138+
}
139+
else
140+
{
141+
await base.Delete_Where_OrderBy_Skip(async);
142+
143+
AssertSql(
144+
"""
145+
@p='100'
146+
147+
DELETE `o`
148+
FROM `Order Details` AS `o`
149+
WHERE EXISTS (
150+
SELECT 1
151+
FROM (
152+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
153+
FROM `Order Details` AS `o0`
154+
WHERE `o0`.`OrderID` < 10300
155+
ORDER BY `o0`.`OrderID`
156+
LIMIT 18446744073709551610 OFFSET @p
157+
) AS `o1`
158+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
159+
""");
160+
}
113161
}
114162

115163
public override async Task Delete_Where_OrderBy_Take(bool async)
116164
{
117-
await base.Delete_Where_OrderBy_Take(async);
165+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
166+
{
167+
// Not supported by MySQL and older MariaDB versions:
168+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
169+
await Assert.ThrowsAsync<MySqlException>(
170+
() => base.Delete_Where_OrderBy_Take(async));
118171

119-
AssertSql(
172+
AssertSql(
120173
"""
121174
@p='100'
122175
@@ -133,13 +186,63 @@ LIMIT @p
133186
) AS `o1`
134187
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
135188
""");
189+
}
190+
else
191+
{
192+
await base.Delete_Where_OrderBy_Take(async);
193+
194+
AssertSql(
195+
"""
196+
@p='100'
197+
198+
DELETE `o`
199+
FROM `Order Details` AS `o`
200+
WHERE EXISTS (
201+
SELECT 1
202+
FROM (
203+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
204+
FROM `Order Details` AS `o0`
205+
WHERE `o0`.`OrderID` < 10300
206+
ORDER BY `o0`.`OrderID`
207+
LIMIT @p
208+
) AS `o1`
209+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
210+
""");
211+
}
136212
}
137213

138214
public override async Task Delete_Where_OrderBy_Skip_Take(bool async)
139215
{
140-
await base.Delete_Where_OrderBy_Skip_Take(async);
216+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
217+
{
218+
// Not supported by MySQL and older MariaDB versions:
219+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
220+
await Assert.ThrowsAsync<MySqlException>(
221+
() => base.Delete_Where_OrderBy_Skip_Take(async));
141222

142-
AssertSql(
223+
AssertSql(
224+
"""
225+
@p='100'
226+
227+
DELETE `o`
228+
FROM `Order Details` AS `o`
229+
WHERE EXISTS (
230+
SELECT 1
231+
FROM (
232+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
233+
FROM `Order Details` AS `o0`
234+
WHERE `o0`.`OrderID` < 10300
235+
ORDER BY `o0`.`OrderID`
236+
LIMIT @p OFFSET @p
237+
) AS `o1`
238+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
239+
""");
240+
}
241+
else
242+
{
243+
await base.Delete_Where_OrderBy_Skip_Take(async);
244+
245+
AssertSql(
143246
"""
144247
@p='100'
145248
@@ -156,13 +259,19 @@ LIMIT @p OFFSET @p
156259
) AS `o1`
157260
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
158261
""");
262+
}
159263
}
160264

161265
public override async Task Delete_Where_Skip(bool async)
162266
{
163-
await base.Delete_Where_Skip(async);
267+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
268+
{
269+
// Not supported by MySQL and older MariaDB versions:
270+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
271+
await Assert.ThrowsAsync<MySqlException>(
272+
() => base.Delete_Where_Skip(async));
164273

165-
AssertSql(
274+
AssertSql(
166275
"""
167276
@p='100'
168277
@@ -178,13 +287,61 @@ LIMIT 18446744073709551610 OFFSET @p
178287
) AS `o1`
179288
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
180289
""");
290+
}
291+
else
292+
{
293+
await base.Delete_Where_Skip(async);
294+
295+
AssertSql(
296+
"""
297+
@p='100'
298+
299+
DELETE `o`
300+
FROM `Order Details` AS `o`
301+
WHERE EXISTS (
302+
SELECT 1
303+
FROM (
304+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
305+
FROM `Order Details` AS `o0`
306+
WHERE `o0`.`OrderID` < 10300
307+
LIMIT 18446744073709551610 OFFSET @p
308+
) AS `o1`
309+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
310+
""");
311+
}
181312
}
182313

183314
public override async Task Delete_Where_Take(bool async)
184315
{
185-
await base.Delete_Where_Take(async);
316+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
317+
{
318+
// Not supported by MySQL and older MariaDB versions:
319+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
320+
await Assert.ThrowsAsync<MySqlException>(
321+
() => base.Delete_Where_Take(async));
186322

187-
AssertSql(
323+
AssertSql(
324+
"""
325+
@p='100'
326+
327+
DELETE `o`
328+
FROM `Order Details` AS `o`
329+
WHERE EXISTS (
330+
SELECT 1
331+
FROM (
332+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
333+
FROM `Order Details` AS `o0`
334+
WHERE `o0`.`OrderID` < 10300
335+
LIMIT @p
336+
) AS `o1`
337+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
338+
""");
339+
}
340+
else
341+
{
342+
await base.Delete_Where_Take(async);
343+
344+
AssertSql(
188345
"""
189346
@p='100'
190347
@@ -200,13 +357,40 @@ LIMIT @p
200357
) AS `o1`
201358
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
202359
""");
360+
}
203361
}
204362

205363
public override async Task Delete_Where_Skip_Take(bool async)
206364
{
207-
await base.Delete_Where_Skip_Take(async);
365+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
366+
{
367+
// Not supported by MySQL and older MariaDB versions:
368+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
369+
await Assert.ThrowsAsync<MySqlException>(
370+
() => base.Delete_Where_Skip_Take(async));
208371

209-
AssertSql(
372+
AssertSql(
373+
"""
374+
@p='100'
375+
376+
DELETE `o`
377+
FROM `Order Details` AS `o`
378+
WHERE EXISTS (
379+
SELECT 1
380+
FROM (
381+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
382+
FROM `Order Details` AS `o0`
383+
WHERE `o0`.`OrderID` < 10300
384+
LIMIT @p OFFSET @p
385+
) AS `o1`
386+
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
387+
""");
388+
}
389+
else
390+
{
391+
await base.Delete_Where_Skip_Take(async);
392+
393+
AssertSql(
210394
"""
211395
@p='100'
212396
@@ -222,6 +406,7 @@ LIMIT @p OFFSET @p
222406
) AS `o1`
223407
WHERE (`o1`.`OrderID` = `o`.`OrderID`) AND (`o1`.`ProductID` = `o`.`ProductID`))
224408
""");
409+
}
225410
}
226411

227412
public override async Task Delete_Where_predicate_with_GroupBy_aggregate(bool async)
@@ -283,9 +468,41 @@ public override async Task Delete_GroupBy_Where_Select_2(bool async)
283468

284469
public override async Task Delete_Where_Skip_Take_Skip_Take_causing_subquery(bool async)
285470
{
286-
await base.Delete_Where_Skip_Take_Skip_Take_causing_subquery(async);
471+
if (!AppConfig.ServerVersion.Supports.DeleteWithSelfReferencingSubquery)
472+
{
473+
// Not supported by MySQL and older MariaDB versions:
474+
// Error Code: 1093. You can't specify target table 'o' for update in FROM clause
475+
await Assert.ThrowsAsync<MySqlException>(
476+
() => base.Delete_Where_Skip_Take_Skip_Take_causing_subquery(async));
287477

288-
AssertSql(
478+
AssertSql(
479+
"""
480+
@p='100'
481+
@p2='5'
482+
@p1='20'
483+
484+
DELETE `o`
485+
FROM `Order Details` AS `o`
486+
WHERE EXISTS (
487+
SELECT 1
488+
FROM (
489+
SELECT `o0`.`OrderID`, `o0`.`ProductID`
490+
FROM (
491+
SELECT `o1`.`OrderID`, `o1`.`ProductID`
492+
FROM `Order Details` AS `o1`
493+
WHERE `o1`.`OrderID` < 10300
494+
LIMIT @p OFFSET @p
495+
) AS `o0`
496+
LIMIT @p2 OFFSET @p1
497+
) AS `o2`
498+
WHERE (`o2`.`OrderID` = `o`.`OrderID`) AND (`o2`.`ProductID` = `o`.`ProductID`))
499+
""");
500+
}
501+
else
502+
{
503+
await base.Delete_Where_Skip_Take_Skip_Take_causing_subquery(async);
504+
505+
AssertSql(
289506
"""
290507
@p='100'
291508
@p2='5'
@@ -307,6 +524,7 @@ LIMIT @p2 OFFSET @p1
307524
) AS `o2`
308525
WHERE (`o2`.`OrderID` = `o`.`OrderID`) AND (`o2`.`ProductID` = `o`.`ProductID`))
309526
""");
527+
}
310528
}
311529

312530
public override async Task Delete_Where_Distinct(bool async)

0 commit comments

Comments
 (0)