@@ -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"""
8388DELETE `o`
8489FROM `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