From: Mike Bayer Date: Thu, 21 Jun 2012 20:49:29 +0000 (-0400) Subject: - [bug] quoting is applied to the column names X-Git-Tag: rel_0_8_0b1~363 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d5186e92534b4d38e590cef2d56c85be845bfdf0;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [bug] quoting is applied to the column names inside the WITH RECURSIVE clause of a common table expression according to the quoting rules for the originating Column. [ticket:2512] --- diff --git a/CHANGES b/CHANGES index 5143cc218d..d2c09e7b6d 100644 --- a/CHANGES +++ b/CHANGES @@ -294,6 +294,12 @@ are also present in 0.8. 0.7.9 ===== - sql + - [bug] quoting is applied to the column names + inside the WITH RECURSIVE clause of a + common table expression according to the + quoting rules for the originating Column. + [ticket:2512] + - [bug] Fixed regression introduced in 0.7.6 whereby the FROM list of a SELECT statement could be incorrect in certain "clone+replace" diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index e0cdbe24c5..96ca1c57d1 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -790,10 +790,13 @@ class SQLCompiler(engine.Compiled): col_source = cte.original.selects[0] else: assert False - recur_cols = [c.key for c in util.unique_list(col_source.inner_columns) + recur_cols = [c for c in + util.unique_list(col_source.inner_columns) if c is not None] - text += "(%s)" % (", ".join(recur_cols)) + text += "(%s)" % (", ".join( + self.preparer.format_column(ident) + for ident in recur_cols)) text += " AS \n" + \ cte.original._compiler_dispatch( self, asfrom=True, **kwargs diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index 4bf0eb70ea..22353f1427 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -2486,6 +2486,20 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL): "FROM regional_sales WHERE " "regional_sales.amount < :amount_2") + def test_cte_reserved_quote(self): + orders = table('orders', + column('order'), + ) + s = select([orders.c.order]).cte("regional_sales", recursive=True) + s = select([s.c.order]) + self.assert_compile(s, + 'WITH RECURSIVE regional_sales("order") AS ' + '(SELECT orders."order" AS "order" ' + "FROM orders)" + ' SELECT regional_sales."order" ' + "FROM regional_sales" + ) + def test_date_between(self): import datetime table = Table('dt', metadata,