Fix string methods related to LastOrDefault and Contains (#175)

* Fix string methods related to LastOrDefault and Contains
pull/176/head
Christopher Jolly 2 years ago committed by GitHub
parent d7d4f90366
commit 0bfa24998f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -239,18 +239,29 @@ namespace EntityFrameworkCore.Jet.Query.ExpressionTranslators.Internal
if (_lastOrDefaultMethodInfoWithoutArgs.Equals(method))
{
var argument = arguments[0];
var lenfunction = _sqlExpressionFactory.Function(
"LEN",
new[] { argument },
nullable: true,
argumentsPropagateNullability: new[] { true },
typeof(int));
var casefunc = _sqlExpressionFactory.Case(
new[]
{
new CaseWhenClause(
_sqlExpressionFactory.Equal(
lenfunction,
_sqlExpressionFactory.Constant(0)),
_sqlExpressionFactory.Constant(1))
},
lenfunction);
return _sqlExpressionFactory.Function(
"MID",
new[]
{
argument,
_sqlExpressionFactory.Coalesce(
_sqlExpressionFactory.Function(
"LEN",
new[] { argument },
nullable: true,
argumentsPropagateNullability: new[] { true },
typeof(int)),
casefunc,
_sqlExpressionFactory.Constant(0)
),
_sqlExpressionFactory.Constant(1)

@ -334,7 +334,7 @@ public class JetSqlTranslatingExpressionVisitor : RelationalSqlTranslatingExpres
_sqlExpressionFactory.GreaterThan(
_sqlExpressionFactory.Function(
"INSTR",
new[] { _sqlExpressionFactory.Constant(1), translatedPattern, translatedInstance, _sqlExpressionFactory.Constant(1) },
new[] { _sqlExpressionFactory.Constant(1), translatedInstance, translatedPattern, _sqlExpressionFactory.Constant(1) },
nullable: true,
argumentsPropagateNullability: new[] { false, true, true, false },
typeof(int)),

@ -7973,6 +7973,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures_on_client(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column_negated(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column_negated(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_constant(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_equals_nullable_column(isAsync: False)
@ -7989,6 +7993,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_column(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_constant(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_FirstOrDefault_and_LastOrDefault(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_FirstOrDefault_and_LastOrDefault(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_wildcard_column_negated(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_wildcard_column_negated(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_wildcard_column(isAsync: False)

@ -9412,6 +9412,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures_on_client(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column_negated(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column_negated(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_column(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_constant(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_parameter(isAsync: False)
@ -9432,6 +9436,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_parameter(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_parameter(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_FirstOrDefault_and_LastOrDefault(async: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_FirstOrDefault_and_LastOrDefault(async: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_bracket(isAsync: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_bracket(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_wildcard_column_negated(isAsync: False)

@ -140,10 +140,12 @@ FROM `FunkyCustomers` AS `f`
await base.String_contains_on_argument_with_wildcard_column(isAsync);
AssertSql(
$@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
"""
SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
FROM `FunkyCustomers` AS `f`,
`FunkyCustomers` AS `f0`
WHERE (`f0`.`LastName` LIKE '') OR INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0");
WHERE `f`.`FirstName` IS NOT NULL AND `f0`.`LastName` IS NOT NULL AND (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0 OR (`f0`.`LastName` LIKE ''))
""");
}
public override async Task String_contains_on_argument_with_wildcard_column_negated(bool isAsync)
@ -151,10 +153,12 @@ WHERE (`f0`.`LastName` LIKE '') OR INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1)
await base.String_contains_on_argument_with_wildcard_column_negated(isAsync);
AssertSql(
$@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
"""
SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
FROM `FunkyCustomers` AS `f`,
`FunkyCustomers` AS `f0`
WHERE NOT ((`f0`.`LastName` LIKE '') OR INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0)");
WHERE NOT (`f`.`FirstName` IS NOT NULL AND `f0`.`LastName` IS NOT NULL AND (INSTR(1, `f`.`FirstName`, `f0`.`LastName`, 1) > 0 OR (`f0`.`LastName` LIKE '')))
""");
}
public override async Task String_starts_with_on_argument_with_wildcard_constant(bool isAsync)

@ -294,7 +294,7 @@ WHERE MID(`c`.`ContactName`, 1, 1) = 'A'
"""
SELECT `c`.`CustomerID`, `c`.`Address`, `c`.`City`, `c`.`CompanyName`, `c`.`ContactName`, `c`.`ContactTitle`, `c`.`Country`, `c`.`Fax`, `c`.`Phone`, `c`.`PostalCode`, `c`.`Region`
FROM `Customers` AS `c`
WHERE MID(`c`.`ContactName`, IIF(LEN(`c`.`ContactName`) IS NULL, 0, LEN(`c`.`ContactName`)), 1) = 's'
WHERE MID(`c`.`ContactName`, IIF(IIF(LEN(`c`.`ContactName`) = 0, 1, LEN(`c`.`ContactName`)) IS NULL, 0, IIF(LEN(`c`.`ContactName`) = 0, 1, LEN(`c`.`ContactName`))), 1) = 's'
""");
}

@ -1031,7 +1031,7 @@ WHERE `e`.`NullableStringC` <> IIF(`e`.`NullableStringA` = `e`.`NullableStringB`
"""
SELECT `e`.`Id`
FROM `Entities1` AS `e`
WHERE `e`.`NullableStringA` IS NOT NULL AND `e`.`NullableStringB` IS NOT NULL AND (INSTR(1, `e`.`NullableStringB`, `e`.`NullableStringA`, 1) > 0 OR (`e`.`NullableStringB` LIKE '')) AND `e`.`BoolA` = TRUE
WHERE `e`.`NullableStringA` IS NOT NULL AND `e`.`NullableStringB` IS NOT NULL AND (INSTR(1, `e`.`NullableStringA`, `e`.`NullableStringB`, 1) > 0 OR (`e`.`NullableStringB` LIKE '')) AND `e`.`BoolA` = TRUE
""");
}
@ -1808,10 +1808,10 @@ FROM `Entities1` AS `e`
await base.Nullable_string_FirstOrDefault_compared_to_nullable_string_LastOrDefault(async);
AssertSql(
"""
"""
SELECT `e`.`Id`, `e`.`BoolA`, `e`.`BoolB`, `e`.`BoolC`, `e`.`IntA`, `e`.`IntB`, `e`.`IntC`, `e`.`NullableBoolA`, `e`.`NullableBoolB`, `e`.`NullableBoolC`, `e`.`NullableIntA`, `e`.`NullableIntB`, `e`.`NullableIntC`, `e`.`NullableStringA`, `e`.`NullableStringB`, `e`.`NullableStringC`, `e`.`StringA`, `e`.`StringB`, `e`.`StringC`
FROM `Entities1` AS `e`
WHERE MID(`e`.`NullableStringA`, 1, 1) = MID(`e`.`NullableStringB`, IIF(LEN(`e`.`NullableStringB`) IS NULL, 0, LEN(`e`.`NullableStringB`)), 1) OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL)
WHERE MID(`e`.`NullableStringA`, 1, 1) = MID(`e`.`NullableStringB`, IIF(IIF(LEN(`e`.`NullableStringB`) = 0, 1, LEN(`e`.`NullableStringB`)) IS NULL, 0, IIF(LEN(`e`.`NullableStringB`) = 0, 1, LEN(`e`.`NullableStringB`))), 1) OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL)
""");
}

Loading…
Cancel
Save