Skip to content

Commit

Permalink
Fix to #19606 - Query: add support for convert to/from bool value usi…
Browse files Browse the repository at this point in the history
…ng Convert.To* methods

Fixes #19606
  • Loading branch information
maumar committed Jun 6, 2020
1 parent 9f316e5 commit 357f370
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class SqlServerConvertTranslator : IMethodCallTranslator
{
private static readonly Dictionary<string, string> _typeMapping = new Dictionary<string, string>
{
[nameof(Convert.ToBoolean)] = "bit",
[nameof(Convert.ToByte)] = "tinyint",
[nameof(Convert.ToDecimal)] = "decimal(18, 2)",
[nameof(Convert.ToDouble)] = "float",
Expand All @@ -33,6 +34,7 @@ public class SqlServerConvertTranslator : IMethodCallTranslator

private static readonly List<Type> _supportedTypes = new List<Type>
{
typeof(bool),
typeof(byte),
typeof(DateTime),
typeof(decimal),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,18 @@ FROM root c
WHERE (c[""Discriminator""] = ""Customer"")");
}

[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Convert_ToBoolean(bool async)
{
await base.Convert_ToBoolean(async);

AssertSql(
@"SELECT c
FROM root c
WHERE ((c[""Discriminator""] = ""Order"") AND (c[""CustomerID""] = ""ALFKI""))");
}


[ConditionalTheory(Skip = "Issue #17246")]
public override async Task Convert_ToByte(bool async)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1063,12 +1063,39 @@ public virtual Task Where_functions_nested(bool async)
entryCount: 91);
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual async Task Convert_ToBoolean(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToBoolean(Convert.ToBoolean(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToByte(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToDecimal(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToDouble(o.OrderID % 3)),
o => Convert.ToBoolean((float)Convert.ToDouble(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToInt16(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToInt32(o.OrderID % 3)),
o => Convert.ToBoolean(Convert.ToInt64(o.OrderID % 3)),
};

foreach (var convertMethod in convertMethods)
{
await AssertQuery(
async,
ss => ss.Set<Order>().Where(o => o.CustomerID == "ALFKI")
.Where(convertMethod),
entryCount: 5);
}
}

[ConditionalTheory]
[MemberData(nameof(IsAsyncData))]
public virtual async Task Convert_ToByte(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToByte(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToByte(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToByte(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToByte(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1095,6 +1122,7 @@ public virtual async Task Convert_ToDecimal(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToDecimal(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToDecimal(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToDecimal(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToDecimal(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1121,6 +1149,7 @@ public virtual async Task Convert_ToDouble(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToDouble(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToDouble(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToDouble(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToDouble(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1147,6 +1176,7 @@ public virtual async Task Convert_ToInt16(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToInt16(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToInt16(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToInt16(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToInt16(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1173,6 +1203,7 @@ public virtual async Task Convert_ToInt32(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToInt32(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToInt32(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToInt32(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToInt32(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1199,6 +1230,7 @@ public virtual async Task Convert_ToInt64(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToInt64(Convert.ToBoolean(o.OrderID % 1)) >= 0,
o => Convert.ToInt64(Convert.ToByte(o.OrderID % 1)) >= 0,
o => Convert.ToInt64(Convert.ToDecimal(o.OrderID % 1)) >= 0,
o => Convert.ToInt64(Convert.ToDouble(o.OrderID % 1)) >= 0,
Expand All @@ -1225,6 +1257,7 @@ public virtual async Task Convert_ToString(bool async)
{
var convertMethods = new List<Expression<Func<Order, bool>>>
{
o => Convert.ToString(Convert.ToBoolean(o.OrderID % 1)) != "10",
o => Convert.ToString(Convert.ToByte(o.OrderID % 1)) != "10",
o => Convert.ToString(Convert.ToDecimal(o.OrderID % 1)) != "10",
o => Convert.ToString(Convert.ToDouble(o.OrderID % 1)) != "10",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -943,6 +943,10 @@ public override async Task Convert_ToByte(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(tinyint, CONVERT(bit, [o].[OrderID] % 1)) >= CAST(0 AS tinyint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(tinyint, CONVERT(tinyint, [o].[OrderID] % 1)) >= CAST(0 AS tinyint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -981,6 +985,10 @@ public override async Task Convert_ToDecimal(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(decimal(18, 2), CONVERT(bit, [o].[OrderID] % 1)) >= 0.0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(decimal(18, 2), CONVERT(tinyint, [o].[OrderID] % 1)) >= 0.0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -1019,6 +1027,10 @@ public override async Task Convert_ToDouble(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(float, CONVERT(bit, [o].[OrderID] % 1)) >= 0.0E0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(float, CONVERT(tinyint, [o].[OrderID] % 1)) >= 0.0E0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -1057,6 +1069,10 @@ public override async Task Convert_ToInt16(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(smallint, CONVERT(bit, [o].[OrderID] % 1)) >= CAST(0 AS smallint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(smallint, CONVERT(tinyint, [o].[OrderID] % 1)) >= CAST(0 AS smallint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -1095,6 +1111,10 @@ public override async Task Convert_ToInt32(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(int, CONVERT(bit, [o].[OrderID] % 1)) >= 0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(int, CONVERT(tinyint, [o].[OrderID] % 1)) >= 0)",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -1133,6 +1153,10 @@ public override async Task Convert_ToInt64(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(bigint, CONVERT(bit, [o].[OrderID] % 1)) >= CAST(0 AS bigint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(bigint, CONVERT(tinyint, [o].[OrderID] % 1)) >= CAST(0 AS bigint))",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down Expand Up @@ -1171,6 +1195,10 @@ public override async Task Convert_ToString(bool async)
AssertSql(
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(nvarchar(max), CONVERT(bit, [o].[OrderID] % 1)) <> N'10')",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
FROM [Orders] AS [o]
WHERE ([o].[CustomerID] = N'ALFKI') AND (CONVERT(nvarchar(max), CONVERT(tinyint, [o].[OrderID] % 1)) <> N'10')",
//
@"SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate]
Expand Down
4 changes: 2 additions & 2 deletions test/EFCore.SqlServer.FunctionalTests/Query/QueryBugsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4308,8 +4308,8 @@ public virtual void Correlated_subquery_with_owned_navigation_being_compared_to_
Assert.Null(t.Turnovers);
});

AssertSql(
@"SELECT [p].[Id], CAST(0 AS bit), [a].[Turnovers_AmountIn], [a].[Id]
AssertSql(
@"SELECT [p].[Id], CAST(0 AS bit), [a].[Turnovers_AmountIn], [a].[Id]
FROM [Partners] AS [p]
LEFT JOIN [Address13157] AS [a] ON [p].[Id] = [a].[Partner13157Id]
ORDER BY [p].[Id], [a].[Id]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ public NorthwindFunctionsQuerySqliteTest(NorthwindQuerySqliteFixture<NoopModelCu
//Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper);
}

public override Task Convert_ToBoolean(bool async)
=> AssertTranslationFailed(() => base.Convert_ToBoolean(async));

public override Task Convert_ToByte(bool async)
=> AssertTranslationFailed(() => base.Convert_ToByte(async));

Expand Down

0 comments on commit 357f370

Please sign in to comment.