Skip to content

Commit ebe8516

Browse files
committed
grab updates for FunctionalTests
1 parent f357be8 commit ebe8516

15 files changed

Lines changed: 380 additions & 85 deletions

src/EFCore.SingleStore/Storage/Internal/SingleStoreRelationalConnection.cs

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ protected static DbDataSource GetEffectiveDataSource(ISingleStoreOptions mySqlSi
9090
=> mySqlSingletonOptions.DataSource ??
9191
contextOptions.FindExtension<CoreOptionsExtension>()?.ApplicationServiceProvider?.GetService<SingleStoreDataSource>();
9292

93-
// TODO: Remove, because we don't use it anywhere.
9493
private bool IsMasterConnection { get; set; }
9594

9695
protected override DbConnection CreateDbConnection()
@@ -178,14 +177,19 @@ public virtual ISingleStoreRelationalConnection CreateMasterConnection()
178177

179178
optionsBuilderInfrastructure.AddOrUpdateExtension(masterMySqlOptions);
180179

181-
return new SingleStoreRelationalConnection(
180+
return CreateMasterConnectionCore(optionsBuilder, _mySqlConnectionStringOptionsValidator);
181+
}
182+
183+
protected virtual ISingleStoreRelationalConnection CreateMasterConnectionCore(
184+
DbContextOptionsBuilder optionsBuilder,
185+
ISingleStoreConnectionStringOptionsValidator mySqlConnectionStringOptionsValidator)
186+
=> new SingleStoreRelationalConnection(
182187
Dependencies with { ContextOptions = optionsBuilder.Options },
183-
_mySqlConnectionStringOptionsValidator,
188+
mySqlConnectionStringOptionsValidator,
184189
dataSource: null)
185190
{
186191
IsMasterConnection = true
187192
};
188-
}
189193

190194
protected virtual SingleStoreConnectionStringBuilder AddConnectionStringOptions(SingleStoreConnectionStringBuilder builder)
191195
{
@@ -255,7 +259,9 @@ public override bool Open(bool errorsExpected = false)
255259

256260
if (result)
257261
{
258-
if (_mySqlOptionsExtension.UpdateSqlModeOnOpen && _mySqlOptionsExtension.NoBackslashEscapes)
262+
if (_mySqlOptionsExtension.UpdateSqlModeOnOpen &&
263+
_mySqlOptionsExtension.NoBackslashEscapes &&
264+
!IsMasterConnection)
259265
{
260266
AddSqlMode(NoBackslashEscapes);
261267
}
@@ -271,9 +277,11 @@ public override async Task<bool> OpenAsync(CancellationToken cancellationToken,
271277

272278
if (result)
273279
{
274-
if (_mySqlOptionsExtension.UpdateSqlModeOnOpen && _mySqlOptionsExtension.NoBackslashEscapes)
280+
if (_mySqlOptionsExtension.UpdateSqlModeOnOpen &&
281+
_mySqlOptionsExtension.NoBackslashEscapes &&
282+
!IsMasterConnection)
275283
{
276-
await AddSqlModeAsync(NoBackslashEscapes)
284+
await AddSqlModeAsync(NoBackslashEscapes, cancellationToken)
277285
.ConfigureAwait(false);
278286
}
279287
}
@@ -282,15 +290,32 @@ await AddSqlModeAsync(NoBackslashEscapes)
282290
}
283291

284292
public virtual void AddSqlMode(string mode)
285-
=> Dependencies.CurrentContext.Context?.Database.ExecuteSqlInterpolated($@"SET SESSION sql_mode = CONCAT(@@sql_mode, ',', {mode});");
293+
=> ExecuteNonQuery($@"SET SESSION sql_mode = CONCAT(@@sql_mode, ',', '{mode}');");
286294

287295
public virtual Task AddSqlModeAsync(string mode, CancellationToken cancellationToken = default)
288-
=> Dependencies.CurrentContext.Context?.Database.ExecuteSqlInterpolatedAsync($@"SET SESSION sql_mode = CONCAT(@@sql_mode, ',', {mode});", cancellationToken);
296+
=> ExecuteNonQueryAsync($@"SET SESSION sql_mode = CONCAT(@@sql_mode, ',', '{mode}');", cancellationToken);
289297

290298
public virtual void RemoveSqlMode(string mode)
291-
=> Dependencies.CurrentContext.Context?.Database.ExecuteSqlInterpolated($@"SET SESSION sql_mode = REPLACE(@@sql_mode, {mode}, '');");
299+
=> ExecuteNonQuery($@"SET SESSION sql_mode = REPLACE(@@sql_mode, '{mode}', '');");
300+
301+
public virtual Task RemoveSqlModeAsync(string mode, CancellationToken cancellationToken = default)
302+
=> ExecuteNonQueryAsync($@"SET SESSION sql_mode = REPLACE(@@sql_mode, '{mode}', '');", cancellationToken);
303+
304+
protected virtual void ExecuteNonQuery(string sql)
305+
{
306+
using var command = DbConnection.CreateCommand();
307+
command.CommandText = sql;
308+
command.ExecuteNonQuery();
309+
}
292310

293-
public virtual void RemoveSqlModeAsync(string mode, CancellationToken cancellationToken = default)
294-
=> Dependencies.CurrentContext.Context?.Database.ExecuteSqlInterpolatedAsync($@"SET SESSION sql_mode = REPLACE(@@sql_mode, {mode}, '');", cancellationToken);
311+
protected virtual async Task ExecuteNonQueryAsync(string sql, CancellationToken cancellationToken = default)
312+
{
313+
var command = DbConnection.CreateCommand();
314+
await using (command.ConfigureAwait(false))
315+
{
316+
command.CommandText = sql;
317+
await command.ExecuteNonQueryAsync(cancellationToken).ConfigureAwait(false);
318+
}
319+
}
295320
}
296321
}

