]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Pass schema_translate_map from DDLCompiler to SQLCompiler
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 7 Aug 2020 15:24:29 +0000 (11:24 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 7 Aug 2020 16:57:41 +0000 (12:57 -0400)
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)

doc/build/changelog/unreleased_13/5500.rst [new file with mode: 0644]
lib/sqlalchemy/sql/compiler.py
test/sql/test_compiler.py

diff --git a/doc/build/changelog/unreleased_13/5500.rst b/doc/build/changelog/unreleased_13/5500.rst
new file mode 100644 (file)
index 0000000..c93a869
--- /dev/null
@@ -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.
index 473e8861714103be097dd01d473ac3fe5b198a9a..f06429bb9410dfa87e0eb358dca5a0af1bd45e19 100644 (file)
@@ -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):
index f79bbed5f42203f389547da0dd7e8263ba985224..2b025309840c19bcbfaa271dc0f08fa866d738ac 100644 (file)
@@ -3672,18 +3672,95 @@ class DDLTest(fixtures.TestBase, AssertsCompiledSQL):
             schema_translate_map=schema_translate_map,
         )
 
+        self.assert_compile(
+            s1.next_value(),
+            "<next sequence value: z.s1>",
+            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(),
+            "<next sequence value: bat.s2>",
+            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(),
+            "<next sequence value: s3>",
+            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 <next sequence value: z.s1> "
+            "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 <next sequence value: bat.s2> "
+            "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 <next sequence value: s3> "
+            "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))