Commit a15d3b58 authored by Michael Newman's avatar Michael Newman Committed by Anssi Kääriäinen
Browse files

[1.3.x] Fixed #18135 -- Close connection used for db version checking

On MySQL when checking the server version, a new connection could be
created but never closed. This could result in open connections on
server startup.

Backport of 4423757c.
parent e293d82c
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -334,10 +334,19 @@ class DatabaseWrapper(BaseDatabaseWrapper):

    def get_server_version(self):
        if not self.server_version:
            new_connection = False
            if not self._valid_connection():
                self.cursor()
            m = server_version_re.match(self.connection.get_server_info())
                # Ensure we have a connection with the DB by using a temporary
                # cursor
                new_connection = True
                self.cursor().close()
            server_info = self.connection.get_server_info()
            if new_connection:
                # Make sure we close the connection
                self.connection.close()
                self.connection = None
            m = server_version_re.match(server_info)
            if not m:
                raise Exception('Unable to determine MySQL version from version string %r' % self.connection.get_server_info())
                raise Exception('Unable to determine MySQL version from version string %r' % server_info)
            self.server_version = tuple([int(x) for x in m.groups()])
        return self.server_version
+8 −0
Original line number Diff line number Diff line
@@ -56,6 +56,14 @@ class OracleChecks(unittest.TestCase):
        self.assertEqual(connection.connection.encoding, "UTF-8")
        self.assertEqual(connection.connection.nencoding, "UTF-8")

class MySQLTests(TestCase):
    @unittest.skipUnless(connection.vendor == 'mysql',
                        "Test valid only for MySQL")
    def test_server_version_connections(self):
        connection.close()
        connection.get_server_version()
        self.assertTrue(connection.connection is None)

class DateQuotingTest(TestCase):

    def test_django_date_trunc(self):