test/EFCore.SingleStore.FunctionalTests/BulkUpdates/NorthwindBulkUpdatesSingleStoreTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,7 @@ public override async Task Update_Where_set_property_plus_parameter(bool async)
10421042

10431043
AssertExecuteUpdateSql(
10441044
"""
1045-
@__value_0='Abc' (Size = 30)
1045+
@__value_0='Abc' (Size = 4000)
10461046
10471047
UPDATE `Customers` AS `c`
10481048
SET `c`.`ContactName` = CONCAT(COALESCE(`c`.`ContactName`, ''), @__value_0)

test/EFCore.SingleStore.FunctionalTests/ConnectionSingleStoreTest.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Reflection;
55
using Microsoft.EntityFrameworkCore;
66
using Microsoft.EntityFrameworkCore.Infrastructure;
7+
using Microsoft.EntityFrameworkCore.Storage;
78
using Microsoft.Extensions.DependencyInjection;
89
using SingleStoreConnector;
910
using EntityFrameworkCore.SingleStore.FunctionalTests.TestUtilities;
@@ -169,6 +170,33 @@ public void Can_create_admin_connection_with_connection()
169170
masterConnection.Open();
170171
}
171172

173+
174+
[Fact]
175+
public void Can_create_database_with_disablebackslashescaping()
176+
{
177+
var optionsBuilder = new DbContextOptionsBuilder<GeneralOptionsContext>();
178+
optionsBuilder.UseSingleStore(SingleStoreTestStore.CreateConnectionString("ConnectionTest_" + Guid.NewGuid()), b => b.ApplyConfiguration().DisableBackslashEscaping());
179+
using var context = new GeneralOptionsContext(optionsBuilder.Options);
180+
181+
var relationalDatabaseCreator = context.GetService<IRelationalDatabaseCreator>();
182+
183+
try
184+
{
185+
relationalDatabaseCreator.EnsureCreated();
186+
}
187+
finally
188+
{
189+
try
190+
{
191+
relationalDatabaseCreator.EnsureDeleted();
192+
}
193+
catch
194+
{
195+
// ignored
196+
}
197+
}
198+
}
199+
172200
private readonly IServiceProvider _serviceProvider = new ServiceCollection()
173201
.AddEntityFrameworkSingleStore()
174202
.BuildServiceProvider();

test/EFCore.SingleStore.FunctionalTests/EFCore.SingleStore.FunctionalTests.csproj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<FixedTestOrder Condition="'$(FixedTestOrder)' == ''">false</FixedTestOrder>
1313
<SpecificTestOrder Condition="'$(SpecificTestOrder)' == ''">false</SpecificTestOrder>
1414
</PropertyGroup>
15-
15+
1616
<PropertyGroup>
1717
<MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);$(NoWarn)</MSBuildWarningsAsMessages>
1818
<DefineConstants Condition="'$(FixedTestOrder)' == 'true'">$(DefineConstants);FIXED_TEST_ORDER</DefineConstants>
@@ -44,28 +44,28 @@
4444

4545
<ItemGroup Condition="'$(LocalEFCoreRepository)' != ''">
4646
<Reference Include="Microsoft.EntityFrameworkCore">
47-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.dll</HintPath>
47+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.dll</HintPath>
4848
</Reference>
4949
<Reference Include="Microsoft.EntityFrameworkCore.Abstractions">
50-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Abstractions.dll</HintPath>
50+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Abstractions.dll</HintPath>
5151
</Reference>
5252
<Reference Include="Microsoft.EntityFrameworkCore.Analyzers">
53-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Analyzers.dll</HintPath>
53+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Analyzers.dll</HintPath>
5454
</Reference>
5555
<Reference Include="Microsoft.EntityFrameworkCore.Proxies">
56-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Proxies.dll</HintPath>
56+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Proxies.dll</HintPath>
5757
</Reference>
5858
<Reference Include="Microsoft.EntityFrameworkCore.Relational">
59-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Relational.dll</HintPath>
59+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Relational.dll</HintPath>
6060
</Reference>
6161
<Reference Include="Microsoft.EntityFrameworkCore.Relational.Specification.Tests">
62-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Relational.Specification.Tests.dll</HintPath>
62+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Relational.Specification.Tests.dll</HintPath>
6363
</Reference>
6464
<Reference Include="Microsoft.EntityFrameworkCore.Specification.Tests">
65-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Specification.Tests.dll</HintPath>
65+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Relational.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Specification.Tests.dll</HintPath>
6666
</Reference>
6767
<Reference Include="Microsoft.EntityFrameworkCore.Design">
68-
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Design.Tests\Debug\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Design.dll</HintPath>
68+
<HintPath>$(LocalEFCoreRepository)\artifacts\bin\EFCore.Design.Tests\$(LocalEFCoreRepositoryConfiguration)\$(EfCoreTestTargetFramework)\Microsoft.EntityFrameworkCore.Design.dll</HintPath>
6969
</Reference>
7070
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
7171
<PackageReference Include="NetTopologySuite" />

test/EFCore.SingleStore.FunctionalTests/MigrationsInfrastructureSingleStoreTest.cs

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public override void Can_generate_up_scripts()
5555
base.Can_generate_up_scripts();
5656

5757
Assert.Equal(
58-
@"CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
58+
"""
59+
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
5960
`MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL,
6061
`ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
6162
CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
@@ -90,7 +91,7 @@ public override void Can_generate_up_scripts()
9091
9192
COMMIT;
9293
93-
",
94+
""",
9495
Sql,
9596
ignoreLineEndingDifferences: true);
9697
}
@@ -109,7 +110,11 @@ public override void Can_generate_one_up_script()
109110
110111
COMMIT;
111112
112-
",
113+
START TRANSACTION;
114+
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
115+
VALUES ('00000000000004_Migration4', '7.0.0-test');
116+
COMMIT;
117+
""",
113118
Sql,
114119
ignoreLineEndingDifferences: true);
115120
}
@@ -137,7 +142,9 @@ public override void Can_generate_idempotent_up_scripts()
137142
{
138143
base.Can_generate_idempotent_up_scripts();
139144

140-
Assert.Equal(@"CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
145+
Assert.Equal(
146+
"""
147+
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
141148
`MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL,
142149
`ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
143150
CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
@@ -232,7 +239,21 @@ IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000
232239
233240
COMMIT;
234241
235-
",
242+
START TRANSACTION;
243+
DROP PROCEDURE IF EXISTS MigrationsScript;
244+
DELIMITER //
245+
CREATE PROCEDURE MigrationsScript()
246+
BEGIN
247+
IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000000000004_Migration4') THEN
248+
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
249+
VALUES ('00000000000004_Migration4', '7.0.0-test');
250+
END IF;
251+
END //
252+
DELIMITER ;
253+
CALL MigrationsScript();
254+
DROP PROCEDURE MigrationsScript;
255+
COMMIT;
256+
""",
236257
Sql,
237258
ignoreLineEndingDifferences: true);
238259
}
@@ -391,7 +412,8 @@ public override void Can_generate_up_scripts_noTransactions()
391412
base.Can_generate_up_scripts_noTransactions();
392413

393414
Assert.Equal(
394-
@"CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
415+
"""
416+
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
395417
`MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL,
396418
`ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
397419
CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
@@ -414,7 +436,9 @@ public override void Can_generate_up_scripts_noTransactions()
414436
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
415437
VALUES ('00000000000003_Migration3', '7.0.0-test');
416438
417-
",
439+
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
440+
VALUES ('00000000000004_Migration4', '7.0.0-test');
441+
""",
418442
Sql,
419443
ignoreLineEndingDifferences: true);
420444
}
@@ -424,7 +448,8 @@ public override void Can_generate_idempotent_up_scripts_noTransactions()
424448
base.Can_generate_idempotent_up_scripts_noTransactions();
425449

