From 5c020c8a41312b4416b1a27e001aaaba47ec7e0b Mon Sep 17 00:00:00 2001 From: Friday Date: Tue, 24 Feb 2026 03:09:36 +0000 Subject: [PATCH] Fix sql(params_inline=True) not inlining subquery filter values When using sql(params_inline=True) on a query with Subquery filters, the subquery's filter values were rendered as placeholders instead of being inlined. This happened because Subquery.get_sql() unconditionally called get_parameterized_sql(), which creates a new Parameterizer even when the outer context expects inline values. The fix checks whether the SqlContext has an active parameterizer: - If yes (parameterized mode): use get_parameterized_sql() so values are collected into the outer query's parameterizer - If no (inline mode): use get_sql() so values are rendered inline Fixes #1800 --- tests/test_query_api.py | 18 ++++++++++++++++++ tortoise/expressions.py | 4 +++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/test_query_api.py b/tests/test_query_api.py index 4b278b09a..aa2846784 100644 --- a/tests/test_query_api.py +++ b/tests/test_query_api.py @@ -17,6 +17,7 @@ from tortoise.context import TortoiseContext, tortoise_test_context from tortoise.contrib import test from tortoise.exceptions import ParamsError +from tortoise.expressions import Subquery from tortoise.models import Model from tortoise.query_api import QueryResult, execute_pypika @@ -343,3 +344,20 @@ async def test_execute_pypika_requires_connection_with_multiple_configured(multi await execute_pypika(query) assert "multiple databases" in str(exc_info.value) + + +@pytest.mark.asyncio +async def test_subquery_params_inline(query_api_db) -> None: + """Subquery filter values should be inlined when using sql(params_inline=True). + + Regression test for https://github.com/tortoise/tortoise-orm/issues/1800 + """ + query = QueryModel.filter( + id__in=Subquery(QueryModel.filter(name="alpha").values_list("id")) + ) + sql = query.sql(params_inline=True) + assert "'alpha'" in sql, f"Expected 'alpha' in inline SQL, got: {sql}" + + # Also verify parameterized mode still works + sql_param = query.sql(params_inline=False) + assert "alpha" not in sql_param, f"Expected no 'alpha' in parameterized SQL, got: {sql_param}" diff --git a/tortoise/expressions.py b/tortoise/expressions.py index ff51e2cb9..37e9a42a9 100644 --- a/tortoise/expressions.py +++ b/tortoise/expressions.py @@ -233,7 +233,9 @@ def __init__(self, query: AwaitableQuery) -> None: def get_sql(self, ctx: SqlContext) -> str: self.query._choose_db_if_not_chosen() self.query._make_query() - return self.query.query.get_parameterized_sql(ctx)[0] + if ctx.parameterizer: + return self.query.query.get_parameterized_sql(ctx)[0] + return self.query.query.get_sql(ctx) def as_(self, alias: str) -> Selectable: # type: ignore self.query._choose_db_if_not_chosen()