summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--lib/sqlalchemy/sql/compiler.py7
-rw-r--r--test/sql/test_compiler.py14
3 files changed, 25 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 5143cc218..d2c09e7b6 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 e0cdbe24c..96ca1c57d 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 4bf0eb70e..22353f142 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,