426450
Assert.Equal(
427-
@"CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
451+
"""
452+
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
428453
`MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL,
429454
`ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
430455
CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
@@ -507,7 +532,19 @@ IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000
507532
CALL MigrationsScript();
508533
DROP PROCEDURE MigrationsScript;
509534
510-
",
535+
DROP PROCEDURE IF EXISTS MigrationsScript;
536+
DELIMITER //
537+
CREATE PROCEDURE MigrationsScript()
538+
BEGIN
539+
IF NOT EXISTS(SELECT 1 FROM `__EFMigrationsHistory` WHERE `MigrationId` = '00000000000004_Migration4') THEN
540+
INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
541+
VALUES ('00000000000004_Migration4', '7.0.0-test');
542+
END IF;
543+
END //
544+
DELIMITER ;
545+
CALL MigrationsScript();
546+
DROP PROCEDURE MigrationsScript;
547+
""",
511548
Sql,
512549
ignoreLineEndingDifferences: true);
513550
}

test/EFCore.SingleStore.FunctionalTests/ProxyGraphUpdatesSingleStoreTest.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Microsoft.EntityFrameworkCore.TestUtilities;
55
using Microsoft.Extensions.DependencyInjection;
66
using EntityFrameworkCore.SingleStore.FunctionalTests.TestUtilities;
7-
using Xunit;
87

