]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Port lower case quoted name fix to firebird
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Nov 2016 14:57:36 +0000 (09:57 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 16 Nov 2016 15:00:36 +0000 (10:00 -0500)
Ported the fix for Oracle quoted-lowercase names to Firebird, so that
a table name that is quoted as lower case can be reflected properly
including when the table name comes from the get_table_names()
inspection function.

Also genericize the test to the test suite for denormlized name
dialects.

Fixes: #3548
Change-Id: I8ca62e8d2b359e363ccb01cfe2daa0995354a3cb

doc/build/changelog/changelog_11.rst
lib/sqlalchemy/dialects/firebird/base.py
lib/sqlalchemy/testing/suite/test_reflection.py
test/dialect/test_oracle.py

index 879ba79a4dbbb1ca9329567731b92949bbd52183..f6334203d78d12a7c18426f9d2a3f0fbedc5da35 100644 (file)
 .. changelog::
     :version: 1.1.5
 
+    .. change:: 3548
+        :tag: bug, firebird
+        :tickets: 3548
+
+        Ported the fix for Oracle quoted-lowercase names to Firebird, so that
+        a table name that is quoted as lower case can be reflected properly
+        including when the table name comes from the get_table_names()
+        inspection function.
+
 .. changelog::
     :version: 1.1.4
     :released: November 15, 2016
index 16e2c55b83fe4fb69bff84286e68f1991a4dc779..e552fae4b141330b1f7cb41dcd934a16d5eb3b31 100644 (file)
@@ -77,6 +77,7 @@ from sqlalchemy import exc, types as sqltypes, sql, util
 from sqlalchemy.sql import expression
 from sqlalchemy.engine import base, default, reflection
 from sqlalchemy.sql import compiler
+from sqlalchemy.sql.elements import quoted_name
 
 from sqlalchemy.types import (BIGINT, BLOB, DATE, FLOAT, INTEGER, NUMERIC,
                               SMALLINT, TEXT, TIME, TIMESTAMP, Integer)
@@ -439,6 +440,8 @@ class FBDialect(default.DefaultDialect):
         elif name.upper() == name and \
                 not self.identifier_preparer._requires_quotes(name.lower()):
             return name.lower()
+        elif name.lower() == name:
+            return quoted_name(name, quote=True)
         else:
             return name
 
index 090d5b0678964b1e17d76be68a1bb3cc0ee323e0..ed6a33b6d44b0fe8cab0bcd3a458d221e99f146d 100644 (file)
@@ -14,6 +14,8 @@ from .. import config
 import operator
 from sqlalchemy.schema import DDL, Index
 from sqlalchemy import event
+from sqlalchemy.sql.elements import quoted_name
+from sqlalchemy import ForeignKey
 
 metadata, users = None, None
 
@@ -705,4 +707,40 @@ class ComponentReflectionTest(fixtures.TablesTest):
             assert id_.get('autoincrement', True)
 
 
-__all__ = ('ComponentReflectionTest', 'HasTableTest')
+class NormalizedNameTest(fixtures.TablesTest):
+    __requires__ = 'denormalized_names',
+    __backend__ = True
+
+    @classmethod
+    def define_tables(cls, metadata):
+        Table(
+            quoted_name('t1', quote=True), metadata,
+            Column('id', Integer, primary_key=True),
+        )
+        Table(
+            quoted_name('t2', quote=True), metadata,
+            Column('id', Integer, primary_key=True),
+            Column('t1id', ForeignKey('t1.id'))
+        )
+
+    def test_reflect_lowercase_forced_tables(self):
+
+        m2 = MetaData(testing.db)
+        t2_ref = Table(quoted_name('t2', quote=True), m2, autoload=True)
+        t1_ref = m2.tables['t1']
+        assert t2_ref.c.t1id.references(t1_ref.c.id)
+
+        m3 = MetaData(testing.db)
+        m3.reflect(only=lambda name, m: name.lower() in ('t1', 't2'))
+        assert m3.tables['t2'].c.t1id.references(m3.tables['t1'].c.id)
+
+    def test_get_table_names(self):
+        tablenames = [
+            t for t in inspect(testing.db).get_table_names()
+            if t.lower() in ("t1", "t2")]
+
+        eq_(tablenames[0].upper(), tablenames[0].lower())
+        eq_(tablenames[1].upper(), tablenames[1].lower())
+
+
+__all__ = ('ComponentReflectionTest', 'HasTableTest', 'NormalizedNameTest')
index 82cc107fdaaf0165aa7f8722103d08534a9974cc..79d37237c97add1f32f2ddfce4834ce12b013b89 100644 (file)
@@ -2008,29 +2008,6 @@ class TableReflectionTest(fixtures.TestBase):
         tbl = Table('test_compress', m2, autoload=True)
         assert tbl.dialect_options['oracle']['compress'] == "OLTP"
 
-    @testing.provide_metadata
-    def test_reflect_lowercase_forced_tables(self):
-        metadata = self.metadata
-
-        Table(
-            quoted_name('t1', quote=True), metadata,
-            Column('id', Integer, primary_key=True),
-        )
-        Table(
-            quoted_name('t2', quote=True), metadata,
-            Column('id', Integer, primary_key=True),
-            Column('t1id', ForeignKey('t1.id'))
-        )
-        metadata.create_all()
-
-        m2 = MetaData(testing.db)
-        t2_ref = Table(quoted_name('t2', quote=True), m2, autoload=True)
-        t1_ref = m2.tables['t1']
-        assert t2_ref.c.t1id.references(t1_ref.c.id)
-
-        m3 = MetaData(testing.db)
-        m3.reflect(only=lambda name, m: name.lower() in ('t1', 't2'))
-        assert m3.tables['t2'].c.t1id.references(m3.tables['t1'].c.id)