]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in default compiler plus those of postgresql, mysql, and
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 13 Oct 2013 00:04:55 +0000 (20:04 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 13 Oct 2013 00:13:27 +0000 (20:13 -0400)
mssql to ensure that any literal SQL expression values are
rendered directly as literals, instead of as bound parameters,
within a CREATE INDEX statement. [ticket:2742]
- don't need expression_as_ddl(); literal_binds and include_table
take care of this functionality.

Conflicts:
lib/sqlalchemy/sql/util.py

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/dialects/mssql/base.py
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/dialects/postgresql/base.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/util.py
test/dialect/mssql/test_compiler.py
test/dialect/mysql/test_compiler.py
test/dialect/postgresql/test_compiler.py
test/dialect/test_oracle.py
test/sql/test_constraints.py

index 0937aaad577bcab2b6c6dba29583949191731cef..3d2179f5a77a96016524f4735d29bf9475e3aaf3 100644 (file)
 .. changelog::
     :version: 0.8.3
 
+    .. change::
+        :tags: bug, sql
+        :tickets: 2742
+        :versions: 0.9.0
+
+        Fixed bug in default compiler plus those of postgresql, mysql, and
+        mssql to ensure that any literal SQL expression values are
+        rendered directly as literals, instead of as bound parameters,
+        within a CREATE INDEX statement.
+
     .. change::
         :tags: bug, sql
         :tickets: 2815
index fc952f4b5933ee4dfb6f7b84620a7b69e8beffe6..fa6db3453c49cdf2a86c7addd00bd27e4d405e54 100644 (file)
@@ -1001,7 +1001,7 @@ class MSDDLCompiler(compiler.DDLCompiler):
                         preparer.format_table(index.table),
                        ', '.join(
                             self.sql_compiler.process(expr,
-                                include_table=False) for
+                                include_table=False, literal_binds=True) for
                                 expr in index.expressions)
                         )
 
index 0fe4595030d8db3ec4a8d4c3499150642d6776af..8ead8f148a4b847e8a6829fba90f1a5e6d0b79eb 100644 (file)
@@ -1532,7 +1532,8 @@ class MySQLDDLCompiler(compiler.DDLCompiler):
         self._verify_index_table(index)
         preparer = self.preparer
         table = preparer.format_table(index.table)
-        columns = [self.sql_compiler.process(expr, include_table=False)
+        columns = [self.sql_compiler.process(expr, include_table=False,
+                        literal_binds=True)
                 for expr in index.expressions]
 
         name = self._prepared_index_name(index)
index 1c8a71fbd135119e35d0dcb0f9fc2c335c7a7bc5..2cbe7c83008d11bdaa5586e262ab242e4e195229 100644 (file)
@@ -1101,12 +1101,9 @@ class PGDDLCompiler(compiler.DDLCompiler):
         text += "(%s)" \
                 % (
                     ', '.join([
-                        self.sql_compiler.process(expr, include_table=False) +
-
-
+                        self.sql_compiler.process(
+                                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)])
                     )
 
@@ -1116,8 +1113,9 @@ class PGDDLCompiler(compiler.DDLCompiler):
             whereclause = None
 
         if whereclause is not None:
-            whereclause = sql_util.expression_as_ddl(whereclause)
-            where_compiled = self.sql_compiler.process(whereclause)
+            where_compiled = self.sql_compiler.process(
+                                    whereclause, include_table=False,
+                                    literal_binds=True)
             text += " WHERE " + where_compiled
         return text
 
@@ -1132,8 +1130,9 @@ class PGDDLCompiler(compiler.DDLCompiler):
             elements.append(self.preparer.quote(c.name, c.quote)+' WITH '+op)
         text += "EXCLUDE USING %s (%s)" % (constraint.using, ', '.join(elements))
         if constraint.where is not None:
-            sqltext = sql_util.expression_as_ddl(constraint.where)
-            text += ' WHERE (%s)' % self.sql_compiler.process(sqltext)
+            text += ' WHERE (%s)' % self.sql_compiler.process(
+                                            constraint.where,
+                                            literal_binds=True)
         text += self.define_constraint_deferrability(constraint)
         return text
 
index 13bf47c0b1f683901ebd271803901b45a016d787..0a1fcdfab19468d318913bc6f3309ff38c750212 100644 (file)
@@ -2031,7 +2031,7 @@ class DDLCompiler(engine.Compiled):
                                     use_schema=include_table_schema),
                        ', '.join(
                             self.sql_compiler.process(expr,
-                                include_table=False) for
+                                include_table=False, literal_binds=True) for
                                 expr in index.expressions)
                         )
         return text
@@ -2121,8 +2121,9 @@ class DDLCompiler(engine.Compiled):
         if constraint.name is not None:
             text += "CONSTRAINT %s " % \
                         self.preparer.format_constraint(constraint)