98
namespace EntityFrameworkCore.SingleStore.FunctionalTests
109
{
@@ -39,12 +38,6 @@ public LazyLoading(ProxyGraphUpdatesWithLazyLoadingSingleStoreFixture fixture)
3938
{
4039
}
4140

42-
// Used to track down a bug in Oracle's MySQL implementation, related to `SELECT ... ORDER BY (SELECT 1)`.
43-
[Fact]
44-
public void DummyTest()
45-
{
46-
}
47-
4841
protected override bool DoesLazyLoading
4942
=> true;
5043

test/EFCore.SingleStore.FunctionalTests/Query/FunkyDataQuerySingleStoreTest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,21 @@ WHERE FALSE
175175
""");
176176
}
177177

178+
public override async Task String_Contains_and_StartsWith_with_same_parameter(bool async)
179+
{
180+
await base.String_Contains_and_StartsWith_with_same_parameter(async);
181+
182+
AssertSql(
183+
"""
184+
@__s_0_contains='%B%' (Size = 4000)
185+
@__s_0_startswith='B%' (Size = 4000)
186+
SELECT `f`.`Id`, `f`.`FirstName`, `f`.`LastName`, `f`.`NullableBool`
187+
FROM `FunkyCustomers` AS `f`
188+
WHERE (`f`.`FirstName` LIKE @__s_0_contains) OR (`f`.`LastName` LIKE @__s_0_startswith)
189+
""");
190+
}
191+
192+
178193
protected override void ClearLog()
179194
=> Fixture.TestSqlLoggerFactory.Clear();
180195

test/EFCore.SingleStore.FunctionalTests/Query/GearsOfWarQuerySingleStoreTest.SingleStore.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,5 +196,39 @@ await AssertQuery(
196196
WHERE `w`.`IsAutomatic` = TRUE"), keys); // Breaking change in 5.0 due to bool expression optimization in `SqlNullabilityProcessor`.
197197
// Was "`w`.`IsAutomatic` <> FALSE" before.
198198
}
199+
200+
[ConditionalTheory]
201+
[MemberData(nameof(IsAsyncData))]
202+
public virtual async Task DateTimeOffset_DateTime(bool async)
203+
{
204+
await AssertQuery(
205+
async,
206+
ss => ss.Set<Mission>().Where(e => e.Timeline == e.Timeline.DateTime),
207+
ss => ss.Set<Mission>().Where(e => true));
208+
209+
AssertSql(
210+
"""
211+
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
212+
FROM `Missions` AS `m`
213+
WHERE `m`.`Timeline` = `m`.`Timeline`
214+
""");
215+
}
216+
217+
[ConditionalTheory]
218+
[MemberData(nameof(IsAsyncData))]
219+
public virtual async Task DateTimeOffset_UtcDateTime(bool async)
220+
{
221+
await AssertQuery(
222+
async,
223+
ss => ss.Set<Mission>().Where(e => e.Timeline == e.Timeline.UtcDateTime),
224+
ss => ss.Set<Mission>().Where(e => true));
225+
226+
AssertSql(
227+
"""
228+
SELECT `m`.`Id`, `m`.`CodeName`, `m`.`Date`, `m`.`Duration`, `m`.`Rating`, `m`.`Time`, `m`.`Timeline`
229+
FROM `Missions` AS `m`
230+
WHERE `m`.`Timeline` = `m`.`Timeline`
231+
""");
232+
}
199233
}
200234
}

0 commit comments

Comments
 (0)