summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-08-30 17:12:58 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-08-30 17:13:58 -0400
commit1351fa138673d93c81c5c44f28711a684c9da8b5 (patch)
treeebd8a3eabd4de5970f921ec607ec6c1b3c092b16
parent2e0f06df914495fffe9c3f12f478d2a419e3c34c (diff)
downloadsqlalchemy-1351fa138673d93c81c5c44f28711a684c9da8b5.tar.gz
MariaDB 10.3 updates
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 (cherry picked from commit 081d4275cf5c3e6842c8e0198542ff89617eaa96)
-rw-r--r--lib/sqlalchemy/testing/requirements.py4
-rw-r--r--test/orm/test_update_delete.py2
-rw-r--r--test/requirements.py27
-rw-r--r--test/sql/test_query.py6
4 files changed, 25 insertions, 14 deletions
diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py
index 76a2d8983..5d5e659d4 100644
--- a/lib/sqlalchemy/testing/requirements.py
+++ b/lib/sqlalchemy/testing/requirements.py
@@ -625,8 +625,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:
diff --git a/test/orm/test_update_delete.py b/test/orm/test_update_delete.py
index 593714a06..12590166d 100644
--- a/test/orm/test_update_delete.py
+++ b/test/orm/test_update_delete.py
@@ -292,7 +292,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
diff --git a/test/requirements.py b/test/requirements.py
index 3c80b0ad3..d3cd8288a 100644
--- a/test/requirements.py
+++ b/test/requirements.py
@@ -269,8 +269,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:
@@ -280,9 +280,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):
@@ -380,15 +381,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 parens_in_union_contained_select_w_limit_offset(self):
@@ -935,6 +938,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
diff --git a/test/sql/test_query.py b/test/sql/test_query.py
index bc9a176f1..06c90044d 100644
--- a/test/sql/test_query.py
+++ b/test/sql/test_query.py
@@ -846,7 +846,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
@@ -878,7 +879,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(