]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in CTE where ``literal_binds`` compiler argument would not
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Aug 2014 18:42:57 +0000 (14:42 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 2 Aug 2014 18:43:25 +0000 (14:43 -0400)
be always be correctly propagated when one CTE referred to another
aliased CTE in a statement.
Fixes #3154

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/sql/compiler.py
test/sql/test_cte.py

index afc51f240065406de194a09113ff9bed5a0d664e..cde13441f65ccfe920600874077c46dd35651a1f 100644 (file)
 .. changelog::
     :version: 0.9.8
 
+    .. change::
+        :tags: bug, sql
+        :versions: 1.0.0
+        :tickets: 3154
+
+        Fixed bug in CTE where ``literal_binds`` compiler argument would not
+        be always be correctly propagated when one CTE referred to another
+        aliased CTE in a statement.
+
     .. change::
         :tags: bug, postgresql
         :versions: 1.0.0
index ca03b62378627f5f0880f27008287b9b10b00dc8..a4877ce8184bef3fa771e96b93103ff19529bdce 100644 (file)
@@ -1118,7 +1118,7 @@ class SQLCompiler(Compiled):
         if cte._cte_alias is not None:
             orig_cte = cte._cte_alias
             if orig_cte not in self.ctes:
-                self.visit_cte(orig_cte)
+                self.visit_cte(orig_cte, **kwargs)
             cte_alias_name = cte._cte_alias.name
             if isinstance(cte_alias_name, elements._truncated_label):
                 cte_alias_name = self._truncated_identifier(
index 7e83968da7217f3505f76f5dfe1d1c15843e71ca..b907fe649b9f90cb127f2dfba016accd768da4ce 100644 (file)
@@ -391,6 +391,44 @@ class CTETest(fixtures.TestBase, AssertsCompiledSQL):
             'regional_sales_2."order" FROM regional_sales_2',
             checkpositional=('x', 'y', 'z'), dialect=dialect)
 
+    def test_positional_binds_2_asliteral(self):
+        orders = table('orders',
+                       column('order'),
+                       )
+        s = select([orders.c.order, literal("x")]).cte("regional_sales")
+        s = select([s.c.order, literal("y")])
+        dialect = default.DefaultDialect()
+        dialect.positional = True
+        dialect.paramstyle = 'numeric'
+        s1 = select([orders.c.order]).where(orders.c.order == 'x').\
+            cte("regional_sales_1")
+
+        s1a = s1.alias()
+
+        s2 = select([orders.c.order == 'y', s1a.c.order,
+                     orders.c.order, s1.c.order]).\
+            where(orders.c.order == 'z').\
+            cte("regional_sales_2")
+
+        s3 = select([s2])
+
+        self.assert_compile(
+            s3,
+            'WITH regional_sales_1 AS '
+            '(SELECT orders."order" AS "order" '
+            'FROM orders '
+            'WHERE orders."order" = \'x\'), '
+            'regional_sales_2 AS '
+            '(SELECT orders."order" = \'y\' AS anon_1, '
+            'anon_2."order" AS "order", orders."order" AS "order", '
+            'regional_sales_1."order" AS "order" '
+            'FROM orders, regional_sales_1 AS anon_2, regional_sales_1 '
+            'WHERE orders."order" = \'z\') '
+            'SELECT regional_sales_2.anon_1, regional_sales_2."order" '
+            'FROM regional_sales_2',
+            checkpositional=(), dialect=dialect,
+            literal_binds=True)
+
     def test_all_aliases(self):
         orders = table('order', column('order'))
         s = select([orders.c.order]).cte("regional_sales")