From 39e287d8bff50e9f91f3f4471088c1946aa6a76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Thu, 5 Jul 2018 18:11:49 +0200 Subject: [PATCH] Fixed #29544 -- Fixed regex lookup on MariaDB. Regression in 42490768441701bc02255b22df8e6894cbe487c7. --- django/db/backends/mysql/base.py | 16 ++++++++++++---- django/db/backends/mysql/operations.py | 4 ++-- docs/releases/2.0.8.txt | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 91e0e83242..fcc6a91c47 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -326,11 +326,19 @@ class DatabaseWrapper(BaseDatabaseWrapper): return True @cached_property - def mysql_version(self): + def mysql_server_info(self): with self.temporary_connection() as cursor: cursor.execute('SELECT VERSION()') - server_info = cursor.fetchone()[0] - match = server_version_re.match(server_info) + return cursor.fetchone()[0] + + @cached_property + def mysql_version(self): + match = server_version_re.match(self.mysql_server_info) if not match: - raise Exception('Unable to determine MySQL version from version string %r' % server_info) + raise Exception('Unable to determine MySQL version from version string %r' % self.mysql_server_info) return tuple(int(x) for x in match.groups()) + + @cached_property + def mysql_is_mariadb(self): + # MariaDB isn't officially supported. + return 'mariadb' in self.mysql_server_info.lower() diff --git a/django/db/backends/mysql/operations.py b/django/db/backends/mysql/operations.py index 47e179db41..31f92ac5cd 100644 --- a/django/db/backends/mysql/operations.py +++ b/django/db/backends/mysql/operations.py @@ -285,8 +285,8 @@ class DatabaseOperations(BaseDatabaseOperations): def regex_lookup(self, lookup_type): # REGEXP BINARY doesn't work correctly in MySQL 8+ and REGEXP_LIKE - # doesn't exist in MySQL 5.6. - if self.connection.mysql_version < (8, 0, 0): + # doesn't exist in MySQL 5.6 or in MariaDB. + if self.connection.mysql_version < (8, 0, 0) or self.connection.mysql_is_mariadb: if lookup_type == 'regex': return '%s REGEXP BINARY %s' return '%s REGEXP %s' diff --git a/docs/releases/2.0.8.txt b/docs/releases/2.0.8.txt index 0e6e081443..c83a60cf81 100644 --- a/docs/releases/2.0.8.txt +++ b/docs/releases/2.0.8.txt @@ -9,4 +9,5 @@ Django 2.0.8 fixes several bugs in 2.0.7. Bugfixes ======== -* ... +* Fixed a regression in Django 2.0.7 that broke the ``regex`` lookup on MariaDB + (even though MariaDB isn't officially supported) (:ticket:`29544`).