From 984a2ba885bd9e446bb168d3cb6b46439b21fc34 Mon Sep 17 00:00:00 2001 From: yykkibbb Date: Wed, 18 Feb 2026 15:36:23 +0900 Subject: [PATCH] Remove CheckComposableSql() override (#1543) The upstream issue (dotnet/efcore#26471) was resolved in EF Core 7.0.0. The base QuerySqlGenerator.CheckComposableSqlTrimmed now recognizes both SELECT and WITH as composable SQL, so the Pomelo override is no longer needed. Also remove the stored procedure test method overrides in FromSqlSprocQueryMySqlTest that expected MySqlException, since the base class tests already expect InvalidOperationException. --- .../Internal/MySqlQuerySqlGenerator.cs | 7 - .../Query/FromSqlSprocQueryMySqlTest.cs | 197 ------------------ 2 files changed, 204 deletions(-) diff --git a/src/EFCore.MySql/Query/ExpressionVisitors/Internal/MySqlQuerySqlGenerator.cs b/src/EFCore.MySql/Query/ExpressionVisitors/Internal/MySqlQuerySqlGenerator.cs index c86ad0e9e..0dc7129f4 100644 --- a/src/EFCore.MySql/Query/ExpressionVisitors/Internal/MySqlQuerySqlGenerator.cs +++ b/src/EFCore.MySql/Query/ExpressionVisitors/Internal/MySqlQuerySqlGenerator.cs @@ -1016,12 +1016,5 @@ protected virtual void GenerateJsonPath(IReadOnlyList path, bool? n Sql.Append(")"); } } - - /// - protected override void CheckComposableSql(string sql) - { - // MySQL supports CTE (WITH) expressions within subqueries, as well as others, - // so we allow any raw SQL to be composed over. - } } } diff --git a/test/EFCore.MySql.FunctionalTests/Query/FromSqlSprocQueryMySqlTest.cs b/test/EFCore.MySql.FunctionalTests/Query/FromSqlSprocQueryMySqlTest.cs index 03e7cd844..fbc92ffec 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/FromSqlSprocQueryMySqlTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/FromSqlSprocQueryMySqlTest.cs @@ -1,11 +1,5 @@ -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.TestModels.Northwind; using Microsoft.EntityFrameworkCore.TestUtilities; -using MySqlConnector; -using Xunit; using Xunit.Abstractions; namespace Pomelo.EntityFrameworkCore.MySql.FunctionalTests.Query @@ -21,196 +15,5 @@ public FromSqlSprocQueryMySqlTest( protected override string TenMostExpensiveProductsSproc => "CALL `Ten Most Expensive Products`()"; protected override string CustomerOrderHistorySproc => "CALL `CustOrderHist`({0})"; - - private string NormalizeDelimitersInRawString(string sql) - => Fixture.TestStore.NormalizeDelimitersInRawString(sql); - - public override async Task From_sql_queryable_stored_procedure_projection(bool async) - { - using var context = CreateContext(); - var query = context - .Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - .Select(mep => mep.TenMostExpensiveProducts); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_re_projection(bool async) - { - using var context = CreateContext(); - var query = context - .Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - .Select( - mep => - new MostExpensiveProduct { TenMostExpensiveProducts = "Foo", UnitPrice = mep.UnitPrice }); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_composed(bool async) - { - using var context = CreateContext(); - var query = context - .Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - .Where(mep => mep.TenMostExpensiveProducts.Contains("C")) - .OrderBy(mep => mep.UnitPrice); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_with_parameter_composed(bool async) - { - using var context = CreateContext(); - - var query = context - .Set() - .FromSqlRaw(CustomerOrderHistorySproc, GetCustomerOrderHistorySprocParameters()) - .Where(coh => coh.ProductName.Contains("C")) - .OrderBy(coh => coh.Total); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_take(bool async) - { - using var context = CreateContext(); - var query = context - .Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - .OrderByDescending(mep => mep.UnitPrice) - .Take(2); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_min(bool async) - { - using var context = CreateContext(); - var query = context.Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()); - - if (async) - { - await Assert.ThrowsAsync(() => query.MinAsync(mep => mep.UnitPrice)); - } - else - { - Assert.Throws(() => query.Min(mep => mep.UnitPrice)); - } - } - - public override async Task From_sql_queryable_stored_procedure_with_include_throws(bool async) - { - using var context = CreateContext(); - var query = context.Set() - .FromSqlRaw("SelectStoredProcedure") - .Include(p => p.OrderDetails); - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_with_multiple_stored_procedures(bool async) - { - using var context = CreateContext(); - var query = from a in context.Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - from b in context.Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - where a.TenMostExpensiveProducts == b.TenMostExpensiveProducts - select new { a, b }; - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_stored_procedure_and_select(bool async) - { - using var context = CreateContext(); - var query = from mep in context.Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - from p in context.Set() - .FromSqlRaw(NormalizeDelimitersInRawString("SELECT * FROM [Products]")) - where mep.TenMostExpensiveProducts == p.ProductName - select new { mep, p }; - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } - - public override async Task From_sql_queryable_select_and_stored_procedure(bool async) - { - using var context = CreateContext(); - var query = from p in context.Set().FromSqlRaw(NormalizeDelimitersInRawString("SELECT * FROM [Products]")) - from mep in context.Set() - .FromSqlRaw(TenMostExpensiveProductsSproc, GetTenMostExpensiveProductsParameters()) - where mep.TenMostExpensiveProducts == p.ProductName - select new { mep, p }; - - if (async) - { - await Assert.ThrowsAsync(() => query.ToArrayAsync()); - } - else - { - Assert.Throws(() => query.ToArray()); - } - } } }