The DELETE statement in Jet doesn't take the TOP clause like SQL server. Limit the valid select expressions to those that do not use TOP. EF Core will then rewrite it into a WHERE EXISTS clause to use in the DELETE. Valid select expressions are able to be used directly in the DELETE/UPDATE

pull/175/head
Christopher Jolly 2 years ago
parent 72868961c4
commit dbe3bf7e89

@ -188,7 +188,8 @@ public class JetQueryableMethodTranslatingExpressionVisitor : RelationalQueryabl
if (selectExpression.Offset == null if (selectExpression.Offset == null
&& selectExpression.GroupBy.Count == 0 && selectExpression.GroupBy.Count == 0
&& selectExpression.Having == null && selectExpression.Having == null
&& selectExpression.Orderings.Count == 0) && selectExpression.Orderings.Count == 0
&& selectExpression.Limit == null)
{ {
TableExpressionBase table; TableExpressionBase table;
if (selectExpression.Tables.Count == 1) if (selectExpression.Tables.Count == 1)
@ -235,7 +236,8 @@ public class JetQueryableMethodTranslatingExpressionVisitor : RelationalQueryabl
IsDistinct: false, IsDistinct: false,
GroupBy: [], GroupBy: [],
Having: null, Having: null,
Orderings: [] Orderings: [],
Limit: null
}) })
{ {
if (selectExpression.Tables.Count > 1 && table is JoinExpressionBase joinExpressionBase) if (selectExpression.Tables.Count > 1 && table is JoinExpressionBase joinExpressionBase)

@ -869,11 +869,15 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
&& selectExpression.Projection.Count == 0) && selectExpression.Projection.Count == 0)
{ {
Sql.Append("DELETE "); Sql.Append("DELETE ");
GenerateTop(selectExpression);
Sql.Append($"{Dependencies.SqlGenerationHelper.DelimitIdentifier(deleteExpression.Table.Alias)}.*"); if (selectExpression.Tables.Count > 1)
{
Sql.Append($"{Dependencies.SqlGenerationHelper.DelimitIdentifier(deleteExpression.Table.Alias)}.*");
Sql.AppendLine();
}
VisitJetTables(selectExpression.Tables, true, out _); Sql.Append("FROM ");
VisitJetTables(selectExpression.Tables, false, out _);
if (selectExpression.Predicate != null) if (selectExpression.Predicate != null)
{ {
@ -905,10 +909,10 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
&& selectExpression.Having == null && selectExpression.Having == null
&& selectExpression.Orderings.Count == 0 && selectExpression.Orderings.Count == 0
&& selectExpression.GroupBy.Count == 0 && selectExpression.GroupBy.Count == 0
&& selectExpression.Projection.Count == 0) && selectExpression.Projection.Count == 0
&& selectExpression.Limit == null)
{ {
Sql.Append("UPDATE "); Sql.Append("UPDATE ");
GenerateTop(selectExpression);
VisitJetTables(selectExpression.Tables, false, out _); VisitJetTables(selectExpression.Tables, false, out _);

@ -24,8 +24,7 @@ public class ComplexTypeBulkUpdatesJetTest : ComplexTypeBulkUpdatesTestBase<
AssertSql( AssertSql(
""" """
DELETE `c`.* DELETE FROM `Customer` AS `c`
FROM `Customer` AS `c`
WHERE `c`.`Name` = 'Monty Elias' WHERE `c`.`Name` = 'Monty Elias'
"""); """);
} }

@ -26,8 +26,7 @@ public class NonSharedModelBulkUpdatesJetTest : NonSharedModelBulkUpdatesTestBas
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Owner` AS `o`
FROM `Owner` AS `o`
"""); """);
} }
@ -37,8 +36,7 @@ FROM `Owner` AS `o`
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Owner` AS `o`
FROM `Owner` AS `o`
"""); """);
} }

