]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Ensure "options" present for unnamed / unlocatable FK
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 3 Jun 2016 19:57:16 +0000 (15:57 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 3 Jun 2016 19:57:16 +0000 (15:57 -0400)
Also ensure the regular expression and subsequent matching
is case insensitive, add more tests

Change-Id: Ie4aa971dcbffca94e78965e22982478eccbf8597

lib/sqlalchemy/dialects/sqlite/base.py
test/dialect/test_sqlite.py

index 7ddd0999353ba03cceddec7fc5969a5da75e5fb0..0f3c5438598991c8f1b259184d1a009ce6e3ea14 100644 (file)
@@ -1342,6 +1342,7 @@ class SQLiteDialect(default.DefaultDialect):
                     'referred_schema': schema,
                     'referred_table': rtbl,
                     'referred_columns': [],
+                    'options': {}
                 }
                 fks[numerical_id] = fk
 
@@ -1378,7 +1379,6 @@ class SQLiteDialect(default.DefaultDialect):
                 '((?:ON (?:DELETE|UPDATE) '
                 '(?:SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION) *)*)'
             )
-
             for match in re.finditer(FK_PATTERN, table_data, re.I):
                 (
                     constraint_name, constrained_columns,
@@ -1394,7 +1394,7 @@ class SQLiteDialect(default.DefaultDialect):
                         self._find_cols_in_sig(referred_columns))
                 referred_name = referred_quoted_name or referred_name
                 options = {}
-                for token in re.split(r" *ON *", onupdatedelete):
+                for token in re.split(r" *ON *", onupdatedelete.upper()):
                     if token.startswith("DELETE"):
                         options['ondelete'] = token[6:].strip()
                     elif token.startswith("UPDATE"):
index 16a628777478e5fd729008b36d7d7e7efc25bcae..354558ebe828229c2610a2bc50708b206d985fd2 100644 (file)
@@ -1170,7 +1170,10 @@ class ConstraintReflectionTest(fixtures.TestBase):
             for name in [
                 "m", "main.l", "k", "j", "i", "h", "g", "f", "e", "e1",
                     "d", "d1", "d2", "c", "b", "a1", "a2"]:
-                conn.execute("drop table %s" % name)
+                try:
+                    conn.execute("drop table %s" % name)
+                except:
+                    pass
 
     def test_legacy_quoted_identifiers_unit(self):
         dialect = sqlite.dialect()
@@ -1203,7 +1206,8 @@ class ConstraintReflectionTest(fixtures.TestBase):
                             'referred_columns': ['id'],
                             'referred_schema': None,
                             'name': None,
-                            'constrained_columns': ['tid']
+                            'constrained_columns': ['tid'],
+                            'options': {}
                         }])
 
     def test_foreign_key_name_is_none(self):
@@ -1215,10 +1219,12 @@ class ConstraintReflectionTest(fixtures.TestBase):
             [
                 {'referred_table': 'a1', 'referred_columns': ['id'],
                  'referred_schema': None, 'name': None,
-                 'constrained_columns': ['id']},
+                 'constrained_columns': ['id'],
+                 'options': {}},
                 {'referred_table': 'a2', 'referred_columns': ['id'],
                  'referred_schema': None, 'name': None,
-                 'constrained_columns': ['id']},
+                 'constrained_columns': ['id'],
+                 'options': {}},
             ]
         )
 
@@ -1231,11 +1237,13 @@ class ConstraintReflectionTest(fixtures.TestBase):
                 {
                     'referred_table': 'a1', 'referred_columns': ['id'],
                     'referred_schema': None, 'name': 'foo1',
-                    'constrained_columns': ['id']},
+                    'constrained_columns': ['id'],
+                    'options': {}},
                 {
                     'referred_table': 'a2', 'referred_columns': ['id'],
                     'referred_schema': None, 'name': 'foo2',
-                    'constrained_columns': ['id']},
+                    'constrained_columns': ['id'],
+                    'options': {}},
             ]
         )
 
@@ -1247,7 +1255,8 @@ class ConstraintReflectionTest(fixtures.TestBase):
             [{
                 'referred_table': 'a2', 'referred_columns': ['id'],
                 'referred_schema': None,
-                'name': None, 'constrained_columns': ['x']
+                'name': None, 'constrained_columns': ['x'],
+                'options': {}
             }]
         )
 
@@ -1260,6 +1269,7 @@ class ConstraintReflectionTest(fixtures.TestBase):
                 'referred_table': 'a2',
                 'referred_columns': ['some ( STUPID n,ame'],
                 'referred_schema': None,
+                'options': {},
                 'name': None, 'constrained_columns': ['some ( STUPID n,ame']
             }]
         )
@@ -1270,6 +1280,7 @@ class ConstraintReflectionTest(fixtures.TestBase):
                 'referred_table': 'a2',
                 'referred_columns': ['some ( STUPID n,ame'],
                 'referred_schema': None,
+                'options': {},
                 'name': None, 'constrained_columns': ['some ( STUPID n,ame']
             }]
         )
@@ -1283,14 +1294,17 @@ class ConstraintReflectionTest(fixtures.TestBase):
                 'referred_table': 'i',
                 'referred_columns': ['x', 'y'],
                 'referred_schema': None, 'name': None,
-                'constrained_columns': ['q', 'p']}]
+                'constrained_columns': ['q', 'p'],
+                'options': {}}]
         )
         fks = inspector.get_foreign_keys('k')
         eq_(
             fks,
-            [{'referred_table': 'i', 'referred_columns': ['x', 'y'],
-             'referred_schema': None, 'name': 'my_fk',
-             'constrained_columns': ['q', 'p']}]
+            [
+                {'referred_table': 'i', 'referred_columns': ['x', 'y'],
+                 'referred_schema': None, 'name': 'my_fk',
+                 'constrained_columns': ['q', 'p'],
+                 'options': {}}]
         )
 
     def test_foreign_key_ondelete_onupdate(self):
@@ -1320,6 +1334,24 @@ class ConstraintReflectionTest(fixtures.TestBase):
             ]
         )
 
+    def test_foreign_key_options_unnamed_inline(self):
+        with testing.db.connect() as conn:
+            conn.execute(
+                "create table foo (id integer, "
+                "foreign key (id) references bar (id) on update cascade)")
+
+            insp = inspect(conn)
+            eq_(
+                insp.get_foreign_keys('foo'),
+                [{
+                    'name': None,
+                    'referred_columns': ['id'],
+                    'referred_table': 'bar',
+                    'constrained_columns': ['id'],
+                    'referred_schema': None,
+                    'options': {'onupdate': 'CASCADE'}}]
+            )
+
     def test_dont_reflect_autoindex(self):
         inspector = Inspector(testing.db)
         eq_(inspector.get_indexes('o'), [])