]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
substitute include_table param rather than adding
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 12 May 2023 15:20:52 +0000 (11:20 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 12 May 2023 15:20:52 +0000 (11:20 -0400)
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

doc/build/changelog/unreleased_20/9772.rst [new file with mode: 0644]
lib/sqlalchemy/sql/compiler.py
test/sql/test_values.py

diff --git a/doc/build/changelog/unreleased_20/9772.rst b/doc/build/changelog/unreleased_20/9772.rst
new file mode 100644 (file)
index 0000000..ff448fa
--- /dev/null
@@ -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.
index 619ff08488a7e97cd209912f31c300a60e56df76..ad686ce27ea710d119aa5fc3d30dc35ff9935d5e 100644 (file)
@@ -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
                         )
                     ),
index b943c4701ded21f12dc31b93d4db366fce0acd00..62e1f1cb5b88472494f3f0ffbe34bdecb2b1bd66 100644 (file)
@@ -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(