]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixes: 8588
authorJohn Bodley <john.bodley@gmail.com>
Wed, 28 Sep 2022 01:35:51 +0000 (18:35 -0700)
committerJohn Bodley <john.bodley@gmail.com>
Wed, 28 Sep 2022 15:07:55 +0000 (08:07 -0700)
lib/sqlalchemy/dialects/mysql/base.py
lib/sqlalchemy/dialects/mysql/reflection.py
test/dialect/mysql/test_reflection.py

index a3e99514bc55b2bd4a7a0f319c21bfb3406499ec..e8ddb6d1e9e76435287decbd52d080a792c27277 100644 (file)
@@ -3162,7 +3162,7 @@ class MySQLDialect(default.DefaultDialect):
         sql = self._show_create_table(
             connection, None, charset, full_name=full_name
         )
-        if re.match(r"^CREATE (?:ALGORITHM)?.* VIEW", sql):
+        if parser._check_view(sql):
             # Adapt views to something table-like.
             columns = self._describe_table(
                 connection, None, charset, full_name=full_name
index e7a6b157fcacd4d3f7cc9baba3153c4d6f973f0b..0f7debb6904f5b1db7e30f09712358039c236379 100644 (file)
@@ -74,6 +74,9 @@ class MySQLTableDefinitionParser:
                     pass
         return state
 
+    def _check_view(self, sql: str) -> bool:
+        return bool(self._re_is_view.match(sql))
+
     def _parse_constraints(self, line):
         """Parse a KEY or CONSTRAINT line.
 
@@ -409,6 +412,8 @@ class MySQLTableDefinitionParser:
             self.preparer._unescape_identifier,
         )
 
+        self._re_is_view = _re_compile(r"^CREATE(\s.*)?\sVIEW")
+
         # `col`,`col2`(32),`col3`(15) DESC
         #
         self._re_keyexprs = _re_compile(
index f815a7b3c919fe021bc45ffacfad11ab75bd3b10..41423e63ba6a9dabe53d097953de54409236e86c 100644 (file)
@@ -1285,8 +1285,6 @@ class ReflectionTest(fixtures.TestBase, AssertsCompiledSQL):
 
 
 class RawReflectionTest(fixtures.TestBase):
-    __backend__ = True
-
     def setup_test(self):
         dialect = mysql.dialect()
         self.parser = _reflection.MySQLTableDefinitionParser(
@@ -1412,3 +1410,14 @@ class RawReflectionTest(fixtures.TestBase):
                 "SET NULL",
             ),
         )
+
+    @testing.combinations(
+        (
+            "CREATE ALGORITHM=UNDEFINED DEFINER=`scott`@`%` SQL SECURITY DEFINER VIEW `v1` AS SELECT",  # noqa: E501
+            True,
+        ),
+        ("CREATE VIEW `v1` AS SELECT", True),
+        ("CREATE TABLE `v1`", False),
+    )
+    def test_is_view(self, sql: str, expected: bool) -> None:
+        is_(self.parser._check_view(sql), expected)