From a2cce1bf43552e699f2babe7e4750354f2d580fe Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 12 Oct 2013 20:21:18 -0400 Subject: [PATCH] Parenthesis will be applied to a compound SQL expression as rendered in the column list of a CREATE INDEX statement. [ticket:2742] --- doc/build/changelog/changelog_08.rst | 8 ++++++++ lib/sqlalchemy/dialects/postgresql/base.py | 5 ++++- test/dialect/postgresql/test_compiler.py | 13 ++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 8de572b205..5892262b46 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -10,6 +10,14 @@ .. changelog:: :version: 0.8.3 + .. change:: + :tags: bug, postgresql + :tickets: 2742 + :versions: 0.9.0 + + Parenthesis will be applied to a compound SQL expression as + rendered in the column list of a CREATE INDEX statement. + .. change:: :tags: bug, sql :tickets: 2742 diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 83ad1d46fb..06ee8c3a23 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -1101,7 +1101,10 @@ class PGDDLCompiler(compiler.DDLCompiler): % ( ', '.join([ self.sql_compiler.process( - expr, include_table=False, literal_binds=True) + + expr.self_group() + if not isinstance(expr, expression.ColumnClause) + else expr, + include_table=False, literal_binds=True) + (c.key in ops and (' ' + ops[c.key]) or '') for expr, c in zip(index.expressions, index.columns)]) ) diff --git a/test/dialect/postgresql/test_compiler.py b/test/dialect/postgresql/test_compiler.py index 858f3e7636..76fd9d9072 100644 --- a/test/dialect/postgresql/test_compiler.py +++ b/test/dialect/postgresql/test_compiler.py @@ -173,6 +173,17 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): 'USING hash (data)', dialect=postgresql.dialect()) + + def test_create_index_expr_gets_parens(self): + m = MetaData() + tbl = Table('testtbl', m, Column('x', Integer), Column('y', Integer)) + + idx1 = Index('test_idx1', 5 / (tbl.c.x + tbl.c.y)) + self.assert_compile( + schema.CreateIndex(idx1), + "CREATE INDEX test_idx1 ON testtbl ((5 / (x + y)))" + ) + def test_create_index_literals(self): m = MetaData() tbl = Table('testtbl', m, Column('data', Integer)) @@ -180,7 +191,7 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): idx1 = Index('test_idx1', tbl.c.data + 5) self.assert_compile( schema.CreateIndex(idx1), - "CREATE INDEX test_idx1 ON testtbl (data + 5)" + "CREATE INDEX test_idx1 ON testtbl ((data + 5))" ) def test_exclude_constraint_min(self): -- 2.47.3