From b66097c0eb1287b360f1d30d3384273fb57b6759 Mon Sep 17 00:00:00 2001 From: Smit Patel Date: Thu, 5 Nov 2020 19:13:24 -0800 Subject: [PATCH] Cosmos: Add support for char literals (#23213) Also remove implicit convert for float to double since there is no explicit convert in Cosmos Resolves #16919 --- .../CosmosSqlTranslatingExpressionVisitor.cs | 4 +++- .../Query/Internal/QuerySqlGenerator.cs | 4 +++- .../BuiltInDataTypesCosmosTest.cs | 12 +++------- .../CustomConvertersCosmosTest.cs | 22 +++++-------------- .../NorthwindFunctionsQueryCosmosTest.cs | 4 ++-- 5 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/EFCore.Cosmos/Query/Internal/CosmosSqlTranslatingExpressionVisitor.cs b/src/EFCore.Cosmos/Query/Internal/CosmosSqlTranslatingExpressionVisitor.cs index f9d32700f96..32f8eede106 100644 --- a/src/EFCore.Cosmos/Query/Internal/CosmosSqlTranslatingExpressionVisitor.cs +++ b/src/EFCore.Cosmos/Query/Internal/CosmosSqlTranslatingExpressionVisitor.cs @@ -701,7 +701,9 @@ private static Expression TryRemoveImplicitConvert(Expression expression) || innerType == typeof(sbyte) || innerType == typeof(char) || innerType == typeof(short) - || innerType == typeof(ushort)))) + || innerType == typeof(ushort))) + || (convertedType == typeof(double) + && (innerType == typeof(float)))) { return TryRemoveImplicitConvert(unaryExpression.Operand); } diff --git a/src/EFCore.Cosmos/Query/Internal/QuerySqlGenerator.cs b/src/EFCore.Cosmos/Query/Internal/QuerySqlGenerator.cs index 0b6082c4d07..6d3ef445c6b 100644 --- a/src/EFCore.Cosmos/Query/Internal/QuerySqlGenerator.cs +++ b/src/EFCore.Cosmos/Query/Internal/QuerySqlGenerator.cs @@ -388,7 +388,9 @@ private JToken GenerateJToken(object value, CoreTypeMapping typeMapping) var unwrappedType = typeMapping.ClrType.UnwrapNullableType(); value = unwrappedType.IsEnum ? Enum.ToObject(unwrappedType, value) - : value; + : unwrappedType == typeof(char) + ? Convert.ChangeType(value, unwrappedType) + : value; } var converter = typeMapping.Converter; diff --git a/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs index 914bf7a82b9..4c5c5b3f5e8 100644 --- a/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/BuiltInDataTypesCosmosTest.cs @@ -17,25 +17,19 @@ public BuiltInDataTypesCosmosTest(BuiltInDataTypesCosmosFixture fixture) { } - [ConditionalTheory(Skip = "Issue #16919")] + [ConditionalTheory(Skip = "Issue #17246 No Explicit Convert")] public override Task Can_filter_projection_with_inline_enum_variable(bool async) { return base.Can_filter_projection_with_inline_enum_variable(async); } - [ConditionalTheory(Skip = "Issue #16919")] + [ConditionalTheory(Skip = "Issue #17246 No Explicit Convert")] public override Task Can_filter_projection_with_captured_enum_variable(bool async) { return base.Can_filter_projection_with_captured_enum_variable(async); } - [ConditionalFact(Skip = "Issue #16919")] - public override void Can_query_using_any_nullable_data_type_as_literal() - { - base.Can_query_using_any_nullable_data_type_as_literal(); - } - - [ConditionalFact(Skip = "Issue #16919")] + [ConditionalFact(Skip = "Issue #17246 No Explicit Convert")] public override void Can_query_with_null_parameters_using_any_nullable_data_type() { base.Can_query_with_null_parameters_using_any_nullable_data_type(); diff --git a/test/EFCore.Cosmos.FunctionalTests/CustomConvertersCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/CustomConvertersCosmosTest.cs index 6bb93535514..a5de655b073 100644 --- a/test/EFCore.Cosmos.FunctionalTests/CustomConvertersCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/CustomConvertersCosmosTest.cs @@ -23,25 +23,19 @@ public override void Can_perform_query_with_max_length() // Over the 2Mb document limit } - [ConditionalTheory(Skip = "Issue #16919")] + [ConditionalTheory(Skip = "Issue #17246 No Explicit Convert")] public override Task Can_filter_projection_with_inline_enum_variable(bool async) { return base.Can_filter_projection_with_inline_enum_variable(async); } - [ConditionalTheory(Skip = "Issue #16919")] + [ConditionalTheory(Skip = "Issue #17246 No Explicit Convert")] public override Task Can_filter_projection_with_captured_enum_variable(bool async) { return base.Can_filter_projection_with_captured_enum_variable(async); } - [ConditionalFact(Skip = "Issue #16919")] - public override void Can_query_using_any_nullable_data_type_as_literal() - { - base.Can_query_using_any_nullable_data_type_as_literal(); - } - - [ConditionalFact(Skip = "Issue #16919")] + [ConditionalFact(Skip = "Issue #17246 No Explicit Convert")] public override void Can_query_with_null_parameters_using_any_nullable_data_type() { base.Can_query_with_null_parameters_using_any_nullable_data_type(); @@ -53,13 +47,7 @@ public override void Can_insert_and_read_back_with_string_key() base.Can_insert_and_read_back_with_string_key(); } - [ConditionalFact(Skip = "Issue #16919")] - public override void Can_query_and_update_with_conversion_for_custom_struct() - { - base.Can_query_and_update_with_conversion_for_custom_struct(); - } - - [ConditionalFact(Skip = "Issue #16919")] + [ConditionalFact(Skip = "Issue #17246 No Explicit Convert")] public override void Can_query_and_update_with_conversion_for_custom_type() { base.Can_query_and_update_with_conversion_for_custom_type(); @@ -83,7 +71,7 @@ public override void Can_insert_and_read_back_with_case_insensitive_string_key() base.Can_insert_and_read_back_with_case_insensitive_string_key(); } - [ConditionalFact(Skip = "Issue #16919")] + [ConditionalFact(Skip = "Issue #17246 No Explicit Convert")] public override void Can_insert_and_query_struct_to_string_converter_for_pk() { base.Can_insert_and_query_struct_to_string_converter_for_pk(); diff --git a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindFunctionsQueryCosmosTest.cs b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindFunctionsQueryCosmosTest.cs index cbc0befafe0..6c86e0b9347 100644 --- a/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindFunctionsQueryCosmosTest.cs +++ b/test/EFCore.Cosmos.FunctionalTests/Query/NorthwindFunctionsQueryCosmosTest.cs @@ -128,20 +128,20 @@ FROM root c WHERE ((c[""Discriminator""] = ""Customer"") AND CONTAINS(c[""ContactName""], c[""ContactName""]))"); } - [ConditionalTheory(Skip = "Issue #16919")] public override async Task String_FirstOrDefault_MethodCall(bool async) { await base.String_FirstOrDefault_MethodCall(async); + AssertSql( @"SELECT c FROM root c WHERE ((c[""Discriminator""] = ""Customer"") AND (LEFT(c[""ContactName""], 1) = ""A""))"); } - [ConditionalTheory(Skip = "Issue #16919")] public override async Task String_LastOrDefault_MethodCall(bool async) { await base.String_LastOrDefault_MethodCall(async); + AssertSql( @"SELECT c FROM root c