using Microsoft.EntityFrameworkCore.Query; using Xunit; using Xunit.Abstractions; namespace EntityFramework.Jet.FunctionalTests { public class NullSemanticsQueryJetTest : NullSemanticsQueryTestBase { public NullSemanticsQueryJetTest(NullSemanticsQueryJetFixture fixture, ITestOutputHelper testOutputHelper) : base(fixture) { fixture.TestSqlLoggerFactory.Clear(); //fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } public override void Projecting_nullable_bool_with_coalesce() { base.Projecting_nullable_bool_with_coalesce(); } public override void Projecting_nullable_bool_with_coalesce_nested() { base.Projecting_nullable_bool_with_coalesce_nested(); } public override void Compare_bool_with_bool_equal() { base.Compare_bool_with_bool_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[NullableBoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_negated_bool_with_bool_equal() { base.Compare_negated_bool_with_bool_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] <> [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_bool_with_negated_bool_equal() { base.Compare_bool_with_negated_bool_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] <> [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_negated_bool_with_negated_bool_equal() { base.Compare_negated_bool_with_negated_bool_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] = [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_bool_with_bool_equal_negated() { base.Compare_bool_with_bool_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_negated_bool_with_bool_equal_negated() { base.Compare_negated_bool_with_bool_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_bool_with_negated_bool_equal_negated() { base.Compare_bool_with_negated_bool_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_negated_bool_with_negated_bool_equal_negated() { base.Compare_negated_bool_with_negated_bool_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_bool_with_bool_not_equal() { base.Compare_bool_with_bool_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_negated_bool_with_bool_not_equal() { base.Compare_negated_bool_with_bool_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_bool_with_negated_bool_not_equal() { base.Compare_bool_with_negated_bool_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_negated_bool_with_negated_bool_not_equal() { base.Compare_negated_bool_with_negated_bool_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_bool_with_bool_not_equal_negated() { base.Compare_bool_with_bool_not_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[NullableBoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_negated_bool_with_bool_not_equal_negated() { base.Compare_negated_bool_with_bool_not_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] <> [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_bool_with_negated_bool_not_equal_negated() { base.Compare_bool_with_negated_bool_not_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] <> [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_negated_bool_with_negated_bool_not_equal_negated() { base.Compare_negated_bool_with_negated_bool_not_equal_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] = [e].[NullableBoolB]) AND [e].[NullableBoolB] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[BoolB]) AND [e].[NullableBoolA] IS NOT NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableBoolA] = [e].[NullableBoolB]) AND ([e].[NullableBoolA] IS NOT NULL AND [e].[NullableBoolB] IS NOT NULL)) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_equals_method() { base.Compare_equals_method(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] = [e].[NullableBoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL)", Sql); } public override void Compare_equals_method_negated() { base.Compare_equals_method_negated(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[BoolA] <> [e].[BoolB] SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[BoolA] <> [e].[NullableBoolB]) OR [e].[NullableBoolB] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([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)", Sql); } public override void Compare_complex_equal_equal_equal() { base.Compare_complex_equal_equal_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] = [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[NullableBoolA] = [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN [e].[IntA] = [e].[NullableIntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN ([e].[NullableIntA] = [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_complex_equal_not_equal_equal() { base.Compare_complex_equal_not_equal_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] = [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[NullableBoolA] = [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN [e].[IntA] = [e].[NullableIntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN ([e].[NullableIntA] = [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_complex_not_equal_equal_equal() { base.Compare_complex_not_equal_equal_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] <> [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN [e].[IntA] = [e].[NullableIntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN (([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) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN (([e].[NullableIntA] = [e].[NullableIntB]) AND ([e].[NullableIntA] IS NOT NULL AND [e].[NullableIntB] IS NOT NULL)) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_complex_not_equal_not_equal_equal() { base.Compare_complex_not_equal_not_equal_equal(); Assert.Equal(@"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] <> [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN [e].[IntA] = [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN [e].[IntA] = [e].[NullableIntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN (([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) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN (([e].[NullableIntA] = [e].[NullableIntB]) AND ([e].[NullableIntA] IS NOT NULL AND [e].[NullableIntB] IS NOT NULL)) OR ([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_complex_not_equal_equal_not_equal() { base.Compare_complex_not_equal_equal_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] <> [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN ([e].[IntA] <> [e].[NullableIntB]) OR [e].[NullableIntB] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN (([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) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END = CASE WHEN (([e].[NullableIntA] <> [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL OR [e].[NullableIntB] IS NULL)) AND ([e].[NullableIntA] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_complex_not_equal_not_equal_not_equal() { base.Compare_complex_not_equal_not_equal_not_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN [e].[BoolA] <> [e].[BoolB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN [e].[IntA] <> [e].[IntB] THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN ([e].[NullableBoolA] <> [e].[BoolB]) OR [e].[NullableBoolA] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN ([e].[IntA] <> [e].[NullableIntB]) OR [e].[NullableIntB] IS NULL THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE CASE WHEN (([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) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END <> CASE WHEN (([e].[NullableIntA] <> [e].[NullableIntB]) OR ([e].[NullableIntA] IS NULL OR [e].[NullableIntB] IS NULL)) AND ([e].[NullableIntA] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL) THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END", Sql); } public override void Compare_nullable_with_null_parameter_equal() { base.Compare_nullable_with_null_parameter_equal(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] IS NULL", Sql); } public override void Compare_nullable_with_non_null_parameter_not_equal() { base.Compare_nullable_with_non_null_parameter_not_equal(); Assert.Equal( @"@__prm_0='Foo' (Size = 4000) SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] = @__prm_0", Sql); } public override void Join_uses_database_semantics() { base.Join_uses_database_semantics(); Assert.Equal( @"SELECT [e1].[Id] AS [Id1], [e2].[Id] AS [Id2], [e1].[NullableIntA], [e2].[NullableIntB] FROM [NullSemanticsEntity1] AS [e1] INNER JOIN [NullSemanticsEntity2] AS [e2] ON [e1].[NullableIntA] = [e2].[NullableIntB]", Sql); } public override void Contains_with_local_array_closure_with_null() { base.Contains_with_local_array_closure_with_null(); AssertSql( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableStringA] IN (N'Foo') OR [e].[NullableStringA] IS NULL)"); } public override void Contains_with_local_array_closure_false_with_null() { base.Contains_with_local_array_closure_false_with_null(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] NOT IN (N'Foo') AND [e].[NullableStringA] IS NOT NULL", Sql); } public override void Contains_with_local_array_closure_with_multiple_nulls() { base.Contains_with_local_array_closure_with_multiple_nulls(); AssertSql( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableStringA] IN (N'Foo') OR [e].[NullableStringA] IS NULL)"); } public override void Where_multiple_ors_with_null() { base.Where_multiple_ors_with_null(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] IN (N'Foo', N'Blah') OR [e].[NullableStringA] IS NULL", Sql); } public override void Where_multiple_ands_with_null() { base.Where_multiple_ands_with_null(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] NOT IN (N'Foo', N'Blah') AND [e].[NullableStringA] IS NOT NULL", Sql); } public override void Where_multiple_ors_with_nullable_parameter() { base.Where_multiple_ors_with_nullable_parameter(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableStringA] IN (N'Foo') OR [e].[NullableStringA] IS NULL)", Sql); } public override void Where_multiple_ands_with_nullable_parameter_and_constant() { base.Where_multiple_ands_with_nullable_parameter_and_constant(); Assert.Equal( @"@__prm3_2='Blah' SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] NOT IN (N'Foo', @__prm3_2) AND [e].[NullableStringA] IS NOT NULL", Sql); } public override void Where_multiple_ands_with_nullable_parameter_and_constant_not_optimized() { base.Where_multiple_ands_with_nullable_parameter_and_constant_not_optimized(); Assert.Equal( @"@__prm3_2='Blah' (Size = 4000) SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ((([e].[NullableStringB] IS NOT NULL AND (([e].[NullableStringA] <> N'Foo') OR [e].[NullableStringA] IS NULL)) AND [e].[NullableStringA] IS NOT NULL) AND [e].[NullableStringA] IS NOT NULL) AND (([e].[NullableStringA] <> @__prm3_2) OR [e].[NullableStringA] IS NULL)", Sql); } public override void Where_equal_nullable_with_null_value_parameter() { base.Where_equal_nullable_with_null_value_parameter(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] IS NULL", Sql); } public override void Where_not_equal_nullable_with_null_value_parameter() { base.Where_not_equal_nullable_with_null_value_parameter(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableStringA] IS NOT NULL", Sql); } public override void Where_equal_with_coalesce() { base.Where_equal_with_coalesce(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (COALESCE([e].[NullableStringA], [e].[NullableStringB]) = [e].[NullableStringC]) OR (([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) AND [e].[NullableStringC] IS NULL)", Sql); } public override void Where_not_equal_with_coalesce() { base.Where_not_equal_with_coalesce(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ((COALESCE([e].[NullableStringA], [e].[NullableStringB]) <> [e].[NullableStringC]) OR (([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) OR [e].[NullableStringC] IS NULL)) AND (([e].[NullableStringA] IS NOT NULL OR [e].[NullableStringB] IS NOT NULL) OR [e].[NullableStringC] IS NOT NULL)", Sql); } public override void Where_equal_with_coalesce_both_sides() { base.Where_equal_with_coalesce_both_sides(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE COALESCE([e].[NullableStringA], [e].[NullableStringB]) = COALESCE([e].[StringA], [e].[StringB])", Sql); } public override void Where_not_equal_with_coalesce_both_sides() { base.Where_not_equal_with_coalesce_both_sides(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ((COALESCE([e].[NullableIntA], [e].[NullableIntB]) <> COALESCE([e].[NullableIntC], [e].[NullableIntB])) OR (([e].[NullableIntA] IS NULL AND [e].[NullableIntB] IS NULL) OR ([e].[NullableIntC] IS NULL AND [e].[NullableIntB] IS NULL))) AND (([e].[NullableIntA] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL) OR ([e].[NullableIntC] IS NOT NULL OR [e].[NullableIntB] IS NOT NULL))", Sql); } public override void Where_equal_with_conditional() { base.Where_equal_with_conditional(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (CASE WHEN ([e].[NullableStringA] = [e].[NullableStringB]) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA] ELSE [e].[NullableStringB] END = [e].[NullableStringC]) OR (CASE WHEN ([e].[NullableStringA] = [e].[NullableStringB]) OR ([e].[NullableStringA] IS NULL AND [e].[NullableStringB] IS NULL) THEN [e].[NullableStringA] ELSE [e].[NullableStringB] END IS NULL AND [e].[NullableStringC] IS NULL)", Sql); } public override void Where_not_equal_with_conditional() { base.Where_not_equal_with_conditional(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE (([e].[NullableStringC] <> CASE WHEN (([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) THEN [e].[NullableStringA] ELSE [e].[NullableStringB] END) OR ([e].[NullableStringC] IS NULL OR CASE WHEN (([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) THEN [e].[NullableStringA] ELSE [e].[NullableStringB] END IS NULL)) AND ([e].[NullableStringC] IS NOT NULL OR CASE WHEN (([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) THEN [e].[NullableStringA] ELSE [e].[NullableStringB] END IS NOT NULL)", Sql); } public override void Where_equal_with_conditional_non_nullable() { base.Where_equal_with_conditional_non_nullable(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableStringC] <> CASE WHEN (([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) THEN [e].[StringA] ELSE [e].[StringB] END) OR [e].[NullableStringC] IS NULL", Sql); } public override void Where_equal_with_and_and_contains() { base.Where_equal_with_and_and_contains(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ((CHARINDEX([e].[NullableStringB], [e].[NullableStringA]) > 0) OR ([e].[NullableStringB] = N'')) AND ([e].[BoolA] = 1)", Sql); } public override void Where_equal_using_relational_null_semantics() { base.Where_equal_using_relational_null_semantics(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[NullableBoolB]", Sql); } public override void Where_equal_using_relational_null_semantics_with_parameter() { base.Where_equal_using_relational_null_semantics_with_parameter(); Assert.Equal( @"@__prm_0='' (DbType = Boolean) SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = @__prm_0", Sql); } public override void Where_equal_using_relational_null_semantics_complex_with_parameter() { base.Where_equal_using_relational_null_semantics_complex_with_parameter(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[NullableBoolB]", Sql); } public override void Where_not_equal_using_relational_null_semantics() { base.Where_not_equal_using_relational_null_semantics(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] <> [e].[NullableBoolB]", Sql); } public override void Where_not_equal_using_relational_null_semantics_with_parameter() { base.Where_not_equal_using_relational_null_semantics_with_parameter(); Assert.Equal( @"@__prm_0='' (DbType = Boolean) SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] <> @__prm_0", Sql); } public override void Where_not_equal_using_relational_null_semantics_complex_with_parameter() { base.Where_not_equal_using_relational_null_semantics_complex_with_parameter(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] <> [e].[NullableBoolB]", Sql); } public override void Switching_null_semantics_produces_different_cache_entry() { base.Switching_null_semantics_produces_different_cache_entry(); Assert.Equal( @"SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE ([e].[NullableBoolA] = [e].[NullableBoolB]) OR ([e].[NullableBoolA] IS NULL AND [e].[NullableBoolB] IS NULL) SELECT [e].[Id] FROM [NullSemanticsEntity1] AS [e] WHERE [e].[NullableBoolA] = [e].[NullableBoolB]", Sql); } private void AssertSql(params string[] expected) { string[] expectedFixed = new string[expected.Length]; int i = 0; foreach (var item in expected) { expectedFixed[i++] = item.Replace("\r\n", "\n"); } Fixture.TestSqlLoggerFactory.AssertBaseline(expectedFixed); } protected override void ClearLog() => Fixture.TestSqlLoggerFactory.Clear(); private string Sql { get { return Fixture.TestSqlLoggerFactory.Sql; } } } }