Commit b7fdd60d authored by Stewart Park's avatar Stewart Park Committed by Tim Graham
Browse files

Fixed #24675 -- Skipped SQL_AUTO_IS_NULL query on MySQL if not needed.

parent 3d223677
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -267,11 +267,12 @@ class DatabaseWrapper(BaseDatabaseWrapper):
        return conn

    def init_connection_state(self):
        if self.features.is_sql_auto_is_null_enabled:
            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.
                # 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):
+6 −0
Original line number Diff line number Diff line
@@ -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
+20 −0
Original line number Diff line number Diff line
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)