@ -28,8 +28,7 @@ public class NorthwindBulkUpdatesJetTest : NorthwindBulkUpdatesTestBase<Northwin
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE `o`.`OrderID` < 10300 WHERE `o`.`OrderID` < 10300
"""); """);
} }
@ -40,8 +39,7 @@ WHERE `o`.`OrderID` < 10300
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE `o`.`OrderID` < 10300 WHERE `o`.`OrderID` < 10300
"""); """);
} }
@ -54,14 +52,12 @@ WHERE `o`.`OrderID` < 10300
""" """
@__quantity_0='1' (Nullable = true) (DbType = Int16) @__quantity_0='1' (Nullable = true) (DbType = Int16)
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE `o`.`Quantity` = @__quantity_0 WHERE `o`.`Quantity` = @__quantity_0
""", """,
// //
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE 0 = 1 WHERE 0 = 1
"""); """);
} }
@ -72,8 +68,7 @@ WHERE 0 = 1
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM `Order Details` AS `o0` FROM `Order Details` AS `o0`
@ -219,8 +214,7 @@ WHERE EXISTS (
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE `o`.`OrderID` < ( WHERE `o`.`OrderID` < (
SELECT TOP 1 ( SELECT TOP 1 (
SELECT TOP 1 `o1`.`OrderID` SELECT TOP 1 `o1`.`OrderID`
@ -273,8 +267,7 @@ WHERE `o0`.`OrderID` IN (
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM ( FROM (
@ -301,8 +294,7 @@ WHERE `o0`.`OrderID` IN (
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE `o`.`OrderID` < 10300 WHERE `o`.`OrderID` < 10300
"""); """);
} }
@ -326,8 +318,7 @@ WHERE `o`.`OrderID` < 10250
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM `Orders` AS `o0` FROM `Orders` AS `o0`
@ -373,8 +364,7 @@ WHERE `c`.`CustomerID` LIKE 'F%'
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM ( FROM (
@ -396,8 +386,7 @@ WHERE EXISTS (
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM ( FROM (
@ -486,8 +475,7 @@ WHERE EXISTS (
AssertSql( AssertSql(
""" """
DELETE `o`.* DELETE FROM `Order Details` AS `o`
FROM `Order Details` AS `o`
WHERE EXISTS ( WHERE EXISTS (
SELECT 1 SELECT 1
FROM ( FROM (
@ -751,13 +739,14 @@ INNER JOIN (
await base.Update_Where_Take_set_constant(async); await base.Update_Where_Take_set_constant(async);
AssertExecuteUpdateSql( AssertExecuteUpdateSql(
""" """
@__p_0='4' UPDATE `Customers` AS `c`
INNER JOIN (
UPDATE TOP(@__p_0) [c] SELECT TOP 4 `c0`.`CustomerID`, `c0`.`Address`, `c0`.`City`, `c0`.`CompanyName`, `c0`.`ContactName`, `c0`.`ContactTitle`, `c0`.`Country`, `c0`.`Fax`, `c0`.`Phone`, `c0`.`PostalCode`, `c0`.`Region`
SET [c].[ContactName] = N'Updated' FROM `Customers` AS `c0`
FROM [Customers] AS [c] WHERE `c0`.`CustomerID` LIKE 'F%'
WHERE [c].[CustomerID] LIKE N'F%' ) AS `t` ON `c`.`CustomerID` = `t`.`CustomerID`
SET `c`.`ContactName` = 'Updated'
"""); """);
} }

@ -30,8 +30,7 @@ public class TPHInheritanceBulkUpdatesJetTest : TPHInheritanceBulkUpdatesTestBas
AssertSql( AssertSql(
""" """
DELETE `a`.* DELETE FROM `Animals` AS `a`
FROM `Animals` AS `a`
WHERE `a`.`Name` = 'Great spotted kiwi' WHERE `a`.`Name` = 'Great spotted kiwi'
"""); """);
} }
@ -42,8 +41,7 @@ WHERE `a`.`Name` = 'Great spotted kiwi'
AssertSql( AssertSql(
""" """
DELETE `a`.* DELETE FROM `Animals` AS `a`
FROM `Animals` AS `a`
WHERE `a`.`Discriminator` = 'Kiwi' AND `a`.`Name` = 'Great spotted kiwi' WHERE `a`.`Discriminator` = 'Kiwi' AND `a`.`Name` = 'Great spotted kiwi'
"""); """);
} }
@ -54,8 +52,7 @@ WHERE `a`.`Discriminator` = 'Kiwi' AND `a`.`Name` = 'Great spotted kiwi'
AssertSql( AssertSql(
""" """
DELETE `c`.* DELETE FROM `Countries` AS `c`
FROM `Countries` AS `c`
WHERE ( WHERE (
SELECT COUNT(*) SELECT COUNT(*)
FROM `Animals` AS `a` FROM `Animals` AS `a`
@ -69,8 +66,7 @@ WHERE (
AssertSql( AssertSql(
""" """
DELETE `c`.* DELETE FROM `Countries` AS `c`
FROM `Countries` AS `c`
WHERE ( WHERE (
SELECT COUNT(*) SELECT COUNT(*)
FROM `Animals` AS `a` FROM `Animals` AS `a`
@ -125,8 +121,7 @@ WHERE [a].[Id] IN (
AssertSql( AssertSql(
""" """
DELETE `a`.* DELETE FROM `Animals` AS `a`
FROM `Animals` AS `a`
WHERE `a`.`Id` IN ( WHERE `a`.`Id` IN (
SELECT `t0`.`Id` SELECT `t0`.`Id`
FROM ( FROM (

@ -42,8 +42,7 @@ public class TPTFiltersInheritanceBulkUpdatesJetTest : TPTFiltersInheritanceBulk
AssertSql( AssertSql(
""" """
DELETE `c`.* DELETE FROM `Countries` AS `c`
FROM `Countries` AS `c`
WHERE ( WHERE (
SELECT COUNT(*) SELECT COUNT(*)
FROM ((`Animals` AS `a` FROM ((`Animals` AS `a`
@ -60,8 +59,7 @@ WHERE (
AssertSql( AssertSql(
""" """
DELETE `c`.* DELETE FROM `Countries` AS `c`
FROM `Countries` AS `c`
WHERE ( WHERE (
SELECT COUNT(*) SELECT COUNT(*)
FROM ((`Animals` AS `a` FROM ((`Animals` AS `a`

Loading…
Cancel
Save