From b7fdd60d85ee94df444369be1b2c778cda44a0c2 Mon Sep 17 00:00:00 2001 From: Stewart Park Date: Mon, 14 Dec 2015 18:19:40 -0800 Subject: [PATCH] Fixed #24675 -- Skipped SQL_AUTO_IS_NULL query on MySQL if not needed. --- django/db/backends/mysql/base.py | 13 +++++++------ django/db/backends/mysql/features.py | 6 ++++++ tests/backends/test_mysql.py | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 tests/backends/test_mysql.py diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 03f3857664..6fbf15e42e 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -267,12 +267,13 @@ class DatabaseWrapper(BaseDatabaseWrapper): return conn def init_connection_state(self): - with self.cursor() as cursor: - # SQL_AUTO_IS_NULL in MySQL controls whether an AUTO_INCREMENT column - # on a recently-inserted row will return when the field is tested for - # NULL. Disabling this value brings this aspect of MySQL in line with - # SQL standards. - cursor.execute('SET SQL_AUTO_IS_NULL = 0') + if self.features.is_sql_auto_is_null_enabled: + with self.cursor() as cursor: + # SQL_AUTO_IS_NULL controls whether an AUTO_INCREMENT column on + # a recently inserted row will return when the field is tested + # for NULL. Disabling this brings this aspect of MySQL in line + # with SQL standards. + cursor.execute('SET SQL_AUTO_IS_NULL = 0') def create_cursor(self): cursor = self.connection.cursor() diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index c8ea8f7fb6..075b68a872 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -69,3 +69,9 @@ class DatabaseFeatures(BaseDatabaseFeatures): def introspected_boolean_field_type(self, *args, **kwargs): return 'IntegerField' + + @cached_property + def is_sql_auto_is_null_enabled(self): + with self.connection.cursor() as cursor: + cursor.execute('SELECT @@SQL_AUTO_IS_NULL') + return cursor.fetchone()[0] == 1 diff --git a/tests/backends/test_mysql.py b/tests/backends/test_mysql.py new file mode 100644 index 0000000000..d667a7c89c --- /dev/null +++ b/tests/backends/test_mysql.py @@ -0,0 +1,20 @@ +from __future__ import unicode_literals + +import unittest + +from django.db import connection +from django.test import TestCase, override_settings + + +@override_settings(DEBUG=True) +@unittest.skipUnless(connection.vendor == 'mysql', 'MySQL specific test.') +class MySQLTests(TestCase): + + def test_auto_is_null_auto_config(self): + query = 'set sql_auto_is_null = 0' + connection.init_connection_state() + last_query = connection.queries[-1]['sql'].lower() + if connection.features.is_sql_auto_is_null_enabled: + self.assertIn(query, last_query) + else: + self.assertNotIn(query, last_query)