diff --git a/Dependencies.targets b/Dependencies.targets index 30ec259c..83dbda20 100644 --- a/Dependencies.targets +++ b/Dependencies.targets @@ -1,8 +1,8 @@ - [9.0.0-preview.7.24405.4,9.0.999] - [9.0.0-preview.7.24405.3,9.0.999] - [9.0.0-preview.7.24405.7,9.0.999] + [9.0.100-rc.1.24452.12,9.0.999] + [9.0.0-rc.1.24451.1,9.0.999] + [9.0.0-rc.1.24431.7,9.0.999] @@ -28,9 +28,9 @@ - - - + + + @@ -45,6 +45,6 @@ - + \ No newline at end of file diff --git a/global.json b/global.json index 5e0a7ad0..9dac2b4d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100-preview.7.24407.12", + "version": "9.0.100-rc.1.24452.12", "allowPrerelease": true, "rollForward": "latestFeature" } diff --git a/src/EFCore.Jet/Migrations/Internal/JetHistoryRepository.cs b/src/EFCore.Jet/Migrations/Internal/JetHistoryRepository.cs index e7f00d4c..0e060329 100644 --- a/src/EFCore.Jet/Migrations/Internal/JetHistoryRepository.cs +++ b/src/EFCore.Jet/Migrations/Internal/JetHistoryRepository.cs @@ -128,7 +128,7 @@ public override string GetDeleteScript(string migrationId) .ToString(); } - public override IDisposable GetDatabaseLock(TimeSpan timeout) + public override IDisposable GetDatabaseLock() { if (!InterpretExistsResult(Dependencies.RawSqlCommandBuilder.Build(CreateExistsSql(LockTableName)) .ExecuteScalar(CreateRelationalCommandParameters()))) @@ -144,8 +144,7 @@ public override IDisposable GetDatabaseLock(TimeSpan timeout) } var retryDelay = _retryDelay; - var startTime = DateTimeOffset.UtcNow; - while (DateTimeOffset.UtcNow - startTime < timeout) + while (true) { var dbLock = CreateMigrationDatabaseLock(); int? insertCount = 0; @@ -164,17 +163,6 @@ public override IDisposable GetDatabaseLock(TimeSpan timeout) return dbLock; } - using var reader = CreateGetLockCommand().ExecuteReader(CreateRelationalCommandParameters()); - if (reader.Read()) - { - var timestamp = reader.DbDataReader.GetFieldValue(1); - if (DateTimeOffset.UtcNow - timestamp > timeout) - { - var id = reader.DbDataReader.GetFieldValue(0); - CreateDeleteLockCommand(id).ExecuteNonQuery(CreateRelationalCommandParameters()); - } - } - Thread.Sleep(retryDelay); if (retryDelay < TimeSpan.FromMinutes(1)) { @@ -185,7 +173,7 @@ public override IDisposable GetDatabaseLock(TimeSpan timeout) throw new TimeoutException(); } - public override async Task GetDatabaseLockAsync(TimeSpan timeout, CancellationToken cancellationToken = new CancellationToken()) + public override async Task GetDatabaseLockAsync(CancellationToken cancellationToken = new CancellationToken()) { if (!InterpretExistsResult(await Dependencies.RawSqlCommandBuilder.Build(CreateExistsSql(LockTableName)) .ExecuteScalarAsync(CreateRelationalCommandParameters(), cancellationToken).ConfigureAwait(false))) @@ -204,8 +192,7 @@ await CreateLockTableCommand() } var retryDelay = _retryDelay; - var startTime = DateTimeOffset.UtcNow; - while (DateTimeOffset.UtcNow - startTime < timeout) + while (true) { var dbLock = CreateMigrationDatabaseLock(); int? insertCount = 0; @@ -225,19 +212,6 @@ await CreateLockTableCommand() return dbLock; } - using var reader = await CreateGetLockCommand().ExecuteReaderAsync(CreateRelationalCommandParameters(), cancellationToken) - .ConfigureAwait(false); - if (await reader.ReadAsync(cancellationToken).ConfigureAwait(false)) - { - var timestamp = await reader.DbDataReader.GetFieldValueAsync(1).ConfigureAwait(false); - if (DateTimeOffset.UtcNow - timestamp > timeout) - { - var id = await reader.DbDataReader.GetFieldValueAsync(0).ConfigureAwait(false); - await CreateDeleteLockCommand(id).ExecuteNonQueryAsync(CreateRelationalCommandParameters(), cancellationToken) - .ConfigureAwait(false); - } - } - await Task.Delay(_retryDelay, cancellationToken).ConfigureAwait(true); if (retryDelay < TimeSpan.FromMinutes(1)) { @@ -266,11 +240,6 @@ private IRelationalCommand CreateInsertLockCommand(DateTimeOffset timestamp) """); } - private IRelationalCommand CreateGetLockCommand() - => Dependencies.RawSqlCommandBuilder.Build($""" -SELECT TOP 1 `Id`, `Timestamp` FROM `{LockTableName}`; -"""); - private IRelationalCommand CreateDeleteLockCommand(int? id = null) { var sql = $""" diff --git a/src/EFCore.Jet/Query/Internal/JetLocateScalarSubqueryVisitor.cs b/src/EFCore.Jet/Query/Internal/JetLocateScalarSubqueryVisitor.cs index 3de8a119..d724f2e1 100644 --- a/src/EFCore.Jet/Query/Internal/JetLocateScalarSubqueryVisitor.cs +++ b/src/EFCore.Jet/Query/Internal/JetLocateScalarSubqueryVisitor.cs @@ -403,11 +403,22 @@ protected override Expression VisitJsonScalar(JsonScalarExpression jsonScalarExp protected override Expression VisitValues(ValuesExpression valuesExpression) { - var rowValues = new RowValueExpression[valuesExpression.RowValues.Count]; - for (var i = 0; i < rowValues.Length; i++) + switch (valuesExpression) { - rowValues[i] = (RowValueExpression)Visit(valuesExpression.RowValues[i]); + case { RowValues: not null }: + var rowValues = new RowValueExpression[valuesExpression.RowValues!.Count]; + for (var i = 0; i < rowValues.Length; i++) + { + rowValues[i] = (RowValueExpression)Visit(valuesExpression.RowValues[i]); + } + return valuesExpression.Update(rowValues); + + case { ValuesParameter: not null }: + var valuesParameter = (SqlParameterExpression)Visit(valuesExpression.ValuesParameter); + return valuesExpression.Update(valuesParameter); + + default: + throw new UnreachableException(); } - return valuesExpression.Update(rowValues); } } diff --git a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs index cfd8dc0c..5b8486ba 100644 --- a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs +++ b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessor.cs @@ -24,8 +24,8 @@ public class JetParameterBasedSqlProcessor : RelationalParameterBasedSqlProcesso /// public JetParameterBasedSqlProcessor( RelationalParameterBasedSqlProcessorDependencies dependencies, - bool useRelationalNulls) - : base(dependencies, useRelationalNulls) + RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) { } @@ -64,7 +64,7 @@ protected override Expression ProcessSqlNullability( Check.NotNull(selectExpression, nameof(selectExpression)); Check.NotNull(parametersValues, nameof(parametersValues)); - return new JetSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process( + return new JetSqlNullabilityProcessor(Dependencies, Parameters).Process( selectExpression, parametersValues, out canCache); } } diff --git a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessorFactory.cs b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessorFactory.cs index 2ab151e9..e0d97bb9 100644 --- a/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessorFactory.cs +++ b/src/EFCore.Jet/Query/Internal/JetParameterBasedSqlProcessorFactory.cs @@ -35,6 +35,6 @@ public JetParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessor /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// - public virtual RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls) - => new JetParameterBasedSqlProcessor(Dependencies, useRelationalNulls); + public RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters) + => new JetParameterBasedSqlProcessor(Dependencies, parameters); } diff --git a/src/EFCore.Jet/Query/Internal/JetSqlNullabilityProcessor.cs b/src/EFCore.Jet/Query/Internal/JetSqlNullabilityProcessor.cs index 6ac89e08..07424f44 100644 --- a/src/EFCore.Jet/Query/Internal/JetSqlNullabilityProcessor.cs +++ b/src/EFCore.Jet/Query/Internal/JetSqlNullabilityProcessor.cs @@ -22,8 +22,8 @@ public class JetSqlNullabilityProcessor : SqlNullabilityProcessor /// public JetSqlNullabilityProcessor( RelationalParameterBasedSqlProcessorDependencies dependencies, - bool useRelationalNulls) - : base(dependencies, useRelationalNulls) + RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) { } diff --git a/src/EFCore.Jet/Query/Internal/SearchConditionConvertingExpressionVisitor.cs b/src/EFCore.Jet/Query/Internal/SearchConditionConvertingExpressionVisitor.cs index 02b73114..a5cdf57b 100644 --- a/src/EFCore.Jet/Query/Internal/SearchConditionConvertingExpressionVisitor.cs +++ b/src/EFCore.Jet/Query/Internal/SearchConditionConvertingExpressionVisitor.cs @@ -1,6 +1,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq.Expressions; using EntityFrameworkCore.Jet.Utilities; using Microsoft.EntityFrameworkCore.Diagnostics; @@ -648,14 +649,24 @@ protected override Expression VisitValues(ValuesExpression valuesExpression) { var parentSearchCondition = _isSearchCondition; _isSearchCondition = false; - - var rowValues = new RowValueExpression[valuesExpression.RowValues.Count]; - for (var i = 0; i < rowValues.Length; i++) + switch (valuesExpression) { - rowValues[i] = (RowValueExpression)Visit(valuesExpression.RowValues[i]); - } + case { RowValues: not null }: + var rowValues = new RowValueExpression[valuesExpression.RowValues!.Count]; + for (var i = 0; i < rowValues.Length; i++) + { + rowValues[i] = (RowValueExpression)Visit(valuesExpression.RowValues[i]); + } + _isSearchCondition = parentSearchCondition; + return valuesExpression.Update(rowValues); - _isSearchCondition = parentSearchCondition; - return valuesExpression.Update(rowValues); + case { ValuesParameter: not null }: + var valuesParameter = (SqlParameterExpression)Visit(valuesExpression.ValuesParameter); + _isSearchCondition = parentSearchCondition; + return valuesExpression.Update(valuesParameter); + + default: + throw new UnreachableException(); + } } } \ No newline at end of file diff --git a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs index 21076d02..30c96b05 100644 --- a/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs +++ b/src/EFCore.Jet/Query/Sql/Internal/JetQuerySqlGenerator.cs @@ -816,7 +816,7 @@ protected override Expression VisitValues(ValuesExpression valuesExpression) /// protected override void GenerateValues(ValuesExpression valuesExpression) { - if (valuesExpression.RowValues.Count == 0) + if (valuesExpression.RowValues is null || valuesExpression.RowValues.Count == 0) { throw new InvalidOperationException(RelationalStrings.EmptyCollectionNotSupportedAsInlineQueryRoot); } diff --git a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt index d525cb92..2c9be180 100644 --- a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt +++ b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_odbc_x86.txt @@ -126,6 +126,8 @@ EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NonSharedModelBulkUpdatesJet EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Check_all_tests_overridden EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_Concat(async: False) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_Concat(async: True) +EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_FromSql_converted_to_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_FromSql_converted_to_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_2(async: False) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_2(async: True) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_3(async: False) @@ -8176,8 +8178,6 @@ EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTe EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_all_migrations_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_one_migration EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_range_of_migrations -EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_second_migration_in_parallel -EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_second_migration_in_parallel_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_1_ASP_NET_Identity_model EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_2_ASP_NET_Identity_model EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_2_model @@ -8198,6 +8198,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTe EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_revert_all_migrations EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_revert_one_migrations EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Empty_Migration_Creates_Database +EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Throws_for_pending_model_changes +EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Throws_for_pending_model_changes_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_check_constraint_generates_exec_when_idempotent EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_check_constraint_with_name EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_column_identity @@ -11415,6 +11417,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Pro EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Projecting_multiple_collections_with_ordering_same_level(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Projecting_multiple_collections_with_ordering_same_level(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Check_all_tests_overridden +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Collate_is_null(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Collate_is_null(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Day(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Day(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Hour(async: False) @@ -11427,8 +11431,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Second EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Second(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Year(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Year(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_nullable_value_type(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_nullable_value_type(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_parameter_array_is_not_supported(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_parameter_array_is_not_supported(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_join_fields(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_join_fields(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_not_valid(async: False) @@ -11436,8 +11444,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_not_vali EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_should_throw_on_client_eval EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_valid(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_valid(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_nullable_value_type(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_nullable_value_type(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_parameter_array_is_not_supported(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_parameter_array_is_not_supported(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_all_literals(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_all_literals(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_identity(async: False) @@ -12359,8 +12371,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_on_nav_subquery_in_projection(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg_expression(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg_expression(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg(isAsync: False) @@ -12578,12 +12590,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_no_data(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_arg(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_arg(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_coalesce(isAsync: False) @@ -12602,12 +12614,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_no_data(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_arg(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_arg(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_coalesce(isAsync: False) @@ -12670,16 +12682,22 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column_in_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_Any_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_Any_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_empty_returns_zero(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_empty_returns_zero(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_explicit_cast_over_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_explicit_cast_over_column(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_scalar_returning_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_scalar_returning_subquery(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_uncorrelated_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_uncorrelated_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg_expression(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg_expression(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg(isAsync: False) @@ -14223,6 +14241,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client_or_server_top_level(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_column(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_subquery_ef_property(isAsync: False) @@ -14259,6 +14279,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested2(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested3(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested3(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_predicate(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_predicate(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_simple(isAsync: False) @@ -14338,6 +14360,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concat_string_int(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concat_string_int(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concurrent_async_queries_when_raw_query +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_column_and_constant(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_column_and_constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_columns_both_fixed_length(async: False) @@ -14764,10 +14788,14 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_nested_collection_with_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_null_coalesce_operator(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_null_coalesce_operator(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Order(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Order(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_count(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_count(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_long_count(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_long_count(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_OrderDescending(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_OrderDescending(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_non_shadow(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_non_shadow(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_shadow_unconstrained_generic_method(async: False) @@ -14951,6 +14979,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_orderby_join_select(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_select(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_select(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_Order_First(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_Order_First(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_join_select(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_join_select(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_select_many(isAsync: False) @@ -15530,6 +15560,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_nested(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_non_entity(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_non_entity(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_plus_other_column_with_correlated_collection(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_plus_other_column_with_correlated_collection(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_with_correlated_collection(async: False) @@ -17380,8 +17412,6 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.I EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_all_parameters(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_constant_and_parameter(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_constant_and_parameter(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_EF_Constant(async: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_EF_Constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_mixed_value_types(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_mixed_value_types(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_one_value(async: False) @@ -17423,6 +17453,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.N EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Nullable_reference_column_collection_index_equals_nullable_column(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Concat_column_collection(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Concat_column_collection(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Contains_with_EF_Constant(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Contains_with_EF_Constant(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_HashSet_of_ints_Contains_int(async: False) @@ -17466,6 +17500,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.P EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_nullable_string(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_string(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_string(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Where_with_EF_Constant_Where_Any(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Where_with_EF_Constant_Where_Any(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_datetimes_filtered(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_datetimes_filtered(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_ints_ordered(async: False) diff --git a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt index 9b3f5f16..159f72e8 100644 --- a/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt +++ b/test/EFCore.Jet.FunctionalTests/GreenTests/ace_2010_oledb_x86.txt @@ -131,6 +131,8 @@ EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NonSharedModelBulkUpdatesJet EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Check_all_tests_overridden EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_Concat(async: False) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_Concat(async: True) +EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_FromSql_converted_to_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_FromSql_converted_to_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_2(async: False) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_2(async: True) EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates.NorthwindBulkUpdatesJetTest.Delete_non_entity_projection_3(async: False) @@ -8248,8 +8250,6 @@ EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTe EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_all_migrations_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_one_migration EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_range_of_migrations -EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_second_migration_in_parallel -EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_apply_second_migration_in_parallel_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_1_ASP_NET_Identity_model EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_2_ASP_NET_Identity_model EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_diff_against_2_2_model @@ -8270,6 +8270,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTe EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_revert_all_migrations EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Can_revert_one_migrations EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Empty_Migration_Creates_Database +EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Throws_for_pending_model_changes +EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsInfrastructureJetTest.Throws_for_pending_model_changes_async EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_check_constraint_generates_exec_when_idempotent EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_check_constraint_with_name EntityFrameworkCore.Jet.FunctionalTests.Migrations.MigrationsJetTest.Add_column_identity @@ -11542,6 +11544,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Pro EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Projecting_multiple_collections_with_ordering_same_level(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.CompositeKeysSplitQueryJetTest.Projecting_multiple_collections_with_ordering_same_level(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Check_all_tests_overridden +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Collate_is_null(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Collate_is_null(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Day(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Day(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Hour(async: False) @@ -11554,8 +11558,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Second EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Second(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Year(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.DateDiff_Year(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_nullable_value_type(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_nullable_value_type(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_parameter_array_is_not_supported(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest_with_parameter_array_is_not_supported(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Greatest(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_join_fields(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_join_fields(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_not_valid(async: False) @@ -11563,8 +11571,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_not_vali EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_should_throw_on_client_eval EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_valid(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.IsDate_valid(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_nullable_value_type(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_nullable_value_type(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_parameter_array_is_not_supported(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least_with_parameter_array_is_not_supported(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Least(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_all_literals(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_all_literals(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.DbFunctionsJetTest.Like_identity(async: False) @@ -13649,8 +13661,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_on_nav_subquery_in_projection(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_over_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg_expression(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg_expression(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Average_with_arg(isAsync: False) @@ -13868,12 +13880,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_no_data(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_over_sum_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_arg(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_arg(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Max_with_coalesce(isAsync: False) @@ -13892,12 +13904,12 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_no_data(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_default_returns_default(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_default_returns_default(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_max_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_over_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_arg(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_arg(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Min_with_coalesce(isAsync: False) @@ -13960,16 +13972,22 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJe EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column_in_subquery(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_on_float_column(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_Any_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_Any_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_empty_returns_zero(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_empty_returns_zero(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_explicit_cast_over_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_explicit_cast_over_column(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery_is_client_eval(isAsync: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery_is_client_eval(isAsync: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery_is_client_eval(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_min_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_nested_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_scalar_returning_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_scalar_returning_subquery(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery(isAsync: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_subquery(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_uncorrelated_subquery(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_over_uncorrelated_subquery(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg_expression(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg_expression(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindAggregateOperatorsQueryJetTest.Sum_with_arg(isAsync: False) @@ -15513,6 +15531,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client_or_server_top_level(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_client(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_column(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_column(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.All_top_level_subquery_ef_property(isAsync: False) @@ -15549,6 +15569,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested2(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested3(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_nested3(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_predicate(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_predicate(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Any_simple(isAsync: False) @@ -15628,6 +15650,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concat_string_int(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concat_string_int(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Concurrent_async_queries_when_raw_query +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_column_and_constant(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_column_and_constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Contains_over_concatenated_column_and_parameter(async: False) @@ -16058,10 +16082,14 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_nested_collection_with_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_null_coalesce_operator(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_null_coalesce_operator(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Order(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Order(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_count(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_count(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_long_count(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_orderBy_take_long_count(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_OrderDescending(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_OrderDescending(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_non_shadow(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_non_shadow(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Select_Property_when_shadow_unconstrained_generic_method(async: False) @@ -16247,6 +16275,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_orderby_join_select(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_select(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_join_select(isAsync: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_Order_First(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_Order_First(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_join_select(isAsync: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_join_select(isAsync: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindMiscellaneousQueryJetTest.Where_orderby_select_many(isAsync: False) @@ -16826,6 +16856,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_nested(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_non_entity(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_non_entity(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_distinct(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_distinct(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_plus_other_column_with_correlated_collection(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_plus_other_column_with_correlated_collection(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.NorthwindSetOperationsQueryJetTest.Union_on_entity_with_correlated_collection(async: False) @@ -18727,8 +18759,6 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.I EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_all_parameters(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_constant_and_parameter(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_constant_and_parameter(async: True) -EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_EF_Constant(async: False) -EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_EF_Constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_mixed_value_types(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_mixed_value_types(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_Contains_with_one_value(async: False) @@ -18761,6 +18791,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.I EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_of_nullable_ints_Contains_null(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_of_nullable_ints_Contains(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_of_nullable_ints_Contains(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_with_single_parameter_element_Contains(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_with_single_parameter_element_Contains(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_with_single_parameter_element_Count(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Inline_collection_with_single_parameter_element_Count(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Json_representation_of_bool_array EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Nested_contains_with_arrays_and_no_inferred_type_mapping(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Nested_contains_with_arrays_and_no_inferred_type_mapping(async: True) @@ -18772,6 +18806,10 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.N EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Nullable_reference_column_collection_index_equals_nullable_column(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Concat_column_collection(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Concat_column_collection(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Contains_with_EF_Constant(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Contains_with_EF_Constant(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Count(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_HashSet_of_ints_Contains_int(async: False) @@ -18815,6 +18853,8 @@ EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.P EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_nullable_string(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_string(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_of_strings_Contains_string(async: True) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Where_with_EF_Constant_Where_Any(async: False) +EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Parameter_collection_Where_with_EF_Constant_Where_Any(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_datetimes_filtered(async: False) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_datetimes_filtered(async: True) EntityFrameworkCore.Jet.FunctionalTests.Query.PrimitiveCollectionsQueryJetTest.Project_collection_of_ints_ordered(async: False) diff --git a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs index 35c8db20..418c8414 100644 --- a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs @@ -8,6 +8,8 @@ using EntityFrameworkCore.Jet.Metadata; using Identity30.Data; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage; @@ -84,33 +86,17 @@ public override void Can_generate_up_scripts() INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000001_Migration1', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - ALTER TABLE `Table1` RENAME COLUMN `Foo` TO `Bar`; INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000002_Migration2', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000003_Migration3', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000004_Migration4', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - INSERT INTO Table1 (Id, Bar, Description) VALUES (-1, 3, 'Value With Empty Lines') @@ -118,10 +104,6 @@ INSERT INTO Table1 (Id, Bar, Description) VALUES (-1, 3, 'Value With INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000005_Migration5', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - INSERT INTO Table1 (Id, Bar, Description) VALUES (-2, 4, 'GO Value With @@ -130,10 +112,6 @@ Value With INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('00000000000006_Migration6', '7.0.0-test'); -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - INSERT INTO Table1 (Id, Bar, Description) VALUES (-3, 5, 'GO Value With @@ -206,10 +184,6 @@ public override void Can_generate_down_scripts() DELETE FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000000000002_Migration2'; -COMMIT TRANSACTION; - -BEGIN TRANSACTION; - DROP TABLE `Table1`; DELETE FROM `__EFMigrationsHistory` @@ -270,20 +244,55 @@ public override void Can_get_active_provider() Assert.Equal("EntityFrameworkCore.Jet", ActiveProvider); } + [ConditionalFact] + public void Throws_for_pending_model_changes() + { + using var context = new BloggingContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.PendingModelChangesWarning.ToString(), + RelationalResources.LogPendingModelChanges(new TestLogger()) + .GenerateMessage(nameof(BloggingContext)), + "RelationalEventId.PendingModelChangesWarning"), + (Assert.Throws(context.Database.Migrate)).Message); + } + + [ConditionalFact] + public async Task Throws_for_pending_model_changes_async() + { + using var context = new BloggingContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.PendingModelChangesWarning.ToString(), + RelationalResources.LogPendingModelChanges(new TestLogger()) + .GenerateMessage(nameof(BloggingContext)), + "RelationalEventId.PendingModelChangesWarning"), + (await Assert.ThrowsAsync(() => context.Database.MigrateAsync())).Message); + } + [ConditionalFact] public async Task Empty_Migration_Creates_Database() { - using (var context = new BloggingContext( + using var context = new BloggingContext( Fixture.TestStore.AddProviderOptions( - new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options)) - { - var creator = (JetDatabaseCreator)context.GetService(); - // creator.RetryTimeout = TimeSpan.FromMinutes(10); + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)) + .ConfigureWarnings(e => e.Log(RelationalEventId.PendingModelChangesWarning)).Options); - await context.Database.MigrateAsync(); + context.Database.EnsureDeleted(); + GiveMeSomeTime(context); - Assert.True(creator.Exists()); - } + var creator = (JetDatabaseCreator)context.GetService(); + //creator.RetryTimeout = TimeSpan.FromMinutes(10); + + await context.Database.MigrateAsync("Empty"); + + Assert.True(creator.Exists()); } public override void Can_apply_all_migrations() // Issue efcore #33331 @@ -292,6 +301,30 @@ public override void Can_apply_all_migrations() // Issue efcore #33331 public override Task Can_apply_all_migrations_async() // Issue efcore #33331 => Assert.ThrowsAnyAsync(() => base.Can_apply_all_migrations_async()); + [ConditionalFact(Skip ="For now")] + public override void Can_apply_one_migration_in_parallel() + { + base.Can_apply_one_migration_in_parallel(); + } + + [ConditionalFact(Skip = "For now")] + public override Task Can_apply_one_migration_in_parallel_async() + { + return base.Can_apply_one_migration_in_parallel_async(); + } + + [ConditionalFact(Skip = "For now")] + public override void Can_apply_second_migration_in_parallel() + { + base.Can_apply_second_migration_in_parallel(); + } + + [ConditionalFact(Skip = "For now")] + public override Task Can_apply_second_migration_in_parallel_async() + { + return base.Can_apply_second_migration_in_parallel_async(); + } + private class BloggingContext(DbContextOptions options) : DbContext(options) { // ReSharper disable once UnusedMember.Local diff --git a/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTest.cs index ba53ecb1..280ab96d 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTest.cs @@ -18,376 +18,6 @@ namespace EntityFrameworkCore.Jet.FunctionalTests.Query; #nullable disable -public class AdHocJsonQueryJetTest : AdHocJsonQueryTestBase +public class AdHocJsonQueryJetTest : AdHocJsonQueryJetTestBase { - protected override ITestStoreFactory TestStoreFactory - => JetTestStoreFactory.Instance; - - protected override async Task Seed29219(MyContext29219 ctx) - { - var entity1 = new MyEntity29219 - { - Id = 1, - Reference = new MyJsonEntity29219 { NonNullableScalar = 10, NullableScalar = 11 }, - Collection = - [ - new() { NonNullableScalar = 100, NullableScalar = 101 }, - new() { NonNullableScalar = 200, NullableScalar = 201 }, - new() { NonNullableScalar = 300, NullableScalar = null } - ] - }; - - var entity2 = new MyEntity29219 - { - Id = 2, - Reference = new MyJsonEntity29219 { NonNullableScalar = 20, NullableScalar = null }, - Collection = [new() { NonNullableScalar = 1001, NullableScalar = null }] - }; - - ctx.Entities.AddRange(entity1, entity2); - await ctx.SaveChangesAsync(); - - await ctx.Database.ExecuteSqlAsync( - $$""" -INSERT INTO [Entities] ([Id], [Reference], [Collection]) -VALUES(3, '{ "NonNullableScalar" : 30 }', '[{ "NonNullableScalar" : 10001 }]') -"""); - } - - protected override async Task Seed30028(MyContext30028 ctx) - { - // complete - await ctx.Database.ExecuteSqlAsync( - $$$$""" -INSERT INTO [Entities] ([Id], [Json]) -VALUES( -1, -'{"RootName":"e1","Collection":[{"BranchName":"e1 c1","Nested":{"LeafName":"e1 c1 l"}},{"BranchName":"e1 c2","Nested":{"LeafName":"e1 c2 l"}}],"OptionalReference":{"BranchName":"e1 or","Nested":{"LeafName":"e1 or l"}},"RequiredReference":{"BranchName":"e1 rr","Nested":{"LeafName":"e1 rr l"}}}') -"""); - - // missing collection - await ctx.Database.ExecuteSqlAsync( - $$$$""" -INSERT INTO [Entities] ([Id], [Json]) -VALUES( -2, -'{"RootName":"e2","OptionalReference":{"BranchName":"e2 or","Nested":{"LeafName":"e2 or l"}},"RequiredReference":{"BranchName":"e2 rr","Nested":{"LeafName":"e2 rr l"}}}') -"""); - - // missing optional reference - await ctx.Database.ExecuteSqlAsync( - $$$$""" -INSERT INTO [Entities] ([Id], [Json]) -VALUES( -3, -'{"RootName":"e3","Collection":[{"BranchName":"e3 c1","Nested":{"LeafName":"e3 c1 l"}},{"BranchName":"e3 c2","Nested":{"LeafName":"e3 c2 l"}}],"RequiredReference":{"BranchName":"e3 rr","Nested":{"LeafName":"e3 rr l"}}}') -"""); - - // missing required reference - await ctx.Database.ExecuteSqlAsync( - $$$$""" -INSERT INTO [Entities] ([Id], [Json]) -VALUES( -4, -'{"RootName":"e4","Collection":[{"BranchName":"e4 c1","Nested":{"LeafName":"e4 c1 l"}},{"BranchName":"e4 c2","Nested":{"LeafName":"e4 c2 l"}}],"OptionalReference":{"BranchName":"e4 or","Nested":{"LeafName":"e4 or l"}}}') -"""); - } - - protected override Task Seed33046(Context33046 ctx) - => ctx.Database.ExecuteSqlAsync( - $$""" -INSERT INTO [Reviews] ([Rounds], [Id]) -VALUES('[{"RoundNumber":11,"SubRounds":[{"SubRoundNumber":111},{"SubRoundNumber":112}]}]', 1) -"""); - - protected override Task SeedArrayOfPrimitives(MyContextArrayOfPrimitives ctx) - { - var entity1 = new MyEntityArrayOfPrimitives - { - Id = 1, - Reference = new MyJsonEntityArrayOfPrimitives - { - IntArray = [1, 2, 3], - ListOfString = - [ - "Foo", - "Bar", - "Baz" - ] - }, - Collection = - [ - new() { IntArray = [111, 112, 113], ListOfString = ["Foo11", "Bar11"] }, - new() { IntArray = [211, 212, 213], ListOfString = ["Foo12", "Bar12"] } - ] - }; - - var entity2 = new MyEntityArrayOfPrimitives - { - Id = 2, - Reference = new MyJsonEntityArrayOfPrimitives - { - IntArray = [10, 20, 30], - ListOfString = - [ - "A", - "B", - "C" - ] - }, - Collection = - [ - new() { IntArray = [110, 120, 130], ListOfString = ["A1", "Z1"] }, - new() { IntArray = [210, 220, 230], ListOfString = ["A2", "Z2"] } - ] - }; - - ctx.Entities.AddRange(entity1, entity2); - return ctx.SaveChangesAsync(); - } - - protected override Task SeedJunkInJson(MyContextJunkInJson ctx) - => ctx.Database.ExecuteSqlAsync( - $$$$""" -INSERT INTO [Entities] ([Collection], [CollectionWithCtor], [Reference], [ReferenceWithCtor], [Id]) -VALUES( -'[{"JunkReference":{"Something":"SomeValue" },"Name":"c11","JunkProperty1":50,"Number":11.5,"JunkCollection1":[],"JunkCollection2":[{"Foo":"junk value"}],"NestedCollection":[{"DoB":"2002-04-01T00:00:00","DummyProp":"Dummy value"},{"DoB":"2002-04-02T00:00:00","DummyReference":{"Foo":5}}],"NestedReference":{"DoB":"2002-03-01T00:00:00"}},{"Name":"c12","Number":12.5,"NestedCollection":[{"DoB":"2002-06-01T00:00:00"},{"DoB":"2002-06-02T00:00:00"}],"NestedDummy":59,"NestedReference":{"DoB":"2002-05-01T00:00:00"}}]', -'[{"MyBool":true,"Name":"c11 ctor","JunkReference":{"Something":"SomeValue","JunkCollection":[{"Foo":"junk value"}]},"NestedCollection":[{"DoB":"2002-08-01T00:00:00"},{"DoB":"2002-08-02T00:00:00"}],"NestedReference":{"DoB":"2002-07-01T00:00:00"}},{"MyBool":false,"Name":"c12 ctor","NestedCollection":[{"DoB":"2002-10-01T00:00:00"},{"DoB":"2002-10-02T00:00:00"}],"JunkCollection":[{"Foo":"junk value"}],"NestedReference":{"DoB":"2002-09-01T00:00:00"}}]', -'{"Name":"r1","JunkCollection":[{"Foo":"junk value"}],"JunkReference":{"Something":"SomeValue" },"Number":1.5,"NestedCollection":[{"DoB":"2000-02-01T00:00:00","JunkReference":{"Something":"SomeValue"}},{"DoB":"2000-02-02T00:00:00"}],"NestedReference":{"DoB":"2000-01-01T00:00:00"}}', -'{"MyBool":true,"JunkCollection":[{"Foo":"junk value"}],"Name":"r1 ctor","JunkReference":{"Something":"SomeValue" },"NestedCollection":[{"DoB":"2001-02-01T00:00:00"},{"DoB":"2001-02-02T00:00:00"}],"NestedReference":{"JunkCollection":[{"Foo":"junk value"}],"DoB":"2001-01-01T00:00:00"}}', -1) -"""); - - protected override Task SeedTrickyBuffering(MyContextTrickyBuffering ctx) - => ctx.Database.ExecuteSqlAsync( - $$$""" -INSERT INTO [Entities] ([Reference], [Id]) -VALUES( -'{"Name": "r1", "Number": 7, "JunkReference":{"Something": "SomeValue" }, "JunkCollection": [{"Foo": "junk value"}], "NestedReference": {"DoB": "2000-01-01T00:00:00"}, "NestedCollection": [{"DoB": "2000-02-01T00:00:00", "JunkReference": {"Something": "SomeValue"}}, {"DoB": "2000-02-02T00:00:00"}]}',1) -"""); - - protected override Task SeedShadowProperties(MyContextShadowProperties ctx) - => ctx.Database.ExecuteSqlAsync( - $$""" -INSERT INTO [Entities] ([Collection], [CollectionWithCtor], [Reference], [ReferenceWithCtor], [Id], [Name]) -VALUES( -'[{"Name":"e1_c1","ShadowDouble":5.5},{"ShadowDouble":20.5,"Name":"e1_c2"}]', -'[{"Name":"e1_c1 ctor","ShadowNullableByte":6},{"ShadowNullableByte":null,"Name":"e1_c2 ctor"}]', -'{"Name":"e1_r", "ShadowString":"Foo"}', -'{"ShadowInt":143,"Name":"e1_r ctor"}', -1, -'e1') -"""); - - protected override async Task SeedNotICollection(MyContextNotICollection ctx) - { - await ctx.Database.ExecuteSqlAsync( - $$""" -INSERT INTO [Entities] ([Json], [Id]) -VALUES( -'{"Collection":[{"Bar":11,"Foo":"c11"},{"Bar":12,"Foo":"c12"},{"Bar":13,"Foo":"c13"}]}', -1) -"""); - - await ctx.Database.ExecuteSqlAsync( - $$$""" -INSERT INTO [Entities] ([Json], [Id]) -VALUES( -'{"Collection":[{"Bar":21,"Foo":"c21"},{"Bar":22,"Foo":"c22"}]}', -2) -"""); - } - - #region EnumLegacyValues - - [ConditionalTheory] - [MemberData(nameof(IsAsyncData))] - public virtual async Task Read_enum_property_with_legacy_values(bool async) - { - var contextFactory = await InitializeAsync( - seed: SeedEnumLegacyValues); - - using (var context = contextFactory.CreateContext()) - { - var query = context.Entities.Select( - x => new - { - x.Reference.IntEnum, - x.Reference.ByteEnum, - x.Reference.LongEnum, - x.Reference.NullableEnum - }); - - var exception = async - ? await (Assert.ThrowsAsync(() => query.ToListAsync())) - : Assert.Throws(() => query.ToList()); - - // Conversion failed when converting the nvarchar value '...' to data type int - //Assert.Equal(245, exception.Number); - } - } - - [ConditionalTheory] - [MemberData(nameof(IsAsyncData))] - public virtual async Task Read_json_entity_with_enum_properties_with_legacy_values(bool async) - { - var contextFactory = await InitializeAsync( - seed: SeedEnumLegacyValues, - shouldLogCategory: c => c == DbLoggerCategory.Query.Name); - - using (var context = contextFactory.CreateContext()) - { - var query = context.Entities.Select(x => x.Reference).AsNoTracking(); - - var result = async - ? await query.ToListAsync() - : query.ToList(); - - Assert.Equal(1, result.Count); - Assert.Equal(ByteEnumLegacyValues.Redmond, result[0].ByteEnum); - Assert.Equal(IntEnumLegacyValues.Foo, result[0].IntEnum); - Assert.Equal(LongEnumLegacyValues.Three, result[0].LongEnum); - Assert.Equal(ULongEnumLegacyValues.Three, result[0].ULongEnum); - Assert.Equal(IntEnumLegacyValues.Bar, result[0].NullableEnum); - } - - var testLogger = new TestLogger(); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ByteEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(IntEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(LongEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ULongEnumLegacyValues)))); - } - - [ConditionalTheory] - [MemberData(nameof(IsAsyncData))] - public virtual async Task Read_json_entity_collection_with_enum_properties_with_legacy_values(bool async) - { - var contextFactory = await InitializeAsync( - seed: SeedEnumLegacyValues, - shouldLogCategory: c => c == DbLoggerCategory.Query.Name); - - using (var context = contextFactory.CreateContext()) - { - var query = context.Entities.Select(x => x.Collection).AsNoTracking(); - - var result = async - ? await query.ToListAsync() - : query.ToList(); - - Assert.Equal(1, result.Count); - Assert.Equal(2, result[0].Count); - Assert.Equal(ByteEnumLegacyValues.Bellevue, result[0][0].ByteEnum); - Assert.Equal(IntEnumLegacyValues.Foo, result[0][0].IntEnum); - Assert.Equal(LongEnumLegacyValues.One, result[0][0].LongEnum); - Assert.Equal(ULongEnumLegacyValues.One, result[0][0].ULongEnum); - Assert.Equal(IntEnumLegacyValues.Bar, result[0][0].NullableEnum); - Assert.Equal(ByteEnumLegacyValues.Seattle, result[0][1].ByteEnum); - Assert.Equal(IntEnumLegacyValues.Baz, result[0][1].IntEnum); - Assert.Equal(LongEnumLegacyValues.Two, result[0][1].LongEnum); - Assert.Equal(ULongEnumLegacyValues.Two, result[0][1].ULongEnum); - Assert.Null(result[0][1].NullableEnum); - } - - var testLogger = new TestLogger(); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ByteEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(IntEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(LongEnumLegacyValues)))); - Assert.Single( - ListLoggerFactory.Log.Where( - l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ULongEnumLegacyValues)))); - } - - private Task SeedEnumLegacyValues(MyContextEnumLegacyValues ctx) - => ctx.Database.ExecuteSqlAsync( - $$""" -INSERT INTO [Entities] ([Collection], [Reference], [Id], [Name]) -VALUES( -'[{"ByteEnum":"Bellevue","IntEnum":"Foo","LongEnum":"One","ULongEnum":"One","Name":"e1_c1","NullableEnum":"Bar"},{"ByteEnum":"Seattle","IntEnum":"Baz","LongEnum":"Two","ULongEnum":"Two","Name":"e1_c2","NullableEnum":null}]', -'{"ByteEnum":"Redmond","IntEnum":"Foo","LongEnum":"Three","ULongEnum":"Three","Name":"e1_r","NullableEnum":"Bar"}', -1, -'e1') -"""); - - private class MyContextEnumLegacyValues(DbContextOptions options) : DbContext((new DbContextOptionsBuilder(options)).ConfigureWarnings(b => b.Log(CoreEventId.StringEnumValueInJson)).Options) - { - - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public DbSet Entities { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity().Property(x => x.Id).ValueGeneratedNever(); - modelBuilder.Entity().OwnsOne(x => x.Reference, b => b.ToJson()); - modelBuilder.Entity().OwnsMany(x => x.Collection, b => b.ToJson()); - } - } - - private class MyEntityEnumLegacyValues - { - public int Id { get; set; } - public string Name { get; set; } - - public MyJsonEntityEnumLegacyValues Reference { get; set; } - public List Collection { get; set; } - } - - private class MyJsonEntityEnumLegacyValues - { - public string Name { get; set; } - - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public IntEnumLegacyValues IntEnum { get; set; } - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public ByteEnumLegacyValues ByteEnum { get; set; } - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public LongEnumLegacyValues LongEnum { get; set; } - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public ULongEnumLegacyValues ULongEnum { get; set; } - // ReSharper disable once UnusedAutoPropertyAccessor.Local - public IntEnumLegacyValues? NullableEnum { get; set; } - } - - private enum IntEnumLegacyValues - { - Foo = int.MinValue, - Bar, - Baz = int.MaxValue, - } - - private enum ByteEnumLegacyValues : byte - { - Seattle, - Redmond, - Bellevue = 255, - } - - private enum LongEnumLegacyValues : long - { - One = long.MinValue, - Two = 1, - Three = long.MaxValue, - } - - private enum ULongEnumLegacyValues : ulong - { - One = ulong.MinValue, - Two = 1, - Three = ulong.MaxValue, - } - - #endregion } diff --git a/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTestBase.cs b/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTestBase.cs new file mode 100644 index 00000000..65441f96 --- /dev/null +++ b/test/EFCore.Jet.FunctionalTests/Query/AdHocJsonQueryJetTestBase.cs @@ -0,0 +1,396 @@ +#nullable disable +using EntityFrameworkCore.Jet.Diagnostics.Internal; +using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; +using Microsoft.EntityFrameworkCore.TestUtilities; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.EntityFrameworkCore.Query; + +public abstract class AdHocJsonQueryJetTestBase : AdHocJsonQueryTestBase +{ + protected override ITestStoreFactory TestStoreFactory + => JetTestStoreFactory.Instance; + + protected override void ConfigureWarnings(WarningsConfigurationBuilder builder) + { + base.ConfigureWarnings(builder); + + builder.Log(CoreEventId.StringEnumValueInJson); + } + + protected override async Task Seed29219(DbContext ctx) + { + var entity1 = new MyEntity29219 + { + Id = 1, + Reference = new MyJsonEntity29219 { NonNullableScalar = 10, NullableScalar = 11 }, + Collection = + [ + new() { NonNullableScalar = 100, NullableScalar = 101 }, + new() { NonNullableScalar = 200, NullableScalar = 201 }, + new() { NonNullableScalar = 300, NullableScalar = null } + ] + }; + + var entity2 = new MyEntity29219 + { + Id = 2, + Reference = new MyJsonEntity29219 { NonNullableScalar = 20, NullableScalar = null }, + Collection = [new() { NonNullableScalar = 1001, NullableScalar = null }] + }; + + ctx.AddRange(entity1, entity2); + await ctx.SaveChangesAsync(); + + await ctx.Database.ExecuteSqlAsync( + $$""" +INSERT INTO [Entities] ([Id], [Reference], [Collection]) +VALUES(3, '{ "NonNullableScalar" : 30 }', '[{ "NonNullableScalar" : 10001 }]') +"""); + } + + protected override async Task Seed30028(DbContext ctx) + { + // complete + await ctx.Database.ExecuteSqlAsync( + $$$$""" +INSERT INTO [Entities] ([Id], [Json]) +VALUES( +1, +'{"RootName":"e1","Collection":[{"BranchName":"e1 c1","Nested":{"LeafName":"e1 c1 l"}},{"BranchName":"e1 c2","Nested":{"LeafName":"e1 c2 l"}}],"OptionalReference":{"BranchName":"e1 or","Nested":{"LeafName":"e1 or l"}},"RequiredReference":{"BranchName":"e1 rr","Nested":{"LeafName":"e1 rr l"}}}') +"""); + + // missing collection + await ctx.Database.ExecuteSqlAsync( + $$$$""" +INSERT INTO [Entities] ([Id], [Json]) +VALUES( +2, +'{"RootName":"e2","OptionalReference":{"BranchName":"e2 or","Nested":{"LeafName":"e2 or l"}},"RequiredReference":{"BranchName":"e2 rr","Nested":{"LeafName":"e2 rr l"}}}') +"""); + + // missing optional reference + await ctx.Database.ExecuteSqlAsync( + $$$$""" +INSERT INTO [Entities] ([Id], [Json]) +VALUES( +3, +'{"RootName":"e3","Collection":[{"BranchName":"e3 c1","Nested":{"LeafName":"e3 c1 l"}},{"BranchName":"e3 c2","Nested":{"LeafName":"e3 c2 l"}}],"RequiredReference":{"BranchName":"e3 rr","Nested":{"LeafName":"e3 rr l"}}}') +"""); + + // missing required reference + await ctx.Database.ExecuteSqlAsync( + $$$$""" +INSERT INTO [Entities] ([Id], [Json]) +VALUES( +4, +'{"RootName":"e4","Collection":[{"BranchName":"e4 c1","Nested":{"LeafName":"e4 c1 l"}},{"BranchName":"e4 c2","Nested":{"LeafName":"e4 c2 l"}}],"OptionalReference":{"BranchName":"e4 or","Nested":{"LeafName":"e4 or l"}}}') +"""); + } + + protected override Task Seed33046(DbContext ctx) + => ctx.Database.ExecuteSqlAsync( + $$""" +INSERT INTO [Reviews] ([Rounds], [Id]) +VALUES('[{"RoundNumber":11,"SubRounds":[{"SubRoundNumber":111},{"SubRoundNumber":112}]}]', 1) +"""); + + protected override Task SeedArrayOfPrimitives(DbContext ctx) + { + var entity1 = new MyEntityArrayOfPrimitives + { + Id = 1, + Reference = new MyJsonEntityArrayOfPrimitives + { + IntArray = [1, 2, 3], + ListOfString = + [ + "Foo", + "Bar", + "Baz" + ] + }, + Collection = + [ + new() { IntArray = [111, 112, 113], ListOfString = ["Foo11", "Bar11"] }, + new() { IntArray = [211, 212, 213], ListOfString = ["Foo12", "Bar12"] } + ] + }; + + var entity2 = new MyEntityArrayOfPrimitives + { + Id = 2, + Reference = new MyJsonEntityArrayOfPrimitives + { + IntArray = [10, 20, 30], + ListOfString = + [ + "A", + "B", + "C" + ] + }, + Collection = + [ + new() { IntArray = [110, 120, 130], ListOfString = ["A1", "Z1"] }, + new() { IntArray = [210, 220, 230], ListOfString = ["A2", "Z2"] } + ] + }; + + ctx.AddRange(entity1, entity2); + return ctx.SaveChangesAsync(); + } + + protected override Task SeedJunkInJson(DbContext ctx) + => ctx.Database.ExecuteSqlAsync( + $$$$""" +INSERT INTO [Entities] ([Collection], [CollectionWithCtor], [Reference], [ReferenceWithCtor], [Id]) +VALUES( +'[{"JunkReference":{"Something":"SomeValue" },"Name":"c11","JunkProperty1":50,"Number":11.5,"JunkCollection1":[],"JunkCollection2":[{"Foo":"junk value"}],"NestedCollection":[{"DoB":"2002-04-01T00:00:00","DummyProp":"Dummy value"},{"DoB":"2002-04-02T00:00:00","DummyReference":{"Foo":5}}],"NestedReference":{"DoB":"2002-03-01T00:00:00"}},{"Name":"c12","Number":12.5,"NestedCollection":[{"DoB":"2002-06-01T00:00:00"},{"DoB":"2002-06-02T00:00:00"}],"NestedDummy":59,"NestedReference":{"DoB":"2002-05-01T00:00:00"}}]', +'[{"MyBool":true,"Name":"c11 ctor","JunkReference":{"Something":"SomeValue","JunkCollection":[{"Foo":"junk value"}]},"NestedCollection":[{"DoB":"2002-08-01T00:00:00"},{"DoB":"2002-08-02T00:00:00"}],"NestedReference":{"DoB":"2002-07-01T00:00:00"}},{"MyBool":false,"Name":"c12 ctor","NestedCollection":[{"DoB":"2002-10-01T00:00:00"},{"DoB":"2002-10-02T00:00:00"}],"JunkCollection":[{"Foo":"junk value"}],"NestedReference":{"DoB":"2002-09-01T00:00:00"}}]', +'{"Name":"r1","JunkCollection":[{"Foo":"junk value"}],"JunkReference":{"Something":"SomeValue" },"Number":1.5,"NestedCollection":[{"DoB":"2000-02-01T00:00:00","JunkReference":{"Something":"SomeValue"}},{"DoB":"2000-02-02T00:00:00"}],"NestedReference":{"DoB":"2000-01-01T00:00:00"}}', +'{"MyBool":true,"JunkCollection":[{"Foo":"junk value"}],"Name":"r1 ctor","JunkReference":{"Something":"SomeValue" },"NestedCollection":[{"DoB":"2001-02-01T00:00:00"},{"DoB":"2001-02-02T00:00:00"}],"NestedReference":{"JunkCollection":[{"Foo":"junk value"}],"DoB":"2001-01-01T00:00:00"}}', +1) +"""); + + protected override Task SeedTrickyBuffering(DbContext ctx) + => ctx.Database.ExecuteSqlAsync( + $$$""" +INSERT INTO [Entities] ([Reference], [Id]) +VALUES( +'{"Name": "r1", "Number": 7, "JunkReference":{"Something": "SomeValue" }, "JunkCollection": [{"Foo": "junk value"}], "NestedReference": {"DoB": "2000-01-01T00:00:00"}, "NestedCollection": [{"DoB": "2000-02-01T00:00:00", "JunkReference": {"Something": "SomeValue"}}, {"DoB": "2000-02-02T00:00:00"}]}',1) +"""); + + protected override Task SeedShadowProperties(DbContext ctx) + => ctx.Database.ExecuteSqlAsync( + $$""" +INSERT INTO [Entities] ([Collection], [CollectionWithCtor], [Reference], [ReferenceWithCtor], [Id], [Name]) +VALUES( +'[{"Name":"e1_c1","ShadowDouble":5.5},{"ShadowDouble":20.5,"Name":"e1_c2"}]', +'[{"Name":"e1_c1 ctor","ShadowNullableByte":6},{"ShadowNullableByte":null,"Name":"e1_c2 ctor"}]', +'{"Name":"e1_r", "ShadowString":"Foo"}', +'{"ShadowInt":143,"Name":"e1_r ctor"}', +1, +'e1') +"""); + + protected override async Task SeedNotICollection(DbContext ctx) + { + await ctx.Database.ExecuteSqlAsync( + $$""" +INSERT INTO [Entities] ([Json], [Id]) +VALUES( +'{"Collection":[{"Bar":11,"Foo":"c11"},{"Bar":12,"Foo":"c12"},{"Bar":13,"Foo":"c13"}]}', +1) +"""); + + await ctx.Database.ExecuteSqlAsync( + $$$""" +INSERT INTO [Entities] ([Json], [Id]) +VALUES( +'{"Collection":[{"Bar":21,"Foo":"c21"},{"Bar":22,"Foo":"c22"}]}', +2) +"""); + } + + #region EnumLegacyValues + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual async Task Read_enum_property_with_legacy_values(bool async) + { + var contextFactory = await InitializeAsync( + onModelCreating: BuildModelEnumLegacyValues, + onConfiguring: b => b.ConfigureWarnings(ConfigureWarnings), + seed: SeedEnumLegacyValues); + + using (var context = contextFactory.CreateContext()) + { + var query = context.Set().Select( + x => new + { + x.Reference.IntEnum, + x.Reference.ByteEnum, + x.Reference.LongEnum, + x.Reference.NullableEnum + }); + + var exception = async + ? await (Assert.ThrowsAsync(() => query.ToListAsync())) + : Assert.Throws(() => query.ToList()); + + // Conversion failed when converting the nvarchar value '...' to data type int + //Assert.Equal(245, exception.Number); + } + } + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual async Task Read_json_entity_with_enum_properties_with_legacy_values(bool async) + { + var contextFactory = await InitializeAsync( + onModelCreating: BuildModelEnumLegacyValues, + onConfiguring: b => b.ConfigureWarnings(ConfigureWarnings), + seed: SeedEnumLegacyValues, + shouldLogCategory: c => c == DbLoggerCategory.Query.Name); + + using (var context = contextFactory.CreateContext()) + { + var query = context.Set().Select(x => x.Reference).AsNoTracking(); + + var result = async + ? await query.ToListAsync() + : query.ToList(); + + Assert.Equal(1, result.Count); + Assert.Equal(ByteEnumLegacyValues.Redmond, result[0].ByteEnum); + Assert.Equal(IntEnumLegacyValues.Foo, result[0].IntEnum); + Assert.Equal(LongEnumLegacyValues.Three, result[0].LongEnum); + Assert.Equal(ULongEnumLegacyValues.Three, result[0].ULongEnum); + Assert.Equal(IntEnumLegacyValues.Bar, result[0].NullableEnum); + } + + var testLogger = new TestLogger(); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ByteEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(IntEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(LongEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ULongEnumLegacyValues)))); + } + + [ConditionalTheory] + [MemberData(nameof(IsAsyncData))] + public virtual async Task Read_json_entity_collection_with_enum_properties_with_legacy_values(bool async) + { + var contextFactory = await InitializeAsync( + onModelCreating: BuildModelEnumLegacyValues, + onConfiguring: b => b.ConfigureWarnings(ConfigureWarnings), + seed: SeedEnumLegacyValues, + shouldLogCategory: c => c == DbLoggerCategory.Query.Name); + + using (var context = contextFactory.CreateContext()) + { + var query = context.Set().Select(x => x.Collection).AsNoTracking(); + + var result = async + ? await query.ToListAsync() + : query.ToList(); + + Assert.Equal(1, result.Count); + Assert.Equal(2, result[0].Count); + Assert.Equal(ByteEnumLegacyValues.Bellevue, result[0][0].ByteEnum); + Assert.Equal(IntEnumLegacyValues.Foo, result[0][0].IntEnum); + Assert.Equal(LongEnumLegacyValues.One, result[0][0].LongEnum); + Assert.Equal(ULongEnumLegacyValues.One, result[0][0].ULongEnum); + Assert.Equal(IntEnumLegacyValues.Bar, result[0][0].NullableEnum); + Assert.Equal(ByteEnumLegacyValues.Seattle, result[0][1].ByteEnum); + Assert.Equal(IntEnumLegacyValues.Baz, result[0][1].IntEnum); + Assert.Equal(LongEnumLegacyValues.Two, result[0][1].LongEnum); + Assert.Equal(ULongEnumLegacyValues.Two, result[0][1].ULongEnum); + Assert.Null(result[0][1].NullableEnum); + } + + var testLogger = new TestLogger(); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ByteEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(IntEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(LongEnumLegacyValues)))); + Assert.Single( + ListLoggerFactory.Log.Where( + l => l.Message == CoreResources.LogStringEnumValueInJson(testLogger).GenerateMessage(nameof(ULongEnumLegacyValues)))); + } + + private Task SeedEnumLegacyValues(DbContext ctx) + => ctx.Database.ExecuteSqlAsync( + $$""" +INSERT INTO [Entities] ([Collection], [Reference], [Id], [Name]) +VALUES( +'[{"ByteEnum":"Bellevue","IntEnum":"Foo","LongEnum":"One","ULongEnum":"One","Name":"e1_c1","NullableEnum":"Bar"},{"ByteEnum":"Seattle","IntEnum":"Baz","LongEnum":"Two","ULongEnum":"Two","Name":"e1_c2","NullableEnum":null}]', +'{"ByteEnum":"Redmond","IntEnum":"Foo","LongEnum":"Three","ULongEnum":"Three","Name":"e1_r","NullableEnum":"Bar"}', +1, +'e1') +"""); + + protected virtual void BuildModelEnumLegacyValues(ModelBuilder modelBuilder) + => modelBuilder.Entity( + b => + { + b.ToTable("Entities"); + b.Property(x => x.Id).ValueGeneratedNever(); + b.OwnsOne(x => x.Reference, b => b.ToJson().HasColumnType(JsonColumnType)); + b.OwnsMany(x => x.Collection, b => b.ToJson().HasColumnType(JsonColumnType)); + }); + + private class MyEntityEnumLegacyValues + { + public int Id { get; set; } + public string Name { get; set; } + + public MyJsonEntityEnumLegacyValues Reference { get; set; } + public List Collection { get; set; } + } + + private class MyJsonEntityEnumLegacyValues + { + public string Name { get; set; } + + // ReSharper disable once UnusedAutoPropertyAccessor.Local + public IntEnumLegacyValues IntEnum { get; set; } + // ReSharper disable once UnusedAutoPropertyAccessor.Local + public ByteEnumLegacyValues ByteEnum { get; set; } + // ReSharper disable once UnusedAutoPropertyAccessor.Local + public LongEnumLegacyValues LongEnum { get; set; } + // ReSharper disable once UnusedAutoPropertyAccessor.Local + public ULongEnumLegacyValues ULongEnum { get; set; } + // ReSharper disable once UnusedAutoPropertyAccessor.Local + public IntEnumLegacyValues? NullableEnum { get; set; } + } + + private enum IntEnumLegacyValues + { + Foo = int.MinValue, + Bar, + Baz = int.MaxValue, + } + + private enum ByteEnumLegacyValues : byte + { + Seattle, + Redmond, + Bellevue = 255, + } + + private enum LongEnumLegacyValues : long + { + One = long.MinValue, + Two = 1, + Three = long.MaxValue, + } + + private enum ULongEnumLegacyValues : ulong + { + One = ulong.MinValue, + Two = 1, + Three = ulong.MaxValue, + } + + #endregion +} diff --git a/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs index 2c5a2a13..cb84080c 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/ComplexNavigationsQueryJetTest.cs @@ -1936,12 +1936,12 @@ public override async Task Contains_with_subquery_optional_navigation_scalar_dis await base.Contains_with_subquery_optional_navigation_scalar_distinct_and_constant_item(async); AssertSql( - """ +""" SELECT `l`.`Id`, `l`.`Date`, `l`.`Name`, `l`.`OneToMany_Optional_Self_Inverse1Id`, `l`.`OneToMany_Required_Self_Inverse1Id`, `l`.`OneToOne_Optional_Self1Id` FROM `LevelOne` AS `l` LEFT JOIN `LevelTwo` AS `l0` ON `l`.`Id` = `l0`.`Level1_Optional_Id` WHERE 5 IN ( - SELECT DISTINCT IIF(LEN(`l1`.`Name`) IS NULL, NULL, CLNG(LEN(`l1`.`Name`))) + SELECT IIF(LEN(`l1`.`Name`) IS NULL, NULL, CLNG(LEN(`l1`.`Name`))) FROM `LevelThree` AS `l1` WHERE `l0`.`Id` IS NOT NULL AND `l0`.`Id` = `l1`.`OneToMany_Optional_Inverse3Id` ) diff --git a/test/EFCore.Jet.FunctionalTests/Query/DbFunctionsJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/DbFunctionsJetTest.cs index 0ae221ad..201b97bc 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/DbFunctionsJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/DbFunctionsJetTest.cs @@ -126,53 +126,29 @@ FROM [Customers] AS [c] """); } - public override async Task Least(bool async) + public override async Task Collate_is_null(bool async) { - await base.Least(async); + await base.Collate_is_null(async); AssertSql( """ -SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice] -FROM [Order Details] AS [o] -WHERE LEAST([o].[OrderID], 10251) = 10251 +SELECT COUNT(*) +FROM `Customers` AS `c` +WHERE `c`.`Region` IS NULL """); } - public override async Task Greatest(bool async) - { - await base.Greatest(async); + public override Task Least(bool async) + => AssertTranslationFailed(() => base.Least(async)); - AssertSql( - """ -SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice] -FROM [Order Details] AS [o] -WHERE GREATEST([o].[OrderID], 10251) = 10251 -"""); - } + public override Task Greatest(bool async) + => AssertTranslationFailed(() => base.Greatest(async)); - public override async Task Least_with_nullable_value_type(bool async) - { - await base.Least_with_nullable_value_type(async); + public override Task Least_with_nullable_value_type(bool async) + => AssertTranslationFailed(() => base.Least_with_nullable_value_type(async)); - AssertSql( - """ -SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice] -FROM [Order Details] AS [o] -WHERE LEAST([o].[OrderID], 10251) = 10251 -"""); - } - - public override async Task Greatest_with_nullable_value_type(bool async) - { - await base.Greatest_with_nullable_value_type(async); - - AssertSql( - """ -SELECT [o].[OrderID], [o].[ProductID], [o].[Discount], [o].[Quantity], [o].[UnitPrice] -FROM [Order Details] AS [o] -WHERE GREATEST([o].[OrderID], 10251) = 10251 -"""); - } + public override Task Greatest_with_nullable_value_type(bool async) + => AssertTranslationFailed(() => base.Greatest_with_nullable_value_type(async)); public override async Task Least_with_parameter_array_is_not_supported(bool async) { diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs index a92171f2..d311f507 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs @@ -7483,7 +7483,7 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ await base.Conditional_expression_with_test_being_simplified_to_constant_complex(isAsync); AssertSql( - """ +""" @__prm_0='True' @__prm2_1='Marcus' Lancer' (Size = 255) @@ -7492,10 +7492,7 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ WHERE IIF(`g`.`HasSoulPatch` = @__prm_0 AND ( SELECT TOP 1 `w`.`Name` FROM `Weapons` AS `w` - WHERE `w`.`Id` = `g`.`SquadId`) = @__prm2_1 AND ( - SELECT TOP 1 `w`.`Name` - FROM `Weapons` AS `w` - WHERE `w`.`Id` = `g`.`SquadId`) IS NOT NULL, TRUE, FALSE) = TRUE + WHERE `w`.`Id` = `g`.`SquadId`) = @__prm2_1, TRUE, FALSE) = TRUE """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs index 678b453e..3a436392 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindAggregateOperatorsQueryJetTest.ResultOperators.cs @@ -690,9 +690,9 @@ public override async Task Sum_with_coalesce(bool isAsync) WHERE `p`.`ProductID` < 40"); } - public override async Task Sum_over_subquery_is_client_eval(bool isAsync) + public override async Task Sum_over_subquery(bool isAsync) { - await base.Sum_over_subquery_is_client_eval(isAsync); + await base.Sum_over_subquery(isAsync); AssertSql( """ @@ -707,9 +707,9 @@ SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) """); } - public override async Task Sum_over_nested_subquery_is_client_eval(bool isAsync) + public override async Task Sum_over_nested_subquery(bool isAsync) { - await base.Sum_over_nested_subquery_is_client_eval(isAsync); + await base.Sum_over_nested_subquery(isAsync); AssertSql( """ SELECT IIF(SUM(( @@ -735,9 +735,9 @@ SELECT IIF(SUM(`o0`.`ProductID`) IS NULL, 0, SUM(`o0`.`ProductID`)) """); } - public override async Task Sum_over_min_subquery_is_client_eval(bool isAsync) + public override async Task Sum_over_min_subquery(bool isAsync) { - await base.Sum_over_min_subquery_is_client_eval(isAsync); + await base.Sum_over_min_subquery(isAsync); AssertSql( """ SELECT IIF(SUM(( @@ -763,6 +763,63 @@ SELECT MIN(`o0`.`ProductID`) """); } + public override async Task Sum_over_scalar_returning_subquery(bool async) + { + await base.Sum_over_scalar_returning_subquery(async); + + AssertSql( + """ +SELECT IIF(SUM(( + SELECT TOP 1 `o`.`OrderID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID`)) IS NULL, 0, SUM(( + SELECT TOP 1 `o`.`OrderID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID`))) +FROM `Customers` AS `c` +"""); + } + + public override async Task Sum_over_Any_subquery(bool async) + { + await base.Sum_over_Any_subquery(async); + + AssertSql( + """ +SELECT IIF(SUM(IIF(EXISTS ( + SELECT 1 + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID`), ( + SELECT TOP 1 `o0`.`OrderID` + FROM `Orders` AS `o0` + WHERE `c`.`CustomerID` = `o0`.`CustomerID`), 0)) IS NULL, 0, SUM(IIF(EXISTS ( + SELECT 1 + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID`), ( + SELECT TOP 1 `o0`.`OrderID` + FROM `Orders` AS `o0` + WHERE `c`.`CustomerID` = `o0`.`CustomerID`), 0))) +FROM `Customers` AS `c` +"""); + } + + public override async Task Sum_over_uncorrelated_subquery(bool async) + { + await base.Sum_over_uncorrelated_subquery(async); + + AssertSql( + """ +SELECT IIF(SUM(( + SELECT COUNT(*) + FROM `Orders` AS `o` + WHERE `o`.`OrderID` > 10300)) IS NULL, 0, SUM(( + SELECT COUNT(*) + FROM `Orders` AS `o` + WHERE `o`.`OrderID` > 10300))) +FROM `Customers` AS `c` +"""); + } + public override async Task Sum_on_float_column(bool isAsync) { await base.Sum_on_float_column(isAsync); @@ -850,9 +907,9 @@ public override async Task Average_with_coalesce(bool isAsync) WHERE `p`.`ProductID` < 40"); } - public override async Task Average_over_subquery_is_client_eval(bool isAsync) + public override async Task Average_over_subquery(bool isAsync) { - await base.Average_over_subquery_is_client_eval(isAsync); + await base.Average_over_subquery(isAsync); AssertSql( """ @@ -867,9 +924,9 @@ SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) """); } - public override async Task Average_over_nested_subquery_is_client_eval(bool isAsync) + public override async Task Average_over_nested_subquery(bool isAsync) { - await base.Average_over_nested_subquery_is_client_eval(isAsync); + await base.Average_over_nested_subquery(isAsync); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='3'")} @@ -878,9 +935,9 @@ public override async Task Average_over_nested_subquery_is_client_eval(bool isAs ORDER BY `c`.`CustomerID`"); } - public override async Task Average_over_max_subquery_is_client_eval(bool isAsync) + public override async Task Average_over_max_subquery(bool isAsync) { - await base.Average_over_max_subquery_is_client_eval(isAsync); + await base.Average_over_max_subquery(isAsync); AssertSql( $@"{AssertSqlHelper.Declaration("@__p_0='3'")} @@ -953,9 +1010,9 @@ public override async Task Min_with_coalesce(bool isAsync) WHERE `p`.`ProductID` < 40"); } - public override async Task Min_over_subquery_is_client_eval(bool isAsync) + public override async Task Min_over_subquery(bool isAsync) { - await base.Min_over_subquery_is_client_eval(isAsync); + await base.Min_over_subquery(isAsync); AssertSql( """ @@ -967,9 +1024,9 @@ SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) """); } - public override async Task Min_over_nested_subquery_is_client_eval(bool isAsync) + public override async Task Min_over_nested_subquery(bool isAsync) { - await base.Min_over_nested_subquery_is_client_eval(isAsync); + await base.Min_over_nested_subquery(isAsync); AssertSql( """ @@ -988,9 +1045,9 @@ ORDER BY `c`.`CustomerID` """); } - public override async Task Min_over_max_subquery_is_client_eval(bool isAsync) + public override async Task Min_over_max_subquery(bool isAsync) { - await base.Min_over_max_subquery_is_client_eval(isAsync); + await base.Min_over_max_subquery(isAsync); AssertSql( """ @@ -1037,9 +1094,9 @@ public override async Task Max_with_coalesce(bool isAsync) WHERE `p`.`ProductID` < 40"); } - public override async Task Max_over_subquery_is_client_eval(bool isAsync) + public override async Task Max_over_subquery(bool isAsync) { - await base.Max_over_subquery_is_client_eval(isAsync); + await base.Max_over_subquery(isAsync); AssertSql( """ @@ -1051,9 +1108,9 @@ SELECT IIF(SUM(`o`.`OrderID`) IS NULL, 0, SUM(`o`.`OrderID`)) """); } - public override async Task Max_over_nested_subquery_is_client_eval(bool isAsync) + public override async Task Max_over_nested_subquery(bool isAsync) { - await base.Max_over_nested_subquery_is_client_eval(isAsync); + await base.Max_over_nested_subquery(isAsync); AssertSql( """ @@ -1072,9 +1129,9 @@ ORDER BY `c`.`CustomerID` """); } - public override async Task Max_over_sum_subquery_is_client_eval(bool isAsync) + public override async Task Max_over_sum_subquery(bool isAsync) { - await base.Max_over_sum_subquery_is_client_eval(isAsync); + await base.Max_over_sum_subquery(isAsync); AssertSql( """ diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs index 4875b0b7..3140e68f 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs @@ -1516,6 +1516,57 @@ SELECT 1 WHERE `c`.`CustomerID` = `o`.`CustomerID` AND `o`.`EmployeeID` = 1)"); } + public override async Task Any_on_distinct(bool async) + { + await base.Any_on_distinct(async); + + AssertSql( + """ +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 EXISTS ( + SELECT 1 + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID` AND (`o`.`EmployeeID` <> 1 OR `o`.`EmployeeID` IS NULL)) +"""); + } + + public override async Task Contains_on_distinct(bool async) + { + await base.Contains_on_distinct(async); + + AssertSql( + """ +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 1 IN ( + SELECT `o`.`EmployeeID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID` +) +"""); + } + + public override async Task All_on_distinct(bool async) + { + await base.All_on_distinct(async); + + AssertSql( + """ +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 IIF(IIF(1 IN ( + SELECT `o`.`EmployeeID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID` + ), TRUE, FALSE) IS NULL, FALSE, IIF(1 IN ( + SELECT `o`.`EmployeeID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID` + ), TRUE, FALSE)) = FALSE +"""); + } + public override async Task All_top_level(bool isAsync) { await base.All_top_level(isAsync); @@ -3808,7 +3859,7 @@ public override async Task Complex_query_with_repeated_nested_query_model_compil await base.Complex_query_with_repeated_nested_query_model_compiles_correctly(isAsync); AssertSql( - """ +""" 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 `c`.`CustomerID` = 'ALFKI' AND EXISTS ( @@ -3818,7 +3869,7 @@ WHERE EXISTS ( SELECT 1 FROM `Customers` AS `c1` WHERE EXISTS ( - SELECT DISTINCT 1 + SELECT 1 FROM ( SELECT TOP 10 1 FROM `Customers` AS `c2` @@ -6977,6 +7028,46 @@ public override async Task Static_member_access_gets_parameterized_within_larger """); } + public override async Task Select_Order(bool async) + { + await base.Select_Order(async); + + AssertSql( + """ +SELECT `c`.`CustomerID` +FROM `Customers` AS `c` +ORDER BY `c`.`CustomerID` +"""); + } + + public override async Task Select_OrderDescending(bool async) + { + await base.Select_OrderDescending(async); + + AssertSql( + """ +SELECT `c`.`CustomerID` +FROM `Customers` AS `c` +ORDER BY `c`.`CustomerID` DESC +"""); + } + + public override async Task Where_Order_First(bool async) + { + await base.Where_Order_First(async); + + AssertSql( + """ +SELECT `c`.`CustomerID` +FROM `Customers` AS `c` +WHERE ( + SELECT TOP 1 `o`.`OrderID` + FROM `Orders` AS `o` + WHERE `c`.`CustomerID` = `o`.`CustomerID` + ORDER BY `o`.`OrderID`) = 10248 +"""); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected.Select(s => s.Trim()).ToArray()); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs index 0865704c..40d7e17b 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindSetOperationsQueryJetTest.cs @@ -1350,6 +1350,54 @@ public override async Task Collection_projection_before_set_operation_fails(bool AssertSql(); } + public override async Task Intersect_on_distinct(bool async) + { + await base.Intersect_on_distinct(async); + + AssertSql( + """ +SELECT [c].[CompanyName] +FROM [Customers] AS [c] +WHERE [c].[City] = N'México D.F.' +INTERSECT +SELECT [c0].[CompanyName] +FROM [Customers] AS [c0] +WHERE [c0].[ContactTitle] = N'Owner' +"""); + } + + public override async Task Union_on_distinct(bool async) + { + await base.Union_on_distinct(async); + + AssertSql( + """ +SELECT `c`.`CompanyName` +FROM `Customers` AS `c` +WHERE `c`.`City` = 'México D.F.' +UNION +SELECT `c0`.`CompanyName` +FROM `Customers` AS `c0` +WHERE `c0`.`ContactTitle` = 'Owner' +"""); + } + + public override async Task Except_on_distinct(bool async) + { + await base.Except_on_distinct(async); + + AssertSql( + """ +SELECT [c].[CompanyName] +FROM [Customers] AS [c] +WHERE [c].[City] = N'México D.F.' +EXCEPT +SELECT [c0].[CompanyName] +FROM [Customers] AS [c0] +WHERE [c0].[ContactTitle] = N'Owner' +"""); + } + public override async Task Include_Union_only_on_one_side_throws(bool async) { await base.Include_Union_only_on_one_side_throws(async); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs index 94b6b545..cbb7b5ee 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs @@ -2416,7 +2416,7 @@ public override async Task Null_semantics_conditional(bool async) await base.Null_semantics_conditional(async); AssertSql( - """ +""" SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`BoolA` = IIF(`e`.`BoolB` = TRUE, `e`.`NullableBoolB`, `e`.`NullableBoolC`) @@ -2431,7 +2431,7 @@ WHERE IIF((`e`.`NullableBoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolA` IS """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE IIF(IIF(`e`.`BoolA` = TRUE, IIF((`e`.`NullableBoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolA` IS NULL OR `e`.`NullableBoolB` IS NULL) AND (`e`.`NullableBoolA` IS NOT NULL OR `e`.`NullableBoolB` IS NOT NULL), TRUE, FALSE), `e`.`BoolC`) <> `e`.`BoolB`, `e`.`BoolA`, IIF((`e`.`NullableBoolB` = `e`.`NullableBoolC` AND `e`.`NullableBoolB` IS NOT NULL AND `e`.`NullableBoolC` IS NOT NULL) OR (`e`.`NullableBoolB` IS NULL AND `e`.`NullableBoolC` IS NULL), TRUE, FALSE)) = TRUE +WHERE IIF(IIF(`e`.`BoolA` = TRUE, IIF((`e`.`NullableBoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolA` IS NULL OR `e`.`NullableBoolB` IS NULL) AND (`e`.`NullableBoolA` IS NOT NULL OR `e`.`NullableBoolB` IS NOT NULL), TRUE, FALSE), `e`.`BoolC`) <> `e`.`BoolB`, `e`.`BoolA`, IIF(`e`.`NullableBoolB` = `e`.`NullableBoolC` OR (`e`.`NullableBoolB` IS NULL AND `e`.`NullableBoolC` IS NULL), TRUE, FALSE)) = TRUE """, // """ @@ -3750,12 +3750,11 @@ public override async Task Is_null_on_column_followed_by_OrElse_optimizes_nullab { await base.Is_null_on_column_followed_by_OrElse_optimizes_nullability_conditional_multiple(async); - // issue #25977 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 IIF(`e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL, IIF((`e`.`NullableStringA` = `e`.`NullableStringB` AND `e`.`NullableStringA` IS NOT NULL AND `e`.`NullableStringB` IS NOT NULL) OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL), TRUE, FALSE), IIF((`e`.`NullableStringA` <> `e`.`NullableStringB` OR `e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND (`e`.`NullableStringA` IS NOT NULL OR `e`.`NullableStringB` IS NOT NULL), TRUE, FALSE)) = TRUE +WHERE IIF(`e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL, IIF(`e`.`NullableStringA` = `e`.`NullableStringB` OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL), TRUE, FALSE), IIF((`e`.`NullableStringA` <> `e`.`NullableStringB` OR `e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND (`e`.`NullableStringA` IS NOT NULL OR `e`.`NullableStringB` IS NOT NULL), TRUE, FALSE)) = TRUE """); } @@ -3767,7 +3766,7 @@ public override async Task Is_null_on_column_followed_by_OrElse_optimizes_nullab """ 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 IIF((`e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND `e`.`NullableBoolC` IS NULL, IIF((`e`.`NullableStringA` = `e`.`NullableStringB` AND `e`.`NullableStringA` IS NOT NULL AND `e`.`NullableStringB` IS NOT NULL) OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL), TRUE, FALSE), IIF((`e`.`NullableStringA` <> `e`.`NullableStringB` OR `e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND (`e`.`NullableStringA` IS NOT NULL OR `e`.`NullableStringB` IS NOT NULL), TRUE, FALSE)) = TRUE +WHERE IIF((`e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND `e`.`NullableBoolC` IS NULL, IIF(`e`.`NullableStringA` = `e`.`NullableStringB` OR (`e`.`NullableStringA` IS NULL AND `e`.`NullableStringB` IS NULL), TRUE, FALSE), IIF((`e`.`NullableStringA` <> `e`.`NullableStringB` OR `e`.`NullableStringA` IS NULL OR `e`.`NullableStringB` IS NULL) AND (`e`.`NullableStringA` IS NOT NULL OR `e`.`NullableStringB` IS NOT NULL), TRUE, FALSE)) = TRUE """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/PrecompiledQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/PrecompiledQueryJetTest.cs index 1a779ab2..13cdecba 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/PrecompiledQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/PrecompiledQueryJetTest.cs @@ -34,7 +34,7 @@ public override async Task BinaryExpression() """ @__id_0='3' -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` > @__id_0 """); @@ -110,7 +110,7 @@ public override async Task ListInit_fully_evaluatable() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` IN (7, 8) """); @@ -122,7 +122,7 @@ public override async Task MethodCallExpression_no_evaluatability() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Name` IS NOT NULL AND LEFT(`b`.`Name`, IIF(LEN(`b`.`Name`) IS NULL, 0, LEN(`b`.`Name`))) = `b`.`Name` """); @@ -136,7 +136,7 @@ public override async Task MethodCallExpression_with_evaluatable_with_captured_v """ @__pattern_0_startswith='foo%' (Size = 255) -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Name` LIKE @__pattern_0_startswith """); @@ -148,7 +148,7 @@ public override async Task MethodCallExpression_with_evaluatable_without_capture AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Name` LIKE 'foo%' """); @@ -160,7 +160,7 @@ public override async Task MethodCallExpression_fully_evaluatable() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -171,7 +171,7 @@ public override async Task New_with_no_arguments() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 0 """); @@ -260,7 +260,7 @@ public override async Task Unary() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE CINT(`b`.`Id`) = 8 """); @@ -283,7 +283,7 @@ public override async Task Terminating_AsEnumerable() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -294,7 +294,7 @@ public override async Task Terminating_AsAsyncEnumerable_on_DbSet() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -305,7 +305,7 @@ public override async Task Terminating_AsAsyncEnumerable_on_IQueryable() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` > 8 """); @@ -317,7 +317,7 @@ public override async Task Foreach_sync_over_operator() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` > 8 """); @@ -328,8 +328,8 @@ public override async Task Terminating_ToArray() await base.Terminating_ToArray(); AssertSql( - """ -SELECT `b`.`Id`, `b`.`Name` +""" +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -340,7 +340,7 @@ public override async Task Terminating_ToArrayAsync() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -351,7 +351,7 @@ public override async Task Terminating_ToDictionary() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -362,7 +362,7 @@ public override async Task Terminating_ToDictionaryAsync() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -395,7 +395,7 @@ public override async Task Terminating_ToHashSet() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -406,7 +406,7 @@ public override async Task Terminating_ToHashSetAsync() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -417,7 +417,7 @@ public override async Task Terminating_ToLookup() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -428,7 +428,7 @@ public override async Task Terminating_ToList() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -439,7 +439,7 @@ public override async Task Terminating_ToListAsync() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -802,25 +802,25 @@ public override async Task Terminating_First() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -832,25 +832,25 @@ public override async Task Terminating_FirstAsync() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -862,25 +862,25 @@ public override async Task Terminating_FirstOrDefault() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -892,25 +892,25 @@ public override async Task Terminating_FirstOrDefaultAsync() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -922,7 +922,7 @@ public override async Task Terminating_GetEnumerator() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """); @@ -934,27 +934,27 @@ public override async Task Terminating_Last() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC @@ -967,27 +967,27 @@ public override async Task Terminating_LastAsync() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC @@ -1000,27 +1000,27 @@ public override async Task Terminating_LastOrDefault() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC @@ -1033,27 +1033,27 @@ public override async Task Terminating_LastOrDefaultAsync() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 ORDER BY `b`.`Id` DESC """, // """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 ORDER BY `b`.`Id` DESC @@ -1164,25 +1164,25 @@ public override async Task Terminating_Single() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -1194,25 +1194,25 @@ public override async Task Terminating_SingleAsync() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -1224,25 +1224,25 @@ public override async Task Terminating_SingleOrDefault() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -1254,25 +1254,25 @@ public override async Task Terminating_SingleOrDefaultAsync() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 8 """, // """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = 7 """); @@ -1392,40 +1392,80 @@ public override async Task Union() AssertSql( """ -SELECT `u`.`Id`, `u`.`Name` +SELECT `u`.`Id`, `u`.`BlogId`, `u`.`Title` FROM ( - SELECT `b`.`Id`, `b`.`Name` - FROM `Blogs` AS `b` - WHERE `b`.`Id` > 7 + SELECT `p`.`Id`, `p`.`BlogId`, `p`.`Title` + FROM `Posts` AS `p` + WHERE `p`.`Id` > 11 UNION - SELECT `b0`.`Id`, `b0`.`Name` - FROM `Blogs` AS `b0` - WHERE `b0`.`Id` < 10 + SELECT `p0`.`Id`, `p0`.`BlogId`, `p0`.`Title` + FROM `Posts` AS `p0` + WHERE `p0`.`Id` < 21 ) AS `u` ORDER BY `u`.`Id` """); } + public override async Task UnionOnEntitiesWithJson() + { + await base.UnionOnEntitiesWithJson(); + + AssertSql( + """ +SELECT [u].[Id], [u].[Name], [u].[Json] +FROM ( + SELECT [b].[Id], [b].[Name], [b].[Json] + FROM [Blogs] AS [b] + WHERE [b].[Id] > 7 + UNION + SELECT [b0].[Id], [b0].[Name], [b0].[Json] + FROM [Blogs] AS [b0] + WHERE [b0].[Id] < 10 +) AS [u] +ORDER BY [u].[Id] +"""); + } + public override async Task Concat() { await base.Concat(); AssertSql( """ -SELECT `u`.`Id`, `u`.`Name` +SELECT `u`.`Id`, `u`.`BlogId`, `u`.`Title` FROM ( - SELECT `b`.`Id`, `b`.`Name` - FROM `Blogs` AS `b` - WHERE `b`.`Id` > 7 + SELECT `p`.`Id`, `p`.`BlogId`, `p`.`Title` + FROM `Posts` AS `p` + WHERE `p`.`Id` > 11 UNION ALL - SELECT `b0`.`Id`, `b0`.`Name` - FROM `Blogs` AS `b0` - WHERE `b0`.`Id` < 10 + SELECT `p0`.`Id`, `p0`.`BlogId`, `p0`.`Title` + FROM `Posts` AS `p0` + WHERE `p0`.`Id` < 21 ) AS `u` ORDER BY `u`.`Id` """); } + public override async Task ConcatOnEntitiesWithJson() + { + await base.ConcatOnEntitiesWithJson(); + + AssertSql( + """ +SELECT [u].[Id], [u].[Name], [u].[Json] +FROM ( + SELECT [b].[Id], [b].[Name], [b].[Json] + FROM [Blogs] AS [b] + WHERE [b].[Id] > 7 + UNION ALL + SELECT [b0].[Id], [b0].[Name], [b0].[Json] + FROM [Blogs] AS [b0] + WHERE [b0].[Id] < 10 +) AS [u] +ORDER BY [u].[Id] +"""); + } + public override async Task Intersect() { await base.Intersect(); @@ -1446,6 +1486,26 @@ ORDER BY [i].[Id] """); } + public override async Task IntersectOnEntitiesWithJson() + { + await base.IntersectOnEntitiesWithJson(); + + AssertSql( + """ +SELECT [i].[Id], [i].[Name], [i].[Json] +FROM ( + SELECT [b].[Id], [b].[Name], [b].[Json] + FROM [Blogs] AS [b] + WHERE [b].[Id] > 7 + INTERSECT + SELECT [b0].[Id], [b0].[Name], [b0].[Json] + FROM [Blogs] AS [b0] + WHERE [b0].[Id] > 8 +) AS [i] +ORDER BY [i].[Id] +"""); + } + public override async Task Except() { await base.Except(); @@ -1466,6 +1526,26 @@ ORDER BY [e].[Id] """); } + public override async Task ExceptOnEntitiesWithJson() + { + await base.ExceptOnEntitiesWithJson(); + + AssertSql( + """ +SELECT [e].[Id], [e].[Name], [e].[Json] +FROM ( + SELECT [b].[Id], [b].[Name], [b].[Json] + FROM [Blogs] AS [b] + WHERE [b].[Id] > 7 + EXCEPT + SELECT [b0].[Id], [b0].[Name], [b0].[Json] + FROM [Blogs] AS [b0] + WHERE [b0].[Id] > 8 +) AS [e] +ORDER BY [e].[Id] +"""); + } + public override async Task ValuesExpression() { await base.ValuesExpression(); @@ -1487,7 +1567,7 @@ public override async Task Contains_with_parameterized_collection() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` IN (1, 2, 3) """); @@ -1499,7 +1579,7 @@ public override async Task FromSqlRaw() AssertSql( """ -SELECT `m`.`Id`, `m`.`Name` +SELECT `m`.`Id`, `m`.`Name`, `m`.`Json` FROM ( SELECT * FROM `Blogs` WHERE `Id` > 8 ) AS `m` @@ -1516,7 +1596,7 @@ public override async Task FromSql_with_FormattableString_parameters() p0='8' p1='9' -SELECT `m`.`Id`, `m`.`Name` +SELECT `m`.`Id`, `m`.`Name`, `m`.`Json` FROM ( SELECT * FROM `Blogs` WHERE `Id` > @p0 AND `Id` < @p1 ) AS `m` @@ -1620,7 +1700,7 @@ public override async Task DbContext_as_local_variable() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -1631,7 +1711,7 @@ public override async Task DbContext_as_field() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -1642,7 +1722,7 @@ public override async Task DbContext_as_property() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -1653,7 +1733,7 @@ public override async Task DbContext_as_captured_variable() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -1664,7 +1744,7 @@ public override async Task DbContext_as_method_invocation_result() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } @@ -1707,7 +1787,7 @@ public override async Task NotParameterizedAttribute_with_constant() AssertSql( """ -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Name` = 'Blog2' """); @@ -1746,7 +1826,7 @@ public override async Task OrderBy() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Name` """); @@ -1773,7 +1853,7 @@ public override async Task Take() AssertSql( """ -SELECT TOP 1 `b`.`Id`, `b`.`Name` +SELECT TOP 1 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Name` """); @@ -1813,7 +1893,7 @@ public override async Task Two_captured_variables_in_different_lambdas() @__starts_0_startswith='blog%' (Size = 255) @__ends_1_endswith='%2' (Size = 255) -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE (`b`.`Name` LIKE @__starts_0_startswith) AND (`b`.`Name` LIKE @__ends_1_endswith) """); @@ -1828,7 +1908,7 @@ public override async Task Same_captured_variable_twice_in_same_lambda() @__foo_0_startswith='X%' (Size = 255) @__foo_0_endswith='%X' (Size = 255) -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE (`b`.`Name` LIKE @__foo_0_startswith) AND (`b`.`Name` LIKE @__foo_0_endswith) """); @@ -1843,7 +1923,7 @@ public override async Task Same_captured_variable_twice_in_different_lambdas() @__foo_0_startswith='X%' (Size = 255) @__foo_0_endswith='%X' (Size = 255) -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE (`b`.`Name` LIKE @__foo_0_startswith) AND (`b`.`Name` LIKE @__foo_0_endswith) """); @@ -1855,7 +1935,7 @@ public override async Task Include_single() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name`, `p`.`Id`, `p`.`BlogId`, `p`.`Title` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json`, `p`.`Id`, `p`.`BlogId`, `p`.`Title` FROM `Blogs` AS `b` LEFT JOIN `Posts` AS `p` ON `b`.`Id` = `p`.`BlogId` WHERE `b`.`Id` > 8 @@ -1869,7 +1949,7 @@ public override async Task Include_split() AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Id` """, @@ -1888,7 +1968,7 @@ public override async Task Final_GroupBy() AssertSql( """ -SELECT `b`.`Name`, `b`.`Id` +SELECT `b`.`Name`, `b`.`Id`, `b`.`Json` FROM `Blogs` AS `b` ORDER BY `b`.`Name` """); @@ -1903,7 +1983,7 @@ public override async Task Multiple_queries_with_captured_variables() @__id1_0='8' @__id2_1='9' -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = @__id1_0 OR `b`.`Id` = @__id2_1 """, @@ -1911,7 +1991,7 @@ public override async Task Multiple_queries_with_captured_variables() """ @__id1_0='8' -SELECT TOP 2 `b`.`Id`, `b`.`Name` +SELECT TOP 2 `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` WHERE `b`.`Id` = @__id1_0 """); @@ -1923,12 +2003,12 @@ public override async Task Unsafe_accessor_gets_generated_once_for_multiple_quer AssertSql( """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """, // """ -SELECT `b`.`Id`, `b`.`Name` +SELECT `b`.`Id`, `b`.`Name`, `b`.`Json` FROM `Blogs` AS `b` """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs index e6329284..77e59e1b 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs @@ -177,18 +177,6 @@ public override async Task Inline_collection_Contains_with_three_values(bool asy """); } - public override async Task Inline_collection_Contains_with_EF_Constant(bool async) - { - await base.Inline_collection_Contains_with_EF_Constant(async); - - AssertSql( - """ -SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` -FROM `PrimitiveCollectionsEntity` AS `p` -WHERE `p`.`Id` IN (2, 999, 1000) -"""); - } - public override async Task Inline_collection_Contains_with_all_parameters(bool async) { await base.Inline_collection_Contains_with_all_parameters(async); @@ -450,6 +438,73 @@ SELECT MAX([v].[Value]) """); } + public override async Task Inline_collection_with_single_parameter_element_Contains(bool async) + { + await base.Inline_collection_with_single_parameter_element_Contains(async); + + AssertSql( + """ +@__i_0='2' + +SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` +FROM `PrimitiveCollectionsEntity` AS `p` +WHERE `p`.`Id` = @__i_0 +"""); + } + + public override async Task Inline_collection_with_single_parameter_element_Count(bool async) + { + await base.Inline_collection_with_single_parameter_element_Count(async); + + AssertSql( + """ +@__i_0='2' +@__i_0='2' + +SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` +FROM `PrimitiveCollectionsEntity` AS `p` +WHERE ( + SELECT COUNT(*) + FROM (SELECT IIF(@__i_0 IS NULL, NULL, CLNG(@__i_0)) AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `v_0`) AS `v` + WHERE `v`.`Value` > `p`.`Id`) = 1 +"""); + } + + public override async Task Inline_collection_Contains_with_EF_Parameter(bool async) + { + await base.Inline_collection_Contains_with_EF_Parameter(async); + + AssertSql( + """ +@__p_0='[2,999,1000]' (Size = 4000) + +SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[String], [p].[Strings] +FROM [PrimitiveCollectionsEntity] AS [p] +WHERE [p].[Id] IN ( + SELECT [p0].[value] + FROM OPENJSON(@__p_0) WITH ([value] int '$') AS [p0] +) +"""); + } + + public override async Task Inline_collection_Count_with_column_predicate_with_EF_Parameter(bool async) + { + await base.Inline_collection_Count_with_column_predicate_with_EF_Parameter(async); + + AssertSql( + """ +@__p_0='[2,999,1000]' (Size = 4000) + +SELECT [p].[Id], [p].[Bool], [p].[Bools], [p].[DateTime], [p].[DateTimes], [p].[Enum], [p].[Enums], [p].[Int], [p].[Ints], [p].[NullableInt], [p].[NullableInts], [p].[NullableString], [p].[NullableStrings], [p].[String], [p].[Strings] +FROM [PrimitiveCollectionsEntity] AS [p] +WHERE ( + SELECT COUNT(*) + FROM OPENJSON(@__p_0) WITH ([value] int '$') AS [p0] + WHERE [p0].[value] > [p].[Id]) = 2 +"""); + } + public override Task Parameter_collection_Count(bool async) => AssertTranslationFailedWithDetails(() => base.Parameter_collection_Count(async), JetStrings.QueryingIntoJsonCollectionsNotSupported()); @@ -663,6 +718,62 @@ public override async Task Parameter_collection_null_Contains(bool async) """); } + public override async Task Parameter_collection_Contains_with_EF_Constant(bool async) + { + await base.Parameter_collection_Contains_with_EF_Constant(async); + + AssertSql( + """ +SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` +FROM `PrimitiveCollectionsEntity` AS `p` +WHERE `p`.`Id` IN (2, 999, 1000) +"""); + } + + public override async Task Parameter_collection_Where_with_EF_Constant_Where_Any(bool async) + { + await base.Parameter_collection_Where_with_EF_Constant_Where_Any(async); + + AssertSql( + """ +SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` +FROM `PrimitiveCollectionsEntity` AS `p` +WHERE EXISTS ( + SELECT 1 + FROM (SELECT 2 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_0` + UNION + SELECT 999 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_1` + UNION + SELECT 1000 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_2`) AS `i` + WHERE `i`.`Value` > 0) +"""); + } + + public override async Task Parameter_collection_Count_with_column_predicate_with_EF_Constant(bool async) + { + await base.Parameter_collection_Count_with_column_predicate_with_EF_Constant(async); + + AssertSql( + """ +SELECT `p`.`Id`, `p`.`Bool`, `p`.`Bools`, `p`.`DateTime`, `p`.`DateTimes`, `p`.`Enum`, `p`.`Enums`, `p`.`Int`, `p`.`Ints`, `p`.`NullableInt`, `p`.`NullableInts`, `p`.`NullableString`, `p`.`NullableStrings`, `p`.`String`, `p`.`Strings` +FROM `PrimitiveCollectionsEntity` AS `p` +WHERE ( + SELECT COUNT(*) + FROM (SELECT 2 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_0` + UNION + SELECT 999 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_1` + UNION + SELECT 1000 AS `Value` + FROM (SELECT COUNT(*) FROM `#Dual`) AS `i_2`) AS `i` + WHERE `i`.`Value` > `p`.`Id`) = 2 +"""); + } + public override Task Column_collection_of_ints_Contains(bool async) => AssertTranslationFailedWithDetails(() => base.Column_collection_of_ints_Contains(async), JetStrings.QueryingIntoJsonCollectionsNotSupported()); diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs index 09ac6fc9..c55f2518 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs @@ -1330,7 +1330,7 @@ public override async Task Null_propagation_optimization2(bool async) // issue #16050 AssertSql( - """ +""" SELECT `u`.`Nickname`, `u`.`SquadId`, `u`.`AssignedCityName`, `u`.`CityOfBirthName`, `u`.`FullName`, `u`.`HasSoulPatch`, `u`.`LeaderNickname`, `u`.`LeaderSquadId`, `u`.`Rank`, `u`.`Discriminator` FROM ( SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, 'Gear' AS `Discriminator` @@ -1339,7 +1339,7 @@ UNION ALL SELECT `o`.`Nickname`, `o`.`SquadId`, `o`.`AssignedCityName`, `o`.`CityOfBirthName`, `o`.`FullName`, `o`.`HasSoulPatch`, `o`.`LeaderNickname`, `o`.`LeaderSquadId`, `o`.`Rank`, 'Officer' AS `Discriminator` FROM `Officers` AS `o` ) AS `u` -WHERE IIF(`u`.`LeaderNickname` IS NULL, NULL, IIF((`u`.`LeaderNickname` LIKE '%us') AND `u`.`LeaderNickname` IS NOT NULL, TRUE, FALSE)) = TRUE +WHERE IIF(`u`.`LeaderNickname` IS NULL, NULL, IIF(`u`.`LeaderNickname` LIKE '%us', TRUE, FALSE)) = TRUE """); } @@ -10267,7 +10267,7 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ await base.Conditional_expression_with_test_being_simplified_to_constant_complex(isAsync); AssertSql( - """ +""" @__prm_0='True' @__prm2_1='Marcus' Lancer' (Size = 255) @@ -10282,10 +10282,7 @@ UNION ALL WHERE IIF(`u`.`HasSoulPatch` = @__prm_0 AND ( SELECT TOP 1 `w`.`Name` FROM `Weapons` AS `w` - WHERE `w`.`Id` = `u`.`SquadId`) = @__prm2_1 AND ( - SELECT TOP 1 `w`.`Name` - FROM `Weapons` AS `w` - WHERE `w`.`Id` = `u`.`SquadId`) IS NOT NULL, TRUE, FALSE) = TRUE + WHERE `w`.`Id` = `u`.`SquadId`) = @__prm2_1, TRUE, FALSE) = TRUE """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs index d898454a..8850223d 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs @@ -1037,7 +1037,7 @@ public override async Task Null_propagation_optimization2(bool async) SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank`, IIF(`o`.`Nickname` IS NOT NULL, 'Officer', NULL) AS `Discriminator` FROM `Gears` AS `g` LEFT JOIN `Officers` AS `o` ON `g`.`Nickname` = `o`.`Nickname` AND `g`.`SquadId` = `o`.`SquadId` -WHERE IIF(`g`.`LeaderNickname` IS NULL, NULL, IIF((`g`.`LeaderNickname` LIKE '%us') AND `g`.`LeaderNickname` IS NOT NULL, TRUE, FALSE)) = TRUE +WHERE IIF(`g`.`LeaderNickname` IS NULL, NULL, IIF(`g`.`LeaderNickname` LIKE '%us', TRUE, FALSE)) = TRUE """); } @@ -8265,7 +8265,7 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ await base.Conditional_expression_with_test_being_simplified_to_constant_complex(isAsync); AssertSql( - """ +""" @__prm_0='True' @__prm2_1='Marcus' Lancer' (Size = 255) @@ -8275,10 +8275,7 @@ public override async Task Conditional_expression_with_test_being_simplified_to_ WHERE IIF(`g`.`HasSoulPatch` = @__prm_0 AND ( SELECT TOP 1 `w`.`Name` FROM `Weapons` AS `w` - WHERE `w`.`Id` = `g`.`SquadId`) = @__prm2_1 AND ( - SELECT TOP 1 `w`.`Name` - FROM `Weapons` AS `w` - WHERE `w`.`Id` = `g`.`SquadId`) IS NOT NULL, TRUE, FALSE) = TRUE + WHERE `w`.`Id` = `g`.`SquadId`) = @__prm2_1, TRUE, FALSE) = TRUE """); }