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

@ -869,11 +869,15 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
&& selectExpression.Projection.Count == 0)
{
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)
{
@ -905,10 +909,10 @@ namespace EntityFrameworkCore.Jet.Query.Sql.Internal
&& selectExpression.Having == null
&& selectExpression.Orderings.Count == 0
&& selectExpression.GroupBy.Count == 0
&& selectExpression.Projection.Count == 0)
&& selectExpression.Projection.Count == 0
&& selectExpression.Limit == null)
{
Sql.Append("UPDATE ");
GenerateTop(selectExpression);
VisitJetTables(selectExpression.Tables, false, out _);

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

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

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

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

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

Loading…
Cancel
Save