From: Mike Bayer Date: Fri, 7 Aug 2020 15:24:29 +0000 (-0400) Subject: Pass schema_translate_map from DDLCompiler to SQLCompiler X-Git-Tag: rel_1_3_19~9^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8db7e957298b920964a47995ec6f5c1406b8fb53;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Pass schema_translate_map from DDLCompiler to SQLCompiler Fixed issue where the :paramref:`_engine.Connection.execution_options.schema_translate_map` feature would not take effect when the :meth:`_schema.Sequence.next_value` function function for a :class:`_schema.Sequence` were used in the :paramref:`_schema.Column.server_default` parameter and the create table DDL were emitted. Fixes: #5500 Change-Id: I74a9fa13d22749d06c8202669f9ea220d9d984d9 (cherry picked from commit ed50a003e296ac6bfb998f2b401091d87874cb4c) --- diff --git a/doc/build/changelog/unreleased_13/5500.rst b/doc/build/changelog/unreleased_13/5500.rst new file mode 100644 index 0000000000..c93a869499 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5500.rst @@ -0,0 +1,10 @@ +.. change:: + :tags: bug, sql + :tickets: 5500 + + Fixed issue where the + :paramref:`_engine.Connection.execution_options.schema_translate_map` + feature would not take effect when the :meth:`_schema.Sequence.next_value` + function function for a :class:`_schema.Sequence` were used in the + :paramref:`_schema.Column.server_default` parameter and the create table + DDL were emitted. diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 473e886171..f06429bb94 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -265,6 +265,8 @@ class Compiled(object): _cached_metadata = None + schema_translate_map = None + execution_options = util.immutabledict() """ Execution options propagated from the statement. In some cases, @@ -306,6 +308,7 @@ class Compiled(object): self.dialect = dialect self.bind = bind self.preparer = self.dialect.identifier_preparer + self.schema_translate_map = schema_translate_map if schema_translate_map: self.preparer = self.preparer._with_schema_translate( schema_translate_map @@ -2835,7 +2838,9 @@ class StrSQLCompiler(SQLCompiler): class DDLCompiler(Compiled): @util.memoized_property def sql_compiler(self): - return self.dialect.statement_compiler(self.dialect, None) + return self.dialect.statement_compiler( + self.dialect, None, schema_translate_map=self.schema_translate_map + ) @util.memoized_property def type_compiler(self): diff --git a/test/sql/test_compiler.py b/test/sql/test_compiler.py index f79bbed5f4..2b02530984 100644 --- a/test/sql/test_compiler.py +++ b/test/sql/test_compiler.py @@ -3672,18 +3672,95 @@ class DDLTest(fixtures.TestBase, AssertsCompiledSQL): schema_translate_map=schema_translate_map, ) + self.assert_compile( + s1.next_value(), + "", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + self.assert_compile( schema.CreateSequence(s2), "CREATE SEQUENCE bat.s2", schema_translate_map=schema_translate_map, ) + self.assert_compile( + s2.next_value(), + "", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + self.assert_compile( schema.CreateSequence(s3), "CREATE SEQUENCE s3", schema_translate_map=schema_translate_map, ) + self.assert_compile( + s3.next_value(), + "", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + + def test_schema_translate_map_sequence_server_default(self): + s1 = schema.Sequence("s1") + s2 = schema.Sequence("s2", schema="foo") + s3 = schema.Sequence("s3", schema="bar") + + schema_translate_map = {None: "z", "bar": None, "foo": "bat"} + + m = MetaData() + + t1 = Table( + "t1", + m, + Column( + "id", Integer, server_default=s1.next_value(), primary_key=True + ), + ) + t2 = Table( + "t2", + m, + Column( + "id", Integer, server_default=s2.next_value(), primary_key=True + ), + ) + t3 = Table( + "t3", + m, + Column( + "id", Integer, server_default=s3.next_value(), primary_key=True + ), + ) + + self.assert_compile( + schema.CreateTable(t1), + "CREATE TABLE z.t1 " + "(id INTEGER DEFAULT " + "NOT NULL, PRIMARY KEY (id))", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + self.assert_compile( + schema.CreateTable(t2), + "CREATE TABLE z.t2 " + "(id INTEGER DEFAULT " + "NOT NULL, PRIMARY KEY (id))", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + self.assert_compile( + schema.CreateTable(t3), + "CREATE TABLE z.t3 " + "(id INTEGER DEFAULT " + "NOT NULL, PRIMARY KEY (id))", + schema_translate_map=schema_translate_map, + dialect="default_enhanced", + ) + def test_fk_render(self): a = Table("a", MetaData(), Column("q", Integer)) b = Table("b", MetaData(), Column("p", Integer))