From: Mike Bayer Date: Tue, 4 Apr 2017 14:02:39 +0000 (-0400) Subject: Apply SQL compilation to sqltext for column-level CHECK constraint X-Git-Tag: rel_1_2_0b1~115^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4a4b17e0d3a154094858e73ed1e32c5733047de8;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Apply SQL compilation to sqltext for column-level CHECK constraint Fixed bug where a column-level :class:`.CheckConstraint` would fail to compile the SQL expression using the underlying dialect compiler as well as apply proper flags to generate literal values as inline, in the case that the sqltext is a Core expression and not just a plain string. This was long-ago fixed for table-level check constraints in 0.9 as part of :ticket:`2742`, which more commonly feature Core SQL expressions as opposed to plain string expressions. Change-Id: I1301ba4b40063e91bc47726aecc5f4990ffcaeda Fixes: #3957 --- diff --git a/doc/build/changelog/changelog_12.rst b/doc/build/changelog/changelog_12.rst index 1d66adc8ef..ad9e73160f 100644 --- a/doc/build/changelog/changelog_12.rst +++ b/doc/build/changelog/changelog_12.rst @@ -13,6 +13,18 @@ .. changelog:: :version: 1.2.0b1 + .. change:: 3957 + :tags: bug, sql + :tickets: 3957 + + Fixed bug where a column-level :class:`.CheckConstraint` would fail + to compile the SQL expression using the underlying dialect compiler + as well as apply proper flags to generate literal values as + inline, in the case that the sqltext is a Core expression and + not just a plain string. This was long-ago fixed for table-level + check constraints in 0.9 as part of :ticket:`2742`, which more commonly + feature Core SQL expressions as opposed to plain string expressions. + .. change:: 3923 :tags: bug, sql :tickets: 3923 diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 4415028988..b18f90312f 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -2602,7 +2602,9 @@ class DDLCompiler(Compiled): formatted_name = self.preparer.format_constraint(constraint) if formatted_name is not None: text += "CONSTRAINT %s " % formatted_name - text += "CHECK (%s)" % constraint.sqltext + text += "CHECK (%s)" % self.sql_compiler.process(constraint.sqltext, + include_table=False, + literal_binds=True) text += self.define_constraint_deferrability(constraint) return text diff --git a/test/sql/test_constraints.py b/test/sql/test_constraints.py index aebbb4c305..3365b3cf0d 100644 --- a/test/sql/test_constraints.py +++ b/test/sql/test_constraints.py @@ -1137,6 +1137,19 @@ class ConstraintCompilationTest(fixtures.TestBase, AssertsCompiledSQL): "ALTER TABLE tbl ADD CHECK (a > 5)" ) + def test_render_check_constraint_inline_sql_literal(self): + t, t2 = self._constraint_create_fixture() + + m = MetaData() + t = Table( + 't', m, + Column('a', Integer, CheckConstraint(Column('a', Integer) > 5))) + + self.assert_compile( + schema.CreateColumn(t.c.a), + "a INTEGER CHECK (a > 5)" + ) + def test_render_index_sql_literal(self): t, t2 = self._constraint_create_fixture()