diff --git a/Dependencies.targets b/Dependencies.targets index 0e751f3c..e9546bc2 100644 --- a/Dependencies.targets +++ b/Dependencies.targets @@ -1,8 +1,8 @@ - [9.0.0,9.0.999] - [9.0.0,9.0.999] - [9.0.0,9.0.999] + [9.0.4,9.0.999] + [9.0.4,9.0.999] + [9.0.4,9.0.999] @@ -28,17 +28,17 @@ - - - - + + + + - - - - + + + + diff --git a/Directory.Build.props b/Directory.Build.props index c6adf6c7..a0ee38dc 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -8,7 +8,7 @@ CirrusRed Copyright © 2017-$([System.DateTime]::Now.Year) CirrusRed True - 12.0 + 13.0 enable portable False diff --git a/Version.props b/Version.props index 742d7309..4d35e9f9 100644 --- a/Version.props +++ b/Version.props @@ -16,8 +16,8 @@ correctly. --> 9.0.0 - beta - 1 + rtm + 0 $(DefineConstants);FIXED_TEST_ORDER diff --git a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs index c8c2c082..5c41619f 100644 --- a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsInfrastructureJetTest.cs @@ -1,9 +1,5 @@ // 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.Data.Common; -using System.Threading.Tasks; using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using EntityFrameworkCore.Jet.Metadata; using Identity30.Data; @@ -15,7 +11,12 @@ using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.TestModels.AspNetIdentity; using Microsoft.EntityFrameworkCore.TestUtilities; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Threading.Tasks; using Xunit; +using static Microsoft.EntityFrameworkCore.Migrations.MigrationsInfrastructureFixtureBase; using JetDatabaseCreator = EntityFrameworkCore.Jet.Storage.Internal.JetDatabaseCreator; // ReSharper disable InconsistentNaming @@ -28,9 +29,9 @@ public class MigrationsInfrastructureJetTest( MigrationsInfrastructureJetTest.MigrationsInfrastructureJetFixture fixture) : MigrationsInfrastructureTestBase(fixture) { - public override void Can_generate_migration_from_initial_database_to_initial() + public override async Task Can_generate_migration_from_initial_database_to_initial() { - base.Can_generate_migration_from_initial_database_to_initial(); + await base.Can_generate_migration_from_initial_database_to_initial(); Assert.Equal( """ @@ -47,9 +48,9 @@ IF NOT EXISTS (SELECT * FROM `INFORMATION_SCHEMA.TABLES` WHERE `TABLE_NAME` = '_ ignoreLineEndingDifferences: true); } - public override void Can_generate_no_migration_script() + public override async Task Can_generate_no_migration_script() { - base.Can_generate_no_migration_script(); + await base.Can_generate_no_migration_script(); Assert.Equal( """ @@ -553,12 +554,136 @@ public override void Can_get_active_provider() Assert.Equal("EntityFrameworkCore.Jet", ActiveProvider); } + [ConditionalFact] + public void Throws_when_no_migrations() + { + using var context = new DbContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false) + .ConfigureWarnings(e => e.Throw(RelationalEventId.MigrationsNotFound))).Options); + + context.Database.EnsureDeleted(); + GiveMeSomeTime(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.MigrationsNotFound.ToString(), + RelationalResources.LogNoMigrationsFound(new TestLogger()) + .GenerateMessage(typeof(DbContext).Assembly.GetName().Name), + "RelationalEventId.MigrationsNotFound"), + (Assert.Throws(context.Database.Migrate)).Message); + } + + [ConditionalFact] + public async Task Throws_when_no_migrations_async() + { + using var context = new DbContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false) + .ConfigureWarnings(e => e.Throw(RelationalEventId.MigrationsNotFound))).Options); + + await context.Database.EnsureDeletedAsync(); + await GiveMeSomeTimeAsync(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.MigrationsNotFound.ToString(), + RelationalResources.LogNoMigrationsFound(new TestLogger()) + .GenerateMessage(typeof(DbContext).Assembly.GetName().Name), + "RelationalEventId.MigrationsNotFound"), + (await Assert.ThrowsAsync(() => context.Database.MigrateAsync())).Message); + } + + [ConditionalFact] + public void Throws_when_no_snapshot() + { + using var context = new MigrationsContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false) + .ConfigureWarnings(e => e.Throw(RelationalEventId.ModelSnapshotNotFound))).Options); + + context.Database.EnsureDeleted(); + GiveMeSomeTime(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.ModelSnapshotNotFound.ToString(), + RelationalResources.LogNoModelSnapshotFound(new TestLogger()) + .GenerateMessage(typeof(MigrationsContext).Assembly.GetName().Name), + "RelationalEventId.ModelSnapshotNotFound"), + (Assert.Throws(context.Database.Migrate)).Message); + } + + [ConditionalFact] + public async Task Throws_when_no_snapshot_async() + { + using var context = new MigrationsContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false) + .ConfigureWarnings(e => e.Throw(RelationalEventId.ModelSnapshotNotFound))).Options); + + await context.Database.EnsureDeletedAsync(); + await GiveMeSomeTimeAsync(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.ModelSnapshotNotFound.ToString(), + RelationalResources.LogNoModelSnapshotFound(new TestLogger()) + .GenerateMessage(typeof(MigrationsContext).Assembly.GetName().Name), + "RelationalEventId.ModelSnapshotNotFound"), + (await Assert.ThrowsAsync(() => context.Database.MigrateAsync())).Message); + } + + [ConditionalFact] + public void Throws_for_nondeterministic_HasData() + { + using var context = new BloggingContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options, + randomData: true); + + context.Database.EnsureDeleted(); + GiveMeSomeTime(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.PendingModelChangesWarning.ToString(), + RelationalResources.LogNonDeterministicModel(new TestLogger()) + .GenerateMessage(nameof(BloggingContext)), + "RelationalEventId.PendingModelChangesWarning"), + (Assert.Throws(context.Database.Migrate)).Message); + } + + [ConditionalFact] + public async Task Throws_for_nondeterministic_HasData_async() + { + using var context = new BloggingContext( + Fixture.TestStore.AddProviderOptions( + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options, + randomData: true); + + await context.Database.EnsureDeletedAsync(); + await GiveMeSomeTimeAsync(context); + + Assert.Equal( + CoreStrings.WarningAsErrorTemplate( + RelationalEventId.PendingModelChangesWarning.ToString(), + RelationalResources.LogNonDeterministicModel(new TestLogger()) + .GenerateMessage(nameof(BloggingContext)), + "RelationalEventId.PendingModelChangesWarning"), + (await Assert.ThrowsAsync(() => context.Database.MigrateAsync())).Message); + } + [ConditionalFact] public void Throws_for_pending_model_changes() { using var context = new BloggingContext( Fixture.TestStore.AddProviderOptions( - new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options); + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options, + randomData: false); + + context.Database.EnsureDeleted(); + GiveMeSomeTime(context); Assert.Equal( CoreStrings.WarningAsErrorTemplate( @@ -574,7 +699,11 @@ public async Task Throws_for_pending_model_changes_async() { using var context = new BloggingContext( Fixture.TestStore.AddProviderOptions( - new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options); + new DbContextOptionsBuilder().EnableServiceProviderCaching(false)).Options, + randomData: false); + + await context.Database.EnsureDeletedAsync(); + await GiveMeSomeTimeAsync(context); Assert.Equal( CoreStrings.WarningAsErrorTemplate( @@ -634,7 +763,7 @@ 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) + private class BloggingContext(DbContextOptions options, bool? randomData = null) : DbContext(options) { // ReSharper disable once UnusedMember.Local public DbSet Blogs { get; set; } @@ -648,6 +777,46 @@ public class Blog public string Name { get; set; } // ReSharper restore UnusedMember.Local } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + if (randomData != null) + { + modelBuilder.Entity().HasData( + new Blog { Id = randomData.Value ? (int)new Random().NextInt64(int.MaxValue) : 1, Name = "HalfADonkey" }); + } + } + } + + [DbContext(typeof(BloggingContext))] + partial class BloggingContextSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + JetModelBuilderExtensions.UseJetIdentityColumns(modelBuilder); + + modelBuilder.Entity("Microsoft.EntityFrameworkCore.Migrations.MigrationsInfrastructureJetTest+BloggingContext+Blog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + JetPropertyBuilderExtensions.UseJetIdentityColumn(b.Property("Id")); + + b.Property("Name") + .HasColumnType("nvarchar(255)"); + + b.HasKey("Id"); + + b.ToTable("Blogs"); + }); +#pragma warning restore 612, 618 + } } [DbContext(typeof(BloggingContext))] diff --git a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsJetTest.cs b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsJetTest.cs index 3c5d689f..9d892be0 100644 --- a/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Migrations/MigrationsJetTest.cs @@ -247,15 +247,15 @@ public override async Task Rename_table() AssertSql( """ -ALTER TABLE [People] DROP CONSTRAINT [PK_People]; +ALTER TABLE `People` DROP CONSTRAINT `PK_People`; """, // """ -EXEC sp_rename '[People]', 'Persons', 'OBJECT'; +ALTER TABLE `People` RENAME TO `Persons`; """, // """ -ALTER TABLE [Persons] ADD CONSTRAINT [PK_Persons] PRIMARY KEY ([Id]); +ALTER TABLE `Persons` ADD CONSTRAINT `PK_Persons` PRIMARY KEY (`Id`); """); } @@ -265,15 +265,15 @@ public override async Task Rename_table_with_primary_key() AssertSql( """ -ALTER TABLE [People] DROP CONSTRAINT [PK_People]; +ALTER TABLE `People` DROP CONSTRAINT `PK_People`; """, // """ -EXEC sp_rename '[People]', N'Persons', 'OBJECT'; +ALTER TABLE `People` RENAME TO `Persons`; """, // """ -ALTER TABLE [Persons] ADD CONSTRAINT [PK_Persons] PRIMARY KEY ([Id]); +ALTER TABLE `Persons` ADD CONSTRAINT `PK_Persons` PRIMARY KEY (`Id`); """); } @@ -283,15 +283,15 @@ public override async Task Rename_table_with_json_column() AssertSql( """ -ALTER TABLE [Entities] DROP CONSTRAINT [PK_Entities]; +ALTER TABLE `Entities` DROP CONSTRAINT `PK_Entities`; """, // """ -EXEC sp_rename N'[Entities]', N'NewEntities', 'OBJECT'; +ALTER TABLE `Entities` RENAME TO `NewEntities`; """, // """ -ALTER TABLE [NewEntities] ADD CONSTRAINT [PK_NewEntities] PRIMARY KEY ([Id]); +ALTER TABLE `NewEntities` ADD CONSTRAINT `PK_NewEntities` PRIMARY KEY (`Id`); """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/AdHocMiscellaneousQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/AdHocMiscellaneousQueryJetTest.cs index 343733ff..3e5cc138 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/AdHocMiscellaneousQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/AdHocMiscellaneousQueryJetTest.cs @@ -431,9 +431,9 @@ public async Task Where_equals_DateTime_Now(bool async) AssertSql( """ -SELECT [d].[Id], [d].[DateTime], [d].[DateTime2], [d].[DateTime2_0], [d].[DateTime2_1], [d].[DateTime2_2], [d].[DateTime2_3], [d].[DateTime2_4], [d].[DateTime2_5], [d].[DateTime2_6], [d].[DateTime2_7], [d].[SmallDateTime] -FROM [Dates] AS [d] -WHERE [d].[DateTime2_2] = GETDATE() OR [d].[DateTime2_7] = GETDATE() OR [d].[DateTime] = GETDATE() OR [d].[SmallDateTime] = GETDATE() +SELECT `d`.`Id`, `d`.`DateTime`, `d`.`DateTime2`, `d`.`DateTime2_0`, `d`.`DateTime2_1`, `d`.`DateTime2_2`, `d`.`DateTime2_3`, `d`.`DateTime2_4`, `d`.`DateTime2_5`, `d`.`DateTime2_6`, `d`.`DateTime2_7`, `d`.`SmallDateTime` +FROM `Dates` AS `d` +WHERE `d`.`DateTime2_2` = NOW() OR `d`.`DateTime2_7` = NOW() OR `d`.`DateTime` = NOW() OR `d`.`SmallDateTime` = NOW() """); } @@ -459,9 +459,9 @@ public async Task Where_not_equals_DateTime_Now(bool async) AssertSql( """ -SELECT [d].[Id], [d].[DateTime], [d].[DateTime2], [d].[DateTime2_0], [d].[DateTime2_1], [d].[DateTime2_2], [d].[DateTime2_3], [d].[DateTime2_4], [d].[DateTime2_5], [d].[DateTime2_6], [d].[DateTime2_7], [d].[SmallDateTime] -FROM [Dates] AS [d] -WHERE [d].[DateTime2_2] <> GETDATE() AND [d].[DateTime2_7] <> GETDATE() AND [d].[DateTime] <> GETDATE() AND [d].[SmallDateTime] <> GETDATE() +SELECT `d`.`Id`, `d`.`DateTime`, `d`.`DateTime2`, `d`.`DateTime2_0`, `d`.`DateTime2_1`, `d`.`DateTime2_2`, `d`.`DateTime2_3`, `d`.`DateTime2_4`, `d`.`DateTime2_5`, `d`.`DateTime2_6`, `d`.`DateTime2_7`, `d`.`SmallDateTime` +FROM `Dates` AS `d` +WHERE `d`.`DateTime2_2` <> NOW() AND `d`.`DateTime2_7` <> NOW() AND `d`.`DateTime` <> NOW() AND `d`.`SmallDateTime` <> NOW() """); } @@ -494,9 +494,9 @@ public async Task Where_equals_new_DateTime(bool async) AssertSql( """ -SELECT [d].[Id], [d].[DateTime], [d].[DateTime2], [d].[DateTime2_0], [d].[DateTime2_1], [d].[DateTime2_2], [d].[DateTime2_3], [d].[DateTime2_4], [d].[DateTime2_5], [d].[DateTime2_6], [d].[DateTime2_7], [d].[SmallDateTime] -FROM [Dates] AS [d] -WHERE [d].[SmallDateTime] = '1970-09-03T12:00:00' AND [d].[DateTime] = '1971-09-03T12:00:10.220' AND [d].[DateTime2] = '1972-09-03T12:00:10.3330000' AND [d].[DateTime2_0] = '1973-09-03T12:00:10' AND [d].[DateTime2_1] = '1974-09-03T12:00:10.5' AND [d].[DateTime2_2] = '1975-09-03T12:00:10.66' AND [d].[DateTime2_3] = '1976-09-03T12:00:10.777' AND [d].[DateTime2_4] = '1977-09-03T12:00:10.8880' AND [d].[DateTime2_5] = '1978-09-03T12:00:10.99900' AND [d].[DateTime2_6] = '1979-09-03T12:00:10.111000' AND [d].[DateTime2_7] = '1980-09-03T12:00:10.2220000' +SELECT `d`.`Id`, `d`.`DateTime`, `d`.`DateTime2`, `d`.`DateTime2_0`, `d`.`DateTime2_1`, `d`.`DateTime2_2`, `d`.`DateTime2_3`, `d`.`DateTime2_4`, `d`.`DateTime2_5`, `d`.`DateTime2_6`, `d`.`DateTime2_7`, `d`.`SmallDateTime` +FROM `Dates` AS `d` +WHERE `d`.`SmallDateTime` = #1970-09-03 12:00:00# AND `d`.`DateTime` = #1971-09-03 12:00:10# AND `d`.`DateTime2` = #1972-09-03 12:00:10# AND `d`.`DateTime2_0` = #1973-09-03 12:00:10# AND `d`.`DateTime2_1` = #1974-09-03 12:00:10# AND `d`.`DateTime2_2` = #1975-09-03 12:00:10# AND `d`.`DateTime2_3` = #1976-09-03 12:00:10# AND `d`.`DateTime2_4` = #1977-09-03 12:00:10# AND `d`.`DateTime2_5` = #1978-09-03 12:00:10# AND `d`.`DateTime2_6` = #1979-09-03 12:00:10# AND `d`.`DateTime2_7` = #1980-09-03 12:00:10# """); } @@ -544,55 +544,10 @@ public async Task Where_contains_DateTime_literals(bool async) AssertSql( """ -@__dateTimes_0='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_1='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_2='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_3='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_4='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_5='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_6='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_7='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_8='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_9='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) -@__dateTimes_0_10='["1970-09-03T12:00:00","1971-09-03T12:00:10.22","1972-09-03T12:00:10.333","1973-09-03T12:00:10","1974-09-03T12:00:10.5","1975-09-03T12:00:10.66","1976-09-03T12:00:10.777","1977-09-03T12:00:10.888","1978-09-03T12:00:10.999","1979-09-03T12:00:10.111","1980-09-03T12:00:10.222"]' (Size = 4000) - -SELECT [d].[Id], [d].[DateTime], [d].[DateTime2], [d].[DateTime2_0], [d].[DateTime2_1], [d].[DateTime2_2], [d].[DateTime2_3], [d].[DateTime2_4], [d].[DateTime2_5], [d].[DateTime2_6], [d].[DateTime2_7], [d].[SmallDateTime] -FROM [Dates] AS [d] -WHERE [d].[SmallDateTime] IN ( - SELECT [d0].[value] - FROM OPENJSON(@__dateTimes_0) WITH ([value] smalldatetime '$') AS [d0] -) AND [d].[DateTime] IN ( - SELECT [d1].[value] - FROM OPENJSON(@__dateTimes_0_1) WITH ([value] datetime '$') AS [d1] -) AND [d].[DateTime2] IN ( - SELECT [d2].[value] - FROM OPENJSON(@__dateTimes_0_2) WITH ([value] datetime2 '$') AS [d2] -) AND [d].[DateTime2_0] IN ( - SELECT [d3].[value] - FROM OPENJSON(@__dateTimes_0_3) WITH ([value] datetime2(0) '$') AS [d3] -) AND [d].[DateTime2_1] IN ( - SELECT [d4].[value] - FROM OPENJSON(@__dateTimes_0_4) WITH ([value] datetime2(1) '$') AS [d4] -) AND [d].[DateTime2_2] IN ( - SELECT [d5].[value] - FROM OPENJSON(@__dateTimes_0_5) WITH ([value] datetime2(2) '$') AS [d5] -) AND [d].[DateTime2_3] IN ( - SELECT [d6].[value] - FROM OPENJSON(@__dateTimes_0_6) WITH ([value] datetime2(3) '$') AS [d6] -) AND [d].[DateTime2_4] IN ( - SELECT [d7].[value] - FROM OPENJSON(@__dateTimes_0_7) WITH ([value] datetime2(4) '$') AS [d7] -) AND [d].[DateTime2_5] IN ( - SELECT [d8].[value] - FROM OPENJSON(@__dateTimes_0_8) WITH ([value] datetime2(5) '$') AS [d8] -) AND [d].[DateTime2_6] IN ( - SELECT [d9].[value] - FROM OPENJSON(@__dateTimes_0_9) WITH ([value] datetime2(6) '$') AS [d9] -) AND [d].[DateTime2_7] IN ( - SELECT [d10].[value] - FROM OPENJSON(@__dateTimes_0_10) WITH ([value] datetime2(7) '$') AS [d10] -) -"""); + SELECT `d`.`Id`, `d`.`DateTime`, `d`.`DateTime2`, `d`.`DateTime2_0`, `d`.`DateTime2_1`, `d`.`DateTime2_2`, `d`.`DateTime2_3`, `d`.`DateTime2_4`, `d`.`DateTime2_5`, `d`.`DateTime2_6`, `d`.`DateTime2_7`, `d`.`SmallDateTime` + FROM `Dates` AS `d` + WHERE `d`.`SmallDateTime` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_0` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_1` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_2` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_3` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_4` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_5` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_6` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) AND `d`.`DateTime2_7` IN (#1970-09-03 12:00:00#, #1971-09-03 12:00:10#, #1972-09-03 12:00:10#, #1973-09-03 12:00:10#, #1974-09-03 12:00:10#, #1975-09-03 12:00:10#, #1976-09-03 12:00:10#, #1977-09-03 12:00:10#, #1978-09-03 12:00:10#, #1979-09-03 12:00:10#, #1980-09-03 12:00:10#) + """); } protected class Context14095(DbContextOptions options) : DbContext(options) diff --git a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs index 0466fa7e..9a5368a8 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/GearsOfWarQueryJetTest.cs @@ -4952,6 +4952,7 @@ ORDER BY `g`.`FullName` DESC public override async Task Null_semantics_on_nullable_bool_from_inner_join_subquery_is_fully_applied(bool isAsync) { await base.Null_semantics_on_nullable_bool_from_inner_join_subquery_is_fully_applied(isAsync); + AssertSql( """ SELECT `f0`.`Id`, `f0`.`CapitalName`, `f0`.`Discriminator`, `f0`.`Name`, `f0`.`ServerAddress`, `f0`.`CommanderName`, `f0`.`Eradicated` @@ -4961,7 +4962,7 @@ INNER JOIN ( FROM `Factions` AS `f` WHERE `f`.`Name` = 'Swarm' ) AS `f0` ON `l`.`Name` = `f0`.`CommanderName` -WHERE `f0`.`Eradicated` = FALSE OR `f0`.`Eradicated` IS NULL +WHERE `f0`.`Eradicated` <> TRUE OR `f0`.`Eradicated` IS NULL """); } @@ -4978,7 +4979,7 @@ LEFT JOIN ( FROM `Factions` AS `f` WHERE `f`.`Name` = 'Swarm' ) AS `f0` ON `l`.`Name` = `f0`.`CommanderName` -WHERE `f0`.`Eradicated` = FALSE OR `f0`.`Eradicated` IS NULL +WHERE `f0`.`Eradicated` <> TRUE OR `f0`.`Eradicated` IS NULL """); } @@ -7478,7 +7479,7 @@ public override async Task Join_inner_source_custom_projection_followed_by_filte SELECT IIF(`f`.`Name` = 'Locust', TRUE, NULL) AS `IsEradicated`, `f`.`CommanderName`, `f`.`Name` FROM `LocustLeaders` AS `l` INNER JOIN `Factions` AS `f` ON `l`.`Name` = `f`.`CommanderName` -WHERE IIF(`f`.`Name` = 'Locust', TRUE, NULL) = FALSE OR IIF(`f`.`Name` = 'Locust', TRUE, NULL) IS NULL +WHERE IIF(`f`.`Name` = 'Locust', TRUE, NULL) <> TRUE OR IIF(`f`.`Name` = 'Locust', TRUE, NULL) IS NULL """); } @@ -8080,6 +8081,20 @@ public override async Task Enum_array_contains(bool async) """); } + public override async Task Coalesce_with_non_root_evaluatable_Convert(bool async) + { + await base.Coalesce_with_non_root_evaluatable_Convert(async); + + AssertSql( + """ +@__rank_0='1' (Nullable = true) + +SELECT `g`.`Nickname`, `g`.`SquadId`, `g`.`AssignedCityName`, `g`.`CityOfBirthName`, `g`.`Discriminator`, `g`.`FullName`, `g`.`HasSoulPatch`, `g`.`LeaderNickname`, `g`.`LeaderSquadId`, `g`.`Rank` +FROM `Gears` AS `g` +WHERE @__rank_0 = `g`.`Rank` +"""); + } + /*`ConditionalTheory` `MemberData(nameof(IsAsyncData))` public async Task DataLength_function_for_string_parameter(bool async) @@ -9155,15 +9170,21 @@ public override async Task Where_DateOnly_FromDateTime_compared_to_property(bool public override async Task Where_DateOnly_FromDateTime_compared_to_constant_and_parameter(bool async) { - await base.Where_DateOnly_FromDateTime_compared_to_constant_and_parameter(async); + //await base.Where_DateOnly_FromDateTime_compared_to_constant_and_parameter(async); + + var prm = new DateOnly(102, 10, 11); + + await AssertQuery( + async, + ss => ss.Set().Where(x => new[] { prm, new DateOnly(115, 3, 7) }.Contains(DateOnly.FromDateTime(x.IssueDate)))); AssertSql( - """ -@__prm_0='10/11/0002' (DbType = Date) + $""" +@__prm_0='0102-10-11T00:00:00.0000000' (DbType = Date) -SELECT [t].[Id], [t].[GearNickName], [t].[GearSquadId], [t].[IssueDate], [t].[Note] -FROM [Tags] AS [t] -WHERE CAST([t].[IssueDate] AS date) IN (@__prm_0, '0015-03-07') +SELECT `t`.`Id`, `t`.`GearNickName`, `t`.`GearSquadId`, `t`.`IssueDate`, `t`.`Note` +FROM `Tags` AS `t` +WHERE `t`.`IssueDate` IN ({AssertSqlHelper.Parameter("@__prm_0")}, #0115-03-07#) """); } @@ -9190,6 +9211,20 @@ public override async Task Comparison_with_value_converted_subclass(bool async) """); } + public override async Task Project_equality_with_value_converted_property(bool async) + { + await base.Project_equality_with_value_converted_property(async); + + AssertSql( + """ +SELECT CASE + WHEN [m].[Difficulty] = N'Unknown' THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END +FROM [Missions] AS [m] +"""); + } + public override async Task Contains_on_readonly_enumerable(bool async) { await base.Contains_on_readonly_enumerable(async); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs index 7ae55fde..2df01d64 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindJoinQueryJetTest.cs @@ -977,6 +977,22 @@ ORDER BY [o].[OrderID] """); } + public override async Task GroupJoin_on_true_equal_true(bool async) + { + await base.GroupJoin_on_true_equal_true(async); + + AssertSql( + """ +SELECT [c].[CustomerID], [o0].[OrderID], [o0].[CustomerID], [o0].[EmployeeID], [o0].[OrderDate] +FROM [Customers] AS [c] +OUTER APPLY ( + SELECT [o].[OrderID], [o].[CustomerID], [o].[EmployeeID], [o].[OrderDate] + FROM [Orders] AS [o] +) AS [o0] +ORDER BY [c].[CustomerID] +"""); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs index 0a634a02..b8f6d7fa 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindMiscellaneousQueryJetTest.cs @@ -7405,6 +7405,32 @@ SELECT TOP 1 `o`.`OrderID` """); } + public override async Task Column_access_inside_subquery_predicate(bool async) + { + await base.Column_access_inside_subquery_predicate(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` = 'ALFKI') +"""); + } + + public override async Task Cast_to_object_over_parameter_directly_in_lambda(bool async) + { + await base.Cast_to_object_over_parameter_directly_in_lambda(async); + + AssertSql( + """ +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +"""); + } + private void AssertSql(params string[] expected) => Fixture.TestSqlLoggerFactory.AssertBaseline(expected.Select(s => s.Trim()).ToArray()); diff --git a/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs index a5bbea0a..a38964ad 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NorthwindWhereQueryJetTest.cs @@ -3371,6 +3371,20 @@ public override async Task Interface_casting_though_generic_method(bool async) """); } + public override async Task Simplifiable_coalesce_over_nullable(bool async) + { + await base.Simplifiable_coalesce_over_nullable(async); + + AssertSql( + $""" +@__p_0='10248' + +SELECT `o`.`OrderID`, `o`.`CustomerID`, `o`.`EmployeeID`, `o`.`OrderDate` +FROM `Orders` AS `o` +WHERE `o`.`OrderID` = {AssertSqlHelper.Parameter("@__p_0")} +"""); + } + #region Evaluation order of predicates public override async Task Take_and_Where_evaluation_order(bool async) diff --git a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs index d5c037b9..82f4f7f0 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/NullSemanticsQueryJetTest.cs @@ -208,7 +208,7 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) await base.Rewrite_compare_bool_with_bool(async); AssertSql( - """ +""" SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` FROM `Entities1` AS `e` """, @@ -228,6 +228,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`BoolA` = `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = TRUE """, // """ @@ -250,6 +261,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = FALSE """, // """ @@ -272,6 +294,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`NullableBoolA` = `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = TRUE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = TRUE """, // """ @@ -294,6 +327,61 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> TRUE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(TRUE = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE = `e`.`NullableBoolB` """, // """ @@ -316,6 +404,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = FALSE """, // """ @@ -338,6 +437,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`BoolA` = `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = TRUE """, // """ @@ -360,6 +470,17 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) SELECT `e`.`Id` FROM `Entities1` AS `e` WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = FALSE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = FALSE """, // """ @@ -385,91 +506,91 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) """, // """ -SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> FALSE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`BoolB` +WHERE `e`.`NullableBoolA` <> FALSE """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +WHERE `e`.`BoolB` = FALSE """, // """ -SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +SELECT `e`.`Id`, IIF(TRUE <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`BoolB` +WHERE `e`.`NullableBoolB` = FALSE """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +WHERE `e`.`BoolB` = TRUE """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(FALSE <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE FALSE <> `e`.`NullableBoolB` """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`BoolA` <> `e`.`BoolB` """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`BoolA` = FALSE """, // """ @@ -495,25 +616,47 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) """, // """ -SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +SELECT `e`.`Id`, `e`.`BoolA` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`BoolB` +WHERE `e`.`BoolA` = TRUE """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +""", + // + """ +SELECT `e`.`Id`, 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) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` 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) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> TRUE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> TRUE OR `e`.`NullableBoolA` IS NULL """, // """ @@ -539,47 +682,58 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = TRUE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE `e`.`NullableBoolA` = TRUE OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`BoolB` = FALSE """, // """ -SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +SELECT `e`.`Id`, IIF(TRUE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`BoolB` +WHERE TRUE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ @@ -605,157 +759,157 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE `e`.`BoolA` = TRUE """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`BoolA` <> `e`.`BoolB` """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`BoolA` = FALSE """, // """ -SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`BoolB` +WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, 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) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +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) """, // """ -SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> FALSE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`BoolB` +WHERE `e`.`NullableBoolA` <> FALSE OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, 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) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +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) """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = FALSE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE `e`.`NullableBoolA` = FALSE OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +WHERE `e`.`BoolB` = TRUE """, // """ -SELECT `e`.`Id`, 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) AS `X` +SELECT `e`.`Id`, IIF(TRUE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` 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) +WHERE TRUE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`BoolB` +WHERE `e`.`BoolB` = FALSE """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(FALSE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`NullableBoolB` +WHERE FALSE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ @@ -770,146 +924,696 @@ public override async Task Rewrite_compare_bool_with_bool(bool async) """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`BoolB` +WHERE `e`.`BoolA` = FALSE """, // """ -SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +WHERE `e`.`BoolA` = `e`.`BoolB` """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` +WHERE `e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL """, // """ -SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolA` AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +WHERE `e`.`BoolA` = TRUE """, // """ -SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`BoolB` +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, 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) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +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) """, // """ -SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> TRUE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`BoolB` +WHERE `e`.`NullableBoolA` <> TRUE OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`BoolA` = `e`.`NullableBoolB` +WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, 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) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`BoolB` +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) """, // """ -SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = TRUE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +WHERE `e`.`NullableBoolA` = TRUE OR `e`.`NullableBoolA` IS NULL """, // """ -SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`BoolB` +WHERE `e`.`BoolB` = FALSE """, // """ -SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +SELECT `e`.`Id`, IIF(TRUE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` FROM `Entities1` AS `e` """, // """ SELECT `e`.`Id` FROM `Entities1` AS `e` -WHERE `e`.`NullableBoolA` = `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +WHERE TRUE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = TRUE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +""", + // + """ +SELECT `e`.`Id`, 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) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` 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) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> FALSE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> FALSE OR `e`.`NullableBoolA` IS NULL +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` OR `e`.`NullableBoolA` IS NULL +""", + // + """ +SELECT `e`.`Id`, 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) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` 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) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = FALSE OR `e`.`NullableBoolA` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = FALSE OR `e`.`NullableBoolA` IS NULL +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(TRUE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE TRUE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE = `e`.`NullableBoolB` OR `e`.`NullableBoolB` IS NULL +""", + // + """ +SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = TRUE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = TRUE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> TRUE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(TRUE = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE = `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` <> `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, (`e`.`BoolA` BXOR `e`.`BoolB`) BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`BoolA` = `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = `e`.`NullableBoolB` +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolA` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolA` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = FALSE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` = `e`.`BoolB` AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = `e`.`BoolB` +""", + // + """ +SELECT `e`.`Id`, IIF((`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), TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` = `e`.`NullableBoolB` OR (`e`.`NullableBoolA` IS NULL AND `e`.`NullableBoolB` IS NULL) +""", + // + """ +SELECT `e`.`Id`, IIF(`e`.`NullableBoolA` <> FALSE AND `e`.`NullableBoolA` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolA` <> FALSE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` BXOR TRUE AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = FALSE +""", + // + """ +SELECT `e`.`Id`, IIF(TRUE <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`NullableBoolB` = FALSE +""", + // + """ +SELECT `e`.`Id`, `e`.`BoolB` AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE `e`.`BoolB` = TRUE +""", + // + """ +SELECT `e`.`Id`, IIF(FALSE <> `e`.`NullableBoolB` AND `e`.`NullableBoolB` IS NOT NULL, TRUE, FALSE) AS `X` +FROM `Entities1` AS `e` +""", + // + """ +SELECT `e`.`Id` +FROM `Entities1` AS `e` +WHERE FALSE <> `e`.`NullableBoolB` """); } diff --git a/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs index de801c28..6866caaf 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/PrimitiveCollectionsQueryJetTest.cs @@ -544,6 +544,24 @@ public override async Task Parameter_collection_HashSet_of_ints_Contains_int(boo """); } + public override async Task Parameter_collection_ImmutableArray_of_ints_Contains_int(bool async) + { + await base.Parameter_collection_ImmutableArray_of_ints_Contains_int(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`.`Int` IN (10, 999) +""", + // + """ +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`.`Int` NOT IN (10, 999) +"""); + } + public override async Task Parameter_collection_of_ints_Contains_nullable_int(bool async) { await base.Parameter_collection_of_ints_Contains_nullable_int(async); diff --git a/test/EFCore.Jet.FunctionalTests/Query/SqlExecutorJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/SqlExecutorJetTest.cs index 1cca651c..dde04642 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/SqlExecutorJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/SqlExecutorJetTest.cs @@ -11,6 +11,7 @@ using Xunit.Abstractions; using Microsoft.EntityFrameworkCore; using Xunit; +using Microsoft.EntityFrameworkCore.TestModels.ConcurrencyModel; #nullable disable namespace EntityFrameworkCore.Jet.FunctionalTests.Query { @@ -264,6 +265,22 @@ public override async Task Query_with_DbParameters_interpolated_2(bool async) Assert.Equal(-1, actual); } + public override async Task Query_with_parameters_custom_converter(bool async) + { + var city = new City { Name = "London" }; + var contactTitle = "Sales Representative"; + + using var context = CreateContext(); + + var actual = async + ? await context.Database.ExecuteSqlAsync( + $@"SELECT COUNT(*) FROM `Customers` WHERE `City` = {city} AND `ContactTitle` = {contactTitle}") + : context.Database.ExecuteSql( + $@"SELECT COUNT(*) FROM `Customers` WHERE `City` = {city} AND `ContactTitle` = {contactTitle}"); + + Assert.Equal(-1, actual); + } + protected override string TenMostExpensiveProductsSproc => "EXEC `Ten Most Expensive Products`"; protected override string CustomerOrderHistorySproc => "EXEC `CustOrderHist` CustomerID"; protected override string CustomerOrderHistoryWithGeneratedParameterSproc => "EXEC `CustOrderHist` CustomerID = {0}"; diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs index c55f2518..0e8957fc 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPCGearsOfWarQueryJetTest.cs @@ -6757,7 +6757,7 @@ INNER JOIN ( FROM `LocustHordes` AS `l1` WHERE `l1`.`Name` = 'Swarm' ) AS `l2` ON `u`.`Name` = `l2`.`CommanderName` -WHERE `l2`.`Eradicated` = FALSE OR `l2`.`Eradicated` IS NULL +WHERE `l2`.`Eradicated` <> TRUE OR `l2`.`Eradicated` IS NULL """); } @@ -6780,7 +6780,7 @@ LEFT JOIN ( FROM `LocustHordes` AS `l1` WHERE `l1`.`Name` = 'Swarm' ) AS `l2` ON `u`.`Name` = `l2`.`CommanderName` -WHERE `l2`.`Eradicated` = FALSE OR `l2`.`Eradicated` IS NULL +WHERE `l2`.`Eradicated` <> TRUE OR `l2`.`Eradicated` IS NULL """); } @@ -10111,7 +10111,7 @@ UNION ALL FROM `LocustCommanders` AS `l0` ) AS `u` INNER JOIN `LocustHordes` AS `l1` ON `u`.`Name` = `l1`.`CommanderName` -WHERE IIF(`l1`.`Name` = 'Locust', TRUE, NULL) = FALSE OR IIF(`l1`.`Name` = 'Locust', TRUE, NULL) IS NULL +WHERE IIF(`l1`.`Name` = 'Locust', TRUE, NULL) <> TRUE OR IIF(`l1`.`Name` = 'Locust', TRUE, NULL) IS NULL """); } @@ -10899,6 +10899,26 @@ public override async Task Enum_array_contains(bool async) """); } + public override async Task Coalesce_with_non_root_evaluatable_Convert(bool async) + { + await base.Coalesce_with_non_root_evaluatable_Convert(async); + + AssertSql( + $""" +@__rank_0='1' (Nullable = true) + +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` + FROM `Gears` AS `g` + 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 {AssertSqlHelper.Parameter("@__rank_0")} = `u`.`Rank` +"""); + } + /*[ConditionalTheory] [MemberData(nameof(IsAsyncData))] public async Task DataLength_function_for_string_parameter(bool async) @@ -12290,6 +12310,20 @@ public override async Task Comparison_with_value_converted_subclass(bool async) """); } + public override async Task Project_equality_with_value_converted_property(bool async) + { + await base.Project_equality_with_value_converted_property(async); + + AssertSql( + """ +SELECT CASE + WHEN [m].[Difficulty] = N'Unknown' THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END +FROM [Missions] AS [m] +"""); + } + public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_subquery(bool async) { //await base.FirstOrDefault_on_empty_collection_of_DateTime_in_subquery(async); diff --git a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs index d806ebcd..6de41caa 100644 --- a/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs +++ b/test/EFCore.Jet.FunctionalTests/Query/TPTGearsOfWarQueryJetTest.cs @@ -5393,7 +5393,7 @@ INNER JOIN ( LEFT JOIN `LocustHordes` AS `l0` ON `f`.`Id` = `l0`.`Id` WHERE `l0`.`Id` IS NOT NULL AND `f`.`Name` = 'Swarm' ) AS `s` ON `l`.`Name` = `s`.`CommanderName` -WHERE `s`.`Eradicated` = FALSE OR `s`.`Eradicated` IS NULL +WHERE `s`.`Eradicated` <> TRUE OR `s`.`Eradicated` IS NULL """); } @@ -5411,7 +5411,7 @@ LEFT JOIN ( LEFT JOIN `LocustHordes` AS `l0` ON `f`.`Id` = `l0`.`Id` WHERE `l0`.`Id` IS NOT NULL AND `f`.`Name` = 'Swarm' ) AS `s` ON `l`.`Name` = `s`.`CommanderName` -WHERE `s`.`Eradicated` = FALSE OR `s`.`Eradicated` IS NULL +WHERE `s`.`Eradicated` <> TRUE OR `s`.`Eradicated` IS NULL """); } @@ -8114,7 +8114,7 @@ INNER JOIN ( LEFT JOIN `LocustHordes` AS `l0` ON `f`.`Id` = `l0`.`Id` WHERE `l0`.`Id` IS NOT NULL ) AS `s` ON `l`.`Name` = `s`.`CommanderName` -WHERE IIF(`s`.`Name` = 'Locust', TRUE, NULL) = FALSE OR IIF(`s`.`Name` = 'Locust', TRUE, NULL) IS NULL +WHERE IIF(`s`.`Name` = 'Locust', TRUE, NULL) <> TRUE OR IIF(`s`.`Name` = 'Locust', TRUE, NULL) IS NULL """); } @@ -8746,6 +8746,21 @@ public override async Task Enum_array_contains(bool async) """); } + public override async Task Coalesce_with_non_root_evaluatable_Convert(bool async) + { + await base.Coalesce_with_non_root_evaluatable_Convert(async); + + AssertSql( + $""" +@__rank_0='1' (Nullable = true) + +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 {AssertSqlHelper.Parameter("@__rank_0")} = `g`.`Rank` +"""); + } + /*[ConditionalTheory] [MemberData(nameof(IsAsyncData))] public async Task DataLength_function_for_string_parameter(bool async) @@ -9896,6 +9911,20 @@ public override async Task Comparison_with_value_converted_subclass(bool async) """); } + public override async Task Project_equality_with_value_converted_property(bool async) + { + await base.Project_equality_with_value_converted_property(async); + + AssertSql( + """ +SELECT CASE + WHEN [m].[Difficulty] = N'Unknown' THEN CAST(1 AS bit) + ELSE CAST(0 AS bit) +END +FROM [Missions] AS [m] +"""); + } + public override async Task FirstOrDefault_on_empty_collection_of_DateTime_in_subquery(bool async) { //await base.FirstOrDefault_on_empty_collection_of_DateTime_in_subquery(async);