]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
MariaDB 10.3 updates
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Aug 2018 21:12:58 +0000 (17:12 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Aug 2018 21:12:58 +0000 (17:12 -0400)
MariaDB seems to handle some additional UPDATE/DELETE FROM
syntaxes as well as some forms of INTERSECT and EXCEPT. Open
up tests that expect failure for MySQL to allow success for
MariaDB 10.3.

Change-Id: Ia9341a82485ef7201bb8130d8dbf4a9b6976035a

lib/sqlalchemy/testing/requirements.py
test/orm/test_update_delete.py
test/requirements.py
test/sql/test_query.py

index 2a5262e4ec0783bda3fe860b1862effe34c7f8de..58df643f4e1468bf3f9f6e9a821b7b0614d52abe 100644 (file)
@@ -751,8 +751,8 @@ class SuiteRequirements(Requirements):
 
     @property
     def update_where_target_in_subquery(self):
-        """Target must support UPDATE where the same table is present in a
-        subquery in the WHERE clause.
+        """Target must support UPDATE (or DELETE) where the same table is
+        present in a subquery in the WHERE clause.
 
         This is an ANSI-standard syntax that apparently MySQL can't handle,
         such as:
index 98fcc4f00beecbb8055e1def6a0a9c739ea1a15d..d1ccbb2e1a5af7b0edebaa667ad8d7ae8ff6f624 100644 (file)
@@ -275,7 +275,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
 
         eq_(sess.query(User).order_by(User.id).all(), [jack, jane])
 
-    @testing.fails_on('mysql', 'FIXME: unknown')
+    @testing.requires.update_where_target_in_subquery
     def test_delete_invalid_evaluation(self):
         User = self.classes.User
 
index db6466f220a38acb0f48ded08a059a72362f90f6..1cf40d8a4f2916be660cbe3a8178f2e98995af71 100644 (file)
@@ -360,8 +360,8 @@ class DefaultRequirements(SuiteRequirements):
 
     @property
     def update_where_target_in_subquery(self):
-        """Target must support UPDATE where the same table is present in a
-        subquery in the WHERE clause.
+        """Target must support UPDATE (or DELETE) where the same table is
+        present in a subquery in the WHERE clause.
 
         This is an ANSI-standard syntax that apparently MySQL can't handle,
         such as:
@@ -371,9 +371,10 @@ class DefaultRequirements(SuiteRequirements):
                 FROM documents GROUP BY documents.user_id
             )
         """
-        return fails_if('mysql',
-                        'MySQL error 1093 "Cant specify target table '
-                        'for update in FROM clause"')
+        return fails_if(
+            self._mysql_not_mariadb_103,
+            'MySQL error 1093 "Cant specify target table '
+            'for update in FROM clause", resolved by MariaDB 10.3')
 
     @property
     def savepoints(self):
@@ -521,15 +522,17 @@ class DefaultRequirements(SuiteRequirements):
         """Target database must support INTERSECT or equivalent."""
 
         return fails_if([
-                "firebird", "mysql", "sybase",
-            ], 'no support for INTERSECT')
+            "firebird", self._mysql_not_mariadb_103,
+            "sybase",
+        ], 'no support for INTERSECT')
 
     @property
     def except_(self):
         """Target database must support EXCEPT or equivalent (i.e. MINUS)."""
         return fails_if([
-                "firebird", "mysql", "sybase",
-            ], 'no support for EXCEPT')
+            "firebird", self._mysql_not_mariadb_103,
+            "sybase",
+        ], 'no support for EXCEPT')
 
     @property
     def order_by_col_from_union(self):
@@ -1185,6 +1188,12 @@ class DefaultRequirements(SuiteRequirements):
             config.db.dialect._mariadb_normalized_version_info < (10, 2)
         )
 
+    def _mysql_not_mariadb_103(self, config):
+        return against(config, "mysql") and (
+            not config.db.dialect._is_mariadb or
+            config.db.dialect._mariadb_normalized_version_info < (10, 3)
+        )
+
     def _has_mysql_on_windows(self, config):
         return against(config, 'mysql') and \
                 config.db.dialect._detect_casing(config.db) == 1
index 1d562c2db8afbb49935031f6fdce8661e308b462..971374eb92ea5d0540fc004ade9687f4b3d7e5ac 100644 (file)
@@ -1008,7 +1008,8 @@ class CompoundTest(fixtures.TestBase):
         found2 = self._fetchall_sorted(e.alias().select().execute())
         eq_(found2, wanted)
 
-    @testing.fails_on('sqlite', "Can't handle this style of nesting")
+    @testing.fails_on(
+        ['sqlite', 'mysql'], "Can't handle this style of nesting")
     @testing.requires.except_
     def test_except_style3(self):
         # aaa, bbb, ccc - (aaa, bbb, ccc - (ccc)) = ccc
@@ -1040,7 +1041,8 @@ class CompoundTest(fixtures.TestBase):
         )
 
     @testing.requires.intersect
-    @testing.fails_on('sqlite', "sqlite can't handle leading parenthesis")
+    @testing.fails_on(['sqlite', 'mysql'],
+                      "sqlite can't handle leading parenthesis")
     def test_intersect_unions(self):
         u = intersect(
             union(