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)) if (_lastOrDefaultMethodInfoWithoutArgs.Equals(method))
{ {
var argument = arguments[0]; 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( return _sqlExpressionFactory.Function(
"MID", "MID",
new[] new[]
{ {
argument, argument,
_sqlExpressionFactory.Coalesce( _sqlExpressionFactory.Coalesce(
_sqlExpressionFactory.Function( casefunc,
"LEN",
new[] { argument },
nullable: true,
argumentsPropagateNullability: new[] { true },
typeof(int)),
_sqlExpressionFactory.Constant(0) _sqlExpressionFactory.Constant(0)
), ),
_sqlExpressionFactory.Constant(1) _sqlExpressionFactory.Constant(1)

@ -334,7 +334,7 @@ public class JetSqlTranslatingExpressionVisitor : RelationalSqlTranslatingExpres
_sqlExpressionFactory.GreaterThan( _sqlExpressionFactory.GreaterThan(
_sqlExpressionFactory.Function( _sqlExpressionFactory.Function(
"INSTR", "INSTR",
new[] { _sqlExpressionFactory.Constant(1), translatedPattern, translatedInstance, _sqlExpressionFactory.Constant(1) }, new[] { _sqlExpressionFactory.Constant(1), translatedInstance, translatedPattern, _sqlExpressionFactory.Constant(1) },
nullable: true, nullable: true,
argumentsPropagateNullability: new[] { false, true, true, false }, argumentsPropagateNullability: new[] { false, true, true, false },
typeof(int)), 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_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: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: True) 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: 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_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_equals_nullable_column(isAsync: False) 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_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: False)
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_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: 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_negated(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_starts_with_on_argument_with_wildcard_column(isAsync: False) 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_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: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FromSqlSprocQueryJetTest.From_sql_queryable_with_multiple_stored_procedures(async: True) 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: 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_constant(isAsync: True)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_contains_on_argument_with_wildcard_parameter(isAsync: False) 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_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: False)
EntityFrameworkCore.Jet.FunctionalTests.Query.FunkyDataQueryJetTest.String_ends_with_on_argument_with_wildcard_parameter(isAsync: True) 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: 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_bracket(isAsync: 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: False)

@ -140,10 +140,12 @@ FROM `FunkyCustomers` AS `f`
await base.String_contains_on_argument_with_wildcard_column(isAsync); await base.String_contains_on_argument_with_wildcard_column(isAsync);
AssertSql( AssertSql(
$@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln` """
SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
FROM `FunkyCustomers` AS `f`, FROM `FunkyCustomers` AS `f`,
`FunkyCustomers` AS `f0` `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) 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); await base.String_contains_on_argument_with_wildcard_column_negated(isAsync);
AssertSql( AssertSql(
$@"SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln` """
SELECT `f`.`FirstName` AS `fn`, `f0`.`LastName` AS `ln`
FROM `FunkyCustomers` AS `f`, FROM `FunkyCustomers` AS `f`,
`FunkyCustomers` AS `f0` `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) 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` 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` 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` SELECT `e`.`Id`
FROM `Entities1` AS `e` 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); await base.Nullable_string_FirstOrDefault_compared_to_nullable_string_LastOrDefault(async);
AssertSql( 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` 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` 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