From: John Bodley Date: Wed, 28 Sep 2022 01:35:51 +0000 (-0700) Subject: Fixes: 8588 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31b98671b895eb166c108f7448d0f0985ba15c13;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fixes: 8588 --- diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index a3e99514bc..e8ddb6d1e9 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -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 diff --git a/lib/sqlalchemy/dialects/mysql/reflection.py b/lib/sqlalchemy/dialects/mysql/reflection.py index e7a6b157fc..0f7debb690 100644 --- a/lib/sqlalchemy/dialects/mysql/reflection.py +++ b/lib/sqlalchemy/dialects/mysql/reflection.py @@ -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( diff --git a/test/dialect/mysql/test_reflection.py b/test/dialect/mysql/test_reflection.py index f815a7b3c9..41423e63ba 100644 --- a/test/dialect/mysql/test_reflection.py +++ b/test/dialect/mysql/test_reflection.py @@ -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)