-        sqltext = sql_util.expression_as_ddl(constraint.sqltext)
-        text += "CHECK (%s)" % self.sql_compiler.process(sqltext)
+        text += "CHECK (%s)" % self.sql_compiler.process(constraint.sqltext,
+                                                            include_table=False,
+                                                            literal_binds=True)
         text += self.define_constraint_deferrability(constraint)
         return text
 
index fdc5bb3725149e7fe1a27accf2828e8b3e63eb3d..ecb26e2ea963da0d0176c1752afe8e1adb30ea94 100644 (file)
@@ -270,6 +270,8 @@ def expression_as_ddl(clause):
      into detached column constructs so that the parent table
      identifier is not included.
 
+     .. deprecated:: this function is removed in 0.9.0.
+
     """
     def repl(element):
         if isinstance(element, expression.BindParameter):
index 87037c6a4edf144820a4d1d03b27c47e355466ff..f218d9d0ed940994fc1bb791ce8d4e8e22290b8b 100644 (file)
@@ -528,6 +528,16 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
                             "CREATE INDEX foo ON test (x DESC, y)"
                             )
 
+    def test_create_index_expr(self):
+        m = MetaData()
+        t1 = Table('foo', m,
+                Column('x', Integer)
+            )
+        self.assert_compile(
+            schema.CreateIndex(Index("bar", t1.c.x > 5)),
+            "CREATE INDEX bar ON foo (x > 5)"
+        )
+
     def test_index_extra_include_1(self):
         metadata = MetaData()
         tbl = Table('test', metadata,
index a77a25cc4a3b58d86728f095fab901c7da6eb300..d1488ed330bd23522a1e23afa6e30d4a5949c915 100644 (file)
@@ -94,6 +94,16 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
             "CREATE TABLE testtbl (data VARCHAR(255), "
             "PRIMARY KEY (data) USING btree)")
 
+    def test_create_index_expr(self):
+        m = MetaData()
+        t1 = Table('foo', m,
+                Column('x', Integer)
+            )
+        self.assert_compile(
+            schema.CreateIndex(Index("bar", t1.c.x > 5)),
+            "CREATE INDEX bar ON foo (x > 5)"
+        )
+
     def test_skip_deferrable_kw(self):
         m = MetaData()
         t1 = Table('t1', m, Column('id', Integer, primary_key=True))
index 11661b11f5a54bfaea45b1a19363b9b3c1a272de..858f3e763659ec8c8bd7bb4dd3bd2d901a4a3e82 100644 (file)
@@ -173,6 +173,16 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
                             'USING hash (data)',
                             dialect=postgresql.dialect())
 
+    def test_create_index_literals(self):
+        m = MetaData()
+        tbl = Table('testtbl', m, Column('data', Integer))
+
+        idx1 = Index('test_idx1', tbl.c.data + 5)
+        self.assert_compile(
+            schema.CreateIndex(idx1),
+            "CREATE INDEX test_idx1 ON testtbl (data + 5)"
+        )
+
     def test_exclude_constraint_min(self):
         m = MetaData()
         tbl = Table('testtbl', m,
index def4654f026589b553c0cdc1c0ce075f4aa5a74e..e3d35e39457cc5cf1f99e69becb2ca952ae0a6e0 100644 (file)
@@ -552,6 +552,17 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
             schema.CreateIndex(Index("bar", t1.c.x)),
             "CREATE INDEX alt_schema.bar ON alt_schema.foo (x)"
         )
+
+    def test_create_index_expr(self):
+        m = MetaData()
+        t1 = Table('foo', m,
+                Column('x', Integer)
+            )
+        self.assert_compile(
+            schema.CreateIndex(Index("bar", t1.c.x > 5)),
+            "CREATE INDEX bar ON foo (x > 5)"
+        )
+
 class CompatFlagsTest(fixtures.TestBase, AssertsCompiledSQL):
     __only_on__ = 'oracle'
 
index b44a6519049581c96dbbf82a9fb2e5489ebd0f88..393bcd4480295ff27f9b008b5df2d4814178d42d 100644 (file)
@@ -726,6 +726,27 @@ class ConstraintCompilationTest(fixtures.TestBase, AssertsCompiledSQL):
             "ALTER TABLE tbl ADD PRIMARY KEY (a)"
         )
 
+    def test_render_check_constraint_sql_literal(self):
+        t, t2 = self._constraint_create_fixture()
+
+        constraint = CheckConstraint(t.c.a > 5)
+
+        self.assert_compile(
+            schema.AddConstraint(constraint),
+            "ALTER TABLE tbl ADD CHECK (a > 5)"
+        )
+
+    def test_render_index_sql_literal(self):
+        t, t2 = self._constraint_create_fixture()
+
+        constraint = Index('name', t.c.a + 5)
+
+        self.assert_compile(
+            schema.CreateIndex(constraint),
+            "CREATE INDEX name ON tbl (a + 5)"
+        )
+
+
 class ConstraintAPITest(fixtures.TestBase):
     def test_double_fk_usage_raises(self):
         f = ForeignKey('b.id')