summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2023-05-12 11:20:52 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2023-05-12 11:20:52 -0400
commit169d6e6804c0e6bbb5f8b2fa4217e659b49a0d9f (patch)
treea07615e3147dbc00ad691632758b8483bc9597b1
parent58d37abb049986c7cddf277c4946d7930e3c1635 (diff)
downloadsqlalchemy-169d6e6804c0e6bbb5f8b2fa4217e659b49a0d9f.tar.gz
substitute include_table param rather than adding
Fixed issue in :func:`_sql.values` construct where an internal compilation error would occur if the construct were used inside of a scalar subquery. Fixes: #9772 Change-Id: I4b0f756977abafbd2aabaaa0064baa875249ebe1
-rw-r--r--doc/build/changelog/unreleased_20/9772.rst6
-rw-r--r--lib/sqlalchemy/sql/compiler.py5
-rw-r--r--test/sql/test_values.py26
3 files changed, 34 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_20/9772.rst b/doc/build/changelog/unreleased_20/9772.rst
new file mode 100644
index 000000000..ff448fabd
--- /dev/null
+++ b/doc/build/changelog/unreleased_20/9772.rst
@@ -0,0 +1,6 @@
+.. change::
+ :tags: bug, sql
+ :tickets: 9772
+
+ Fixed issue in :func:`_sql.values` construct where an internal compilation
+ error would occur if the construct were used inside of a scalar subquery.
diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py
index 619ff0848..ad686ce27 100644
--- a/lib/sqlalchemy/sql/compiler.py
+++ b/lib/sqlalchemy/sql/compiler.py
@@ -4275,15 +4275,14 @@ class SQLCompiler(Compiled):
)
if name:
+ kw["include_table"] = False
v = "%s(%s)%s (%s)" % (
lateral,
v,
self.get_render_as_alias_suffix(self.preparer.quote(name)),
(
", ".join(
- c._compiler_dispatch(
- self, include_table=False, **kw
- )
+ c._compiler_dispatch(self, **kw)
for c in element.columns
)
),
diff --git a/test/sql/test_values.py b/test/sql/test_values.py
index b943c4701..62e1f1cb5 100644
--- a/test/sql/test_values.py
+++ b/test/sql/test_values.py
@@ -10,6 +10,7 @@ from sqlalchemy import Table
from sqlalchemy import testing
from sqlalchemy import true
from sqlalchemy.engine import default
+from sqlalchemy.sql import func
from sqlalchemy.sql import select
from sqlalchemy.sql import Values
from sqlalchemy.sql.compiler import FROM_LINTING
@@ -85,6 +86,31 @@ class ValuesTest(fixtures.TablesTest, AssertsCompiledSQL):
'AS "Spaces and Cases" ("CaseSensitive", "has spaces", number)',
)
+ def test_values_in_scalar_subq(self):
+ """test #9772"""
+
+ people = self.tables.people
+ table_value_constructor = Values(
+ Column("v1", Integer), name="tvc"
+ ).data(
+ [
+ (people.c.people_id,),
+ (people.c.age,),
+ (people.c.name,),
+ ]
+ )
+
+ maximum = select(func.max(table_value_constructor.c.v1))
+ maximum_subquery = maximum.scalar_subquery()
+ query = select(people.c.people_id, maximum_subquery)
+ self.assert_compile(
+ query,
+ "SELECT people.people_id, "
+ "(SELECT max(tvc.v1) AS max_1 FROM "
+ "(VALUES (people.people_id), (people.age), (people.name)) "
+ "AS tvc (v1)) AS anon_1 FROM people",
+ )
+
def test_values_in_cte_params(self):
cte1 = select(
Values(