diff --git a/.gitignore b/.gitignore index 6ff35448..df0ddeef 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ commit.txt *.diff dist/ build/ +mysql-vendor/ MANIFEST cpy_server*/ *_output.txt diff --git a/.gitmodules b/.gitmodules index 74fe0f2f..1765f49b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cpyint"] path = cpyint url = ../connector-python-internal.git - branch = master + branch = master-2.1 diff --git a/CHANGES.txt b/CHANGES.txt index 1209accc..28f50747 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,14 +3,67 @@ MySQL Connector/Python 2.1 - Release Notes & Changes ==================================================== MySQL Connector/Python -Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. Full release notes: http://dev.mysql.com/doc/relnotes/connector-python/en/ +v2.1.8 +====== + +- WL#11680: Add caching_sha2_password authentication plugin +- BUG#27945883: Fixes for failing unittest with MySQL latest versions +- BUG#27371245: Connection fails on unsupported default's auth_plugin +- BUG#26484601: Unable to connect to a server using other than TLSv1 + +v2.1.7 +====== + +- BUG#26376334: Fix prepared statements in MySQL 8.0 +- BUG#25965922: Add support for Django 1.11 +- BUG#24659561: Fix MySQLCursor.executemany() when using utf8mb4 charset +- BUG#24342757: Fix unclosed socket on connection failure +- BUG#22880163: Fix memory leak on using Named Tuple Cursors +- BUG#22825962: Fix memory leak on escape_string() +- BUG#22564149: Fix cmd_query_iter() when using bytestrings with Python 2 +- BUG#21947091: Add ssl_disabled option + +v2.1.6 +====== + +- BUG#25726671: Fix compatibility issues with the latest Django versions +- BUG#25558885: Set default connection timeout to pure connector/python +- BUG#25397650: Verify server certificate only if ssl_verify_cert is True +- BUG#25589496: Don't convert to unicode if non-ascii data is present +- BUG#25383644: Add connection back to pool on exception +- BUG#22476689: Importing world.sql fails with cext enabled +- BUG#20736339: Expect multiple include directories from mysql_config +- BUG#19685386: C extension tests are failing using MySQL 5.7.4 + +v2.1.5 +====== + +- BUG#25111218: Fix duplicate logic for reading EOF packet +- BUG#21656282: Connection fails using unicode passwords with C extension +- BUG#21530841: Select statement fails for results with more than 4096 columns +- BUG#21530100: Fix reading option files +- BUG#21477493: Fix RE_SQL_INSERT_STMT to correctly match Insert Statement +- BUG#21476495: Fix set_charset_collation() for an invalid charset provided + v2.1.4 ====== +- BUG#22873551: Fix cleartext authentication issue +- BUG#22545879: Fix usage of --ssl-cipher option +- BUG#22529828: Fix potencial SQL injection +- BUG#21881038: Fix duplicate entry in CHANGES.txt +- BUG#21879914: Fix using SSL without key or certificate using C/Ext +- BUG#21879859: Fix consuming results after calling procedure +- BUG#21498719: Fix conversion of Python bytearray +- BUG#21449996: Fix LOAD DATA with compression turned on +- BUG#20834643: Attribute Error while promoting servers using MySQL Fabric +- BUG#20811802: Fix buffered named tuple cursor with CExtension +- BUG#20217174: Fix install command honouring --install-lib when given v2.1.3 ====== diff --git a/README.txt b/README.txt index 7fe3debf..eb5723e6 100644 --- a/README.txt +++ b/README.txt @@ -3,7 +3,7 @@ MySQL Connector/Python 2.1 ========================== MySQL Connector/Python -Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. License information can be found in the LICENSE.txt file. @@ -28,7 +28,7 @@ doubt, this particular copy of the software is released under the version 2 of the GNU General Public License. MySQL Connector/Python is brought to you by Oracle. -Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. License information can be found in the LICENSE.txt file. diff --git a/cpyint b/cpyint index 00975510..f77b8360 160000 --- a/cpyint +++ b/cpyint @@ -1 +1 @@ -Subproject commit 009755101c891c428ec390d3b1aeac216c90ba43 +Subproject commit f77b83600d2df418cae7da3b728a4a930419d02e diff --git a/examples/dates.py b/examples/dates.py index 23469b00..af599050 100644 --- a/examples/dates.py +++ b/examples/dates.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -82,6 +82,7 @@ def main(config): except (mysql.connector.errors.Error, TypeError) as exc: output.append("Failed inserting {0}\nError: {1}\n".format( data, exc)) + cursor.execute(stmt_drop) raise # Read the names again and print them diff --git a/examples/microseconds.py b/examples/microseconds.py index 396241cc..9c30a343 100644 --- a/examples/microseconds.py +++ b/examples/microseconds.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -95,7 +95,8 @@ def main(config): except: # Ignoring the fact that it was not there pass - + + cursor.execute("DROP TABLE IF EXISTS relay_laps") cursor.close() cnx.close() diff --git a/lib/cpy_distutils.py b/lib/cpy_distutils.py index e944ce65..463c304a 100644 --- a/lib/cpy_distutils.py +++ b/lib/cpy_distutils.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,15 +29,19 @@ from distutils.command.install_lib import install_lib from distutils.errors import DistutilsExecError from distutils.util import get_platform -from distutils.dir_util import copy_tree +from distutils.version import LooseVersion +from distutils.dir_util import copy_tree, mkpath +from distutils.sysconfig import get_python_lib, get_python_version from distutils import log from glob import glob import os import shlex import struct -from subprocess import Popen, PIPE, STDOUT +from subprocess import Popen, PIPE, STDOUT, check_call import sys import platform +import shutil + ARCH_64BIT = sys.maxsize > 2**32 # Works with Python 2.6 and greater py_arch = '64-bit' if ARCH_64BIT else '32-bit' @@ -45,6 +49,10 @@ CEXT_OPTIONS = [ ('with-mysql-capi=', None, "Location of MySQL C API installation or path to mysql_config"), + ('extra-compile-args=', None, + "Extra compile args"), + ('extra-link-args=', None, + "Extra link args") ] CEXT_STATIC_OPTIONS = [ @@ -125,7 +133,11 @@ def unix_lib_is64bit(lib_file): lib_file = mysqlclient_libs[-1] log.debug("# Using file command to test lib_file {0}".format(lib_file)) - prc = Popen(['file', '-L', lib_file], stdin=PIPE, stderr=STDOUT, + if platform.uname() == 'SunOS': + cmd_list = ['file', '-L', lib_file] + else: + cmd_list = ['file', '-L', lib_file] + prc = Popen(cmd_list, stdin=PIPE, stderr=STDOUT, stdout=PIPE) stdout = prc.communicate()[0] stdout = stdout.split(':')[1] @@ -136,21 +148,7 @@ def unix_lib_is64bit(lib_file): return False -def get_mysql_config_info(mysql_config): - """Get MySQL information using mysql_config tool - - Returns a dict. - """ - options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version'] - - cmd = [mysql_config] + [ "--{0}".format(opt) for opt in options ] - - try: - proc = Popen(cmd, stdout=PIPE, universal_newlines=True) - stdout, _ = proc.communicate() - except OSError as exc: - raise DistutilsExecError("Failed executing mysql_config: {0}".format( - str(exc))) +def parse_mysql_config_info(options, stdout): log.debug("# stdout: {0}".format(stdout)) info = {} for option, line in zip(options, stdout.split('\n')): @@ -164,21 +162,58 @@ def get_mysql_config_info(mysql_config): info['version'] = tuple([int(v) for v in ver.split('.')[0:3]]) libs = shlex.split(info['libs']) + if ',' in libs[1]: + libs.pop(1) info['lib_dir'] = libs[0].replace('-L', '') info['libs'] = [ lib.replace('-l', '') for lib in libs[1:] ] + if platform.uname()[0] == 'SunOS': + info['lib_dir'] = info['lib_dir'].replace('-R', '') + info['libs'] = [lib.replace('-R', '') for lib in info['libs']] log.debug("# info['libs']: ") for lib in info['libs']: log.debug("# {0}".format(lib)) libs = shlex.split(info['libs_r']) + if ',' in libs[1]: + libs.pop(1) info['lib_r_dir'] = libs[0].replace('-L', '') info['libs_r'] = [ lib.replace('-l', '') for lib in libs[1:] ] + info['include'] = [x.strip() for x in info['include'].split('-I')[1:]] + + return info + + +def get_mysql_config_info(mysql_config): + """Get MySQL information using mysql_config tool + + Returns a dict. + """ + options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version'] - info['include'] = info['include'].replace('-I', '') + cmd = [mysql_config] + [ "--{0}".format(opt) for opt in options ] + + try: + proc = Popen(cmd, stdout=PIPE, universal_newlines=True) + stdout, _ = proc.communicate() + except OSError as exc: + raise DistutilsExecError("Failed executing mysql_config: {0}".format( + str(exc))) + + info = parse_mysql_config_info(options, stdout) # Try to figure out the architecture info['arch'] = None if os.name == 'posix': - pathname = os.path.join(info['lib_dir'], 'lib' + info['libs'][0]) + '*' + if platform.uname()[0] == 'SunOS': + print("info['lib_dir']: {0}".format(info['lib_dir'])) + print("info['libs'][0]: {0}".format(info['libs'][0])) + pathname = os.path.abspath(os.path.join(info['lib_dir'], + 'lib', + info['libs'][0])) + '/*' + else: + pathname = os.path.join(info['lib_dir'], + 'lib' + info['libs'][0]) + '*' + print("# Looking mysqlclient_lib at path: {0}".format(pathname)) + log.debug("# searching mysqlclient_lib at: %s", pathname) libs = glob(pathname) mysqlclient_libs = [] for filepath in libs: @@ -198,7 +233,12 @@ def get_mysql_config_info(mysql_config): log.debug("#+ {0}".format(mysqlclient_lib)) log.debug("# tested mysqlclient_lib[-1]: " "{0}".format(mysqlclient_libs[-1])) - proc = Popen(['file', '-L', mysqlclient_libs[-1]], stdout=PIPE, + if platform.uname()[0] == 'SunOS': + print("mysqlclient_lib: {0}".format(mysqlclient_libs[-1])) + cmd_list = ['file', mysqlclient_libs[-1]] + else: + cmd_list = ['file', '-L', mysqlclient_libs[-1]] + proc = Popen(cmd_list, stdout=PIPE, universal_newlines=True) stdout, _ = proc.communicate() stdout = stdout.split(':')[1] @@ -251,6 +291,8 @@ class BuildExtDynamic(build_ext): def initialize_options(self): build_ext.initialize_options(self) + self.extra_compile_args = None + self.extra_link_args = None self.with_mysql_capi = None def _finalize_connector_c(self, connc_loc): @@ -280,22 +322,21 @@ def _finalize_connector_c(self, connc_loc): log.debug("# connc_loc: {0}".format(connc_loc)) else: # Probably using MS Windows - myconfigh = os.path.join(connc_loc, 'include', 'my_config.h') + myversionh = os.path.join(connc_loc, 'include', + 'mysql_version.h') - if not os.path.exists(myconfigh): + if not os.path.exists(myversionh): log.error("MySQL C API installation invalid " - "(my_config.h not found)") + "(mysql_version.h not found)") sys.exit(1) else: - with open(myconfigh, 'rb') as fp: + with open(myversionh, 'rb') as fp: for line in fp.readlines(): - if b'#define VERSION' in line: - version = tuple([ - int(v) for v in - line.split()[2].replace( - b'"', b'').split(b'.') - ]) - if version < min_version: + if b'#define LIBMYSQL_VERSION' in line: + version = LooseVersion( + line.split()[2].replace(b'"', b'').decode() + ).version + if tuple(version) < min_version: log.error(err_version); sys.exit(1) break @@ -316,7 +357,7 @@ def _finalize_connector_c(self, connc_loc): else: raise OSError("Unsupported platform: %s" % os.name) - include_dir = os.path.join(connc_loc, 'include') + include_dirs = [os.path.join(connc_loc, 'include')] if os.name == 'nt': libraries = ['libmysql'] else: @@ -341,28 +382,26 @@ def _finalize_connector_c(self, connc_loc): log.error(err_version) sys.exit(1) - include_dir = myc_info['include'] + include_dirs = myc_info['include'] libraries = myc_info['libs'] library_dirs = myc_info['lib_dir'] self._mysql_config_info = myc_info self.arch = self._mysql_config_info['arch'] connc_64bit = self.arch == 'x86_64' - if not os.path.exists(include_dir): - log.error(err_invalid_loc, connc_loc) - sys.exit(1) + for include_dir in include_dirs: + if not os.path.exists(include_dir): + log.error(err_invalid_loc, connc_loc) + sys.exit(1) # Set up the build_ext class - self.include_dirs.append(include_dir) + self.include_dirs.extend(include_dirs) self.libraries.extend(libraries) self.library_dirs.append(library_dirs) # We try to offer a nice message when the architecture of Python # is not the same as MySQL Connector/C binaries. - py_arch = '64-bit' if ARCH_64BIT else '32-bit' - log.debug("# Python architecture: {0}".format(py_arch)) - log.debug("# Python ARCH_64BIT: {0}".format(ARCH_64BIT)) - log.debug("# self.arch: {0}".format(self.arch)) + print("# self.arch: {0}".format(self.arch)) if ARCH_64BIT != connc_64bit: log.error("Python is {0}, but does not " "match MySQL C API {1} architecture, " @@ -373,22 +412,26 @@ def _finalize_connector_c(self, connc_loc): sys.exit(1) def finalize_options(self): - self.set_undefined_options('install', - ('with_mysql_capi', 'with_mysql_capi')) + self.set_undefined_options( + 'install', + ('extra_compile_args', 'extra_compile_args'), + ('extra_link_args', 'extra_link_args'), + ('with_mysql_capi', 'with_mysql_capi')) build_ext.finalize_options(self) + print("# Python architecture: {0}".format(py_arch)) + print("# Python ARCH_64BIT: {0}".format(ARCH_64BIT)) + if self.with_mysql_capi: self._finalize_connector_c(self.with_mysql_capi) def fix_compiler(self): - platform = get_platform() - cc = self.compiler if not cc: return - if 'macosx-10.9' in platform: + if 'macosx-10.9' in get_platform(): for needle in ['-mno-fused-madd']: try: cc.compiler.remove(needle) @@ -422,6 +465,14 @@ def fix_compiler(self): # Add system headers to Extensions extra_compile_args sysheaders = [ '-isystem' + dir for dir in cc.include_dirs] for ext in self.extensions: + # Add extra compile args + if self.extra_compile_args: + ext.extra_compile_args.extend(self.extra_compile_args.split()) + # Add extra link args + if self.extra_link_args and ext.name == "_mysql_connector": + extra_link_args = self.extra_link_args.split() + ext.extra_link_args.extend(extra_link_args) + # Add system headers for sysheader in sysheaders: if sysheader not in ext.extra_compile_args: ext.extra_compile_args.append(sysheader) @@ -434,8 +485,16 @@ def run(self): """Run the command""" if not self.with_mysql_capi: return - if os.name == 'nt': + for ext in self.extensions: + # Use the multithread, static version of the run-time library + ext.extra_compile_args.append("/MT") + # Add extra compile args + if self.extra_compile_args: + ext.extra_compile_args.extend(self.extra_compile_args.split()) + # Add extra link args + if self.extra_link_args: + ext.extra_link_args.extend(self.extra_link_args.split()) build_ext.run(self) else: self.real_build_extensions = self.build_extensions @@ -452,11 +511,27 @@ class BuildExtStatic(BuildExtDynamic): user_options = build_ext.user_options + CEXT_OPTIONS def finalize_options(self): + install_obj = self.distribution.get_command_obj('install') + install_obj.with_mysql_capi = self.with_mysql_capi + install_obj.extra_compile_args = self.extra_compile_args + install_obj.extra_link_args = self.extra_link_args + install_obj.static = True + + options_pairs = [] + if not self.extra_compile_args: + options_pairs.append(('extra_compile_args', 'extra_compile_args')) + if not self.extra_link_args: + options_pairs.append(('extra_link_args', 'extra_link_args')) if not self.with_mysql_capi: - self.set_undefined_options('install', - ('with_mysql_capi', 'with_mysql_capi')) + options_pairs.append(('with_mysql_capi', 'with_mysql_capi')) + if options_pairs: + self.set_undefined_options('install', *options_pairs) build_ext.finalize_options(self) + + print("# Python architecture: {0}".format(py_arch)) + print("# Python ARCH_64BIT: {0}".format(ARCH_64BIT)) + self.connc_lib = os.path.join(self.build_temp, 'connc', 'lib') self.connc_include = os.path.join(self.build_temp, 'connc', 'include') @@ -480,7 +555,10 @@ def _finalize_connector_c(self, connc_loc): lib_file_path = os.path.join(self.connc_lib, lib_file) if os.path.isfile(lib_file_path) and not lib_file.endswith('.a'): os.unlink(os.path.join(self.connc_lib, lib_file)) - + elif os.name == 'nt': + self.include_dirs.extend([self.connc_include]) + self.libraries.extend(['libmysql']) + self.library_dirs.extend([self.connc_lib]) def fix_compiler(self): BuildExtDynamic.fix_compiler(self) @@ -492,7 +570,8 @@ def fix_compiler(self): if os.name == 'posix': include_dirs.append(self.connc_include) library_dirs.append(self.connc_lib) - libraries.append("mysqlclient") + if self.with_mysql_capi: + libraries.append("mysqlclient") # As we statically link and the "libmysqlclient.a" library # carry no information what it depends on, we need to @@ -504,6 +583,12 @@ def fix_compiler(self): ext.include_dirs.extend(include_dirs) ext.library_dirs.extend(library_dirs) ext.libraries.extend(libraries) + # Add extra compile args + if self.extra_compile_args: + ext.extra_compile_args.extend(self.extra_compile_args.split()) + # Add extra link args + if self.extra_link_args: + ext.extra_link_args.extend(self.extra_link_args.split()) class InstallLib(install_lib): @@ -524,16 +609,26 @@ def finalize_options(self): def run(self): self.build() - outfiles = self.install() + outfiles = [ + filename for filename in self.install() if filename.endswith(".py") + ] # (Optionally) compile .py to .pyc if outfiles is not None and self.distribution.has_pure_modules(): self.byte_compile(outfiles) if self.byte_code_only: + if get_python_version().startswith("3"): + for base, _, files in os.walk(self.install_dir): + for filename in files: + if filename.endswith(".pyc"): + new_name = "{0}.pyc".format(filename.split(".")[0]) + os.rename(os.path.join(base, filename), + os.path.join(base, "..", new_name)) + for base, _, files in os.walk(self.install_dir): + if base.endswith("__pycache__"): + os.rmdir(base) for source_file in outfiles: - if os.path.join('mysql', '__init__.py') in source_file: - continue log.info("Removing %s", source_file) os.remove(source_file) @@ -552,23 +647,27 @@ class Install(install): def initialize_options(self): install.initialize_options(self) + self.extra_compile_args = None + self.extra_link_args = None self.with_mysql_capi = None self.byte_code_only = None self.static = None def finalize_options(self): if self.static: - log.info("Linking CExtension statically with MySQL libraries") + log.info("Linking C Extension statically with libraries") self.distribution.cmdclass['build_ext'] = BuildExtStatic if self.byte_code_only is None: self.byte_code_only = False + build_ext_obj = self.distribution.get_command_obj('build_ext') + build_ext_obj.with_mysql_capi = self.with_mysql_capi + build_ext_obj.extra_compile_args = self.extra_compile_args + build_ext_obj.extra_link_args = self.extra_link_args + build_ext_obj.static = self.static + if self.with_mysql_capi: - build_ext = self.distribution.get_command_obj('build_ext') - build_ext.with_mysql_capi = self.with_mysql_capi - build = self.distribution.get_command_obj('build_ext') - build.with_mysql_capi = self.with_mysql_capi self.need_ext = True if not self.need_ext: @@ -578,7 +677,7 @@ def finalize_options(self): def run(self): if not self.need_ext: - log.info("Not Installing C Extension") + log.info("Not Installing MySQL C Extension") else: - log.info("Installing C Extension") + log.info("Installing MySQL C Extension") install.run(self) diff --git a/lib/mysql/connector/__init__.py b/lib/mysql/connector/__init__.py index 8a2428ed..f7e2c8ba 100644 --- a/lib/mysql/connector/__init__.py +++ b/lib/mysql/connector/__init__.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -175,8 +175,7 @@ def connect(*args, **kwargs): if HAVE_CEXT and not use_pure: return CMySQLConnection(*args, **kwargs) - else: - return MySQLConnection(*args, **kwargs) + return MySQLConnection(*args, **kwargs) Connect = connect # pylint: disable=C0103 __version_info__ = version.VERSION diff --git a/lib/mysql/connector/abstracts.py b/lib/mysql/connector/abstracts.py index 6bbd2c11..ad7b6fbe 100644 --- a/lib/mysql/connector/abstracts.py +++ b/lib/mysql/connector/abstracts.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -26,6 +26,7 @@ from abc import ABCMeta, abstractmethod, abstractproperty import re import time +import weakref from .catch23 import make_abc, BYTE_TYPES from .conversion import MySQLConverterBase @@ -33,6 +34,8 @@ from .optionfiles import MySQLOptionsParser from . import errors +NAMED_TUPLE_CACHE = weakref.WeakValueDictionary() + @make_abc(ABCMeta) class MySQLConnectionAbstract(object): @@ -57,12 +60,13 @@ def __init__(self, **kwargs): self._client_host = '' self._client_port = 0 self._ssl = {} + self._ssl_disabled = DEFAULT_CONFIGURATION["ssl_disabled"] self._force_ipv6 = False self._use_unicode = True self._get_warnings = False self._raise_on_warnings = False - self._connection_timeout = None + self._connection_timeout = DEFAULT_CONFIGURATION["connect_timeout"] self._buffered = False self._unread_result = False self._have_next_result = False @@ -127,7 +131,7 @@ def _read_option_files(self, config): config_options[option][1] <= value[1]): config_options[option] = value except KeyError: - if group is 'connector_python': + if group == 'connector_python': raise AttributeError("Unsupported argument " "'{0}'".format(option)) except KeyError: @@ -231,6 +235,13 @@ def config(self, **kwargs): except KeyError: self._consume_results = False + # Configure auth_plugin + try: + self._auth_plugin = config['auth_plugin'] + del config['auth_plugin'] + except KeyError: + self._auth_plugin = '' + # Configure character set and collation if 'charset' in config or 'collation' in config: try: @@ -284,6 +295,10 @@ def config(self, **kwargs): password = self._password self.set_login(user, password) + # Configure host information + if 'host' in config and config['host']: + self._host = config['host'] + # Check network locations try: self._port = int(config['port']) @@ -294,6 +309,9 @@ def config(self, **kwargs): raise errors.InterfaceError( "TCP/IP port number should be an integer") + if "ssl_disabled" in config: + self._ssl_disabled = config.pop("ssl_disabled") + # Other configuration set_ssl_flag = False for key, value in config.items(): @@ -334,7 +352,6 @@ def config(self, **kwargs): "ssl_key and ssl_cert need to be both " "set, or neither." ) - self.set_client_flags([ClientFlag.SSL]) def _check_server_version(self, server_version): """Check the MySQL version @@ -612,8 +629,7 @@ def python_charset(self): encoding = CharacterSet.get_info(self._charset_id)[0] if encoding in ('utf8mb4', 'binary'): return 'utf8' - else: - return encoding + return encoding def set_charset_collation(self, charset=None, collation=None): """Sets the character set and collation for the current connection @@ -634,7 +650,6 @@ def set_charset_collation(self, charset=None, collation=None): """ if charset: if isinstance(charset, int): - self._charset_id = charset (self._charset_id, charset_name, collation_name) = \ CharacterSet.get_charset_info(charset) elif isinstance(charset, str): @@ -709,7 +724,7 @@ def connect(self, **kwargs): arguments are given, it will use the already configured or default values. """ - if len(kwargs) > 0: + if kwargs: self.config(**kwargs) self.disconnect() @@ -1037,7 +1052,7 @@ def execute(self, operation, params=(), multi=False): pass @abstractmethod - def executemany(self, operation, seqparams): + def executemany(self, operation, seq_params): """Execute the given operation multiple times The executemany() method will execute the operation iterating diff --git a/lib/mysql/connector/authentication.py b/lib/mysql/connector/authentication.py index 4d8cdb8d..acf6970b 100644 --- a/lib/mysql/connector/authentication.py +++ b/lib/mysql/connector/authentication.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -23,11 +23,11 @@ """Implementing support for MySQL Authentication Plugins""" -from hashlib import sha1 +from hashlib import sha1, sha256 import struct from . import errors -from .catch23 import PY2, isstr +from .catch23 import PY2, isstr, UNICODE_TYPES class BaseAuthPlugin(object): @@ -173,6 +173,82 @@ def prepare_password(self): return password + b'\x00' +class MySQLCachingSHA2PasswordAuthPlugin(BaseAuthPlugin): + """Class implementing the MySQL caching_sha2_password authentication plugin + + Note that encrypting using RSA is not supported since the Python + Standard Library does not provide this OpenSSL functionality. + """ + requires_ssl = False + plugin_name = 'caching_sha2_password' + perform_full_authentication = 4 + fast_auth_success = 3 + + def _scramble(self): + """ Returns a scramble of the password using a Nonce sent by the + server. + + The scramble is of the form: + XOR(SHA2(password), SHA2(SHA2(SHA2(password)), Nonce)) + """ + if not self._auth_data: + raise errors.InterfaceError("Missing authentication data (seed)") + + if not self._password: + return b'' + + password = self._password.encode('utf-8') \ + if isinstance(self._password, UNICODE_TYPES) else self._password + + if PY2: + password = buffer(password) # pylint: disable=E0602 + try: + auth_data = buffer(self._auth_data) # pylint: disable=E0602 + except TypeError: + raise errors.InterfaceError("Authentication data incorrect") + else: + password = password + auth_data = self._auth_data + + hash1 = sha256(password).digest() + hash2 = sha256() + hash2.update(sha256(hash1).digest()) + hash2.update(auth_data) + hash2 = hash2.digest() + if PY2: + xored = [ord(h1) ^ ord(h2) for (h1, h2) in zip(hash1, hash2)] + else: + xored = [h1 ^ h2 for (h1, h2) in zip(hash1, hash2)] + hash3 = struct.pack('32B', *xored) + + return hash3 + + def prepare_password(self): + if len(self._auth_data) > 1: + return self._scramble() + elif self._auth_data[0] == self.perform_full_authentication: + return self._full_authentication() + return None + + def _full_authentication(self): + """Returns password as as clear text""" + if not self._ssl_enabled: + raise errors.InterfaceError("{name} requires SSL".format( + name=self.plugin_name)) + + if not self._password: + return b'\x00' + password = self._password + + if PY2: + if isinstance(password, unicode): # pylint: disable=E0602 + password = password.encode('utf8') + elif isinstance(password, str): + password = password.encode('utf8') + + return password + b'\x00' + + def get_auth_plugin(plugin_name): """Return authentication class based on plugin name diff --git a/lib/mysql/connector/catch23.py b/lib/mysql/connector/catch23.py index 3efd41cc..2ed5d47c 100644 --- a/lib/mysql/connector/catch23.py +++ b/lib/mysql/connector/catch23.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -63,7 +63,6 @@ def init_bytearray(payload=b'', encoding='utf-8'): except AttributeError: raise ValueError("payload must be a str or bytes") - return bytearray(payload) @@ -71,15 +70,13 @@ def isstr(obj): """Returns whether a variable is a string""" if PY2: return isinstance(obj, basestring) - else: - return isinstance(obj, str) + return isinstance(obj, str) def isunicode(obj): """Returns whether a variable is a of unicode type""" if PY2: return isinstance(obj, unicode) - else: - return isinstance(obj, str) + return isinstance(obj, str) if PY2: diff --git a/lib/mysql/connector/connection.py b/lib/mysql/connector/connection.py index 453c73e6..87637613 100644 --- a/lib/mysql/connector/connection.py +++ b/lib/mysql/connector/connection.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,7 +29,7 @@ import time from .authentication import get_auth_plugin -from .catch23 import PY2, isstr +from .catch23 import PY2, isstr, UNICODE_TYPES from .constants import ( ClientFlag, ServerCmd, ServerFlag, flag_is_set, ShutdownType, NET_BUFFER_LENGTH @@ -78,7 +78,6 @@ def __init__(self, *args, **kwargs): self._use_unicode = True self._get_warnings = False self._raise_on_warnings = False - self._connection_timeout = None self._buffered = False self._unread_result = False self._have_next_result = False @@ -91,8 +90,14 @@ def __init__(self, *args, **kwargs): self._auth_plugin = None self._pool_config_version = None - if len(kwargs) > 0: - self.connect(**kwargs) + if kwargs: + try: + self.connect(**kwargs) + except: + # Tidy-up underlying socket on failure + self.close() + self._socket = None + raise def _do_handshake(self): """Get the handshake from the MySQL server""" @@ -110,6 +115,14 @@ def _do_handshake(self): self._server_version = self._check_server_version( handshake['server_version_original']) + if not handshake['capabilities'] & ClientFlag.SSL: + self._client_flags &= ~ClientFlag.SSL + if self._ssl.get('verify_cert'): + raise errors.InterfaceError("SSL is required but the server " + "doesn't support it", errno=2026) + elif not self._ssl_disabled: + self._client_flags |= ClientFlag.SSL + if handshake['capabilities'] & ClientFlag.PLUGIN_AUTH: self.set_client_flags([ClientFlag.PLUGIN_AUTH]) @@ -127,11 +140,16 @@ def _do_auth(self, username=None, password=None, database=None, reply back. Raises any error coming from MySQL. """ self._ssl_active = False - if client_flags & ClientFlag.SSL and ssl_options: + if client_flags & ClientFlag.SSL: packet = self._protocol.make_auth_ssl(charset=charset, client_flags=client_flags) self._socket.send(packet) - self._socket.switch_to_ssl(**ssl_options) + self._socket.switch_to_ssl(ssl_options.get('ca'), + ssl_options.get('cert'), + ssl_options.get('key'), + ssl_options.get('verify_cert') or False, + ssl_options.get('cipher'), + ssl_options.get('version', None)) self._ssl_active = True packet = self._protocol.make_auth( @@ -154,6 +172,8 @@ def _auth_switch_request(self, username=None, password=None): Raises NotSupportedError when we get the old, insecure password reply back. Raises any error coming from MySQL. """ + auth = None + new_auth_plugin = self._auth_plugin or self._handshake["auth_plugin"] packet = self._socket.recv() if packet[4] == 254 and len(packet) == 5: raise errors.NotSupportedError( @@ -169,12 +189,22 @@ def _auth_switch_request(self, username=None, password=None): response = auth.auth_response() self._socket.send(response) packet = self._socket.recv() - if packet[4] != 1: - return self._handle_ok(packet) - else: - auth_data = self._protocol.parse_auth_more_data(packet) + + if packet[4] == 1: + auth_data = self._protocol.parse_auth_more_data(packet) + auth = get_auth_plugin(new_auth_plugin)( + auth_data, password=password, ssl_enabled=self._ssl_active) + if new_auth_plugin == "caching_sha2_password": + response = auth.auth_response() + if response: + self._socket.send(response) + packet = self._socket.recv() + + if packet[4] == 0: + return self._handle_ok(packet) elif packet[4] == 255: raise errors.get_exception(packet) + return None def _get_connection(self, prtcls=None): """Get connection based on configuration @@ -191,6 +221,7 @@ def _get_connection(self, prtcls=None): conn = MySQLTCPSocket(host=self.server_host, port=self.server_port, force_ipv6=self._force_ipv6) + conn.set_connection_timeout(self._connection_timeout) return conn @@ -205,9 +236,11 @@ def _open_connection(self): self._socket = self._get_connection() self._socket.open_connection() self._do_handshake() + self._do_auth(self._user, self._password, self._database, self._client_flags, self._charset_id, self._ssl) + self.set_converter_class(self._converter_class) if self._client_flags & ClientFlag.COMPRESS: self._socket.recv = self._socket.recv_compressed @@ -231,9 +264,10 @@ def close(self): try: self.cmd_quit() - self._socket.close_connection() except (AttributeError, errors.Error): pass # Getting an exception would mean we are disconnected. + self._socket.close_connection() + disconnect = close def _send_cmd(self, command, argument=None, packet_number=0, packet=None, @@ -419,7 +453,7 @@ def get_row(self, binary=False, columns=None): Returns a tuple. """ (rows, eof) = self.get_rows(count=1, binary=binary, columns=columns) - if len(rows): + if rows: return (rows[0], eof) return (None, eof) @@ -437,17 +471,23 @@ def get_rows(self, count=None, binary=False, columns=None): try: if binary: + charset = self.charset + if charset == 'utf8mb4': + charset = 'utf8' rows = self._protocol.read_binary_result( - self._socket, columns, count) + self._socket, columns, count, charset) else: - rows = self._protocol.read_text_result(self._socket, self._server_version, count=count) + rows = self._protocol.read_text_result(self._socket, + self._server_version, + count=count) except errors.Error as err: self.unread_result = False raise err if rows[-1] is not None: - ek = rows[-1] # OK or EOF - self._handle_server_status(ek['status_flag'] if 'status_flag' in ek else ek['server_status']) + row = rows[-1] # OK or EOF + self._handle_server_status(row['status_flag'] if 'status_flag' in + row else row['server_status']) self.unread_result = False return rows @@ -513,10 +553,9 @@ def cmd_query_iter(self, statements): Returns a generator. """ if not isinstance(statements, bytearray): - if isstr(statements): - statements = bytearray(statements.encode('utf-8')) - else: - statements = bytearray(statements) + if isstr(statements) and isinstance(statements, UNICODE_TYPES): + statements = statements.encode('utf8') + statements = bytearray(statements) # Handle the first query result yield self._handle_result(self._send_cmd(ServerCmd.QUERY, statements)) @@ -929,6 +968,17 @@ def _handle_binary_result(self, packet): eof = self._handle_eof(self._socket.recv()) return (column_count, columns, eof) + def cmd_stmt_fetch(self, statement_id, rows=1): + """Fetch a MySQL statement Result Set + + This method will send the FETCH command to MySQL together with the + given statement id and the number of rows to fetch. + """ + packet = self._protocol.make_stmt_fetch(statement_id, rows) + self.unread_result = False + self._send_cmd(ServerCmd.STMT_FETCH, packet, expect_response=False) + self.unread_result = True + def cmd_stmt_prepare(self, statement): """Prepare a MySQL statement diff --git a/lib/mysql/connector/connection_cext.py b/lib/mysql/connector/connection_cext.py index 9c00a9ac..734af9bd 100644 --- a/lib/mysql/connector/connection_cext.py +++ b/lib/mysql/connector/connection_cext.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -54,6 +54,7 @@ HAVE_CMYSQL = True # pylint: enable=F0401,C0413 + class CMySQLConnection(MySQLConnectionAbstract): """Class initiating a MySQL Connection using Connector/C""" @@ -64,12 +65,11 @@ def __init__(self, **kwargs): raise RuntimeError( "MySQL Connector/Python C Extension not available") self._cmysql = None - self._connection_timeout = 2 self._columns = [] self.converter = None super(CMySQLConnection, self).__init__(**kwargs) - if len(kwargs) > 0: + if kwargs: self.connect(**kwargs) def _do_handshake(self): @@ -139,12 +139,11 @@ def in_transaction(self): def _open_connection(self): charset_name = CharacterSet.get_info(self._charset_id)[0] - - self._cmysql = _mysql_connector.MySQL( + self._cmysql = _mysql_connector.MySQL( # pylint: disable=E1101,I1101 buffered=self._buffered, raw=self._raw, charset_name=charset_name, - connection_timeout=int(self._connection_timeout or 10), + connection_timeout=(self._connection_timeout or 0), use_unicode=self._use_unicode, auth_plugin=self._auth_plugin) @@ -159,12 +158,13 @@ def _open_connection(self): 'compress': self.isset_client_flag(ClientFlag.COMPRESS) } - if self.isset_client_flag(ClientFlag.SSL): + if not self._ssl_disabled: cnx_kwargs.update({ - 'ssl_ca': self._ssl['ca'], - 'ssl_cert': self._ssl['cert'], - 'ssl_key': self._ssl['key'], - 'ssl_verify_cert': self._ssl['verify_cert'] + 'ssl_ca': self._ssl.get('ca'), + 'ssl_cert': self._ssl.get('cert'), + 'ssl_key': self._ssl.get('key'), + 'ssl_verify_cert': self._ssl.get('verify_cert') or False, + 'ssl_disabled': self._ssl_disabled }) try: @@ -355,7 +355,7 @@ def fetch_eof_status(self): 'field_count': self._cmysql.st_field_count(), 'insert_id': self._cmysql.insert_id(), 'affected_rows': self._cmysql.affected_rows(), - 'server_status': self._server_status, + 'status_flag': self._server_status, } return None @@ -534,6 +534,7 @@ def cmd_change_user(self, username='', password='', database='', self._charset_id = charset self._post_connection() + return self.fetch_eof_status() def cmd_refresh(self, options): """Send the Refresh command to the MySQL server""" diff --git a/lib/mysql/connector/constants.py b/lib/mysql/connector/constants.py index 8d27cb03..85e3f3a3 100644 --- a/lib/mysql/connector/constants.py +++ b/lib/mysql/connector/constants.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -57,6 +57,8 @@ 'ssl_key': None, 'ssl_verify_cert': False, 'ssl_cipher': None, + 'ssl_disabled': False, + 'ssl_version': None, 'passwd': None, 'db': None, 'connect_timeout': None, @@ -102,10 +104,10 @@ def get_desc(cls, name): return None @classmethod - def get_info(cls, num): + def get_info(cls, setid): """Get information about given constant""" for name, info in cls.desc.items(): - if info[0] == num: + if info[0] == setid: return name return None @@ -158,6 +160,7 @@ class FieldType(_Constants): NEWDATE = 0x0e VARCHAR = 0x0f BIT = 0x10 + JSON = 0xf5 NEWDECIMAL = 0xf6 ENUM = 0xf7 SET = 0xf8 @@ -187,6 +190,7 @@ class FieldType(_Constants): 'NEWDATE': (0x0e, 'NEWDATE'), 'VARCHAR': (0x0f, 'VARCHAR'), 'BIT': (0x10, 'BIT'), + 'JSON': (0xf5, 'JSON'), 'NEWDECIMAL': (0xf6, 'NEWDECIMAL'), 'ENUM': (0xf7, 'ENUM'), 'SET': (0xf8, 'SET'), @@ -472,6 +476,11 @@ class ServerFlag(_Flags): STATUS_LAST_ROW_SENT = 1 << 7 STATUS_DB_DROPPED = 1 << 8 STATUS_NO_BACKSLASH_ESCAPES = 1 << 9 + SERVER_STATUS_METADATA_CHANGED = 1 << 10 + SERVER_QUERY_WAS_SLOW = 1 << 11 + SERVER_PS_OUT_PARAMS = 1 << 12 + SERVER_STATUS_IN_TRANS_READONLY = 1 << 13 + SERVER_SESSION_STATE_CHANGED = 1 << 14 desc = { 'SERVER_STATUS_IN_TRANS': (1 << 0, @@ -483,10 +492,31 @@ class ServerFlag(_Flags): 'next query exists'), 'SERVER_QUERY_NO_GOOD_INDEX_USED': (1 << 4, ''), 'SERVER_QUERY_NO_INDEX_USED': (1 << 5, ''), - 'SERVER_STATUS_CURSOR_EXISTS': (1 << 6, ''), - 'SERVER_STATUS_LAST_ROW_SENT': (1 << 7, ''), + 'SERVER_STATUS_CURSOR_EXISTS': (1 << 6, + 'Set when server opened a read-only ' + 'non-scrollable cursor for a query.'), + 'SERVER_STATUS_LAST_ROW_SENT': (1 << 7, + 'Set when a read-only cursor is ' + 'exhausted'), 'SERVER_STATUS_DB_DROPPED': (1 << 8, 'A database was dropped'), 'SERVER_STATUS_NO_BACKSLASH_ESCAPES': (1 << 9, ''), + 'SERVER_STATUS_METADATA_CHANGED': (1024, + 'Set if after a prepared statement ' + 'reprepare we discovered that the ' + 'new statement returns a different ' + 'number of result set columns.'), + 'SERVER_QUERY_WAS_SLOW': (2048, ''), + 'SERVER_PS_OUT_PARAMS': (4096, + 'To mark ResultSet containing output ' + 'parameter values.'), + 'SERVER_STATUS_IN_TRANS_READONLY': (8192, + 'Set if multi-statement ' + 'transaction is a read-only ' + 'transaction.'), + 'SERVER_SESSION_STATE_CHANGED': (1 << 14, + 'Session state has changed on the ' + 'server because of the execution of ' + 'the last statement'), } @@ -592,7 +622,7 @@ def get_info(cls, setid): "Character set '{0}' unsupported".format(setid)) @classmethod - def get_desc(cls, setid): + def get_desc(cls, name): """Retrieves character set information as string using an ID Retrieves character set and collation information based on the @@ -601,7 +631,7 @@ def get_desc(cls, setid): Returns a tuple. """ try: - return "%s/%s" % cls.get_info(setid) + return "%s/%s" % cls.get_info(name) except: raise @@ -686,7 +716,7 @@ def get_supported(cls): return tuple(res) -class SQLMode(_Constants): # pylint: disable=R0921 +class SQLMode(_Constants): """MySQL SQL Modes The numeric values of SQL Modes are not interesting, only the names @@ -734,7 +764,7 @@ def get_desc(cls, name): raise NotImplementedError @classmethod - def get_info(cls, number): + def get_info(cls, setid): raise NotImplementedError @classmethod diff --git a/lib/mysql/connector/conversion.py b/lib/mysql/connector/conversion.py index d94e9e99..706c6b3d 100644 --- a/lib/mysql/connector/conversion.py +++ b/lib/mysql/connector/conversion.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -95,9 +95,9 @@ def to_python(self, vtype, value): except KeyError: return value - def escape(self, buf): + def escape(self, value): """Escape buffer for sending to MySQL""" - return buf + return value def quote(self, buf): """Quote buffer for sending to MySQL""" @@ -163,14 +163,11 @@ def quote(self, buf): if PY2: if isinstance(buf, float): return repr(buf) - else: - return str(buf) - else: - return str(buf).encode('ascii') + return str(buf) + return str(buf).encode('ascii') elif isinstance(buf, type(None)): return bytearray(b"NULL") - else: - return bytearray(b"'" + buf + b"'") + return bytearray(b"'" + buf + b"'") def to_mysql(self, value): """Convert Python data type to MySQL""" @@ -257,8 +254,7 @@ def _bool_to_mysql(self, value): """Convert value to boolean""" if value: return 1 - else: - return 0 + return 0 def _nonetype_to_mysql(self, value): """ @@ -358,8 +354,7 @@ def _timedelta_to_mysql(self, value): if PY2: return result - else: - return result.encode('ascii') + return result.encode('ascii') def _decimal_to_mysql(self, value): """ @@ -547,6 +542,61 @@ def _SET_to_python(self, value, dsc=None): # pylint: disable=C0103 raise ValueError("Could not convert set %s to a sequence." % value) return set_type + def _JSON_to_python(self, value, dsc=None): # pylint: disable=C0103 + """Returns JSON column type as python type + + Returns JSON column type as python type. + """ + try: + num = float(value) + if num.is_integer(): + return int(value) + return num + except ValueError: + pass + + if value == b'true': + return True + elif value == b'false': + return False + + # The following types are returned between double quotes or + # bytearray(b'"')[0] or int 34 for shortness. + if value[0] == 34 and value[-1] == 34: + value_nq = value[1:-1] + + value_datetime = self._DATETIME_to_python(value_nq) + if value_datetime is not None: + return value_datetime + + value_date = self._DATE_to_python(value_nq) + if value_date is not None: + return value_date + try: + value_time = self._TIME_to_python(value_nq) + if value_time is not None: + return value_time + except ValueError: + pass + + if isinstance(value, (bytes, bytearray)): + return value.decode(self.charset) + + if dsc is not None: + # Check if we deal with a SET + if dsc[7] & FieldFlag.SET: + return self._SET_to_python(value, dsc) + if dsc[7] & FieldFlag.BINARY: + if self.charset != 'binary': + try: + return value.decode(self.charset) + except (LookupError, UnicodeDecodeError): + return value + else: + return value + + return self._STRING_to_python(value, dsc) + def _STRING_to_python(self, value, dsc=None): # pylint: disable=C0103 """ Note that a SET is a string too, but using the FieldFlag we can see @@ -559,7 +609,13 @@ def _STRING_to_python(self, value, dsc=None): # pylint: disable=C0103 if dsc[7] & FieldFlag.SET: return self._SET_to_python(value, dsc) if dsc[7] & FieldFlag.BINARY: - return value + if self.charset != 'binary': + try: + return value.decode(self.charset) + except (LookupError, UnicodeDecodeError): + return value + else: + return value if self.charset == 'binary': return value @@ -576,11 +632,10 @@ def _BLOB_to_python(self, value, dsc=None): # pylint: disable=C0103 if dsc[7] & FieldFlag.BINARY: if PY2: return value - else: - return bytes(value) + return bytes(value) return self._STRING_to_python(value, dsc) - _LONG_BLOB_to_python = _BLOB_to_python + _LONG_BLOB_to_python = _JSON_to_python _MEDIUM_BLOB_to_python = _BLOB_to_python _TINY_BLOB_to_python = _BLOB_to_python diff --git a/lib/mysql/connector/cursor.py b/lib/mysql/connector/cursor.py index 7cc73627..4b4d3bca 100644 --- a/lib/mysql/connector/cursor.py +++ b/lib/mysql/connector/cursor.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,8 +29,9 @@ import weakref from . import errors -from .abstracts import MySQLCursorAbstract +from .abstracts import MySQLCursorAbstract, NAMED_TUPLE_CACHE from .catch23 import PY2 +from .constants import ServerFlag SQL_COMMENT = r"\/\*.*?\*\/" RE_SQL_COMMENT = re.compile( @@ -40,10 +41,19 @@ r'''\s*ON\s+DUPLICATE\s+KEY(?:[^"'`]*["'`][^"'`]*["'`])*[^"'`]*$''', re.I | re.M | re.S) RE_SQL_INSERT_STMT = re.compile( - r"({0}|\s)*INSERT({0}|\s)*INTO.+VALUES.*".format(SQL_COMMENT), + r"({0}|\s)*INSERT({0}|\s)*INTO\s+[`'\"]?.+[`'\"]?(?:\.[`'\"]?.+[`'\"]?)" + r"{{0,2}}\s+VALUES\s*\(.+(?:\s*,.+)*\)".format(SQL_COMMENT), re.I | re.M | re.S) RE_SQL_INSERT_VALUES = re.compile(r'.*VALUES\s*(\(.*\)).*', re.I | re.M | re.S) RE_PY_PARAM = re.compile(b'(%s)') +RE_PY_MAPPING_PARAM = re.compile( + br''' + % + \((?P[^)]+)\) + (?P[diouxXeEfFgGcrs%]) + ''', + re.X +) RE_SQL_SPLIT_STMTS = re.compile( b''';(?=(?:[^"'`]*["'`][^"'`]*["'`])*[^"'`]*$)''') RE_SQL_FIND_PARAM = re.compile( @@ -51,6 +61,7 @@ ERR_NO_RESULT_TO_FETCH = "No result set to fetch from" +MAX_RESULTS = 4294967295 class _ParamSubstitutor(object): """ @@ -75,6 +86,41 @@ def remaining(self): return len(self.params) - self.index +def _bytestr_format_dict(bytestr, value_dict): + """ + >>> _bytestr_format_dict(b'%(a)s', {b'a': b'foobar'}) + b'foobar + >>> _bytestr_format_dict(b'%%(a)s', {b'a': b'foobar'}) + b'%%(a)s' + >>> _bytestr_format_dict(b'%%%(a)s', {b'a': b'foobar'}) + b'%%foobar' + >>> _bytestr_format_dict(b'%(x)s %(y)s', + ... {b'x': b'x=%(y)s', b'y': b'y=%(x)s'}) + b'x=%(y)s y=%(x)s' + """ + def replace(matchobj): + """Replace pattern.""" + value = None + groups = matchobj.groupdict() + if groups["conversion_type"] == b"%": + value = b"%" + if groups["conversion_type"] == b"s": + key = groups["mapping_key"] + value = value_dict[key] + if value is None: + raise ValueError("Unsupported conversion_type: {0}" + "".format(groups["conversion_type"])) + return bytes(value) if PY2 else value + + stmt = RE_PY_MAPPING_PARAM.sub(replace, bytestr) + if PY2: + try: + return stmt.decode("utf-8") + except UnicodeDecodeError: + pass + return stmt + + class CursorBase(MySQLCursorAbstract): """ Base for defining MySQLCursor. This class is a skeleton and defines @@ -142,7 +188,7 @@ def execute(self, operation, params=(), multi=False): """ pass - def executemany(self, operation, seqparams): + def executemany(self, operation, seq_params): """Execute the given operation multiple times The executemany() method will execute the operation iterating @@ -360,9 +406,9 @@ def _process_params_dict(self, params): conv = escape(conv) conv = quote(conv) if PY2: - res["%({0})s".format(key)] = conv + res[key] = conv else: - res["%({0})s".format(key).encode()] = conv + res[key.encode()] = conv except Exception as err: raise errors.ProgrammingError( "Failed processing pyformat-parameters; %s" % err) @@ -447,7 +493,7 @@ def _execute_iter(self, query_iter): i = 0 while True: - result = next(query_iter) + result = next(query_iter) # pylint: disable=R1708 self._reset_result() self._handle_result(result) try: @@ -497,8 +543,8 @@ def execute(self, operation, params=None, multi=False): if params is not None: if isinstance(params, dict): - for key, value in self._process_params_dict(params).items(): - stmt = stmt.replace(key, value) + stmt = _bytestr_format_dict( + stmt, self._process_params_dict(params)) elif isinstance(params, (list, tuple)): psub = _ParamSubstitutor(self._process_params(params)) stmt = RE_PY_PARAM.sub(psub, stmt) @@ -510,15 +556,15 @@ def execute(self, operation, params=None, multi=False): if multi: self._executed_list = [] return self._execute_iter(self._connection.cmd_query_iter(stmt)) - else: - try: - self._handle_result(self._connection.cmd_query(stmt)) - except errors.InterfaceError: - if self._connection._have_next_result: # pylint: disable=W0212 - raise errors.InterfaceError( - "Use multi=True when executing multiple statements") - raise - return None + + try: + self._handle_result(self._connection.cmd_query(stmt)) + except errors.InterfaceError: + if self._connection._have_next_result: # pylint: disable=W0212 + raise errors.InterfaceError( + "Use multi=True when executing multiple statements") + raise + return None def _batch_insert(self, operation, seq_params): """Implements multi row insert""" @@ -531,8 +577,7 @@ def remove_comments(match): """ if match.group(1): return "" - else: - return match.group(2) + return match.group(2) tmp = re.sub(RE_SQL_ON_DUPLICATE, '', re.sub(RE_SQL_COMMENT, remove_comments, operation)) @@ -543,16 +588,16 @@ def remove_comments(match): "Failed rewriting statement for multi-row INSERT. " "Check SQL syntax." ) - fmt = matches.group(1).encode(self._connection.charset) + fmt = matches.group(1).encode(self._connection.python_charset) values = [] try: - stmt = operation.encode(self._connection.charset) + stmt = operation.encode(self._connection.python_charset) for params in seq_params: tmp = fmt if isinstance(params, dict): - for key, value in self._process_params_dict(params).items(): - tmp = tmp.replace(key, value) + tmp = _bytestr_format_dict( + tmp, self._process_params_dict(params)) else: psub = _ParamSubstitutor(self._process_params(params)) tmp = RE_PY_PARAM.sub(psub, tmp) @@ -566,8 +611,7 @@ def remove_comments(match): stmt = stmt.replace(fmt, b','.join(values), 1) self._executed = stmt return stmt - else: - return None + return None except (UnicodeDecodeError, UnicodeEncodeError) as err: raise errors.ProgrammingError(str(err)) except errors.Error: @@ -612,7 +656,7 @@ def executemany(self, operation, seq_params): if re.match(RE_SQL_INSERT_STMT, operation): if not seq_params: self._rowcount = 0 - return + return None stmt = self._batch_insert(operation, seq_params) if stmt is not None: return self.execute(stmt) @@ -631,6 +675,7 @@ def executemany(self, operation, seq_params): # Raise whatever execute() raises raise self._rowcount = rowcnt + return None def stored_results(self): """Returns an iterator for stored results @@ -723,16 +768,16 @@ def callproc(self, procname, args=()): if 'columns' in result: results.append(tmp) self._connection._consume_results = can_consume_results - #pylint: enable=W0212 + # pylint: enable=W0212 if argnames: select = "SELECT {0}".format(','.join(argtypes)) self.execute(select) self._stored_results = results return self.fetchone() - else: - self._stored_results = results - return () + + self._stored_results = results + return () except errors.Error: raise @@ -767,7 +812,7 @@ def _fetch_warnings(self): raise errors.InterfaceError( "Failed getting warnings; %s" % err) - if len(res): + if res: return res return None @@ -1034,8 +1079,38 @@ def __init__(self, connection=None): self._prepared = None self._binary = True self._have_result = None + self._last_row_sent = False + self._cursor_exists = False - def callproc(self, *args, **kwargs): + def reset(self, free=True): + if self._prepared: + try: + self._connection.cmd_stmt_close(self._prepared['statement_id']) + except errors.Error: + # We tried to deallocate, but it's OK when we fail. + pass + self._prepared = None + self._last_row_sent = False + self._cursor_exists = False + + def _handle_noresultset(self, res): + self._handle_server_status(res.get('status_flag', + res.get('server_status', 0))) + super(MySQLCursorPrepared, self)._handle_noresultset(res) + + def _handle_server_status(self, flags): + """Check for SERVER_STATUS_CURSOR_EXISTS and + SERVER_STATUS_LAST_ROW_SENT flags set by the server. + """ + self._cursor_exists = flags & ServerFlag.STATUS_CURSOR_EXISTS != 0 + self._last_row_sent = flags & ServerFlag.STATUS_LAST_ROW_SENT != 0 + + def _handle_eof(self, eof): + self._handle_server_status(eof.get('status_flag', + eof.get('server_status', 0))) + super(MySQLCursorPrepared, self)._handle_eof(eof) + + def callproc(self, procname, args=()): """Calls a stored procedue Not supported with MySQLCursorPrepared. @@ -1048,13 +1123,7 @@ def close(self): This method will try to deallocate the prepared statement and close the cursor. """ - if self._prepared: - try: - self._connection.cmd_stmt_close(self._prepared['statement_id']) - except errors.Error: - # We tried to deallocate, but it's OK when we fail. - pass - self._prepared = None + self.reset() super(MySQLCursorPrepared, self).close() def _row_to_python(self, rowdata, desc=None): @@ -1065,17 +1134,22 @@ def _row_to_python(self, rowdata, desc=None): """ pass - def _handle_result(self, res): + def _handle_result(self, result): """Handle result after execution""" - if isinstance(res, dict): + if isinstance(result, dict): self._connection.unread_result = False self._have_result = False - self._handle_noresultset(res) + self._handle_noresultset(result) else: - self._description = res[1] + self._description = result[1] self._connection.unread_result = True self._have_result = True + if 'status_flag' in result[2]: + self._handle_server_status(result[2]['status_flag']) + elif 'server_status' in result[2]: + self._handle_server_status(result[2]['server_status']) + def execute(self, operation, params=(), multi=False): # multi is unused """Prepare and execute a MySQL Prepared Statement @@ -1092,7 +1166,10 @@ def execute(self, operation, params=(), multi=False): # multi is unused self._executed = operation try: if not isinstance(operation, bytes): - operation = operation.encode(self._connection.charset) + charset = self._connection.charset + if charset == 'utf8mb4': + charset = 'utf8' + operation = operation.encode(charset) except (UnicodeDecodeError, UnicodeEncodeError) as err: raise errors.ProgrammingError(str(err)) @@ -1153,6 +1230,8 @@ def fetchone(self): Returns a tuple or None. """ + if self._cursor_exists: + self._connection.cmd_stmt_fetch(self._prepared['statement_id']) return self._fetch_row() or None def fetchmany(self, size=None): @@ -1168,10 +1247,18 @@ def fetchmany(self, size=None): def fetchall(self): if not self._have_unread_result(): raise errors.InterfaceError("No result set to fetch from.") - (rows, eof) = self._connection.get_rows( - binary=self._binary, columns=self.description) + rows = [] + if self._nextrow[0]: + rows.append(self._nextrow[0]) + while self._have_unread_result(): + if self._cursor_exists: + self._connection.cmd_stmt_fetch( + self._prepared['statement_id'], MAX_RESULTS) + (tmp, eof) = self._connection.get_rows( + binary=self._binary, columns=self.description) + rows.extend(tmp) + self._handle_eof(eof) self._rowcount = len(rows) - self._handle_eof(eof) return rows @@ -1247,9 +1334,15 @@ def _row_to_python(self, rowdata, desc=None): if row: # pylint: disable=W0201 - self.named_tuple = namedtuple('Row', self.column_names) + columns = tuple(self.column_names) + try: + named_tuple = NAMED_TUPLE_CACHE[columns] + except KeyError: + named_tuple = namedtuple('Row', columns) + NAMED_TUPLE_CACHE[columns] = named_tuple # pylint: enable=W0201 - return self.named_tuple(*row) + return named_tuple(*row) + return None def fetchone(self): """Returns next row of a query result set @@ -1258,8 +1351,7 @@ def fetchone(self): if row: if hasattr(self._connection, 'converter'): return self._row_to_python(row, self.description) - else: - return row + return row return None def fetchall(self): diff --git a/lib/mysql/connector/cursor_cext.py b/lib/mysql/connector/cursor_cext.py index 4dd6e9a1..74415527 100644 --- a/lib/mysql/connector/cursor_cext.py +++ b/lib/mysql/connector/cursor_cext.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -28,7 +28,10 @@ import re import weakref -from .abstracts import MySQLConnectionAbstract, MySQLCursorAbstract +from _mysql_connector import MySQLInterfaceError # pylint: disable=F0401,E0611 + +from .abstracts import (MySQLConnectionAbstract, MySQLCursorAbstract, + NAMED_TUPLE_CACHE) from .catch23 import PY2, isunicode from . import errors from .errorcode import CR_NO_RESULT_SET @@ -39,7 +42,6 @@ RE_SQL_SPLIT_STMTS ) -from _mysql_connector import MySQLInterfaceError # pylint: disable=F0401 class _ParamSubstitutor(object): @@ -198,13 +200,16 @@ def _execute_iter(self): while True: try: if not self.nextset(): - raise StopIteration + raise StopIteration # pylint: disable=R1708 except errors.InterfaceError as exc: # Result without result set if exc.errno != CR_NO_RESULT_SET: raise i += 1 - self._executed = executed_list[i].strip() + try: + self._executed = executed_list[i].strip() + except IndexError: + self._executed = executed_list[0] yield self return @@ -275,8 +280,7 @@ def remove_comments(match): """ if match.group(1): return "" - else: - return match.group(2) + return match.group(2) tmp = re.sub(RE_SQL_ON_DUPLICATE, '', re.sub(RE_SQL_COMMENT, remove_comments, operation)) @@ -310,8 +314,7 @@ def remove_comments(match): stmt = stmt.replace(fmt, b','.join(values), 1) self._executed = stmt return stmt - else: - return None + return None except (UnicodeDecodeError, UnicodeEncodeError) as err: raise errors.ProgrammingError(str(err)) except Exception as err: @@ -336,7 +339,7 @@ def executemany(self, operation, seq_params): if re.match(RE_SQL_INSERT_STMT, operation): if not seq_params: self._rowcount = 0 - return + return None stmt = self._batch_insert(operation, seq_params) if stmt is not None: return self.execute(stmt) @@ -362,6 +365,7 @@ def executemany(self, operation, seq_params): "Failed executing the operation; {0}".format(err)) self._rowcount = rowcnt + return None @property def description(self): @@ -373,8 +377,7 @@ def rowcount(self): """Returns the number of rows produced or affected""" if self._rowcount == -1: return self._affected_rows - else: - return self._rowcount + return self._rowcount @property def lastrowid(self): @@ -448,8 +451,7 @@ def callproc(self, procname, args=()): self.execute(select) return self.fetchone() - else: - return tuple() + return tuple() except errors.Error: raise @@ -713,8 +715,7 @@ def fetchone(self): row = super(CMySQLCursorDict, self).fetchone() if row: return dict(zip(self.column_names, row)) - else: - return None + return None def fetchmany(self, size=1): """Returns next set of rows as list of dictionaries""" @@ -737,8 +738,7 @@ def _fetch_row(self): row = super(CMySQLCursorBufferedDict, self)._fetch_row() if row: return dict(zip(self.column_names, row)) - else: - return None + return None def fetchall(self): res = super(CMySQLCursorBufferedDict, self).fetchall() @@ -753,7 +753,12 @@ def _handle_resultset(self): """Handle a result set""" super(CMySQLCursorNamedTuple, self)._handle_resultset() # pylint: disable=W0201 - self.named_tuple = namedtuple('Row', self.column_names) + columns = tuple(self.column_names) + try: + self.named_tuple = NAMED_TUPLE_CACHE[columns] + except KeyError: + self.named_tuple = namedtuple('Row', columns) + NAMED_TUPLE_CACHE[columns] = self.named_tuple # pylint: enable=W0201 def fetchone(self): @@ -762,8 +767,7 @@ def fetchone(self): row = super(CMySQLCursorNamedTuple, self).fetchone() if row: return self.named_tuple(*row) - else: - return None + return None def fetchmany(self, size=1): """Returns next set of rows as list of named tuples""" @@ -790,8 +794,7 @@ def _fetch_row(self): row = super(CMySQLCursorBufferedNamedTuple, self)._fetch_row() if row: return self.named_tuple(*row) - else: - return None + return None def fetchall(self): res = super(CMySQLCursorBufferedNamedTuple, self).fetchall() @@ -807,4 +810,3 @@ def __init__(self, connection): super(CMySQLCursorPrepared, self).__init__(connection) raise NotImplementedError( "Alternative: Use connection.MySQLCursorPrepared") - diff --git a/lib/mysql/connector/django/base.py b/lib/mysql/connector/django/base.py index 7ffc2223..fcdbbe01 100644 --- a/lib/mysql/connector/django/base.py +++ b/lib/mysql/connector/django/base.py @@ -22,6 +22,7 @@ import warnings import django +from django.core.exceptions import ImproperlyConfigured from django.utils.functional import cached_property try: @@ -29,7 +30,6 @@ from mysql.connector.conversion import MySQLConverter, MySQLConverterBase from mysql.connector.catch23 import PY2 except ImportError as err: - from django.core.exceptions import ImproperlyConfigured raise ImproperlyConfigured( "Error loading mysql.connector module: {0}".format(err)) @@ -47,7 +47,6 @@ HAVE_CEXT = True if version < (1, 1): - from django.core.exceptions import ImproperlyConfigured raise ImproperlyConfigured( "MySQL Connector/Python v1.1.0 or newer " "is required; you have %s" % mysql.connector.__version__) @@ -332,6 +331,14 @@ def data_types(self): SchemaEditorClass = DatabaseSchemaEditor Database = mysql.connector + if django.VERSION >= (1, 11): + client_class = DatabaseClient + creation_class = DatabaseCreation + features_class = DatabaseFeatures + introspection_class = DatabaseIntrospection + ops_class = DatabaseOperations + validation_class = DatabaseValidation + def __init__(self, *args, **kwargs): super(DatabaseWrapper, self).__init__(*args, **kwargs) @@ -344,12 +351,13 @@ def __init__(self, *args, **kwargs): self.converter = DjangoCMySQLConverter() else: self.converter = DjangoMySQLConverter() - self.ops = DatabaseOperations(self) - self.features = DatabaseFeatures(self) - self.client = DatabaseClient(self) - self.creation = DatabaseCreation(self) - self.introspection = DatabaseIntrospection(self) - self.validation = DatabaseValidation(self) + if django.VERSION < (1, 11): + self.ops = DatabaseOperations(self) + self.features = DatabaseFeatures(self) + self.client = DatabaseClient(self) + self.creation = DatabaseCreation(self) + self.introspection = DatabaseIntrospection(self) + self.validation = DatabaseValidation(self) def _valid_connection(self): if self.connection: @@ -418,7 +426,7 @@ def init_connection_state(self): except AttributeError: self._set_autocommit(self.settings_dict['AUTOCOMMIT']) - def create_cursor(self): + def create_cursor(self, name=None): # Django 1.6 cursor = self.connection.cursor() return CursorWrapper(cursor) diff --git a/lib/mysql/connector/django/introspection.py b/lib/mysql/connector/django/introspection.py index 77e55031..e82623fd 100644 --- a/lib/mysql/connector/django/introspection.py +++ b/lib/mysql/connector/django/introspection.py @@ -72,7 +72,53 @@ def get_table_list(self, cursor): else: return [row[0] for row in cursor.fetchall()] - if django.VERSION >= (1, 8): + if django.VERSION >= (1, 11): + def get_table_description(self, cursor, table_name): + """ + Returns a description of the table, with the DB-API + cursor.description interface." + """ + # - information_schema database gives more accurate results for + # some figures: + # - varchar length returned by cursor.description is an internal + # length, not visible length (#5725) + # - precision and scale (for decimal fields) (#5014) + # - auto_increment is not available in cursor.description + + InfoLine = namedtuple('InfoLine', 'col_name data_type max_len ' + 'num_prec num_scale extra column_default') + cursor.execute(""" + SELECT column_name, data_type, character_maximum_length, + numeric_precision, numeric_scale, extra, column_default + FROM information_schema.columns + WHERE table_name = %s AND table_schema = DATABASE()""", + [table_name]) + field_info = dict( + (line[0], InfoLine(*line)) for line in cursor.fetchall() + ) + + cursor.execute("SELECT * FROM %s LIMIT 1" + % self.connection.ops.quote_name(table_name)) + to_int = lambda i: int(i) if i is not None else i + fields = [] + for line in cursor.description: + col_name = force_text(line[0]) + fields.append( + FieldInfo(*( + (col_name,) + + line[1:3] + + ( + to_int(field_info[col_name].max_len) or line[3], + to_int(field_info[col_name].num_prec) or line[4], + to_int(field_info[col_name].num_scale) or line[5], + line[6], + field_info[col_name].column_default, + field_info[col_name].extra, + ) + )) + ) + return fields + elif django.VERSION >= (1, 8): def get_table_description(self, cursor, table_name): """ Returns a description of the table, with the DB-API @@ -279,9 +325,8 @@ def get_constraints(self, cursor, table_name): 'unique': False, 'index': False, 'check': False, - 'foreign_key': ( - (ref_table, ref_column) if ref_column else None, - ) + 'foreign_key': \ + (ref_table, ref_column) if ref_column else None } constraints[constraint]['columns'].add(column) # Now get the constraint types diff --git a/lib/mysql/connector/django/operations.py b/lib/mysql/connector/django/operations.py index 127750db..8b232906 100644 --- a/lib/mysql/connector/django/operations.py +++ b/lib/mysql/connector/django/operations.py @@ -185,6 +185,10 @@ def validate_autopk_value(self, value): 'value for AutoField.') return value + if django.VERSION > (1, 8): + def adapt_datetimefield_value(self, value): + return self.value_to_db_datetime(value) + def value_to_db_datetime(self, value): if value is None: return None @@ -202,6 +206,10 @@ def value_to_db_datetime(self, value): return datetime_to_mysql(value) return self.connection.converter.to_mysql(value) + if django.VERSION > (1, 8): + def adapt_timefield_value(self, value): + return self.value_to_db_time(value) + def value_to_db_time(self, value): if value is None: return None @@ -218,9 +226,15 @@ def value_to_db_time(self, value): def max_name_length(self): return 64 - def bulk_insert_sql(self, fields, num_values): - items_sql = "({0})".format(", ".join(["%s"] * len(fields))) - return "VALUES " + ", ".join([items_sql] * num_values) + if django.VERSION < (1, 9): + def bulk_insert_sql(self, fields, num_values): + items_sql = "({0})".format(", ".join(["%s"] * len(fields))) + return "VALUES " + ", ".join([items_sql] * num_values) + else: + def bulk_insert_sql(self, fields, placeholder_rows): + placeholder_rows_sql = (", ".join(row) for row in placeholder_rows) + values_sql = ", ".join("({0})".format(sql) for sql in placeholder_rows_sql) + return "VALUES " + values_sql if django.VERSION < (1, 8): def year_lookup_bounds(self, value): diff --git a/lib/mysql/connector/errorcode.py b/lib/mysql/connector/errorcode.py index 63048119..0b3489aa 100644 --- a/lib/mysql/connector/errorcode.py +++ b/lib/mysql/connector/errorcode.py @@ -24,14 +24,14 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # This file was auto-generated. -_GENERATED_ON = '2015-12-13' -_MYSQL_VERSION = (5, 7, 10) +_GENERATED_ON = '2018-03-16' +_MYSQL_VERSION = (8, 0, 11) """This module contains the MySQL Server and Client error codes""" # Start MySQL Errors -ER_HASHCHK = 1000 -ER_NISAMCHK = 1001 +OBSOLETE_ER_HASHCHK = 1000 +OBSOLETE_ER_NISAMCHK = 1001 ER_NO = 1002 ER_YES = 1003 ER_CANT_CREATE_FILE = 1004 @@ -39,27 +39,27 @@ ER_CANT_CREATE_DB = 1006 ER_DB_CREATE_EXISTS = 1007 ER_DB_DROP_EXISTS = 1008 -ER_DB_DROP_DELETE = 1009 +OBSOLETE_ER_DB_DROP_DELETE = 1009 ER_DB_DROP_RMDIR = 1010 -ER_CANT_DELETE_FILE = 1011 +OBSOLETE_ER_CANT_DELETE_FILE = 1011 ER_CANT_FIND_SYSTEM_REC = 1012 ER_CANT_GET_STAT = 1013 -ER_CANT_GET_WD = 1014 +OBSOLETE_ER_CANT_GET_WD = 1014 ER_CANT_LOCK = 1015 ER_CANT_OPEN_FILE = 1016 ER_FILE_NOT_FOUND = 1017 ER_CANT_READ_DIR = 1018 -ER_CANT_SET_WD = 1019 +OBSOLETE_ER_CANT_SET_WD = 1019 ER_CHECKREAD = 1020 -ER_DISK_FULL = 1021 +OBSOLETE_ER_DISK_FULL = 1021 ER_DUP_KEY = 1022 -ER_ERROR_ON_CLOSE = 1023 +OBSOLETE_ER_ERROR_ON_CLOSE = 1023 ER_ERROR_ON_READ = 1024 ER_ERROR_ON_RENAME = 1025 ER_ERROR_ON_WRITE = 1026 ER_FILE_USED = 1027 ER_FILSORT_ABORT = 1028 -ER_FORM_NOT_FOUND = 1029 +OBSOLETE_ER_FORM_NOT_FOUND = 1029 ER_GET_ERRNO = 1030 ER_ILLEGAL_HA = 1031 ER_KEY_NOT_FOUND = 1032 @@ -69,7 +69,7 @@ ER_OPEN_AS_READONLY = 1036 ER_OUTOFMEMORY = 1037 ER_OUT_OF_SORTMEMORY = 1038 -ER_UNEXPECTED_EOF = 1039 +OBSOLETE_ER_UNEXPECTED_EOF = 1039 ER_CON_COUNT_ERROR = 1040 ER_OUT_OF_RESOURCES = 1041 ER_BAD_HOST_ERROR = 1042 @@ -107,8 +107,8 @@ ER_TOO_BIG_FIELDLENGTH = 1074 ER_WRONG_AUTO_KEY = 1075 ER_READY = 1076 -ER_NORMAL_SHUTDOWN = 1077 -ER_GOT_SIGNAL = 1078 +OBSOLETE_ER_NORMAL_SHUTDOWN = 1077 +OBSOLETE_ER_GOT_SIGNAL = 1078 ER_SHUTDOWN_COMPLETE = 1079 ER_FORCING_CLOSE = 1080 ER_IPSOCK_ERROR = 1081 @@ -150,7 +150,7 @@ ER_TOO_MANY_FIELDS = 1117 ER_TOO_BIG_ROWSIZE = 1118 ER_STACK_OVERRUN = 1119 -ER_WRONG_OUTER_JOIN = 1120 +ER_WRONG_OUTER_JOIN_UNUSED = 1120 ER_NULL_COLUMN_IN_INDEX = 1121 ER_CANT_FIND_UDF = 1122 ER_CANT_INITIALIZE_UDF = 1123 @@ -180,8 +180,8 @@ ER_NONEXISTING_TABLE_GRANT = 1147 ER_NOT_ALLOWED_COMMAND = 1148 ER_SYNTAX_ERROR = 1149 -ER_UNUSED1 = 1150 -ER_UNUSED2 = 1151 +OBSOLETE_ER_UNUSED1 = 1150 +OBSOLETE_ER_UNUSED2 = 1151 ER_ABORTING_CONNECTION = 1152 ER_NET_PACKET_TOO_LARGE = 1153 ER_NET_READ_ERROR_FROM_PIPE = 1154 @@ -195,7 +195,7 @@ ER_TOO_LONG_STRING = 1162 ER_TABLE_CANT_HANDLE_BLOB = 1163 ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164 -ER_UNUSED3 = 1165 +OBSOLETE_ER_UNUSED3 = 1165 ER_WRONG_COLUMN_NAME = 1166 ER_WRONG_KEY_COLUMN = 1167 ER_WRONG_MRG_TABLE = 1168 @@ -204,7 +204,7 @@ ER_PRIMARY_CANT_HAVE_NULL = 1171 ER_TOO_MANY_ROWS = 1172 ER_REQUIRES_PRIMARY_KEY = 1173 -ER_NO_RAID_COMPILED = 1174 +OBSOLETE_ER_NO_RAID_COMPILED = 1174 ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175 ER_KEY_DOES_NOT_EXITS = 1176 ER_CHECK_NO_SUCH_TABLE = 1177 @@ -213,11 +213,11 @@ ER_ERROR_DURING_COMMIT = 1180 ER_ERROR_DURING_ROLLBACK = 1181 ER_ERROR_DURING_FLUSH_LOGS = 1182 -ER_ERROR_DURING_CHECKPOINT = 1183 +OBSOLETE_ER_ERROR_DURING_CHECKPOINT = 1183 ER_NEW_ABORTING_CONNECTION = 1184 -ER_DUMP_NOT_IMPLEMENTED = 1185 -ER_FLUSH_MASTER_BINLOG_CLOSED = 1186 -ER_INDEX_REBUILD = 1187 +OBSOLETE_ER_DUMP_NOT_IMPLEMENTED = 1185 +OBSOLETE_ER_FLUSH_MASTER_BINLOG_CLOSED = 1186 +OBSOLETE_ER_INDEX_REBUILD = 1187 ER_MASTER = 1188 ER_MASTER_NET_READ = 1189 ER_MASTER_NET_WRITE = 1190 @@ -228,7 +228,7 @@ ER_CRASHED_ON_REPAIR = 1195 ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196 ER_TRANS_CACHE_FULL = 1197 -ER_SLAVE_MUST_STOP = 1198 +OBSOLETE_ER_SLAVE_MUST_STOP = 1198 ER_SLAVE_NOT_RUNNING = 1199 ER_BAD_SLAVE = 1200 ER_MASTER_INFO = 1201 @@ -238,18 +238,18 @@ ER_LOCK_WAIT_TIMEOUT = 1205 ER_LOCK_TABLE_FULL = 1206 ER_READ_ONLY_TRANSACTION = 1207 -ER_DROP_DB_WITH_READ_LOCK = 1208 -ER_CREATE_DB_WITH_READ_LOCK = 1209 +OBSOLETE_ER_DROP_DB_WITH_READ_LOCK = 1208 +OBSOLETE_ER_CREATE_DB_WITH_READ_LOCK = 1209 ER_WRONG_ARGUMENTS = 1210 ER_NO_PERMISSION_TO_CREATE_USER = 1211 -ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212 +OBSOLETE_ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212 ER_LOCK_DEADLOCK = 1213 ER_TABLE_CANT_HANDLE_FT = 1214 ER_CANNOT_ADD_FOREIGN = 1215 ER_NO_REFERENCED_ROW = 1216 ER_ROW_IS_REFERENCED = 1217 ER_CONNECT_TO_MASTER = 1218 -ER_QUERY_ON_MASTER = 1219 +OBSOLETE_ER_QUERY_ON_MASTER = 1219 ER_ERROR_WHEN_EXECUTING_COMMAND = 1220 ER_WRONG_USAGE = 1221 ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222 @@ -275,7 +275,7 @@ ER_SUBQUERY_NO_1_ROW = 1242 ER_UNKNOWN_STMT_HANDLER = 1243 ER_CORRUPT_HELP_DB = 1244 -ER_CYCLIC_REFERENCE = 1245 +OBSOLETE_ER_CYCLIC_REFERENCE = 1245 ER_AUTO_CONVERT = 1246 ER_ILLEGAL_REFERENCE = 1247 ER_DERIVED_MUST_HAVE_ALIAS = 1248 @@ -284,8 +284,8 @@ ER_NOT_SUPPORTED_AUTH_MODE = 1251 ER_SPATIAL_CANT_HAVE_NULL = 1252 ER_COLLATION_CHARSET_MISMATCH = 1253 -ER_SLAVE_WAS_RUNNING = 1254 -ER_SLAVE_WAS_NOT_RUNNING = 1255 +OBSOLETE_ER_SLAVE_WAS_RUNNING = 1254 +OBSOLETE_ER_SLAVE_WAS_NOT_RUNNING = 1255 ER_TOO_BIG_FOR_UNCOMPRESS = 1256 ER_ZLIB_Z_MEM_ERROR = 1257 ER_ZLIB_Z_BUF_ERROR = 1258 @@ -298,7 +298,7 @@ WARN_DATA_TRUNCATED = 1265 ER_WARN_USING_OTHER_HANDLER = 1266 ER_CANT_AGGREGATE_2COLLATIONS = 1267 -ER_DROP_USER = 1268 +OBSOLETE_ER_DROP_USER = 1268 ER_REVOKE_GRANTS = 1269 ER_CANT_AGGREGATE_3COLLATIONS = 1270 ER_CANT_AGGREGATE_NCOLLATIONS = 1271 @@ -312,7 +312,7 @@ ER_UNTIL_COND_IGNORED = 1279 ER_WRONG_NAME_FOR_INDEX = 1280 ER_WRONG_NAME_FOR_CATALOG = 1281 -ER_WARN_QC_RESIZE = 1282 +OBSOLETE_ER_WARN_QC_RESIZE = 1282 ER_BAD_FT_COLUMN = 1283 ER_UNKNOWN_KEY_CACHE = 1284 ER_WARN_HOSTNAME_WONT_WORK = 1285 @@ -323,7 +323,7 @@ ER_OPTION_PREVENTS_STATEMENT = 1290 ER_DUPLICATED_VALUE_IN_TYPE = 1291 ER_TRUNCATED_WRONG_VALUE = 1292 -ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293 +OBSOLETE_ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293 ER_INVALID_ON_UPDATE = 1294 ER_UNSUPPORTED_PS = 1295 ER_GET_ERRMSG = 1296 @@ -376,10 +376,10 @@ ER_FPARSER_ERROR_IN_PARAMETER = 1343 ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344 ER_VIEW_NO_EXPLAIN = 1345 -ER_FRM_UNKNOWN_TYPE = 1346 +OBSOLETE_ER_FRM_UNKNOWN_TYPE = 1346 ER_WRONG_OBJECT = 1347 ER_NONUPDATEABLE_COLUMN = 1348 -ER_VIEW_SELECT_DERIVED_UNUSED = 1349 +OBSOLETE_ER_VIEW_SELECT_DERIVED_UNUSED = 1349 ER_VIEW_SELECT_CLAUSE = 1350 ER_VIEW_SELECT_VARIABLE = 1351 ER_VIEW_SELECT_TMPTABLE = 1352 @@ -388,7 +388,7 @@ ER_WARN_VIEW_WITHOUT_KEY = 1355 ER_VIEW_INVALID = 1356 ER_SP_NO_DROP_SP = 1357 -ER_SP_GOTO_IN_HNDLR = 1358 +OBSOLETE_ER_SP_GOTO_IN_HNDLR = 1358 ER_TRG_ALREADY_EXISTS = 1359 ER_TRG_DOES_NOT_EXIST = 1360 ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361 @@ -402,7 +402,7 @@ ER_VIEW_CHECK_FAILED = 1369 ER_PROCACCESS_DENIED_ERROR = 1370 ER_RELAY_LOG_FAIL = 1371 -ER_PASSWD_LENGTH = 1372 +OBSOLETE_ER_PASSWD_LENGTH = 1372 ER_UNKNOWN_TARGET_BINLOG = 1373 ER_IO_ERR_LOG_INDEX_READ = 1374 ER_BINLOG_PURGE_PROHIBITED = 1375 @@ -413,13 +413,13 @@ ER_RELAY_LOG_INIT = 1380 ER_NO_BINARY_LOGGING = 1381 ER_RESERVED_SYNTAX = 1382 -ER_WSAS_FAILED = 1383 -ER_DIFF_GROUPS_PROC = 1384 -ER_NO_GROUP_FOR_PROC = 1385 -ER_ORDER_WITH_PROC = 1386 -ER_LOGGING_PROHIBIT_CHANGING_OF = 1387 -ER_NO_FILE_MAPPING = 1388 -ER_WRONG_MAGIC = 1389 +OBSOLETE_ER_WSAS_FAILED = 1383 +OBSOLETE_ER_DIFF_GROUPS_PROC = 1384 +OBSOLETE_ER_NO_GROUP_FOR_PROC = 1385 +OBSOLETE_ER_ORDER_WITH_PROC = 1386 +OBSOLETE_ER_LOGGING_PROHIBIT_CHANGING_OF = 1387 +OBSOLETE_ER_NO_FILE_MAPPING = 1388 +OBSOLETE_ER_WRONG_MAGIC = 1389 ER_PS_MANY_PARAM = 1390 ER_KEY_PART_0 = 1391 ER_VIEW_CHECKSUM = 1392 @@ -447,10 +447,10 @@ ER_SP_NOT_VAR_ARG = 1414 ER_SP_NO_RETSET = 1415 ER_CANT_CREATE_GEOMETRY_OBJECT = 1416 -ER_FAILED_ROUTINE_BREAK_BINLOG = 1417 +OBSOLETE_ER_FAILED_ROUTINE_BREAK_BINLOG = 1417 ER_BINLOG_UNSAFE_ROUTINE = 1418 ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419 -ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420 +OBSOLETE_ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420 ER_STMT_HAS_NO_OPEN_CURSOR = 1421 ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422 ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423 @@ -464,7 +464,7 @@ ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431 ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432 ER_FOREIGN_DATA_STRING_INVALID = 1433 -ER_CANT_CREATE_FEDERATED_TABLE = 1434 +OBSOLETE_ER_CANT_CREATE_FEDERATED_TABLE = 1434 ER_TRG_IN_WRONG_SCHEMA = 1435 ER_STACK_OVERRUN_NEED_MORE = 1436 ER_TOO_LONG_BODY = 1437 @@ -476,7 +476,7 @@ ER_VIEW_PREVENT_UPDATE = 1443 ER_PS_NO_RECURSION = 1444 ER_SP_CANT_SET_AUTOCOMMIT = 1445 -ER_MALFORMED_DEFINER = 1446 +OBSOLETE_ER_MALFORMED_DEFINER = 1446 ER_VIEW_FRM_NO_USER = 1447 ER_VIEW_OTHER_USER = 1448 ER_NO_SUCH_USER = 1449 @@ -487,7 +487,7 @@ ER_TRG_NO_DEFINER = 1454 ER_OLD_FILE_FORMAT = 1455 ER_SP_RECURSION_LIMIT = 1456 -ER_SP_PROC_TABLE_CORRUPT = 1457 +OBSOLETE_ER_SP_PROC_TABLE_CORRUPT = 1457 ER_SP_WRONG_NAME = 1458 ER_TABLE_NEEDS_UPGRADE = 1459 ER_SP_NO_AGGREGATE = 1460 @@ -512,14 +512,14 @@ ER_PARTITION_REQUIRES_VALUES_ERROR = 1479 ER_PARTITION_WRONG_VALUES_ERROR = 1480 ER_PARTITION_MAXVALUE_ERROR = 1481 -ER_PARTITION_SUBPARTITION_ERROR = 1482 -ER_PARTITION_SUBPART_MIX_ERROR = 1483 +OBSOLETE_ER_PARTITION_SUBPARTITION_ERROR = 1482 +OBSOLETE_ER_PARTITION_SUBPART_MIX_ERROR = 1483 ER_PARTITION_WRONG_NO_PART_ERROR = 1484 ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485 ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486 -ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487 +OBSOLETE_ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487 ER_FIELD_NOT_FOUND_PART_ERROR = 1488 -ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489 +OBSOLETE_ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489 ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490 ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491 ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492 @@ -552,7 +552,7 @@ ER_CONSECUTIVE_REORG_PARTITIONS = 1519 ER_REORG_OUTSIDE_RANGE = 1520 ER_PARTITION_FUNCTION_FAILURE = 1521 -ER_PART_STATE_ERROR = 1522 +OBSOLETE_ER_PART_STATE_ERROR = 1522 ER_LIMITED_PART_RANGE = 1523 ER_PLUGIN_IS_NOT_LOADED = 1524 ER_WRONG_VALUE = 1525 @@ -565,49 +565,49 @@ ER_SIZE_OVERFLOW_ERROR = 1532 ER_ALTER_FILEGROUP_FAILED = 1533 ER_BINLOG_ROW_LOGGING_FAILED = 1534 -ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535 -ER_BINLOG_ROW_RBR_TO_SBR = 1536 +OBSOLETE_ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535 +OBSOLETE_ER_BINLOG_ROW_RBR_TO_SBR = 1536 ER_EVENT_ALREADY_EXISTS = 1537 -ER_EVENT_STORE_FAILED = 1538 +OBSOLETE_ER_EVENT_STORE_FAILED = 1538 ER_EVENT_DOES_NOT_EXIST = 1539 -ER_EVENT_CANT_ALTER = 1540 -ER_EVENT_DROP_FAILED = 1541 +OBSOLETE_ER_EVENT_CANT_ALTER = 1540 +OBSOLETE_ER_EVENT_DROP_FAILED = 1541 ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542 ER_EVENT_ENDS_BEFORE_STARTS = 1543 ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544 -ER_EVENT_OPEN_TABLE_FAILED = 1545 -ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546 -ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547 -ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE = 1548 -ER_EVENT_CANNOT_DELETE = 1549 -ER_EVENT_COMPILE_ERROR = 1550 +OBSOLETE_ER_EVENT_OPEN_TABLE_FAILED = 1545 +OBSOLETE_ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546 +OBSOLETE_ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547 +OBSOLETE_ER_CANNOT_LOAD_FROM_TABLE = 1548 +OBSOLETE_ER_EVENT_CANNOT_DELETE = 1549 +OBSOLETE_ER_EVENT_COMPILE_ERROR = 1550 ER_EVENT_SAME_NAME = 1551 -ER_EVENT_DATA_TOO_LONG = 1552 +OBSOLETE_ER_EVENT_DATA_TOO_LONG = 1552 ER_DROP_INDEX_FK = 1553 ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554 -ER_CANT_WRITE_LOCK_LOG_TABLE = 1555 +OBSOLETE_ER_CANT_WRITE_LOCK_LOG_TABLE = 1555 ER_CANT_LOCK_LOG_TABLE = 1556 ER_FOREIGN_DUPLICATE_KEY_OLD_UNUSED = 1557 ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558 ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559 ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560 -ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561 +OBSOLETE_ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561 ER_PARTITION_NO_TEMPORARY = 1562 ER_PARTITION_CONST_DOMAIN_ERROR = 1563 ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564 -ER_DDL_LOG_ERROR = 1565 +OBSOLETE_ER_DDL_LOG_ERROR_UNUSED = 1565 ER_NULL_IN_VALUES_LESS_THAN = 1566 ER_WRONG_PARTITION_NAME = 1567 ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568 ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569 -ER_EVENT_MODIFY_QUEUE_ERROR = 1570 +OBSOLETE_ER_EVENT_MODIFY_QUEUE_ERROR = 1570 ER_EVENT_SET_VAR_ERROR = 1571 ER_PARTITION_MERGE_ERROR = 1572 -ER_CANT_ACTIVATE_LOG = 1573 -ER_RBR_NOT_AVAILABLE = 1574 +OBSOLETE_ER_CANT_ACTIVATE_LOG = 1573 +OBSOLETE_ER_RBR_NOT_AVAILABLE = 1574 ER_BASE64_DECODE_ERROR = 1575 ER_EVENT_RECURSION_FORBIDDEN = 1576 -ER_EVENTS_DB_ERROR = 1577 +OBSOLETE_ER_EVENTS_DB_ERROR = 1577 ER_ONLY_INTEGERS_ALLOWED = 1578 ER_UNSUPORTED_LOG_ENGINE = 1579 ER_BAD_LOG_STATEMENT = 1580 @@ -620,40 +620,40 @@ ER_BINLOG_PURGE_EMFILE = 1587 ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588 ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589 -ER_SLAVE_INCIDENT = 1590 +OBSOLETE_ER_SLAVE_INCIDENT = 1590 ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591 ER_BINLOG_UNSAFE_STATEMENT = 1592 -ER_SLAVE_FATAL_ERROR = 1593 -ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594 -ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595 -ER_SLAVE_CREATE_EVENT_FAILURE = 1596 -ER_SLAVE_MASTER_COM_FAILURE = 1597 +ER_BINLOG_FATAL_ERROR = 1593 +OBSOLETE_ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594 +OBSOLETE_ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595 +OBSOLETE_ER_SLAVE_CREATE_EVENT_FAILURE = 1596 +OBSOLETE_ER_SLAVE_MASTER_COM_FAILURE = 1597 ER_BINLOG_LOGGING_IMPOSSIBLE = 1598 ER_VIEW_NO_CREATION_CTX = 1599 ER_VIEW_INVALID_CREATION_CTX = 1600 -ER_SR_INVALID_CREATION_CTX = 1601 +OBSOLETE_ER_SR_INVALID_CREATION_CTX = 1601 ER_TRG_CORRUPTED_FILE = 1602 ER_TRG_NO_CREATION_CTX = 1603 ER_TRG_INVALID_CREATION_CTX = 1604 ER_EVENT_INVALID_CREATION_CTX = 1605 ER_TRG_CANT_OPEN_TABLE = 1606 -ER_CANT_CREATE_SROUTINE = 1607 -ER_NEVER_USED = 1608 +OBSOLETE_ER_CANT_CREATE_SROUTINE = 1607 +OBSOLETE_ER_NEVER_USED = 1608 ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609 ER_SLAVE_CORRUPT_EVENT = 1610 -ER_LOAD_DATA_INVALID_COLUMN_UNUSED = 1611 +OBSOLETE_ER_LOAD_DATA_INVALID_COLUMN_UNUSED = 1611 ER_LOG_PURGE_NO_FILE = 1612 ER_XA_RBTIMEOUT = 1613 ER_XA_RBDEADLOCK = 1614 ER_NEED_REPREPARE = 1615 -ER_DELAYED_NOT_SUPPORTED = 1616 +OBSOLETE_ER_DELAYED_NOT_SUPPORTED = 1616 WARN_NO_MASTER_INFO = 1617 WARN_OPTION_IGNORED = 1618 ER_PLUGIN_DELETE_BUILTIN = 1619 WARN_PLUGIN_BUSY = 1620 ER_VARIABLE_IS_READONLY = 1621 ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622 -ER_SLAVE_HEARTBEAT_FAILURE = 1623 +OBSOLETE_ER_SLAVE_HEARTBEAT_FAILURE = 1623 ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624 ER_NDB_REPLICATION_SCHEMA_ERROR = 1625 ER_CONFLICT_FN_PARSE_ERROR = 1626 @@ -681,7 +681,7 @@ ER_COND_ITEM_TOO_LONG = 1648 ER_UNKNOWN_LOCALE = 1649 ER_SLAVE_IGNORE_SERVER_IDS = 1650 -ER_QUERY_CACHE_DISABLED = 1651 +OBSOLETE_ER_QUERY_CACHE_DISABLED = 1651 ER_SAME_NAME_PARTITION_FIELD = 1652 ER_PARTITION_COLUMN_LIST_ERROR = 1653 ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654 @@ -699,7 +699,7 @@ ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666 ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667 ER_BINLOG_UNSAFE_LIMIT = 1668 -ER_UNUSED4 = 1669 +OBSOLETE_ER_UNUSED4 = 1669 ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670 ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671 ER_BINLOG_UNSAFE_UDF = 1672 @@ -707,7 +707,7 @@ ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674 ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675 ER_MESSAGE_AND_STATEMENT = 1676 -ER_SLAVE_CONVERSION_FAILED = 1677 +OBSOLETE_ER_SLAVE_CONVERSION_FAILED = 1677 ER_SLAVE_CANT_CREATE_CONVERSION = 1678 ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679 ER_PATH_LENGTH = 1680 @@ -730,7 +730,7 @@ ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697 ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698 ER_SET_PASSWORD_AUTH_PLUGIN = 1699 -ER_GRANT_PLUGIN_USER_EXISTS = 1700 +OBSOLETE_ER_GRANT_PLUGIN_USER_EXISTS = 1700 ER_TRUNCATE_ILLEGAL_FK = 1701 ER_PLUGIN_IS_PERMANENT = 1702 ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703 @@ -771,15 +771,15 @@ ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738 ER_WARN_INDEX_NOT_APPLICABLE = 1739 ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740 -ER_NO_SUCH_KEY_VALUE = 1741 +OBSOLETE_ER_NO_SUCH_KEY_VALUE = 1741 ER_RPL_INFO_DATA_TOO_LONG = 1742 -ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743 -ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744 +OBSOLETE_ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743 +OBSOLETE_ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744 ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745 ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746 ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747 ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748 -ER_NO_SUCH_PARTITION__UNUSED = 1749 +OBSOLETE_ER_NO_SUCH_PARTITION__UNUSED = 1749 ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750 ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751 ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752 @@ -797,11 +797,11 @@ ER_TABLE_HAS_NO_FT = 1764 ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765 ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766 -ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767 -ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768 +OBSOLETE_ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767 +OBSOLETE_ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768 ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769 ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770 -ER_SKIPPING_LOGGED_TRANSACTION = 1771 +OBSOLETE_ER_SKIPPING_LOGGED_TRANSACTION = 1771 ER_MALFORMED_GTID_SET_SPECIFICATION = 1772 ER_MALFORMED_GTID_SET_ENCODING = 1773 ER_MALFORMED_GTID_SPECIFICATION = 1774 @@ -810,11 +810,11 @@ ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777 ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778 ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779 -ER_GTID_MODE_REQUIRES_BINLOG = 1780 +OBSOLETE_ER_GTID_MODE_REQUIRES_BINLOG = 1780 ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781 ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782 ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783 -ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED = 1784 +OBSOLETE_ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED = 1784 ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785 ER_GTID_UNSAFE_CREATE_SELECT = 1786 ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787 @@ -864,12 +864,12 @@ ER_DUP_INDEX = 1831 ER_FK_COLUMN_CANNOT_CHANGE = 1832 ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833 -ER_UNUSED5 = 1834 +OBSOLETE_ER_UNUSED5 = 1834 ER_MALFORMED_PACKET = 1835 ER_READ_ONLY_MODE = 1836 -ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837 +ER_GTID_NEXT_TYPE_UNDEFINED_GTID = 1837 ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838 -ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839 +OBSOLETE_ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839 ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840 ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841 ER_GTID_PURGED_WAS_CHANGED = 1842 @@ -882,7 +882,7 @@ ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849 ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850 ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851 -ER_UNUSED6 = 1852 +OBSOLETE_ER_UNUSED6 = 1852 ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853 ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854 ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855 @@ -895,7 +895,7 @@ ER_MUST_CHANGE_PASSWORD_LOGIN = 1862 ER_ROW_IN_WRONG_PARTITION = 1863 ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864 -ER_INNODB_NO_FT_USES_PARSER = 1865 +OBSOLETE_ER_INNODB_NO_FT_USES_PARSER = 1865 ER_BINLOG_LOGICAL_CORRUPTION = 1866 ER_WARN_PURGE_LOG_IN_USE = 1867 ER_WARN_PURGE_LOG_IS_ACTIVE = 1868 @@ -914,11 +914,12 @@ ER_INNODB_FORCED_RECOVERY = 1881 ER_AES_INVALID_IV = 1882 ER_PLUGIN_CANNOT_BE_UNINSTALLED = 1883 -ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP = 1884 +ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_ASSIGNED_GTID = 1884 ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885 +ER_MISSING_KEY = 1886 ER_FILE_CORRUPT = 3000 ER_ERROR_ON_MASTER = 3001 -ER_INCONSISTENT_ERROR = 3002 +OBSOLETE_ER_INCONSISTENT_ERROR = 3002 ER_STORAGE_ENGINE_NOT_LOADED = 3003 ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 3004 ER_WARN_LEGACY_SYNTAX_CONVERTED = 3005 @@ -943,7 +944,7 @@ ER_QUERY_TIMEOUT = 3024 ER_NON_RO_SELECT_DISABLE_TIMER = 3025 ER_DUP_LIST_ENTRY = 3026 -ER_SQL_MODE_NO_EFFECT = 3027 +OBSOLETE_ER_SQL_MODE_NO_EFFECT = 3027 ER_AGGREGATE_ORDER_FOR_UNION = 3028 ER_AGGREGATE_ORDER_NON_AGG_QUERY = 3029 ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR = 3030 @@ -979,7 +980,7 @@ ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS = 3060 ER_ILLEGAL_USER_VAR = 3061 ER_GTID_MODE_OFF = 3062 -ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063 +OBSOLETE_ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063 ER_INCORRECT_TYPE = 3064 ER_FIELD_IN_ORDER_NOT_SELECT = 3065 ER_AGGREGATE_IN_ORDER_NOT_SELECT = 3066 @@ -991,10 +992,10 @@ ER_INVALID_GEOJSON_UNSPECIFIED = 3072 ER_DIMENSION_UNSUPPORTED = 3073 ER_SLAVE_CHANNEL_DOES_NOT_EXIST = 3074 -ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075 +OBSOLETE_ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075 ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG = 3076 ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY = 3077 -ER_SLAVE_CHANNEL_DELETE = 3078 +OBSOLETE_ER_SLAVE_CHANNEL_DELETE = 3078 ER_SLAVE_MULTIPLE_CHANNELS_CMD = 3079 ER_SLAVE_MAX_CHANNELS_EXCEEDED = 3080 ER_SLAVE_CHANNEL_MUST_STOP = 3081 @@ -1029,11 +1030,11 @@ ER_FEATURE_NOT_AVAILABLE = 3110 ER_CANT_SET_GTID_MODE = 3111 ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF = 3112 -ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113 -ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114 -ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115 -ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3116 -ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3117 +OBSOLETE_ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113 +OBSOLETE_ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114 +OBSOLETE_ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115 +ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX = 3116 +ER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX = 3117 ER_ACCOUNT_HAS_BEEN_LOCKED = 3118 ER_WRONG_TABLESPACE_NAME = 3119 ER_TABLESPACE_IS_NOT_EMPTY = 3120 @@ -1088,10 +1089,3454 @@ ER_SESSION_WAS_KILLED = 3169 ER_CAPACITY_EXCEEDED = 3170 ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER = 3171 -ER_TABLE_NEEDS_UPG_PART = 3172 +OBSOLETE_ER_TABLE_NEEDS_UPG_PART = 3172 ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID = 3173 ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL = 3174 ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT = 3175 +ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE = 3176 +ER_LOCK_REFUSED_BY_ENGINE = 3177 +ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN = 3178 +ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE = 3179 +OBSOLETE_ER_MASTER_KEY_ROTATION_ERROR_BY_SE = 3180 +ER_MASTER_KEY_ROTATION_BINLOG_FAILED = 3181 +ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE = 3182 +ER_TABLESPACE_CANNOT_ENCRYPT = 3183 +ER_INVALID_ENCRYPTION_OPTION = 3184 +ER_CANNOT_FIND_KEY_IN_KEYRING = 3185 +ER_CAPACITY_EXCEEDED_IN_PARSER = 3186 +ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE = 3187 +ER_KEYRING_UDF_KEYRING_SERVICE_ERROR = 3188 +ER_USER_COLUMN_OLD_LENGTH = 3189 +ER_CANT_RESET_MASTER = 3190 +ER_GROUP_REPLICATION_MAX_GROUP_SIZE = 3191 +ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED = 3192 +ER_TABLE_REFERENCED = 3193 +OBSOLETE_ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE = 3194 +OBSOLETE_ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO = 3195 +OBSOLETE_ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196 +ER_XA_RETRY = 3197 +ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198 +ER_BINLOG_UNSAFE_XA = 3199 +ER_UDF_ERROR = 3200 +ER_KEYRING_MIGRATION_FAILURE = 3201 +ER_KEYRING_ACCESS_DENIED_ERROR = 3202 +ER_KEYRING_MIGRATION_STATUS = 3203 +OBSOLETE_ER_PLUGIN_FAILED_TO_OPEN_TABLES = 3204 +OBSOLETE_ER_PLUGIN_FAILED_TO_OPEN_TABLE = 3205 +OBSOLETE_ER_AUDIT_LOG_NO_KEYRING_PLUGIN_INSTALLED = 3206 +OBSOLETE_ER_AUDIT_LOG_ENCRYPTION_PASSWORD_HAS_NOT_BEEN_SET = 3207 +OBSOLETE_ER_AUDIT_LOG_COULD_NOT_CREATE_AES_KEY = 3208 +OBSOLETE_ER_AUDIT_LOG_ENCRYPTION_PASSWORD_CANNOT_BE_FETCHED = 3209 +OBSOLETE_ER_AUDIT_LOG_JSON_FILTERING_NOT_ENABLED = 3210 +OBSOLETE_ER_AUDIT_LOG_UDF_INSUFFICIENT_PRIVILEGE = 3211 +ER_AUDIT_LOG_SUPER_PRIVILEGE_REQUIRED = 3212 +OBSOLETE_ER_COULD_NOT_REINITIALIZE_AUDIT_LOG_FILTERS = 3213 +ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_TYPE = 3214 +ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_COUNT = 3215 +ER_AUDIT_LOG_HAS_NOT_BEEN_INSTALLED = 3216 +ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_TYPE = 3217 +ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_VALUE = 3218 +OBSOLETE_ER_AUDIT_LOG_JSON_FILTER_PARSING_ERROR = 3219 +OBSOLETE_ER_AUDIT_LOG_JSON_FILTER_NAME_CANNOT_BE_EMPTY = 3220 +OBSOLETE_ER_AUDIT_LOG_JSON_USER_NAME_CANNOT_BE_EMPTY = 3221 +OBSOLETE_ER_AUDIT_LOG_JSON_FILTER_DOES_NOT_EXISTS = 3222 +OBSOLETE_ER_AUDIT_LOG_USER_FIRST_CHARACTER_MUST_BE_ALPHANUMERIC = 3223 +OBSOLETE_ER_AUDIT_LOG_USER_NAME_INVALID_CHARACTER = 3224 +OBSOLETE_ER_AUDIT_LOG_HOST_NAME_INVALID_CHARACTER = 3225 +ER_UNSUPPORT_COMPRESSED_TEMPORARY_TABLE = 3500 +ER_ACL_OPERATION_FAILED = 3501 +ER_UNSUPPORTED_INDEX_ALGORITHM = 3502 +ER_NO_SUCH_DB = 3503 +ER_TOO_BIG_ENUM = 3504 +ER_TOO_LONG_SET_ENUM_VALUE = 3505 +ER_INVALID_DD_OBJECT = 3506 +ER_UPDATING_DD_TABLE = 3507 +ER_INVALID_DD_OBJECT_ID = 3508 +ER_INVALID_DD_OBJECT_NAME = 3509 +ER_TABLESPACE_MISSING_WITH_NAME = 3510 +ER_TOO_LONG_ROUTINE_COMMENT = 3511 +ER_SP_LOAD_FAILED = 3512 +ER_INVALID_BITWISE_OPERANDS_SIZE = 3513 +ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE = 3514 +ER_WARN_UNSUPPORTED_HINT = 3515 +ER_UNEXPECTED_GEOMETRY_TYPE = 3516 +ER_SRS_PARSE_ERROR = 3517 +ER_SRS_PROJ_PARAMETER_MISSING = 3518 +ER_WARN_SRS_NOT_FOUND = 3519 +ER_SRS_NOT_CARTESIAN = 3520 +ER_SRS_NOT_CARTESIAN_UNDEFINED = 3521 +ER_PK_INDEX_CANT_BE_INVISIBLE = 3522 +ER_UNKNOWN_AUTHID = 3523 +ER_FAILED_ROLE_GRANT = 3524 +ER_OPEN_ROLE_TABLES = 3525 +ER_FAILED_DEFAULT_ROLES = 3526 +ER_COMPONENTS_NO_SCHEME = 3527 +ER_COMPONENTS_NO_SCHEME_SERVICE = 3528 +ER_COMPONENTS_CANT_LOAD = 3529 +ER_ROLE_NOT_GRANTED = 3530 +ER_FAILED_REVOKE_ROLE = 3531 +ER_RENAME_ROLE = 3532 +ER_COMPONENTS_CANT_ACQUIRE_SERVICE_IMPLEMENTATION = 3533 +ER_COMPONENTS_CANT_SATISFY_DEPENDENCY = 3534 +ER_COMPONENTS_LOAD_CANT_REGISTER_SERVICE_IMPLEMENTATION = 3535 +ER_COMPONENTS_LOAD_CANT_INITIALIZE = 3536 +ER_COMPONENTS_UNLOAD_NOT_LOADED = 3537 +ER_COMPONENTS_UNLOAD_CANT_DEINITIALIZE = 3538 +ER_COMPONENTS_CANT_RELEASE_SERVICE = 3539 +ER_COMPONENTS_UNLOAD_CANT_UNREGISTER_SERVICE = 3540 +ER_COMPONENTS_CANT_UNLOAD = 3541 +ER_WARN_UNLOAD_THE_NOT_PERSISTED = 3542 +ER_COMPONENT_TABLE_INCORRECT = 3543 +ER_COMPONENT_MANIPULATE_ROW_FAILED = 3544 +ER_COMPONENTS_UNLOAD_DUPLICATE_IN_GROUP = 3545 +ER_CANT_SET_GTID_PURGED_DUE_SETS_CONSTRAINTS = 3546 +ER_CANNOT_LOCK_USER_MANAGEMENT_CACHES = 3547 +ER_SRS_NOT_FOUND = 3548 +ER_VARIABLE_NOT_PERSISTED = 3549 +ER_IS_QUERY_INVALID_CLAUSE = 3550 +ER_UNABLE_TO_STORE_STATISTICS = 3551 +ER_NO_SYSTEM_SCHEMA_ACCESS = 3552 +ER_NO_SYSTEM_TABLESPACE_ACCESS = 3553 +ER_NO_SYSTEM_TABLE_ACCESS = 3554 +ER_NO_SYSTEM_TABLE_ACCESS_FOR_DICTIONARY_TABLE = 3555 +ER_NO_SYSTEM_TABLE_ACCESS_FOR_SYSTEM_TABLE = 3556 +ER_NO_SYSTEM_TABLE_ACCESS_FOR_TABLE = 3557 +ER_INVALID_OPTION_KEY = 3558 +ER_INVALID_OPTION_VALUE = 3559 +ER_INVALID_OPTION_KEY_VALUE_PAIR = 3560 +ER_INVALID_OPTION_START_CHARACTER = 3561 +ER_INVALID_OPTION_END_CHARACTER = 3562 +ER_INVALID_OPTION_CHARACTERS = 3563 +ER_DUPLICATE_OPTION_KEY = 3564 +ER_WARN_SRS_NOT_FOUND_AXIS_ORDER = 3565 +ER_NO_ACCESS_TO_NATIVE_FCT = 3566 +ER_RESET_MASTER_TO_VALUE_OUT_OF_RANGE = 3567 +ER_UNRESOLVED_TABLE_LOCK = 3568 +ER_DUPLICATE_TABLE_LOCK = 3569 +ER_BINLOG_UNSAFE_SKIP_LOCKED = 3570 +ER_BINLOG_UNSAFE_NOWAIT = 3571 +ER_LOCK_NOWAIT = 3572 +ER_CTE_RECURSIVE_REQUIRES_UNION = 3573 +ER_CTE_RECURSIVE_REQUIRES_NONRECURSIVE_FIRST = 3574 +ER_CTE_RECURSIVE_FORBIDS_AGGREGATION = 3575 +ER_CTE_RECURSIVE_FORBIDDEN_JOIN_ORDER = 3576 +ER_CTE_RECURSIVE_REQUIRES_SINGLE_REFERENCE = 3577 +ER_SWITCH_TMP_ENGINE = 3578 +ER_WINDOW_NO_SUCH_WINDOW = 3579 +ER_WINDOW_CIRCULARITY_IN_WINDOW_GRAPH = 3580 +ER_WINDOW_NO_CHILD_PARTITIONING = 3581 +ER_WINDOW_NO_INHERIT_FRAME = 3582 +ER_WINDOW_NO_REDEFINE_ORDER_BY = 3583 +ER_WINDOW_FRAME_START_ILLEGAL = 3584 +ER_WINDOW_FRAME_END_ILLEGAL = 3585 +ER_WINDOW_FRAME_ILLEGAL = 3586 +ER_WINDOW_RANGE_FRAME_ORDER_TYPE = 3587 +ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE = 3588 +ER_WINDOW_RANGE_FRAME_NUMERIC_TYPE = 3589 +ER_WINDOW_RANGE_BOUND_NOT_CONSTANT = 3590 +ER_WINDOW_DUPLICATE_NAME = 3591 +ER_WINDOW_ILLEGAL_ORDER_BY = 3592 +ER_WINDOW_INVALID_WINDOW_FUNC_USE = 3593 +ER_WINDOW_INVALID_WINDOW_FUNC_ALIAS_USE = 3594 +ER_WINDOW_NESTED_WINDOW_FUNC_USE_IN_WINDOW_SPEC = 3595 +ER_WINDOW_ROWS_INTERVAL_USE = 3596 +ER_WINDOW_NO_GROUP_ORDER = 3597 +ER_WINDOW_EXPLAIN_JSON = 3598 +ER_WINDOW_FUNCTION_IGNORES_FRAME = 3599 +ER_WL9236_NOW_UNUSED = 3600 +ER_INVALID_NO_OF_ARGS = 3601 +ER_FIELD_IN_GROUPING_NOT_GROUP_BY = 3602 +ER_TOO_LONG_TABLESPACE_COMMENT = 3603 +ER_ENGINE_CANT_DROP_TABLE = 3604 +ER_ENGINE_CANT_DROP_MISSING_TABLE = 3605 +ER_TABLESPACE_DUP_FILENAME = 3606 +ER_DB_DROP_RMDIR2 = 3607 +ER_IMP_NO_FILES_MATCHED = 3608 +ER_IMP_SCHEMA_DOES_NOT_EXIST = 3609 +ER_IMP_TABLE_ALREADY_EXISTS = 3610 +ER_IMP_INCOMPATIBLE_MYSQLD_VERSION = 3611 +ER_IMP_INCOMPATIBLE_DD_VERSION = 3612 +ER_IMP_INCOMPATIBLE_SDI_VERSION = 3613 +ER_WARN_INVALID_HINT = 3614 +ER_VAR_DOES_NOT_EXIST = 3615 +ER_LONGITUDE_OUT_OF_RANGE = 3616 +ER_LATITUDE_OUT_OF_RANGE = 3617 +ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS = 3618 +ER_ILLEGAL_PRIVILEGE_LEVEL = 3619 +ER_NO_SYSTEM_VIEW_ACCESS = 3620 +ER_COMPONENT_FILTER_FLABBERGASTED = 3621 +ER_PART_EXPR_TOO_LONG = 3622 +ER_UDF_DROP_DYNAMICALLY_REGISTERED = 3623 +ER_UNABLE_TO_STORE_COLUMN_STATISTICS = 3624 +ER_UNABLE_TO_UPDATE_COLUMN_STATISTICS = 3625 +ER_UNABLE_TO_DROP_COLUMN_STATISTICS = 3626 +ER_UNABLE_TO_BUILD_HISTOGRAM = 3627 +ER_MANDATORY_ROLE = 3628 +ER_MISSING_TABLESPACE_FILE = 3629 +ER_PERSIST_ONLY_ACCESS_DENIED_ERROR = 3630 +ER_CMD_NEED_SUPER = 3631 +ER_PATH_IN_DATADIR = 3632 +ER_DDL_IN_PROGRESS = 3633 +ER_TOO_MANY_CONCURRENT_CLONES = 3634 +ER_APPLIER_LOG_EVENT_VALIDATION_ERROR = 3635 +ER_CTE_MAX_RECURSION_DEPTH = 3636 +ER_NOT_HINT_UPDATABLE_VARIABLE = 3637 +ER_CREDENTIALS_CONTRADICT_TO_HISTORY = 3638 +ER_WARNING_PASSWORD_HISTORY_CLAUSES_VOID = 3639 +ER_CLIENT_DOES_NOT_SUPPORT = 3640 +ER_I_S_SKIPPED_TABLESPACE = 3641 +ER_TABLESPACE_ENGINE_MISMATCH = 3642 +ER_WRONG_SRID_FOR_COLUMN = 3643 +ER_CANNOT_ALTER_SRID_DUE_TO_INDEX = 3644 +ER_WARN_BINLOG_PARTIAL_UPDATES_DISABLED = 3645 +ER_WARN_BINLOG_V1_ROW_EVENTS_DISABLED = 3646 +ER_WARN_BINLOG_PARTIAL_UPDATES_SUGGESTS_PARTIAL_IMAGES = 3647 +ER_COULD_NOT_APPLY_JSON_DIFF = 3648 +ER_CORRUPTED_JSON_DIFF = 3649 +ER_RESOURCE_GROUP_EXISTS = 3650 +ER_RESOURCE_GROUP_NOT_EXISTS = 3651 +ER_INVALID_VCPU_ID = 3652 +ER_INVALID_VCPU_RANGE = 3653 +ER_INVALID_THREAD_PRIORITY = 3654 +ER_DISALLOWED_OPERATION = 3655 +ER_RESOURCE_GROUP_BUSY = 3656 +ER_RESOURCE_GROUP_DISABLED = 3657 +ER_FEATURE_UNSUPPORTED = 3658 +ER_ATTRIBUTE_IGNORED = 3659 +ER_INVALID_THREAD_ID = 3660 +ER_RESOURCE_GROUP_BIND_FAILED = 3661 +ER_INVALID_USE_OF_FORCE_OPTION = 3662 +ER_GROUP_REPLICATION_COMMAND_FAILURE = 3663 +ER_SDI_OPERATION_FAILED = 3664 +ER_MISSING_JSON_TABLE_VALUE = 3665 +ER_WRONG_JSON_TABLE_VALUE = 3666 +ER_TF_MUST_HAVE_ALIAS = 3667 +ER_TF_FORBIDDEN_JOIN_TYPE = 3668 +ER_JT_VALUE_OUT_OF_RANGE = 3669 +ER_JT_MAX_NESTED_PATH = 3670 +ER_PASSWORD_EXPIRATION_NOT_SUPPORTED_BY_AUTH_METHOD = 3671 +ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL = 3672 +ER_BAD_NULL_ERROR_NOT_IGNORED = 3673 +WARN_USELESS_SPATIAL_INDEX = 3674 +ER_DISK_FULL_NOWAIT = 3675 +ER_PARSE_ERROR_IN_DIGEST_FN = 3676 +ER_UNDISCLOSED_PARSE_ERROR_IN_DIGEST_FN = 3677 +ER_SCHEMA_DIR_EXISTS = 3678 +ER_SCHEMA_DIR_MISSING = 3679 +ER_SCHEMA_DIR_CREATE_FAILED = 3680 +ER_SCHEMA_DIR_UNKNOWN = 3681 +ER_ONLY_IMPLEMENTED_FOR_SRID_0_AND_4326 = 3682 +ER_BINLOG_EXPIRE_LOG_DAYS_AND_SECS_USED_TOGETHER = 3683 +ER_REGEXP_BUFFER_OVERFLOW = 3684 +ER_REGEXP_ILLEGAL_ARGUMENT = 3685 +ER_REGEXP_INDEX_OUTOFBOUNDS_ERROR = 3686 +ER_REGEXP_INTERNAL_ERROR = 3687 +ER_REGEXP_RULE_SYNTAX = 3688 +ER_REGEXP_BAD_ESCAPE_SEQUENCE = 3689 +ER_REGEXP_UNIMPLEMENTED = 3690 +ER_REGEXP_MISMATCHED_PAREN = 3691 +ER_REGEXP_BAD_INTERVAL = 3692 +ER_REGEXP_MAX_LT_MIN = 3693 +ER_REGEXP_INVALID_BACK_REF = 3694 +ER_REGEXP_LOOK_BEHIND_LIMIT = 3695 +ER_REGEXP_MISSING_CLOSE_BRACKET = 3696 +ER_REGEXP_INVALID_RANGE = 3697 +ER_REGEXP_STACK_OVERFLOW = 3698 +ER_REGEXP_TIME_OUT = 3699 +ER_REGEXP_PATTERN_TOO_BIG = 3700 +ER_CANT_SET_ERROR_LOG_SERVICE = 3701 +ER_EMPTY_PIPELINE_FOR_ERROR_LOG_SERVICE = 3702 +ER_COMPONENT_FILTER_DIAGNOSTICS = 3703 +ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS = 3704 +ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS = 3705 +ER_NONPOSITIVE_RADIUS = 3706 +ER_RESTART_SERVER_FAILED = 3707 +ER_SRS_MISSING_MANDATORY_ATTRIBUTE = 3708 +ER_SRS_MULTIPLE_ATTRIBUTE_DEFINITIONS = 3709 +ER_SRS_NAME_CANT_BE_EMPTY_OR_WHITESPACE = 3710 +ER_SRS_ORGANIZATION_CANT_BE_EMPTY_OR_WHITESPACE = 3711 +ER_SRS_ID_ALREADY_EXISTS = 3712 +ER_WARN_SRS_ID_ALREADY_EXISTS = 3713 +ER_CANT_MODIFY_SRID_0 = 3714 +ER_WARN_RESERVED_SRID_RANGE = 3715 +ER_CANT_MODIFY_SRS_USED_BY_COLUMN = 3716 +ER_SRS_INVALID_CHARACTER_IN_ATTRIBUTE = 3717 +ER_SRS_ATTRIBUTE_STRING_TOO_LONG = 3718 +ER_DEPRECATED_UTF8_ALIAS = 3719 +ER_DEPRECATED_NATIONAL = 3720 +ER_INVALID_DEFAULT_UTF8MB4_COLLATION = 3721 +ER_UNABLE_TO_COLLECT_INSTANCE_LOG_STATUS = 3722 +ER_RESERVED_TABLESPACE_NAME = 3723 +ER_UNABLE_TO_SET_OPTION = 3724 +ER_SLAVE_POSSIBLY_DIVERGED_AFTER_DDL = 3725 +ER_PARSER_TRACE = 10000 +ER_BOOTSTRAP_CANT_THREAD = 10001 +ER_TRIGGER_INVALID_VALUE = 10002 +ER_OPT_WRONG_TREE = 10003 +ER_DD_FAILSAFE = 10004 +ER_DD_NO_WRITES_NO_REPOPULATION = 10005 +ER_DD_VERSION_FOUND = 10006 +ER_DD_VERSION_INSTALLED = 10007 +ER_DD_VERSION_UNSUPPORTED = 10008 +ER_LOG_SYSLOG_FACILITY_FAIL = 10009 +ER_LOG_SYSLOG_CANNOT_OPEN = 10010 +ER_LOG_SLOW_CANNOT_OPEN = 10011 +ER_LOG_GENERAL_CANNOT_OPEN = 10012 +ER_LOG_CANNOT_WRITE = 10013 +ER_RPL_ZOMBIE_ENCOUNTERED = 10014 +ER_RPL_GTID_TABLE_CANNOT_OPEN = 10015 +ER_SYSTEM_SCHEMA_NOT_FOUND = 10016 +ER_DD_INIT_UPGRADE_FAILED = 10017 +ER_VIEW_UNKNOWN_CHARSET_OR_COLLATION = 10018 +ER_DD_VIEW_CANT_ALLOC_CHARSET = 10019 +ER_DD_INIT_FAILED = 10020 +ER_DD_UPDATING_PLUGIN_MD_FAILED = 10021 +ER_DD_POPULATING_TABLES_FAILED = 10022 +ER_DD_VIEW_CANT_CREATE = 10023 +ER_DD_METADATA_NOT_FOUND = 10024 +ER_DD_CACHE_NOT_EMPTY_AT_SHUTDOWN = 10025 +ER_DD_OBJECT_REMAINS = 10026 +ER_DD_OBJECT_REMAINS_IN_RELEASER = 10027 +ER_DD_OBJECT_RELEASER_REMAINS = 10028 +ER_DD_CANT_GET_OBJECT_KEY = 10029 +ER_DD_CANT_CREATE_OBJECT_KEY = 10030 +ER_CANT_CREATE_HANDLE_MGR_THREAD = 10031 +ER_RPL_REPO_HAS_GAPS = 10032 +ER_INVALID_VALUE_FOR_ENFORCE_GTID_CONSISTENCY = 10033 +ER_CHANGED_ENFORCE_GTID_CONSISTENCY = 10034 +ER_CHANGED_GTID_MODE = 10035 +ER_DISABLED_STORAGE_ENGINE_AS_DEFAULT = 10036 +ER_DEBUG_SYNC_HIT = 10037 +ER_DEBUG_SYNC_EXECUTED = 10038 +ER_DEBUG_SYNC_THREAD_MAX = 10039 +ER_DEBUG_SYNC_OOM = 10040 +ER_CANT_INIT_TC_LOG = 10041 +ER_EVENT_CANT_INIT_QUEUE = 10042 +ER_EVENT_PURGING_QUEUE = 10043 +ER_EVENT_LAST_EXECUTION = 10044 +ER_EVENT_MESSAGE_STACK = 10045 +ER_EVENT_EXECUTION_FAILED = 10046 +ER_CANT_INIT_SCHEDULER_THREAD = 10047 +ER_SCHEDULER_STOPPED = 10048 +ER_CANT_CREATE_SCHEDULER_THREAD = 10049 +ER_SCHEDULER_WAITING = 10050 +ER_SCHEDULER_STARTED = 10051 +ER_SCHEDULER_STOPPING_FAILED_TO_GET_EVENT = 10052 +ER_SCHEDULER_STOPPING_FAILED_TO_CREATE_WORKER = 10053 +ER_SCHEDULER_KILLING = 10054 +ER_UNABLE_TO_RESOLVE_IP = 10055 +ER_UNABLE_TO_RESOLVE_HOSTNAME = 10056 +ER_HOSTNAME_RESEMBLES_IPV4 = 10057 +ER_HOSTNAME_DOESNT_RESOLVE_TO = 10058 +ER_ADDRESSES_FOR_HOSTNAME_HEADER = 10059 +ER_ADDRESSES_FOR_HOSTNAME_LIST_ITEM = 10060 +ER_TRG_WITHOUT_DEFINER = 10061 +ER_TRG_NO_CLIENT_CHARSET = 10062 +ER_PARSING_VIEW = 10063 +ER_COMPONENTS_INFRASTRUCTURE_BOOTSTRAP = 10064 +ER_COMPONENTS_INFRASTRUCTURE_SHUTDOWN = 10065 +ER_COMPONENTS_PERSIST_LOADER_BOOTSTRAP = 10066 +ER_DEPART_WITH_GRACE = 10067 +ER_CA_SELF_SIGNED = 10068 +ER_SSL_LIBRARY_ERROR = 10069 +ER_NO_THD_NO_UUID = 10070 +ER_UUID_SALT = 10071 +ER_UUID_IS = 10072 +ER_UUID_INVALID = 10073 +ER_UUID_SCRUB = 10074 +ER_CREATING_NEW_UUID = 10075 +ER_CANT_CREATE_UUID = 10076 +ER_UNKNOWN_UNSUPPORTED_STORAGE_ENGINE = 10077 +ER_SECURE_AUTH_VALUE_UNSUPPORTED = 10078 +ER_INVALID_INSTRUMENT = 10079 +ER_INNODB_MANDATORY = 10080 +OBSOLETE_ER_INNODB_CANNOT_BE_IGNORED = 10081 +ER_OLD_PASSWORDS_NO_MIDDLE_GROUND = 10082 +ER_VERBOSE_REQUIRES_HELP = 10083 +ER_POINTLESS_WITHOUT_SLOWLOG = 10084 +ER_WASTEFUL_NET_BUFFER_SIZE = 10085 +ER_DEPRECATED_TIMESTAMP_IMPLICIT_DEFAULTS = 10086 +ER_FT_BOOL_SYNTAX_INVALID = 10087 +ER_CREDENTIALLESS_AUTO_USER_BAD = 10088 +ER_CONNECTION_HANDLING_OOM = 10089 +ER_THREAD_HANDLING_OOM = 10090 +ER_CANT_CREATE_TEST_FILE = 10091 +ER_CANT_CREATE_PID_FILE = 10092 +ER_CANT_REMOVE_PID_FILE = 10093 +ER_CANT_CREATE_SHUTDOWN_THREAD = 10094 +ER_SEC_FILE_PRIV_CANT_ACCESS_DIR = 10095 +ER_SEC_FILE_PRIV_IGNORED = 10096 +ER_SEC_FILE_PRIV_EMPTY = 10097 +ER_SEC_FILE_PRIV_NULL = 10098 +ER_SEC_FILE_PRIV_DIRECTORY_INSECURE = 10099 +ER_SEC_FILE_PRIV_CANT_STAT = 10100 +ER_SEC_FILE_PRIV_DIRECTORY_PERMISSIONS = 10101 +ER_SEC_FILE_PRIV_ARGUMENT_TOO_LONG = 10102 +ER_CANT_CREATE_NAMED_PIPES_THREAD = 10103 +ER_CANT_CREATE_TCPIP_THREAD = 10104 +ER_CANT_CREATE_SHM_THREAD = 10105 +ER_CANT_CREATE_INTERRUPT_THREAD = 10106 +ER_WRITABLE_CONFIG_REMOVED = 10107 +ER_CORE_VALUES = 10108 +ER_WRONG_DATETIME_SPEC = 10109 +ER_RPL_BINLOG_FILTERS_OOM = 10110 +ER_KEYCACHE_OOM = 10111 +ER_CONFIRMING_THE_FUTURE = 10112 +ER_BACK_IN_TIME = 10113 +ER_FUTURE_DATE = 10114 +ER_UNSUPPORTED_DATE = 10115 +ER_STARTING_AS = 10116 +ER_SHUTTING_DOWN_SLAVE_THREADS = 10117 +ER_DISCONNECTING_REMAINING_CLIENTS = 10118 +ER_ABORTING = 10119 +ER_BINLOG_END = 10120 +ER_CALL_ME_LOCALHOST = 10121 +ER_USER_REQUIRES_ROOT = 10122 +ER_REALLY_RUN_AS_ROOT = 10123 +ER_USER_WHAT_USER = 10124 +ER_TRANSPORTS_WHAT_TRANSPORTS = 10125 +ER_FAIL_SETGID = 10126 +ER_FAIL_SETUID = 10127 +ER_FAIL_SETREGID = 10128 +ER_FAIL_SETREUID = 10129 +ER_FAIL_CHROOT = 10130 +ER_WIN_LISTEN_BUT_HOW = 10131 +ER_NOT_RIGHT_NOW = 10132 +ER_FIXING_CLIENT_CHARSET = 10133 +ER_OOM = 10134 +ER_FAILED_TO_LOCK_MEM = 10135 +ER_MYINIT_FAILED = 10136 +ER_BEG_INITFILE = 10137 +ER_END_INITFILE = 10138 +ER_CHANGED_MAX_OPEN_FILES = 10139 +ER_CANT_INCREASE_MAX_OPEN_FILES = 10140 +ER_CHANGED_MAX_CONNECTIONS = 10141 +ER_CHANGED_TABLE_OPEN_CACHE = 10142 +ER_THE_USER_ABIDES = 10143 +ER_RPL_CANT_ADD_DO_TABLE = 10144 +ER_RPL_CANT_ADD_IGNORE_TABLE = 10145 +ER_TRACK_VARIABLES_BOGUS = 10146 +ER_EXCESS_ARGUMENTS = 10147 +ER_VERBOSE_HINT = 10148 +ER_CANT_READ_ERRMSGS = 10149 +ER_CANT_INIT_DBS = 10150 +ER_LOG_OUTPUT_CONTRADICTORY = 10151 +ER_NO_CSV_NO_LOG_TABLES = 10152 +ER_RPL_REWRITEDB_MISSING_ARROW = 10153 +ER_RPL_REWRITEDB_EMPTY_FROM = 10154 +ER_RPL_REWRITEDB_EMPTY_TO = 10155 +ER_LOG_FILES_GIVEN_LOG_OUTPUT_IS_TABLE = 10156 +ER_LOG_FILE_INVALID = 10157 +ER_LOWER_CASE_TABLE_NAMES_CS_DD_ON_CI_FS_UNSUPPORTED = 10158 +ER_LOWER_CASE_TABLE_NAMES_USING_2 = 10159 +ER_LOWER_CASE_TABLE_NAMES_USING_0 = 10160 +ER_NEED_LOG_BIN = 10161 +ER_NEED_FILE_INSTEAD_OF_DIR = 10162 +ER_LOG_BIN_BETTER_WITH_NAME = 10163 +ER_BINLOG_NEEDS_SERVERID = 10164 +ER_RPL_CANT_MAKE_PATHS = 10165 +ER_CANT_INITIALIZE_GTID = 10166 +ER_CANT_INITIALIZE_EARLY_PLUGINS = 10167 +ER_CANT_INITIALIZE_BUILTIN_PLUGINS = 10168 +ER_CANT_INITIALIZE_DYNAMIC_PLUGINS = 10169 +ER_PERFSCHEMA_INIT_FAILED = 10170 +ER_STACKSIZE_UNEXPECTED = 10171 +ER_CANT_SET_DATADIR = 10172 +ER_CANT_STAT_DATADIR = 10173 +ER_CANT_CHOWN_DATADIR = 10174 +ER_CANT_SET_UP_PERSISTED_VALUES = 10175 +ER_CANT_SAVE_GTIDS = 10176 +ER_AUTH_CANT_SET_DEFAULT_PLUGIN = 10177 +ER_CANT_JOIN_SHUTDOWN_THREAD = 10178 +ER_CANT_HASH_DO_AND_IGNORE_RULES = 10179 +ER_CANT_OPEN_CA = 10180 +ER_CANT_ACCESS_CAPATH = 10181 +ER_SSL_TRYING_DATADIR_DEFAULTS = 10182 +ER_AUTO_OPTIONS_FAILED = 10183 +ER_CANT_INIT_TIMER = 10184 +ER_SERVERID_TOO_LARGE = 10185 +ER_DEFAULT_SE_UNAVAILABLE = 10186 +ER_CANT_OPEN_ERROR_LOG = 10187 +ER_INVALID_ERROR_LOG_NAME = 10188 +ER_RPL_INFINITY_DENIED = 10189 +ER_RPL_INFINITY_IGNORED = 10190 +ER_NDB_TABLES_NOT_READY = 10191 +ER_TABLE_CHECK_INTACT = 10192 +ER_DD_TABLESPACE_NOT_FOUND = 10193 +ER_DD_TRG_CONNECTION_COLLATION_MISSING = 10194 +ER_DD_TRG_DB_COLLATION_MISSING = 10195 +ER_DD_TRG_DEFINER_OOM = 10196 +ER_DD_TRG_FILE_UNREADABLE = 10197 +ER_TRG_CANT_PARSE = 10198 +ER_DD_TRG_CANT_ADD = 10199 +ER_DD_CANT_RESOLVE_VIEW = 10200 +ER_DD_VIEW_WITHOUT_DEFINER = 10201 +ER_PLUGIN_INIT_FAILED = 10202 +ER_RPL_TRX_DELEGATES_INIT_FAILED = 10203 +ER_RPL_BINLOG_STORAGE_DELEGATES_INIT_FAILED = 10204 +ER_RPL_BINLOG_TRANSMIT_DELEGATES_INIT_FAILED = 10205 +ER_RPL_BINLOG_RELAY_DELEGATES_INIT_FAILED = 10206 +ER_RPL_PLUGIN_FUNCTION_FAILED = 10207 +ER_SQL_HA_READ_FAILED = 10208 +ER_SR_BOGUS_VALUE = 10209 +ER_SR_INVALID_CONTEXT = 10210 +ER_READING_TABLE_FAILED = 10211 +ER_DES_FILE_WRONG_KEY = 10212 +ER_CANT_SET_PERSISTED = 10213 +ER_JSON_PARSE_ERROR = 10214 +ER_CONFIG_OPTION_WITHOUT_GROUP = 10215 +ER_VALGRIND_DO_QUICK_LEAK_CHECK = 10216 +ER_VALGRIND_COUNT_LEAKS = 10217 +ER_LOAD_DATA_INFILE_FAILED_IN_UNEXPECTED_WAY = 10218 +ER_UNKNOWN_ERROR_NUMBER = 10219 +ER_UDF_CANT_ALLOC_FOR_STRUCTURES = 10220 +ER_UDF_CANT_ALLOC_FOR_FUNCTION = 10221 +ER_UDF_INVALID_ROW_IN_FUNCTION_TABLE = 10222 +ER_UDF_CANT_OPEN_FUNCTION_TABLE = 10223 +ER_XA_RECOVER_FOUND_TRX_IN_SE = 10224 +ER_XA_RECOVER_FOUND_XA_TRX = 10225 +ER_XA_IGNORING_XID = 10226 +ER_XA_COMMITTING_XID = 10227 +ER_XA_ROLLING_BACK_XID = 10228 +ER_XA_STARTING_RECOVERY = 10229 +ER_XA_NO_MULTI_2PC_HEURISTIC_RECOVER = 10230 +ER_XA_RECOVER_EXPLANATION = 10231 +ER_XA_RECOVERY_DONE = 10232 +ER_TRX_GTID_COLLECT_REJECT = 10233 +ER_SQL_AUTHOR_DEFAULT_ROLES_FAIL = 10234 +ER_SQL_USER_TABLE_CREATE_WARNING = 10235 +ER_SQL_USER_TABLE_ALTER_WARNING = 10236 +ER_ROW_IN_WRONG_PARTITION_PLEASE_REPAIR = 10237 +ER_MYISAM_CRASHED_ERROR_IN_THREAD = 10238 +ER_MYISAM_CRASHED_ERROR_IN = 10239 +ER_TOO_MANY_STORAGE_ENGINES = 10240 +ER_SE_TYPECODE_CONFLICT = 10241 +ER_TRX_WRITE_SET_OOM = 10242 +ER_HANDLERTON_OOM = 10243 +ER_CONN_SHM_LISTENER = 10244 +ER_CONN_SHM_CANT_CREATE_SERVICE = 10245 +ER_CONN_SHM_CANT_CREATE_CONNECTION = 10246 +ER_CONN_PIP_CANT_CREATE_EVENT = 10247 +ER_CONN_PIP_CANT_CREATE_PIPE = 10248 +ER_CONN_PER_THREAD_NO_THREAD = 10249 +ER_CONN_TCP_NO_SOCKET = 10250 +ER_CONN_TCP_CREATED = 10251 +ER_CONN_TCP_ADDRESS = 10252 +ER_CONN_TCP_IPV6_AVAILABLE = 10253 +ER_CONN_TCP_IPV6_UNAVAILABLE = 10254 +ER_CONN_TCP_ERROR_WITH_STRERROR = 10255 +ER_CONN_TCP_CANT_RESOLVE_HOSTNAME = 10256 +ER_CONN_TCP_IS_THERE_ANOTHER_USING_PORT = 10257 +ER_CONN_UNIX_IS_THERE_ANOTHER_USING_SOCKET = 10258 +ER_CONN_UNIX_PID_CLAIMED_SOCKET_FILE = 10259 +ER_CONN_TCP_CANT_RESET_V6ONLY = 10260 +ER_CONN_TCP_BIND_RETRY = 10261 +ER_CONN_TPC_BIND_FAIL = 10262 +ER_CONN_TCP_IP_NOT_LOGGED = 10263 +ER_CONN_TCP_RESOLVE_INFO = 10264 +ER_CONN_TCP_START_FAIL = 10265 +ER_CONN_TCP_LISTEN_FAIL = 10266 +ER_CONN_UNIX_PATH_TOO_LONG = 10267 +ER_CONN_UNIX_LOCK_FILE_FAIL = 10268 +ER_CONN_UNIX_NO_FD = 10269 +ER_CONN_UNIX_NO_BIND_NO_START = 10270 +ER_CONN_UNIX_LISTEN_FAILED = 10271 +ER_CONN_UNIX_LOCK_FILE_GIVING_UP = 10272 +ER_CONN_UNIX_LOCK_FILE_CANT_CREATE = 10273 +ER_CONN_UNIX_LOCK_FILE_CANT_OPEN = 10274 +ER_CONN_UNIX_LOCK_FILE_CANT_READ = 10275 +ER_CONN_UNIX_LOCK_FILE_EMPTY = 10276 +ER_CONN_UNIX_LOCK_FILE_PIDLESS = 10277 +ER_CONN_UNIX_LOCK_FILE_CANT_WRITE = 10278 +ER_CONN_UNIX_LOCK_FILE_CANT_DELETE = 10279 +ER_CONN_UNIX_LOCK_FILE_CANT_SYNC = 10280 +ER_CONN_UNIX_LOCK_FILE_CANT_CLOSE = 10281 +ER_CONN_SOCKET_SELECT_FAILED = 10282 +ER_CONN_SOCKET_ACCEPT_FAILED = 10283 +ER_AUTH_RSA_CANT_FIND = 10284 +ER_AUTH_RSA_CANT_PARSE = 10285 +ER_AUTH_RSA_CANT_READ = 10286 +ER_AUTH_RSA_FILES_NOT_FOUND = 10287 +ER_CONN_ATTR_TRUNCATED = 10288 +ER_X509_CIPHERS_MISMATCH = 10289 +ER_X509_ISSUER_MISMATCH = 10290 +ER_X509_SUBJECT_MISMATCH = 10291 +ER_AUTH_CANT_ACTIVATE_ROLE = 10292 +ER_X509_NEEDS_RSA_PRIVKEY = 10293 +ER_X509_CANT_WRITE_KEY = 10294 +ER_X509_CANT_CHMOD_KEY = 10295 +ER_X509_CANT_READ_CA_KEY = 10296 +ER_X509_CANT_READ_CA_CERT = 10297 +ER_X509_CANT_CREATE_CERT = 10298 +ER_X509_CANT_WRITE_CERT = 10299 +ER_AUTH_CANT_CREATE_RSA_PAIR = 10300 +ER_AUTH_CANT_WRITE_PRIVKEY = 10301 +ER_AUTH_CANT_WRITE_PUBKEY = 10302 +ER_AUTH_SSL_CONF_PREVENTS_CERT_GENERATION = 10303 +ER_AUTH_USING_EXISTING_CERTS = 10304 +ER_AUTH_CERTS_SAVED_TO_DATADIR = 10305 +ER_AUTH_CERT_GENERATION_DISABLED = 10306 +ER_AUTH_RSA_CONF_PREVENTS_KEY_GENERATION = 10307 +ER_AUTH_KEY_GENERATION_SKIPPED_PAIR_PRESENT = 10308 +ER_AUTH_KEYS_SAVED_TO_DATADIR = 10309 +ER_AUTH_KEY_GENERATION_DISABLED = 10310 +ER_AUTHCACHE_PROXIES_PRIV_SKIPPED_NEEDS_RESOLVE = 10311 +ER_AUTHCACHE_PLUGIN_MISSING = 10312 +ER_AUTHCACHE_PLUGIN_CONFIG = 10313 +OBSOLETE_ER_AUTHCACHE_ROLE_TABLES_DODGY = 10314 +ER_AUTHCACHE_USER_SKIPPED_NEEDS_RESOLVE = 10315 +ER_AUTHCACHE_USER_TABLE_DODGY = 10316 +ER_AUTHCACHE_USER_IGNORED_DEPRECATED_PASSWORD = 10317 +ER_AUTHCACHE_USER_IGNORED_NEEDS_PLUGIN = 10318 +ER_AUTHCACHE_USER_IGNORED_INVALID_PASSWORD = 10319 +ER_AUTHCACHE_EXPIRED_PASSWORD_UNSUPPORTED = 10320 +ER_NO_SUPER_WITHOUT_USER_PLUGIN = 10321 +ER_AUTHCACHE_DB_IGNORED_EMPTY_NAME = 10322 +ER_AUTHCACHE_DB_SKIPPED_NEEDS_RESOLVE = 10323 +ER_AUTHCACHE_DB_ENTRY_LOWERCASED_REVOKE_WILL_FAIL = 10324 +ER_AUTHCACHE_TABLE_PROXIES_PRIV_MISSING = 10325 +ER_AUTHCACHE_CANT_OPEN_AND_LOCK_PRIVILEGE_TABLES = 10326 +ER_AUTHCACHE_CANT_INIT_GRANT_SUBSYSTEM = 10327 +ER_AUTHCACHE_PROCS_PRIV_SKIPPED_NEEDS_RESOLVE = 10328 +ER_AUTHCACHE_PROCS_PRIV_ENTRY_IGNORED_BAD_ROUTINE_TYPE = 10329 +ER_AUTHCACHE_TABLES_PRIV_SKIPPED_NEEDS_RESOLVE = 10330 +ER_USER_NOT_IN_EXTRA_USERS_BINLOG_POSSIBLY_INCOMPLETE = 10331 +ER_DD_SCHEMA_NOT_FOUND = 10332 +ER_DD_TABLE_NOT_FOUND = 10333 +ER_DD_SE_INIT_FAILED = 10334 +ER_DD_ABORTING_PARTIAL_UPGRADE = 10335 +ER_DD_FRM_EXISTS_FOR_TABLE = 10336 +ER_DD_CREATED_FOR_UPGRADE = 10337 +ER_ERRMSG_CANT_FIND_FILE = 10338 +ER_ERRMSG_LOADING_55_STYLE = 10339 +ER_ERRMSG_MISSING_IN_FILE = 10340 +ER_ERRMSG_OOM = 10341 +ER_ERRMSG_CANT_READ = 10342 +ER_TABLE_INCOMPATIBLE_DECIMAL_FIELD = 10343 +ER_TABLE_INCOMPATIBLE_YEAR_FIELD = 10344 +ER_INVALID_CHARSET_AND_DEFAULT_IS_MB = 10345 +ER_TABLE_WRONG_KEY_DEFINITION = 10346 +ER_CANT_OPEN_FRM_FILE = 10347 +ER_CANT_READ_FRM_FILE = 10348 +ER_TABLE_CREATED_WITH_DIFFERENT_VERSION = 10349 +ER_VIEW_UNPARSABLE = 10350 +ER_FILE_TYPE_UNKNOWN = 10351 +ER_INVALID_INFO_IN_FRM = 10352 +ER_CANT_OPEN_AND_LOCK_PRIVILEGE_TABLES = 10353 +ER_AUDIT_PLUGIN_DOES_NOT_SUPPORT_AUDIT_AUTH_EVENTS = 10354 +ER_AUDIT_PLUGIN_HAS_INVALID_DATA = 10355 +ER_TZ_OOM_INITIALIZING_TIME_ZONES = 10356 +ER_TZ_CANT_OPEN_AND_LOCK_TIME_ZONE_TABLE = 10357 +ER_TZ_OOM_LOADING_LEAP_SECOND_TABLE = 10358 +ER_TZ_TOO_MANY_LEAPS_IN_LEAP_SECOND_TABLE = 10359 +ER_TZ_ERROR_LOADING_LEAP_SECOND_TABLE = 10360 +ER_TZ_UNKNOWN_OR_ILLEGAL_DEFAULT_TIME_ZONE = 10361 +ER_TZ_CANT_FIND_DESCRIPTION_FOR_TIME_ZONE = 10362 +ER_TZ_CANT_FIND_DESCRIPTION_FOR_TIME_ZONE_ID = 10363 +ER_TZ_TRANSITION_TYPE_TABLE_TYPE_TOO_LARGE = 10364 +ER_TZ_TRANSITION_TYPE_TABLE_ABBREVIATIONS_EXCEED_SPACE = 10365 +ER_TZ_TRANSITION_TYPE_TABLE_LOAD_ERROR = 10366 +ER_TZ_TRANSITION_TABLE_TOO_MANY_TRANSITIONS = 10367 +ER_TZ_TRANSITION_TABLE_BAD_TRANSITION_TYPE = 10368 +ER_TZ_TRANSITION_TABLE_LOAD_ERROR = 10369 +ER_TZ_NO_TRANSITION_TYPES_IN_TIME_ZONE = 10370 +ER_TZ_OOM_LOADING_TIME_ZONE_DESCRIPTION = 10371 +ER_TZ_CANT_BUILD_MKTIME_MAP = 10372 +ER_TZ_OOM_WHILE_LOADING_TIME_ZONE = 10373 +ER_TZ_OOM_WHILE_SETTING_TIME_ZONE = 10374 +ER_SLAVE_SQL_THREAD_STOPPED_UNTIL_CONDITION_BAD = 10375 +ER_SLAVE_SQL_THREAD_STOPPED_UNTIL_POSITION_REACHED = 10376 +ER_SLAVE_SQL_THREAD_STOPPED_BEFORE_GTIDS_ALREADY_APPLIED = 10377 +ER_SLAVE_SQL_THREAD_STOPPED_BEFORE_GTIDS_REACHED = 10378 +ER_SLAVE_SQL_THREAD_STOPPED_AFTER_GTIDS_REACHED = 10379 +ER_SLAVE_SQL_THREAD_STOPPED_GAP_TRX_PROCESSED = 10380 +ER_GROUP_REPLICATION_PLUGIN_NOT_INSTALLED = 10381 +ER_GTID_ALREADY_ADDED_BY_USER = 10382 +ER_FAILED_TO_DELETE_FROM_GTID_EXECUTED_TABLE = 10383 +ER_FAILED_TO_COMPRESS_GTID_EXECUTED_TABLE = 10384 +ER_FAILED_TO_COMPRESS_GTID_EXECUTED_TABLE_OOM = 10385 +ER_FAILED_TO_INIT_THREAD_ATTR_FOR_GTID_TABLE_COMPRESSION = 10386 +ER_FAILED_TO_CREATE_GTID_TABLE_COMPRESSION_THREAD = 10387 +ER_FAILED_TO_JOIN_GTID_TABLE_COMPRESSION_THREAD = 10388 +ER_NPIPE_FAILED_TO_INIT_SECURITY_DESCRIPTOR = 10389 +ER_NPIPE_FAILED_TO_SET_SECURITY_DESCRIPTOR = 10390 +ER_NPIPE_PIPE_ALREADY_IN_USE = 10391 +ER_NDB_SLAVE_SAW_EPOCH_LOWER_THAN_PREVIOUS_ON_START = 10392 +ER_NDB_SLAVE_SAW_EPOCH_LOWER_THAN_PREVIOUS = 10393 +ER_NDB_SLAVE_SAW_ALREADY_COMMITTED_EPOCH = 10394 +ER_NDB_SLAVE_PREVIOUS_EPOCH_NOT_COMMITTED = 10395 +ER_NDB_SLAVE_MISSING_DATA_FOR_TIMESTAMP_COLUMN = 10396 +ER_NDB_SLAVE_LOGGING_EXCEPTIONS_TO = 10397 +ER_NDB_SLAVE_LOW_EPOCH_RESOLUTION = 10398 +ER_NDB_INFO_FOUND_UNEXPECTED_FIELD_TYPE = 10399 +ER_NDB_INFO_FAILED_TO_CREATE_NDBINFO = 10400 +ER_NDB_INFO_FAILED_TO_INIT_NDBINFO = 10401 +ER_NDB_CLUSTER_WRONG_NUMBER_OF_FUNCTION_ARGUMENTS = 10402 +ER_NDB_CLUSTER_SCHEMA_INFO = 10403 +ER_NDB_CLUSTER_GENERIC_MESSAGE = 10404 +ER_RPL_CANT_OPEN_INFO_TABLE = 10405 +ER_RPL_CANT_SCAN_INFO_TABLE = 10406 +ER_RPL_CORRUPTED_INFO_TABLE = 10407 +ER_RPL_CORRUPTED_KEYS_IN_INFO_TABLE = 10408 +ER_RPL_WORKER_ID_IS = 10409 +ER_RPL_INCONSISTENT_TIMESTAMPS_IN_TRX = 10410 +ER_RPL_INCONSISTENT_SEQUENCE_NO_IN_TRX = 10411 +ER_RPL_CHANNELS_REQUIRE_TABLES_AS_INFO_REPOSITORIES = 10412 +ER_RPL_CHANNELS_REQUIRE_NON_ZERO_SERVER_ID = 10413 +ER_RPL_REPO_SHOULD_BE_TABLE = 10414 +ER_RPL_ERROR_CREATING_MASTER_INFO = 10415 +ER_RPL_ERROR_CHANGING_MASTER_INFO_REPO_TYPE = 10416 +ER_RPL_CHANGING_RELAY_LOG_INFO_REPO_TYPE_FAILED_DUE_TO_GAPS = 10417 +ER_RPL_ERROR_CREATING_RELAY_LOG_INFO = 10418 +ER_RPL_ERROR_CHANGING_RELAY_LOG_INFO_REPO_TYPE = 10419 +ER_RPL_FAILED_TO_DELETE_FROM_SLAVE_WORKERS_INFO_REPOSITORY = 10420 +ER_RPL_FAILED_TO_RESET_STATE_IN_SLAVE_INFO_REPOSITORY = 10421 +ER_RPL_ERROR_CHECKING_REPOSITORY = 10422 +ER_RPL_SLAVE_GENERIC_MESSAGE = 10423 +ER_RPL_SLAVE_COULD_NOT_CREATE_CHANNEL_LIST = 10424 +ER_RPL_MULTISOURCE_REQUIRES_TABLE_TYPE_REPOSITORIES = 10425 +ER_RPL_SLAVE_FAILED_TO_INIT_A_MASTER_INFO_STRUCTURE = 10426 +ER_RPL_SLAVE_FAILED_TO_INIT_MASTER_INFO_STRUCTURE = 10427 +ER_RPL_SLAVE_FAILED_TO_CREATE_CHANNEL_FROM_MASTER_INFO = 10428 +ER_RPL_FAILED_TO_CREATE_NEW_INFO_FILE = 10429 +ER_RPL_FAILED_TO_CREATE_CACHE_FOR_INFO_FILE = 10430 +ER_RPL_FAILED_TO_OPEN_INFO_FILE = 10431 +ER_RPL_GTID_MEMORY_FINALLY_AVAILABLE = 10432 +ER_SERVER_COST_UNKNOWN_COST_CONSTANT = 10433 +ER_SERVER_COST_INVALID_COST_CONSTANT = 10434 +ER_ENGINE_COST_UNKNOWN_COST_CONSTANT = 10435 +ER_ENGINE_COST_UNKNOWN_STORAGE_ENGINE = 10436 +ER_ENGINE_COST_INVALID_DEVICE_TYPE_FOR_SE = 10437 +ER_ENGINE_COST_INVALID_CONST_CONSTANT_FOR_SE_AND_DEVICE = 10438 +ER_SERVER_COST_FAILED_TO_READ = 10439 +ER_ENGINE_COST_FAILED_TO_READ = 10440 +ER_FAILED_TO_OPEN_COST_CONSTANT_TABLES = 10441 +ER_RPL_UNSUPPORTED_UNIGNORABLE_EVENT_IN_STREAM = 10442 +ER_RPL_GTID_LOG_EVENT_IN_STREAM = 10443 +ER_RPL_UNEXPECTED_BEGIN_IN_STREAM = 10444 +ER_RPL_UNEXPECTED_COMMIT_ROLLBACK_OR_XID_LOG_EVENT_IN_STREAM = 10445 +ER_RPL_UNEXPECTED_XA_ROLLBACK_IN_STREAM = 10446 +ER_EVENT_EXECUTION_FAILED_CANT_AUTHENTICATE_USER = 10447 +ER_EVENT_EXECUTION_FAILED_USER_LOST_EVEN_PRIVILEGE = 10448 +ER_EVENT_ERROR_DURING_COMPILATION = 10449 +ER_EVENT_DROPPING = 10450 +ER_NDB_SCHEMA_GENERIC_MESSAGE = 10451 +ER_RPL_INCOMPATIBLE_DECIMAL_IN_RBR = 10452 +ER_INIT_ROOT_WITHOUT_PASSWORD = 10453 +ER_INIT_GENERATING_TEMP_PASSWORD_FOR_ROOT = 10454 +ER_INIT_CANT_OPEN_BOOTSTRAP_FILE = 10455 +ER_INIT_BOOTSTRAP_COMPLETE = 10456 +ER_INIT_DATADIR_NOT_EMPTY_WONT_INITIALIZE = 10457 +ER_INIT_DATADIR_EXISTS_WONT_INITIALIZE = 10458 +ER_INIT_DATADIR_EXISTS_AND_PATH_TOO_LONG_WONT_INITIALIZE = 10459 +ER_INIT_DATADIR_EXISTS_AND_NOT_WRITABLE_WONT_INITIALIZE = 10460 +ER_INIT_CREATING_DD = 10461 +ER_RPL_BINLOG_STARTING_DUMP = 10462 +ER_RPL_BINLOG_MASTER_SENDS_HEARTBEAT = 10463 +ER_RPL_BINLOG_SKIPPING_REMAINING_HEARTBEAT_INFO = 10464 +ER_RPL_BINLOG_MASTER_USES_CHECKSUM_AND_SLAVE_CANT = 10465 +ER_NDB_QUERY_FAILED = 10466 +ER_KILLING_THREAD = 10467 +ER_DETACHING_SESSION_LEFT_BY_PLUGIN = 10468 +ER_CANT_DETACH_SESSION_LEFT_BY_PLUGIN = 10469 +ER_DETACHED_SESSIONS_LEFT_BY_PLUGIN = 10470 +ER_FAILED_TO_DECREMENT_NUMBER_OF_THREADS = 10471 +ER_PLUGIN_DID_NOT_DEINITIALIZE_THREADS = 10472 +ER_KILLED_THREADS_OF_PLUGIN = 10473 +ER_NDB_SLAVE_MAX_REPLICATED_EPOCH_UNKNOWN = 10474 +ER_NDB_SLAVE_MAX_REPLICATED_EPOCH_SET_TO = 10475 +ER_NDB_NODE_ID_AND_MANAGEMENT_SERVER_INFO = 10476 +ER_NDB_DISCONNECT_INFO = 10477 +ER_NDB_COLUMN_DEFAULTS_DIFFER = 10478 +ER_NDB_COLUMN_SHOULD_NOT_HAVE_NATIVE_DEFAULT = 10479 +ER_NDB_FIELD_INFO = 10480 +ER_NDB_COLUMN_INFO = 10481 +ER_NDB_OOM_IN_FIX_UNIQUE_INDEX_ATTR_ORDER = 10482 +ER_NDB_SLAVE_MALFORMED_EVENT_RECEIVED_ON_TABLE = 10483 +ER_NDB_SLAVE_CONFLICT_FUNCTION_REQUIRES_ROLE = 10484 +ER_NDB_SLAVE_CONFLICT_DETECTION_REQUIRES_TRANSACTION_IDS = 10485 +ER_NDB_SLAVE_BINLOG_MISSING_INFO_FOR_CONFLICT_DETECTION = 10486 +ER_NDB_ERROR_IN_READAUTOINCREMENTVALUE = 10487 +ER_NDB_FOUND_UNCOMMITTED_AUTOCOMMIT = 10488 +ER_NDB_SLAVE_TOO_MANY_RETRIES = 10489 +ER_NDB_SLAVE_ERROR_IN_UPDATE_CREATE_INFO = 10490 +ER_NDB_SLAVE_CANT_ALLOCATE_TABLE_SHARE = 10491 +ER_NDB_BINLOG_ERROR_INFO_FROM_DA = 10492 +ER_NDB_BINLOG_CREATE_TABLE_EVENT = 10493 +ER_NDB_BINLOG_FAILED_CREATE_TABLE_EVENT_OPERATIONS = 10494 +ER_NDB_BINLOG_RENAME_EVENT = 10495 +ER_NDB_BINLOG_FAILED_CREATE_EVENT_OPERATIONS_DURING_RENAME = 10496 +ER_NDB_UNEXPECTED_RENAME_TYPE = 10497 +ER_NDB_ERROR_IN_GET_AUTO_INCREMENT = 10498 +ER_NDB_CREATING_SHARE_IN_OPEN = 10499 +ER_NDB_TABLE_OPENED_READ_ONLY = 10500 +ER_NDB_INITIALIZE_GIVEN_CLUSTER_PLUGIN_DISABLED = 10501 +ER_NDB_BINLOG_FORMAT_CHANGED_FROM_STMT_TO_MIXED = 10502 +ER_NDB_TRAILING_SHARE_RELEASED_BY_CLOSE_CACHED_TABLES = 10503 +ER_NDB_SHARE_ALREADY_EXISTS = 10504 +ER_NDB_HANDLE_TRAILING_SHARE_INFO = 10505 +ER_NDB_CLUSTER_GET_SHARE_INFO = 10506 +ER_NDB_CLUSTER_REAL_FREE_SHARE_INFO = 10507 +ER_NDB_CLUSTER_REAL_FREE_SHARE_DROP_FAILED = 10508 +ER_NDB_CLUSTER_FREE_SHARE_INFO = 10509 +ER_NDB_CLUSTER_MARK_SHARE_DROPPED_INFO = 10510 +ER_NDB_CLUSTER_MARK_SHARE_DROPPED_DESTROYING_SHARE = 10511 +ER_NDB_CLUSTER_OOM_THD_NDB = 10512 +ER_NDB_BINLOG_NDB_TABLES_INITIALLY_READ_ONLY = 10513 +ER_NDB_UTIL_THREAD_OOM = 10514 +ER_NDB_ILLEGAL_VALUE_FOR_NDB_RECV_THREAD_CPU_MASK = 10515 +ER_NDB_TOO_MANY_CPUS_IN_NDB_RECV_THREAD_CPU_MASK = 10516 +ER_DBUG_CHECK_SHARES_OPEN = 10517 +ER_DBUG_CHECK_SHARES_INFO = 10518 +ER_DBUG_CHECK_SHARES_DROPPED = 10519 +ER_INVALID_OR_OLD_TABLE_OR_DB_NAME = 10520 +ER_TC_RECOVERING_AFTER_CRASH_USING = 10521 +ER_TC_CANT_AUTO_RECOVER_WITH_TC_HEURISTIC_RECOVER = 10522 +ER_TC_BAD_MAGIC_IN_TC_LOG = 10523 +ER_TC_NEED_N_SE_SUPPORTING_2PC_FOR_RECOVERY = 10524 +ER_TC_RECOVERY_FAILED_THESE_ARE_YOUR_OPTIONS = 10525 +ER_TC_HEURISTIC_RECOVERY_MODE = 10526 +ER_TC_HEURISTIC_RECOVERY_FAILED = 10527 +ER_TC_RESTART_WITHOUT_TC_HEURISTIC_RECOVER = 10528 +ER_RPL_SLAVE_FAILED_TO_CREATE_OR_RECOVER_INFO_REPOSITORIES = 10529 +ER_RPL_SLAVE_AUTO_POSITION_IS_1_AND_GTID_MODE_IS_OFF = 10530 +ER_RPL_SLAVE_CANT_START_SLAVE_FOR_CHANNEL = 10531 +ER_RPL_SLAVE_CANT_STOP_SLAVE_FOR_CHANNEL = 10532 +ER_RPL_RECOVERY_NO_ROTATE_EVENT_FROM_MASTER = 10533 +ER_RPL_RECOVERY_ERROR_READ_RELAY_LOG = 10534 +ER_RPL_RECOVERY_ERROR_FREEING_IO_CACHE = 10535 +ER_RPL_RECOVERY_SKIPPED_GROUP_REPLICATION_CHANNEL = 10536 +ER_RPL_RECOVERY_ERROR = 10537 +ER_RPL_RECOVERY_IO_ERROR_READING_RELAY_LOG_INDEX = 10538 +ER_RPL_RECOVERY_FILE_MASTER_POS_INFO = 10539 +ER_RPL_RECOVERY_REPLICATE_SAME_SERVER_ID_REQUIRES_POSITION = 10540 +ER_RPL_MTS_RECOVERY_STARTING_COORDINATOR = 10541 +ER_RPL_MTS_RECOVERY_FAILED_TO_START_COORDINATOR = 10542 +ER_RPL_MTS_AUTOMATIC_RECOVERY_FAILED = 10543 +ER_RPL_MTS_RECOVERY_CANT_OPEN_RELAY_LOG = 10544 +ER_RPL_MTS_RECOVERY_SUCCESSFUL = 10545 +ER_RPL_SERVER_ID_MISSING = 10546 +ER_RPL_CANT_CREATE_SLAVE_THREAD = 10547 +ER_RPL_SLAVE_IO_THREAD_WAS_KILLED = 10548 +ER_RPL_SLAVE_MASTER_UUID_HAS_CHANGED = 10549 +ER_RPL_SLAVE_USES_CHECKSUM_AND_MASTER_PRE_50 = 10550 +ER_RPL_SLAVE_SECONDS_BEHIND_MASTER_DUBIOUS = 10551 +ER_RPL_SLAVE_CANT_FLUSH_MASTER_INFO_FILE = 10552 +ER_RPL_SLAVE_REPORT_HOST_TOO_LONG = 10553 +ER_RPL_SLAVE_REPORT_USER_TOO_LONG = 10554 +ER_RPL_SLAVE_REPORT_PASSWORD_TOO_LONG = 10555 +ER_RPL_SLAVE_ERROR_RETRYING = 10556 +ER_RPL_SLAVE_ERROR_READING_FROM_SERVER = 10557 +ER_RPL_SLAVE_DUMP_THREAD_KILLED_BY_MASTER = 10558 +ER_RPL_MTS_STATISTICS = 10559 +ER_RPL_MTS_RECOVERY_COMPLETE = 10560 +ER_RPL_SLAVE_CANT_INIT_RELAY_LOG_POSITION = 10561 +ER_RPL_SLAVE_CONNECTED_TO_MASTER_REPLICATION_STARTED = 10562 +ER_RPL_SLAVE_IO_THREAD_KILLED = 10563 +ER_RPL_SLAVE_IO_THREAD_CANT_REGISTER_ON_MASTER = 10564 +ER_RPL_SLAVE_FORCING_TO_RECONNECT_IO_THREAD = 10565 +ER_RPL_SLAVE_ERROR_REQUESTING_BINLOG_DUMP = 10566 +ER_RPL_LOG_ENTRY_EXCEEDS_SLAVE_MAX_ALLOWED_PACKET = 10567 +ER_RPL_SLAVE_STOPPING_AS_MASTER_OOM = 10568 +ER_RPL_SLAVE_IO_THREAD_ABORTED_WAITING_FOR_RELAY_LOG_SPACE = 10569 +ER_RPL_SLAVE_IO_THREAD_EXITING = 10570 +ER_RPL_SLAVE_CANT_INITIALIZE_SLAVE_WORKER = 10571 +ER_RPL_MTS_GROUP_RECOVERY_RELAY_LOG_INFO_FOR_WORKER = 10572 +ER_RPL_ERROR_LOOKING_FOR_LOG = 10573 +ER_RPL_MTS_GROUP_RECOVERY_RELAY_LOG_INFO = 10574 +ER_RPL_CANT_FIND_FOLLOWUP_FILE = 10575 +ER_RPL_MTS_CHECKPOINT_PERIOD_DIFFERS_FROM_CNT = 10576 +ER_RPL_SLAVE_WORKER_THREAD_CREATION_FAILED = 10577 +ER_RPL_SLAVE_WORKER_THREAD_CREATION_FAILED_WITH_ERRNO = 10578 +ER_RPL_SLAVE_FAILED_TO_INIT_PARTITIONS_HASH = 10579 +ER_RPL_SLAVE_NDB_TABLES_NOT_AVAILABLE = 10580 +ER_RPL_SLAVE_SQL_THREAD_STARTING = 10581 +ER_RPL_SLAVE_SKIP_COUNTER_EXECUTED = 10582 +ER_RPL_SLAVE_ADDITIONAL_ERROR_INFO_FROM_DA = 10583 +ER_RPL_SLAVE_ERROR_INFO_FROM_DA = 10584 +ER_RPL_SLAVE_ERROR_LOADING_USER_DEFINED_LIBRARY = 10585 +ER_RPL_SLAVE_ERROR_RUNNING_QUERY = 10586 +ER_RPL_SLAVE_SQL_THREAD_EXITING = 10587 +ER_RPL_SLAVE_READ_INVALID_EVENT_FROM_MASTER = 10588 +ER_RPL_SLAVE_QUEUE_EVENT_FAILED_INVALID_CONFIGURATION = 10589 +ER_RPL_SLAVE_IO_THREAD_DETECTED_UNEXPECTED_EVENT_SEQUENCE = 10590 +ER_RPL_SLAVE_CANT_USE_CHARSET = 10591 +ER_RPL_SLAVE_CONNECTED_TO_MASTER_REPLICATION_RESUMED = 10592 +ER_RPL_SLAVE_NEXT_LOG_IS_ACTIVE = 10593 +ER_RPL_SLAVE_NEXT_LOG_IS_INACTIVE = 10594 +ER_RPL_SLAVE_SQL_THREAD_IO_ERROR_READING_EVENT = 10595 +ER_RPL_SLAVE_ERROR_READING_RELAY_LOG_EVENTS = 10596 +ER_SLAVE_CHANGE_MASTER_TO_EXECUTED = 10597 +ER_RPL_SLAVE_NEW_MASTER_INFO_NEEDS_REPOS_TYPE_OTHER_THAN_FILE = 10598 +ER_RPL_FAILED_TO_STAT_LOG_IN_INDEX = 10599 +ER_RPL_LOG_NOT_FOUND_WHILE_COUNTING_RELAY_LOG_SPACE = 10600 +ER_SLAVE_CANT_USE_TEMPDIR = 10601 +ER_RPL_RELAY_LOG_NEEDS_FILE_NOT_DIRECTORY = 10602 +ER_RPL_RELAY_LOG_INDEX_NEEDS_FILE_NOT_DIRECTORY = 10603 +ER_RPL_PLEASE_USE_OPTION_RELAY_LOG = 10604 +ER_RPL_OPEN_INDEX_FILE_FAILED = 10605 +ER_RPL_CANT_INITIALIZE_GTID_SETS_IN_RLI_INIT_INFO = 10606 +ER_RPL_CANT_OPEN_LOG_IN_RLI_INIT_INFO = 10607 +ER_RPL_ERROR_WRITING_RELAY_LOG_CONFIGURATION = 10608 +ER_NDB_OOM_GET_NDB_BLOBS_VALUE = 10609 +ER_NDB_THREAD_TIMED_OUT = 10610 +ER_NDB_TABLE_IS_NOT_DISTRIBUTED = 10611 +ER_NDB_CREATING_TABLE = 10612 +ER_NDB_FLUSHING_TABLE_INFO = 10613 +ER_NDB_CLEANING_STRAY_TABLES = 10614 +ER_NDB_DISCOVERED_MISSING_DB = 10615 +ER_NDB_DISCOVERED_REMAINING_DB = 10616 +ER_NDB_CLUSTER_FIND_ALL_DBS_RETRY = 10617 +ER_NDB_CLUSTER_FIND_ALL_DBS_FAIL = 10618 +ER_NDB_SKIPPING_SETUP_TABLE = 10619 +ER_NDB_FAILED_TO_SET_UP_TABLE = 10620 +ER_NDB_MISSING_FRM_DISCOVERING = 10621 +ER_NDB_MISMATCH_IN_FRM_DISCOVERING = 10622 +ER_NDB_BINLOG_CLEANING_UP_SETUP_LEFTOVERS = 10623 +ER_NDB_WAITING_INFO = 10624 +ER_NDB_WAITING_INFO_WITH_MAP = 10625 +ER_NDB_TIMEOUT_WHILE_DISTRIBUTING = 10626 +ER_NDB_NOT_WAITING_FOR_DISTRIBUTING = 10627 +ER_NDB_DISTRIBUTED_INFO = 10628 +ER_NDB_DISTRIBUTION_COMPLETE = 10629 +ER_NDB_SCHEMA_DISTRIBUTION_FAILED = 10630 +ER_NDB_SCHEMA_DISTRIBUTION_REPORTS_SUBSCRIBE = 10631 +ER_NDB_SCHEMA_DISTRIBUTION_REPORTS_UNSUBSCRIBE = 10632 +ER_NDB_BINLOG_CANT_DISCOVER_TABLE_FROM_SCHEMA_EVENT = 10633 +ER_NDB_BINLOG_SIGNALLING_UNKNOWN_VALUE = 10634 +ER_NDB_BINLOG_REPLY_TO = 10635 +ER_NDB_BINLOG_CANT_RELEASE_SLOCK = 10636 +ER_NDB_CANT_FIND_TABLE = 10637 +ER_NDB_DISCARDING_EVENT_NO_OBJ = 10638 +ER_NDB_DISCARDING_EVENT_ID_VERSION_MISMATCH = 10639 +ER_NDB_CLEAR_SLOCK_INFO = 10640 +ER_NDB_BINLOG_SKIPPING_LOCAL_TABLE = 10641 +ER_NDB_BINLOG_ONLINE_ALTER_RENAME = 10642 +ER_NDB_BINLOG_CANT_REOPEN_SHADOW_TABLE = 10643 +ER_NDB_BINLOG_ONLINE_ALTER_RENAME_COMPLETE = 10644 +ER_NDB_BINLOG_SKIPPING_DROP_OF_LOCAL_TABLE = 10645 +ER_NDB_BINLOG_SKIPPING_RENAME_OF_LOCAL_TABLE = 10646 +ER_NDB_BINLOG_SKIPPING_DROP_OF_DB_CONTAINING_LOCAL_TABLES = 10647 +ER_NDB_BINLOG_GOT_DIST_PRIV_EVENT_FLUSHING_PRIVILEGES = 10648 +ER_NDB_BINLOG_GOT_SCHEMA_EVENT = 10649 +ER_NDB_BINLOG_SKIPPING_OLD_SCHEMA_OPERATION = 10650 +ER_NDB_CLUSTER_FAILURE = 10651 +ER_NDB_TABLES_INITIALLY_READ_ONLY_ON_RECONNECT = 10652 +ER_NDB_IGNORING_UNKNOWN_EVENT = 10653 +ER_NDB_BINLOG_OPENING_INDEX = 10654 +ER_NDB_BINLOG_CANT_LOCK_NDB_BINLOG_INDEX = 10655 +ER_NDB_BINLOG_INJECTING_RANDOM_WRITE_FAILURE = 10656 +ER_NDB_BINLOG_CANT_WRITE_TO_NDB_BINLOG_INDEX = 10657 +ER_NDB_BINLOG_WRITING_TO_NDB_BINLOG_INDEX = 10658 +ER_NDB_BINLOG_CANT_COMMIT_TO_NDB_BINLOG_INDEX = 10659 +ER_NDB_BINLOG_WRITE_TO_NDB_BINLOG_INDEX_FAILED_AFTER_KILL = 10660 +ER_NDB_BINLOG_USING_SERVER_ID_0_SLAVES_WILL_NOT = 10661 +ER_NDB_SERVER_ID_RESERVED_OR_TOO_LARGE = 10662 +ER_NDB_BINLOG_NDB_LOG_TRANSACTION_ID_REQUIRES_V2_ROW_EVENTS = 10663 +ER_NDB_BINLOG_NDB_LOG_APPLY_STATUS_FORCING_FULL_USE_WRITE = 10664 +ER_NDB_BINLOG_GENERIC_MESSAGE = 10665 +ER_NDB_CONFLICT_GENERIC_MESSAGE = 10666 +ER_NDB_TRANS_DEPENDENCY_TRACKER_ERROR = 10667 +ER_NDB_CONFLICT_FN_PARSE_ERROR = 10668 +ER_NDB_CONFLICT_FN_SETUP_ERROR = 10669 +ER_NDB_BINLOG_FAILED_TO_GET_TABLE = 10670 +ER_NDB_BINLOG_NOT_LOGGING = 10671 +ER_NDB_BINLOG_CREATE_TABLE_EVENT_FAILED = 10672 +ER_NDB_BINLOG_CREATE_TABLE_EVENT_INFO = 10673 +ER_NDB_BINLOG_DISCOVER_TABLE_EVENT_INFO = 10674 +ER_NDB_BINLOG_BLOB_REQUIRES_PK = 10675 +ER_NDB_BINLOG_CANT_CREATE_EVENT_IN_DB = 10676 +ER_NDB_BINLOG_CANT_CREATE_EVENT_IN_DB_AND_CANT_DROP = 10677 +ER_NDB_BINLOG_CANT_CREATE_EVENT_IN_DB_DROPPED = 10678 +ER_NDB_BINLOG_DISCOVER_REUSING_OLD_EVENT_OPS = 10679 +ER_NDB_BINLOG_CREATING_NDBEVENTOPERATION_FAILED = 10680 +ER_NDB_BINLOG_CANT_CREATE_BLOB = 10681 +ER_NDB_BINLOG_NDBEVENT_EXECUTE_FAILED = 10682 +ER_NDB_CREATE_EVENT_OPS_LOGGING_INFO = 10683 +ER_NDB_BINLOG_CANT_DROP_EVENT_FROM_DB = 10684 +ER_NDB_TIMED_OUT_IN_DROP_TABLE = 10685 +ER_NDB_BINLOG_UNHANDLED_ERROR_FOR_TABLE = 10686 +ER_NDB_BINLOG_CLUSTER_FAILURE = 10687 +ER_NDB_BINLOG_UNKNOWN_NON_DATA_EVENT = 10688 +ER_NDB_BINLOG_INJECTOR_DISCARDING_ROW_EVENT_METADATA = 10689 +ER_NDB_REMAINING_OPEN_TABLES = 10690 +ER_NDB_REMAINING_OPEN_TABLE_INFO = 10691 +ER_NDB_COULD_NOT_GET_APPLY_STATUS_SHARE = 10692 +ER_NDB_BINLOG_SERVER_SHUTDOWN_DURING_NDB_CLUSTER_START = 10693 +ER_NDB_BINLOG_CLUSTER_RESTARTED_RESET_MASTER_SUGGESTED = 10694 +ER_NDB_BINLOG_CLUSTER_HAS_RECONNECTED = 10695 +ER_NDB_BINLOG_STARTING_LOG_AT_EPOCH = 10696 +ER_NDB_BINLOG_NDB_TABLES_WRITABLE = 10697 +ER_NDB_BINLOG_SHUTDOWN_DETECTED = 10698 +ER_NDB_BINLOG_LOST_SCHEMA_CONNECTION_WAITING = 10699 +ER_NDB_BINLOG_LOST_SCHEMA_CONNECTION_CONTINUING = 10700 +ER_NDB_BINLOG_ERROR_HANDLING_SCHEMA_EVENT = 10701 +ER_NDB_BINLOG_CANT_INJECT_APPLY_STATUS_WRITE_ROW = 10702 +ER_NDB_BINLOG_ERROR_DURING_GCI_ROLLBACK = 10703 +ER_NDB_BINLOG_ERROR_DURING_GCI_COMMIT = 10704 +ER_NDB_BINLOG_LATEST_TRX_IN_EPOCH_NOT_IN_BINLOG = 10705 +ER_NDB_BINLOG_RELEASING_EXTRA_SHARE_REFERENCES = 10706 +ER_NDB_BINLOG_REMAINING_OPEN_TABLES = 10707 +ER_NDB_BINLOG_REMAINING_OPEN_TABLE_INFO = 10708 +ER_TREE_CORRUPT_PARENT_SHOULD_POINT_AT_PARENT = 10709 +ER_TREE_CORRUPT_ROOT_SHOULD_BE_BLACK = 10710 +ER_TREE_CORRUPT_2_CONSECUTIVE_REDS = 10711 +ER_TREE_CORRUPT_RIGHT_IS_LEFT = 10712 +ER_TREE_CORRUPT_INCORRECT_BLACK_COUNT = 10713 +ER_WRONG_COUNT_FOR_ORIGIN = 10714 +ER_WRONG_COUNT_FOR_KEY = 10715 +ER_WRONG_COUNT_OF_ELEMENTS = 10716 +ER_RPL_ERROR_READING_SLAVE_WORKER_CONFIGURATION = 10717 +ER_RPL_ERROR_WRITING_SLAVE_WORKER_CONFIGURATION = 10718 +ER_RPL_FAILED_TO_OPEN_RELAY_LOG = 10719 +ER_RPL_WORKER_CANT_READ_RELAY_LOG = 10720 +ER_RPL_WORKER_CANT_FIND_NEXT_RELAY_LOG = 10721 +ER_RPL_MTS_SLAVE_COORDINATOR_HAS_WAITED = 10722 +ER_BINLOG_FAILED_TO_WRITE_DROP_FOR_TEMP_TABLES = 10723 +ER_BINLOG_OOM_WRITING_DELETE_WHILE_OPENING_HEAP_TABLE = 10724 +ER_FAILED_TO_REPAIR_TABLE = 10725 +ER_FAILED_TO_REMOVE_TEMP_TABLE = 10726 +ER_SYSTEM_TABLE_NOT_TRANSACTIONAL = 10727 +ER_RPL_ERROR_WRITING_MASTER_CONFIGURATION = 10728 +ER_RPL_ERROR_READING_MASTER_CONFIGURATION = 10729 +ER_RPL_SSL_INFO_IN_MASTER_INFO_IGNORED = 10730 +ER_PLUGIN_FAILED_DEINITIALIZATION = 10731 +ER_PLUGIN_HAS_NONZERO_REFCOUNT_AFTER_DEINITIALIZATION = 10732 +ER_PLUGIN_SHUTTING_DOWN_PLUGIN = 10733 +ER_PLUGIN_REGISTRATION_FAILED = 10734 +ER_PLUGIN_CANT_OPEN_PLUGIN_TABLE = 10735 +ER_PLUGIN_CANT_LOAD = 10736 +ER_PLUGIN_LOAD_PARAMETER_TOO_LONG = 10737 +ER_PLUGIN_FORCING_SHUTDOWN = 10738 +ER_PLUGIN_HAS_NONZERO_REFCOUNT_AFTER_SHUTDOWN = 10739 +ER_PLUGIN_UNKNOWN_VARIABLE_TYPE = 10740 +ER_PLUGIN_VARIABLE_SET_READ_ONLY = 10741 +ER_PLUGIN_VARIABLE_MISSING_NAME = 10742 +ER_PLUGIN_VARIABLE_NOT_ALLOCATED_THREAD_LOCAL = 10743 +ER_PLUGIN_OOM = 10744 +ER_PLUGIN_BAD_OPTIONS = 10745 +ER_PLUGIN_PARSING_OPTIONS_FAILED = 10746 +ER_PLUGIN_DISABLED = 10747 +ER_PLUGIN_HAS_CONFLICTING_SYSTEM_VARIABLES = 10748 +ER_PLUGIN_CANT_SET_PERSISTENT_OPTIONS = 10749 +ER_MY_NET_WRITE_FAILED_FALLING_BACK_ON_STDERR = 10750 +ER_RETRYING_REPAIR_WITHOUT_QUICK = 10751 +ER_RETRYING_REPAIR_WITH_KEYCACHE = 10752 +ER_FOUND_ROWS_WHILE_REPAIRING = 10753 +ER_ERROR_DURING_OPTIMIZE_TABLE = 10754 +ER_ERROR_ENABLING_KEYS = 10755 +ER_CHECKING_TABLE = 10756 +ER_RECOVERING_TABLE = 10757 +ER_CANT_CREATE_TABLE_SHARE_FROM_FRM = 10758 +ER_CANT_LOCK_TABLE = 10759 +ER_CANT_ALLOC_TABLE_OBJECT = 10760 +ER_CANT_CREATE_HANDLER_OBJECT_FOR_TABLE = 10761 +ER_CANT_SET_HANDLER_REFERENCE_FOR_TABLE = 10762 +ER_CANT_LOCK_TABLESPACE = 10763 +ER_CANT_UPGRADE_GENERATED_COLUMNS_TO_DD = 10764 +ER_DD_ERROR_CREATING_ENTRY = 10765 +ER_DD_CANT_FETCH_TABLE_DATA = 10766 +ER_DD_CANT_FIX_SE_DATA = 10767 +ER_DD_CANT_CREATE_SP = 10768 +ER_CANT_OPEN_DB_OPT_USING_DEFAULT_CHARSET = 10769 +ER_CANT_CREATE_CACHE_FOR_DB_OPT = 10770 +ER_CANT_IDENTIFY_CHARSET_USING_DEFAULT = 10771 +ER_DB_OPT_NOT_FOUND_USING_DEFAULT_CHARSET = 10772 +ER_EVENT_CANT_GET_TIMEZONE_FROM_FIELD = 10773 +ER_EVENT_CANT_FIND_TIMEZONE = 10774 +ER_EVENT_CANT_GET_CHARSET = 10775 +ER_EVENT_CANT_GET_COLLATION = 10776 +ER_EVENT_CANT_OPEN_TABLE_MYSQL_EVENT = 10777 +ER_CANT_PARSE_STORED_ROUTINE_BODY = 10778 +ER_CANT_OPEN_TABLE_MYSQL_PROC = 10779 +ER_CANT_READ_TABLE_MYSQL_PROC = 10780 +ER_FILE_EXISTS_DURING_UPGRADE = 10781 +ER_CANT_OPEN_DATADIR_AFTER_UPGRADE_FAILURE = 10782 +ER_CANT_SET_PATH_FOR = 10783 +ER_CANT_OPEN_DIR = 10784 +ER_NDB_EMPTY_NODEID_IN_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10785 +ER_NDB_CANT_PARSE_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10786 +ER_NDB_INVALID_NODEID_IN_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10787 +ER_NDB_DUPLICATE_NODEID_IN_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10788 +ER_NDB_POOL_SIZE_MUST_MATCH_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10789 +ER_NDB_NODEID_NOT_FIRST_IN_NDB_CLUSTER_CONNECTION_POOL_NODEIDS = 10790 +ER_NDB_USING_NODEID = 10791 +ER_NDB_CANT_ALLOC_GLOBAL_NDB_CLUSTER_CONNECTION = 10792 +ER_NDB_CANT_ALLOC_GLOBAL_NDB_OBJECT = 10793 +ER_NDB_USING_NODEID_LIST = 10794 +ER_NDB_CANT_ALLOC_NDB_CLUSTER_CONNECTION = 10795 +ER_NDB_STARTING_CONNECT_THREAD = 10796 +ER_NDB_NODE_INFO = 10797 +ER_NDB_CANT_START_CONNECT_THREAD = 10798 +ER_NDB_GENERIC_ERROR = 10799 +ER_NDB_CPU_MASK_TOO_SHORT = 10800 +ER_EVENT_ERROR_CREATING_QUERY_TO_WRITE_TO_BINLOG = 10801 +ER_EVENT_SCHEDULER_ERROR_LOADING_FROM_DB = 10802 +ER_EVENT_SCHEDULER_ERROR_GETTING_EVENT_OBJECT = 10803 +ER_EVENT_SCHEDULER_GOT_BAD_DATA_FROM_TABLE = 10804 +ER_EVENT_CANT_GET_LOCK_FOR_DROPPING_EVENT = 10805 +ER_EVENT_UNABLE_TO_DROP_EVENT = 10806 +ER_BINLOG_ATTACHING_THREAD_MEMORY_FINALLY_AVAILABLE = 10807 +ER_BINLOG_CANT_RESIZE_CACHE = 10808 +ER_BINLOG_FILE_BEING_READ_NOT_PURGED = 10809 +ER_BINLOG_IO_ERROR_READING_HEADER = 10810 +ER_BINLOG_CANT_OPEN_LOG = 10811 +ER_BINLOG_CANT_CREATE_CACHE_FOR_LOG = 10812 +ER_BINLOG_FILE_EXTENSION_NUMBER_EXHAUSTED = 10813 +ER_BINLOG_FILE_NAME_TOO_LONG = 10814 +ER_BINLOG_FILE_EXTENSION_NUMBER_RUNNING_LOW = 10815 +ER_BINLOG_CANT_OPEN_FOR_LOGGING = 10816 +ER_BINLOG_FAILED_TO_SYNC_INDEX_FILE = 10817 +ER_BINLOG_ERROR_READING_GTIDS_FROM_RELAY_LOG = 10818 +ER_BINLOG_EVENTS_READ_FROM_RELAY_LOG_INFO = 10819 +ER_BINLOG_ERROR_READING_GTIDS_FROM_BINARY_LOG = 10820 +ER_BINLOG_EVENTS_READ_FROM_BINLOG_INFO = 10821 +ER_BINLOG_CANT_GENERATE_NEW_FILE_NAME = 10822 +ER_BINLOG_FAILED_TO_SYNC_INDEX_FILE_IN_OPEN = 10823 +ER_BINLOG_CANT_USE_FOR_LOGGING = 10824 +ER_BINLOG_FAILED_TO_CLOSE_INDEX_FILE_WHILE_REBUILDING = 10825 +ER_BINLOG_FAILED_TO_DELETE_INDEX_FILE_WHILE_REBUILDING = 10826 +ER_BINLOG_FAILED_TO_RENAME_INDEX_FILE_WHILE_REBUILDING = 10827 +ER_BINLOG_FAILED_TO_OPEN_INDEX_FILE_AFTER_REBUILDING = 10828 +ER_BINLOG_CANT_APPEND_LOG_TO_TMP_INDEX = 10829 +ER_BINLOG_CANT_LOCATE_OLD_BINLOG_OR_RELAY_LOG_FILES = 10830 +ER_BINLOG_CANT_DELETE_FILE = 10831 +ER_BINLOG_CANT_SET_TMP_INDEX_NAME = 10832 +ER_BINLOG_FAILED_TO_OPEN_TEMPORARY_INDEX_FILE = 10833 +ER_BINLOG_ERROR_GETTING_NEXT_LOG_FROM_INDEX = 10834 +ER_BINLOG_CANT_OPEN_TMP_INDEX = 10835 +ER_BINLOG_CANT_COPY_INDEX_TO_TMP = 10836 +ER_BINLOG_CANT_CLOSE_TMP_INDEX = 10837 +ER_BINLOG_CANT_MOVE_TMP_TO_INDEX = 10838 +ER_BINLOG_PURGE_LOGS_CALLED_WITH_FILE_NOT_IN_INDEX = 10839 +ER_BINLOG_PURGE_LOGS_CANT_SYNC_INDEX_FILE = 10840 +ER_BINLOG_PURGE_LOGS_CANT_COPY_TO_REGISTER_FILE = 10841 +ER_BINLOG_PURGE_LOGS_CANT_FLUSH_REGISTER_FILE = 10842 +ER_BINLOG_PURGE_LOGS_CANT_UPDATE_INDEX_FILE = 10843 +ER_BINLOG_PURGE_LOGS_FAILED_TO_PURGE_LOG = 10844 +ER_BINLOG_FAILED_TO_SET_PURGE_INDEX_FILE_NAME = 10845 +ER_BINLOG_FAILED_TO_OPEN_REGISTER_FILE = 10846 +ER_BINLOG_FAILED_TO_REINIT_REGISTER_FILE = 10847 +ER_BINLOG_FAILED_TO_READ_REGISTER_FILE = 10848 +ER_CANT_STAT_FILE = 10849 +ER_BINLOG_CANT_DELETE_LOG_FILE_DOES_INDEX_MATCH_FILES = 10850 +ER_BINLOG_CANT_DELETE_FILE_AND_READ_BINLOG_INDEX = 10851 +ER_BINLOG_FAILED_TO_DELETE_LOG_FILE = 10852 +ER_BINLOG_LOGGING_INCIDENT_TO_STOP_SLAVES = 10853 +ER_BINLOG_CANT_FIND_LOG_IN_INDEX = 10854 +ER_BINLOG_RECOVERING_AFTER_CRASH_USING = 10855 +ER_BINLOG_CANT_OPEN_CRASHED_BINLOG = 10856 +ER_BINLOG_CANT_TRIM_CRASHED_BINLOG = 10857 +ER_BINLOG_CRASHED_BINLOG_TRIMMED = 10858 +ER_BINLOG_CANT_CLEAR_IN_USE_FLAG_FOR_CRASHED_BINLOG = 10859 +ER_BINLOG_FAILED_TO_RUN_AFTER_SYNC_HOOK = 10860 +ER_TURNING_LOGGING_OFF_FOR_THE_DURATION = 10861 +ER_BINLOG_FAILED_TO_RUN_AFTER_FLUSH_HOOK = 10862 +ER_BINLOG_CRASH_RECOVERY_FAILED = 10863 +ER_BINLOG_WARNING_SUPPRESSED = 10864 +ER_NDB_LOG_ENTRY = 10865 +ER_NDB_LOG_ENTRY_WITH_PREFIX = 10866 +ER_NDB_BINLOG_CANT_CREATE_PURGE_THD = 10867 +ER_INNODB_UNKNOWN_COLLATION = 10868 +ER_INNODB_INVALID_LOG_GROUP_HOME_DIR = 10869 +ER_INNODB_INVALID_INNODB_UNDO_DIRECTORY = 10870 +ER_INNODB_ILLEGAL_COLON_IN_POOL = 10871 +ER_INNODB_INVALID_PAGE_SIZE = 10872 +ER_INNODB_DIRTY_WATER_MARK_NOT_LOW = 10873 +ER_INNODB_IO_CAPACITY_EXCEEDS_MAX = 10874 +ER_INNODB_FILES_SAME = 10875 +ER_INNODB_UNREGISTERED_TRX_ACTIVE = 10876 +ER_INNODB_CLOSING_CONNECTION_ROLLS_BACK = 10877 +ER_INNODB_TRX_XLATION_TABLE_OOM = 10878 +ER_INNODB_CANT_FIND_INDEX_IN_INNODB_DD = 10879 +ER_INNODB_INDEX_COLUMN_INFO_UNLIKE_MYSQLS = 10880 +ER_INNODB_CANT_OPEN_TABLE = 10881 +ER_INNODB_CANT_BUILD_INDEX_XLATION_TABLE_FOR = 10882 +ER_INNODB_PK_NOT_IN_MYSQL = 10883 +ER_INNODB_PK_ONLY_IN_MYSQL = 10884 +ER_INNODB_CLUSTERED_INDEX_PRIVATE = 10885 +ER_INNODB_PARTITION_TABLE_LOWERCASED = 10886 +ER_ERRMSG_REPLACEMENT_DODGY = 10887 +ER_ERRMSG_REPLACEMENTS_FAILED = 10888 +ER_NPIPE_CANT_CREATE = 10889 +ER_PARTITION_MOVE_CREATED_DUPLICATE_ROW_PLEASE_FIX = 10890 +ER_AUDIT_CANT_ABORT_COMMAND = 10891 +ER_AUDIT_CANT_ABORT_EVENT = 10892 +ER_AUDIT_WARNING = 10893 +ER_NDB_NUMBER_OF_CHANNELS = 10894 +ER_NDB_SLAVE_PARALLEL_WORKERS = 10895 +ER_NDB_DISTRIBUTING_ERR = 10896 +ER_RPL_SLAVE_INSECURE_CHANGE_MASTER = 10897 +ER_RPL_SLAVE_FLUSH_RELAY_LOGS_NOT_ALLOWED = 10898 +ER_RPL_SLAVE_INCORRECT_CHANNEL = 10899 +ER_FAILED_TO_FIND_DL_ENTRY = 10900 +ER_FAILED_TO_OPEN_SHARED_LIBRARY = 10901 +ER_THREAD_PRIORITY_IGNORED = 10902 +ER_BINLOG_CACHE_SIZE_TOO_LARGE = 10903 +ER_BINLOG_STMT_CACHE_SIZE_TOO_LARGE = 10904 +ER_FAILED_TO_GENERATE_UNIQUE_LOGFILE = 10905 +ER_FAILED_TO_READ_FILE = 10906 +ER_FAILED_TO_WRITE_TO_FILE = 10907 +ER_BINLOG_UNSAFE_MESSAGE_AND_STATEMENT = 10908 +ER_FORCE_CLOSE_THREAD = 10909 +ER_SERVER_SHUTDOWN_COMPLETE = 10910 +ER_RPL_CANT_HAVE_SAME_BASENAME = 10911 +ER_RPL_GTID_MODE_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 10912 +ER_WARN_NO_SERVERID_SPECIFIED = 10913 +ER_ABORTING_USER_CONNECTION = 10914 +ER_SQL_MODE_MERGED_WITH_STRICT_MODE = 10915 +ER_GTID_PURGED_WAS_UPDATED = 10916 +ER_GTID_EXECUTED_WAS_UPDATED = 10917 +ER_DEPRECATE_MSG_WITH_REPLACEMENT = 10918 +ER_TRG_CREATION_CTX_NOT_SET = 10919 +ER_FILE_HAS_OLD_FORMAT = 10920 +ER_VIEW_CREATION_CTX_NOT_SET = 10921 +ER_TABLE_NAME_CAUSES_TOO_LONG_PATH = 10922 +ER_TABLE_UPGRADE_REQUIRED = 10923 +ER_GET_ERRNO_FROM_STORAGE_ENGINE = 10924 +ER_ACCESS_DENIED_ERROR_WITHOUT_PASSWORD = 10925 +ER_ACCESS_DENIED_ERROR_WITH_PASSWORD = 10926 +ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED = 10927 +ER_MUST_CHANGE_EXPIRED_PASSWORD = 10928 +ER_SYSTEM_TABLES_NOT_SUPPORTED_BY_STORAGE_ENGINE = 10929 +ER_FILESORT_TERMINATED = 10930 +ER_SERVER_STARTUP_MSG = 10931 +ER_FAILED_TO_FIND_LOCALE_NAME = 10932 +ER_FAILED_TO_FIND_COLLATION_NAME = 10933 +ER_SERVER_OUT_OF_RESOURCES = 10934 +ER_SERVER_OUTOFMEMORY = 10935 +ER_INVALID_COLLATION_FOR_CHARSET = 10936 +ER_CANT_START_ERROR_LOG_SERVICE = 10937 +ER_CREATING_NEW_UUID_FIRST_START = 10938 +ER_FAILED_TO_GET_ABSOLUTE_PATH = 10939 +ER_PERFSCHEMA_COMPONENTS_INFRASTRUCTURE_BOOTSTRAP = 10940 +ER_PERFSCHEMA_COMPONENTS_INFRASTRUCTURE_SHUTDOWN = 10941 +ER_DUP_FD_OPEN_FAILED = 10942 +ER_SYSTEM_VIEW_INIT_FAILED = 10943 +ER_RESOURCE_GROUP_POST_INIT_FAILED = 10944 +ER_RESOURCE_GROUP_SUBSYSTEM_INIT_FAILED = 10945 +ER_FAILED_START_MYSQLD_DAEMON = 10946 +ER_CANNOT_CHANGE_TO_ROOT_DIR = 10947 +ER_PERSISTENT_PRIVILEGES_BOOTSTRAP = 10948 +ER_BASEDIR_SET_TO = 10949 +ER_RPL_FILTER_ADD_WILD_DO_TABLE_FAILED = 10950 +ER_RPL_FILTER_ADD_WILD_IGNORE_TABLE_FAILED = 10951 +ER_PRIVILEGE_SYSTEM_INIT_FAILED = 10952 +ER_CANNOT_SET_LOG_ERROR_SERVICES = 10953 +ER_PERFSCHEMA_TABLES_INIT_FAILED = 10954 +ER_TX_EXTRACTION_ALGORITHM_FOR_BINLOG_TX_DEPEDENCY_TRACKING = 10955 +ER_INVALID_REPLICATION_TIMESTAMPS = 10956 +ER_RPL_TIMESTAMPS_RETURNED_TO_NORMAL = 10957 +ER_BINLOG_FILE_OPEN_FAILED = 10958 +ER_BINLOG_EVENT_WRITE_TO_STMT_CACHE_FAILED = 10959 +ER_SLAVE_RELAY_LOG_TRUNCATE_INFO = 10960 +ER_SLAVE_RELAY_LOG_PURGE_FAILED = 10961 +ER_RPL_SLAVE_FILTER_CREATE_FAILED = 10962 +ER_RPL_SLAVE_GLOBAL_FILTERS_COPY_FAILED = 10963 +ER_RPL_SLAVE_RESET_FILTER_OPTIONS = 10964 +ER_MISSING_GRANT_SYSTEM_TABLE = 10965 +ER_MISSING_ACL_SYSTEM_TABLE = 10966 +ER_ANONYMOUS_AUTH_ID_NOT_ALLOWED_IN_MANDATORY_ROLES = 10967 +ER_UNKNOWN_AUTH_ID_IN_MANDATORY_ROLE = 10968 +ER_WRITE_ROW_TO_PARTITION_FAILED = 10969 +ER_RESOURCE_GROUP_METADATA_UPDATE_SKIPPED = 10970 +ER_FAILED_TO_PERSIST_RESOURCE_GROUP_METADATA = 10971 +ER_FAILED_TO_DESERIALIZE_RESOURCE_GROUP = 10972 +ER_FAILED_TO_UPDATE_RESOURCE_GROUP = 10973 +ER_RESOURCE_GROUP_VALIDATION_FAILED = 10974 +ER_FAILED_TO_ALLOCATE_MEMORY_FOR_RESOURCE_GROUP = 10975 +ER_FAILED_TO_ALLOCATE_MEMORY_FOR_RESOURCE_GROUP_HASH = 10976 +ER_FAILED_TO_ADD_RESOURCE_GROUP_TO_MAP = 10977 +ER_RESOURCE_GROUP_IS_DISABLED = 10978 +ER_FAILED_TO_APPLY_RESOURCE_GROUP_CONTROLLER = 10979 +ER_FAILED_TO_ACQUIRE_LOCK_ON_RESOURCE_GROUP = 10980 +ER_PFS_NOTIFICATION_FUNCTION_REGISTER_FAILED = 10981 +ER_RES_GRP_SET_THR_AFFINITY_FAILED = 10982 +ER_RES_GRP_SET_THR_AFFINITY_TO_CPUS_FAILED = 10983 +ER_RES_GRP_THD_UNBIND_FROM_CPU_FAILED = 10984 +ER_RES_GRP_SET_THREAD_PRIORITY_FAILED = 10985 +ER_RES_GRP_FAILED_TO_DETERMINE_NICE_CAPABILITY = 10986 +ER_RES_GRP_FAILED_TO_GET_THREAD_HANDLE = 10987 +ER_RES_GRP_GET_THREAD_PRIO_NOT_SUPPORTED = 10988 +ER_RES_GRP_FAILED_DETERMINE_CPU_COUNT = 10989 +ER_RES_GRP_FEATURE_NOT_AVAILABLE = 10990 +ER_RES_GRP_INVALID_THREAD_PRIORITY = 10991 +ER_RES_GRP_SOLARIS_PROCESSOR_BIND_TO_CPUID_FAILED = 10992 +ER_RES_GRP_SOLARIS_PROCESSOR_BIND_TO_THREAD_FAILED = 10993 +ER_RES_GRP_SOLARIS_PROCESSOR_AFFINITY_FAILED = 10994 +ER_DD_UPGRADE_RENAME_IDX_STATS_FILE_FAILED = 10995 +ER_DD_UPGRADE_DD_OPEN_FAILED = 10996 +ER_DD_UPGRADE_FAILED_TO_FETCH_TABLESPACES = 10997 +ER_DD_UPGRADE_FAILED_TO_ACQUIRE_TABLESPACE = 10998 +ER_DD_UPGRADE_FAILED_TO_RESOLVE_TABLESPACE_ENGINE = 10999 +ER_FAILED_TO_CREATE_SDI_FOR_TABLESPACE = 11000 +ER_FAILED_TO_STORE_SDI_FOR_TABLESPACE = 11001 +ER_DD_UPGRADE_FAILED_TO_FETCH_TABLES = 11002 +ER_DD_UPGRADE_DD_POPULATED = 11003 +ER_DD_UPGRADE_INFO_FILE_OPEN_FAILED = 11004 +ER_DD_UPGRADE_INFO_FILE_CLOSE_FAILED = 11005 +ER_DD_UPGRADE_TABLESPACE_MIGRATION_FAILED = 11006 +ER_DD_UPGRADE_FAILED_TO_CREATE_TABLE_STATS = 11007 +ER_DD_UPGRADE_TABLE_STATS_MIGRATE_COMPLETED = 11008 +ER_DD_UPGRADE_FAILED_TO_CREATE_INDEX_STATS = 11009 +ER_DD_UPGRADE_INDEX_STATS_MIGRATE_COMPLETED = 11010 +ER_DD_UPGRADE_FAILED_FIND_VALID_DATA_DIR = 11011 +ER_DD_UPGRADE_START = 11012 +ER_DD_UPGRADE_FAILED_INIT_DD_SE = 11013 +ER_DD_UPGRADE_FOUND_PARTIALLY_UPGRADED_DD_ABORT = 11014 +ER_DD_UPGRADE_FOUND_PARTIALLY_UPGRADED_DD_CONTINUE = 11015 +ER_DD_UPGRADE_SE_LOGS_FAILED = 11016 +ER_DD_UPGRADE_SDI_INFO_UPDATE_FAILED = 11017 +ER_SKIP_UPDATING_METADATA_IN_SE_RO_MODE = 11018 +ER_CREATED_SYSTEM_WITH_VERSION = 11019 +ER_UNKNOWN_ERROR_DETECTED_IN_SE = 11020 +ER_READ_LOG_EVENT_FAILED = 11021 +ER_ROW_DATA_TOO_BIG_TO_WRITE_IN_BINLOG = 11022 +ER_FAILED_TO_CONSTRUCT_DROP_EVENT_QUERY = 11023 +ER_FAILED_TO_BINLOG_DROP_EVENT = 11024 +ER_FAILED_TO_START_SLAVE_THREAD = 11025 +ER_RPL_IO_THREAD_KILLED = 11026 +ER_SLAVE_RECONNECT_FAILED = 11027 +ER_SLAVE_KILLED_AFTER_RECONNECT = 11028 +ER_SLAVE_NOT_STARTED_ON_SOME_CHANNELS = 11029 +ER_FAILED_TO_ADD_RPL_FILTER = 11030 +ER_PER_CHANNEL_RPL_FILTER_CONF_FOR_GRP_RPL = 11031 +ER_RPL_FILTERS_NOT_ATTACHED_TO_CHANNEL = 11032 +ER_FAILED_TO_BUILD_DO_AND_IGNORE_TABLE_HASHES = 11033 +ER_CLONE_PLUGIN_NOT_LOADED = 11034 +ER_CLONE_HANDLER_EXISTS = 11035 +ER_FAILED_TO_CREATE_CLONE_HANDLER = 11036 +ER_CYCLE_TIMER_IS_NOT_AVAILABLE = 11037 +ER_NANOSECOND_TIMER_IS_NOT_AVAILABLE = 11038 +ER_MICROSECOND_TIMER_IS_NOT_AVAILABLE = 11039 +ER_PFS_MALLOC_ARRAY_OVERFLOW = 11040 +ER_PFS_MALLOC_ARRAY_OOM = 11041 +ER_INNODB_FAILED_TO_FIND_IDX_WITH_KEY_NO = 11042 +ER_INNODB_FAILED_TO_FIND_IDX = 11043 +ER_INNODB_FAILED_TO_FIND_IDX_FROM_DICT_CACHE = 11044 +ER_INNODB_ACTIVE_INDEX_CHANGE_FAILED = 11045 +ER_INNODB_DIFF_IN_REF_LEN = 11046 +ER_WRONG_TYPE_FOR_COLUMN_PREFIX_IDX_FLD = 11047 +ER_INNODB_CANNOT_CREATE_TABLE = 11048 +ER_INNODB_INTERNAL_INDEX = 11049 +ER_INNODB_IDX_CNT_MORE_THAN_DEFINED_IN_MYSQL = 11050 +ER_INNODB_IDX_CNT_FEWER_THAN_DEFINED_IN_MYSQL = 11051 +ER_INNODB_IDX_COLUMN_CNT_DIFF = 11052 +ER_INNODB_USE_MONITOR_GROUP_NAME = 11053 +ER_INNODB_MONITOR_DEFAULT_VALUE_NOT_DEFINED = 11054 +ER_INNODB_MONITOR_IS_ENABLED = 11055 +ER_INNODB_INVALID_MONITOR_COUNTER_NAME = 11056 +ER_WIN_LOAD_LIBRARY_FAILED = 11057 +ER_PARTITION_HANDLER_ADMIN_MSG = 11058 +ER_RPL_RLI_INIT_INFO_MSG = 11059 +ER_DD_UPGRADE_TABLE_INTACT_ERROR = 11060 +ER_SERVER_INIT_COMPILED_IN_COMMANDS = 11061 +ER_MYISAM_CHECK_METHOD_ERROR = 11062 +ER_MYISAM_CRASHED_ERROR = 11063 +ER_WAITPID_FAILED = 11064 +ER_FAILED_TO_FIND_MYSQLD_STATUS = 11065 +ER_INNODB_ERROR_LOGGER_MSG = 11066 +ER_INNODB_ERROR_LOGGER_FATAL_MSG = 11067 +ER_DEPRECATED_SYNTAX_WITH_REPLACEMENT = 11068 +ER_DEPRECATED_SYNTAX_NO_REPLACEMENT = 11069 +ER_DEPRECATE_MSG_NO_REPLACEMENT = 11070 +ER_LOG_PRINTF_MSG = 11071 +ER_BINLOG_LOGGING_NOT_POSSIBLE = 11072 +ER_FAILED_TO_SET_PERSISTED_OPTIONS = 11073 +ER_COMPONENTS_FAILED_TO_ACQUIRE_SERVICE_IMPLEMENTATION = 11074 +ER_RES_GRP_INVALID_VCPU_RANGE = 11075 +ER_RES_GRP_INVALID_VCPU_ID = 11076 +ER_ERROR_DURING_FLUSH_LOG_COMMIT_PHASE = 11077 +ER_DROP_DATABASE_FAILED_RMDIR_MANUALLY = 11078 +ER_EXPIRE_LOGS_DAYS_IGNORED = 11079 +ER_BINLOG_MALFORMED_OR_OLD_RELAY_LOG = 11080 +ER_DD_UPGRADE_VIEW_COLUMN_NAME_TOO_LONG = 11081 +ER_TABLE_NEEDS_DUMP_UPGRADE = 11082 +ER_DD_UPGRADE_FAILED_TO_UPDATE_VER_NO_IN_TABLESPACE = 11083 +ER_KEYRING_MIGRATION_FAILED = 11084 +ER_KEYRING_MIGRATION_SUCCESSFUL = 11085 +ER_RESTART_RECEIVED_INFO = 11086 +ER_LCTN_CHANGED = 11087 +ER_DD_INITIALIZE = 11088 +ER_DD_RESTART = 11089 +ER_DD_UPGRADE = 11090 +ER_DD_UPGRADE_OFF = 11091 +ER_DD_UPGRADE_VERSION_NOT_SUPPORTED = 11092 +ER_DD_UPGRADE_SCHEMA_UNAVAILABLE = 11093 +ER_DD_MINOR_DOWNGRADE = 11094 +ER_DD_MINOR_DOWNGRADE_VERSION_NOT_SUPPORTED = 11095 +ER_DD_NO_VERSION_FOUND = 11096 +ER_THREAD_POOL_NOT_SUPPORTED_ON_PLATFORM = 11097 +ER_THREAD_POOL_SIZE_TOO_LOW = 11098 +ER_THREAD_POOL_SIZE_TOO_HIGH = 11099 +ER_THREAD_POOL_ALGORITHM_INVALID = 11100 +ER_THREAD_POOL_INVALID_STALL_LIMIT = 11101 +ER_THREAD_POOL_INVALID_PRIO_KICKUP_TIMER = 11102 +ER_THREAD_POOL_MAX_UNUSED_THREADS_INVALID = 11103 +ER_THREAD_POOL_CON_HANDLER_INIT_FAILED = 11104 +ER_THREAD_POOL_INIT_FAILED = 11105 +ER_THREAD_POOL_PLUGIN_STARTED = 11106 +ER_THREAD_POOL_CANNOT_SET_THREAD_SPECIFIC_DATA = 11107 +ER_THREAD_POOL_FAILED_TO_CREATE_CONNECT_HANDLER_THD = 11108 +ER_THREAD_POOL_FAILED_TO_CREATE_THD_AND_AUTH_CONN = 11109 +ER_THREAD_POOL_FAILED_PROCESS_CONNECT_EVENT = 11110 +ER_THREAD_POOL_FAILED_TO_CREATE_POOL = 11111 +ER_THREAD_POOL_RATE_LIMITED_ERROR_MSGS = 11112 +ER_TRHEAD_POOL_LOW_LEVEL_INIT_FAILED = 11113 +ER_THREAD_POOL_LOW_LEVEL_REARM_FAILED = 11114 +ER_THREAD_POOL_BUFFER_TOO_SMALL = 11115 +ER_MECAB_NOT_SUPPORTED = 11116 +ER_MECAB_NOT_VERIFIED = 11117 +ER_MECAB_CREATING_MODEL = 11118 +ER_MECAB_FAILED_TO_CREATE_MODEL = 11119 +ER_MECAB_FAILED_TO_CREATE_TRIGGER = 11120 +ER_MECAB_UNSUPPORTED_CHARSET = 11121 +ER_MECAB_CHARSET_LOADED = 11122 +ER_MECAB_PARSE_FAILED = 11123 +ER_MECAB_OOM_WHILE_PARSING_TEXT = 11124 +ER_MECAB_CREATE_LATTICE_FAILED = 11125 +ER_SEMISYNC_TRACE_ENTER_FUNC = 11126 +ER_SEMISYNC_TRACE_EXIT_WITH_INT_EXIT_CODE = 11127 +ER_SEMISYNC_TRACE_EXIT_WITH_BOOL_EXIT_CODE = 11128 +ER_SEMISYNC_TRACE_EXIT = 11129 +ER_SEMISYNC_RPL_INIT_FOR_TRX = 11130 +ER_SEMISYNC_FAILED_TO_ALLOCATE_TRX_NODE = 11131 +ER_SEMISYNC_BINLOG_WRITE_OUT_OF_ORDER = 11132 +ER_SEMISYNC_INSERT_LOG_INFO_IN_ENTRY = 11133 +ER_SEMISYNC_PROBE_LOG_INFO_IN_ENTRY = 11134 +ER_SEMISYNC_CLEARED_ALL_ACTIVE_TRANSACTION_NODES = 11135 +ER_SEMISYNC_CLEARED_ACTIVE_TRANSACTION_TILL_POS = 11136 +ER_SEMISYNC_REPLY_MAGIC_NO_ERROR = 11137 +ER_SEMISYNC_REPLY_PKT_LENGTH_TOO_SMALL = 11138 +ER_SEMISYNC_REPLY_BINLOG_FILE_TOO_LARGE = 11139 +ER_SEMISYNC_SERVER_REPLY = 11140 +ER_SEMISYNC_FUNCTION_CALLED_TWICE = 11141 +ER_SEMISYNC_RPL_ENABLED_ON_MASTER = 11142 +ER_SEMISYNC_MASTER_OOM = 11143 +ER_SEMISYNC_DISABLED_ON_MASTER = 11144 +ER_SEMISYNC_FORCED_SHUTDOWN = 11145 +ER_SEMISYNC_MASTER_GOT_REPLY_AT_POS = 11146 +ER_SEMISYNC_MASTER_SIGNAL_ALL_WAITING_THREADS = 11147 +ER_SEMISYNC_MASTER_TRX_WAIT_POS = 11148 +ER_SEMISYNC_BINLOG_REPLY_IS_AHEAD = 11149 +ER_SEMISYNC_MOVE_BACK_WAIT_POS = 11150 +ER_SEMISYNC_INIT_WAIT_POS = 11151 +ER_SEMISYNC_WAIT_TIME_FOR_BINLOG_SENT = 11152 +ER_SEMISYNC_WAIT_FOR_BINLOG_TIMEDOUT = 11153 +ER_SEMISYNC_WAIT_TIME_ASSESSMENT_FOR_COMMIT_TRX_FAILED = 11154 +ER_SEMISYNC_RPL_SWITCHED_OFF = 11155 +ER_SEMISYNC_RPL_SWITCHED_ON = 11156 +ER_SEMISYNC_NO_SPACE_IN_THE_PKT = 11157 +ER_SEMISYNC_SYNC_HEADER_UPDATE_INFO = 11158 +ER_SEMISYNC_FAILED_TO_INSERT_TRX_NODE = 11159 +ER_SEMISYNC_TRX_SKIPPED_AT_POS = 11160 +ER_SEMISYNC_MASTER_FAILED_ON_NET_FLUSH = 11161 +ER_SEMISYNC_RECEIVED_ACK_IS_SMALLER = 11162 +ER_SEMISYNC_ADD_ACK_TO_SLOT = 11163 +ER_SEMISYNC_UPDATE_EXISTING_SLAVE_ACK = 11164 +ER_SEMISYNC_FAILED_TO_START_ACK_RECEIVER_THD = 11165 +ER_SEMISYNC_STARTING_ACK_RECEIVER_THD = 11166 +ER_SEMISYNC_FAILED_TO_WAIT_ON_DUMP_SOCKET = 11167 +ER_SEMISYNC_STOPPING_ACK_RECEIVER_THREAD = 11168 +ER_SEMISYNC_FAILED_REGISTER_SLAVE_TO_RECEIVER = 11169 +ER_SEMISYNC_START_BINLOG_DUMP_TO_SLAVE = 11170 +ER_SEMISYNC_STOP_BINLOG_DUMP_TO_SLAVE = 11171 +ER_SEMISYNC_UNREGISTER_TRX_OBSERVER_FAILED = 11172 +ER_SEMISYNC_UNREGISTER_BINLOG_STORAGE_OBSERVER_FAILED = 11173 +ER_SEMISYNC_UNREGISTER_BINLOG_TRANSMIT_OBSERVER_FAILED = 11174 +ER_SEMISYNC_UNREGISTERED_REPLICATOR = 11175 +ER_SEMISYNC_SOCKET_FD_TOO_LARGE = 11176 +ER_SEMISYNC_SLAVE_REPLY = 11177 +ER_SEMISYNC_MISSING_MAGIC_NO_FOR_SEMISYNC_PKT = 11178 +ER_SEMISYNC_SLAVE_START = 11179 +ER_SEMISYNC_SLAVE_REPLY_WITH_BINLOG_INFO = 11180 +ER_SEMISYNC_SLAVE_NET_FLUSH_REPLY_FAILED = 11181 +ER_SEMISYNC_SLAVE_SEND_REPLY_FAILED = 11182 +ER_SEMISYNC_EXECUTION_FAILED_ON_MASTER = 11183 +ER_SEMISYNC_NOT_SUPPORTED_BY_MASTER = 11184 +ER_SEMISYNC_SLAVE_SET_FAILED = 11185 +ER_SEMISYNC_FAILED_TO_STOP_ACK_RECEIVER_THD = 11186 +ER_FIREWALL_FAILED_TO_READ_FIREWALL_TABLES = 11187 +ER_FIREWALL_FAILED_TO_REG_DYNAMIC_PRIVILEGES = 11188 +ER_FIREWALL_RECORDING_STMT_WAS_TRUNCATED = 11189 +ER_FIREWALL_RECORDING_STMT_WITHOUT_TEXT = 11190 +ER_FIREWALL_SUSPICIOUS_STMT = 11191 +ER_FIREWALL_ACCESS_DENIED = 11192 +ER_FIREWALL_SKIPPED_UNKNOWN_USER_MODE = 11193 +ER_FIREWALL_RELOADING_CACHE = 11194 +ER_FIREWALL_RESET_FOR_USER = 11195 +ER_FIREWALL_STATUS_FLUSHED = 11196 +ER_KEYRING_LOGGER_ERROR_MSG = 11197 +ER_AUDIT_LOG_FILTER_IS_NOT_INSTALLED = 11198 +ER_AUDIT_LOG_SWITCHING_TO_INCLUDE_LIST = 11199 +ER_AUDIT_LOG_CANNOT_SET_LOG_POLICY_WITH_OTHER_POLICIES = 11200 +ER_AUDIT_LOG_ONLY_INCLUDE_LIST_USED = 11201 +ER_AUDIT_LOG_INDEX_MAP_CANNOT_ACCESS_DIR = 11202 +ER_AUDIT_LOG_WRITER_RENAME_FILE_FAILED = 11203 +ER_AUDIT_LOG_WRITER_DEST_FILE_ALREADY_EXISTS = 11204 +ER_AUDIT_LOG_WRITER_RENAME_FILE_FAILED_REMOVE_FILE_MANUALLY = 11205 +ER_AUDIT_LOG_WRITER_INCOMPLETE_FILE_RENAMED = 11206 +ER_AUDIT_LOG_WRITER_FAILED_TO_WRITE_TO_FILE = 11207 +ER_AUDIT_LOG_EC_WRITER_FAILED_TO_INIT_ENCRYPTION = 11208 +ER_AUDIT_LOG_EC_WRITER_FAILED_TO_INIT_COMPRESSION = 11209 +ER_AUDIT_LOG_EC_WRITER_FAILED_TO_CREATE_FILE = 11210 +ER_AUDIT_LOG_RENAME_LOG_FILE_BEFORE_FLUSH = 11211 +ER_AUDIT_LOG_FILTER_RESULT_MSG = 11212 +ER_AUDIT_LOG_JSON_READER_FAILED_TO_PARSE = 11213 +ER_AUDIT_LOG_JSON_READER_BUF_TOO_SMALL = 11214 +ER_AUDIT_LOG_JSON_READER_FAILED_TO_OPEN_FILE = 11215 +ER_AUDIT_LOG_JSON_READER_FILE_PARSING_ERROR = 11216 +ER_AUDIT_LOG_FILTER_INVALID_COLUMN_COUNT = 11217 +ER_AUDIT_LOG_FILTER_INVALID_COLUMN_DEFINITION = 11218 +ER_AUDIT_LOG_FILTER_FAILED_TO_STORE_TABLE_FLDS = 11219 +ER_AUDIT_LOG_FILTER_FAILED_TO_UPDATE_TABLE = 11220 +ER_AUDIT_LOG_FILTER_FAILED_TO_INSERT_INTO_TABLE = 11221 +ER_AUDIT_LOG_FILTER_FAILED_TO_DELETE_FROM_TABLE = 11222 +ER_AUDIT_LOG_FILTER_FAILED_TO_INIT_TABLE_FOR_READ = 11223 +ER_AUDIT_LOG_FILTER_FAILED_TO_READ_TABLE = 11224 +ER_AUDIT_LOG_FILTER_FAILED_TO_CLOSE_TABLE_AFTER_READING = 11225 +ER_AUDIT_LOG_FILTER_USER_AND_HOST_CANNOT_BE_EMPTY = 11226 +ER_AUDIT_LOG_FILTER_FLD_FILTERNAME_CANNOT_BE_EMPTY = 11227 +ER_VALIDATE_PWD_DICT_FILE_NOT_SPECIFIED = 11228 +ER_VALIDATE_PWD_DICT_FILE_NOT_LOADED = 11229 +ER_VALIDATE_PWD_DICT_FILE_TOO_BIG = 11230 +ER_VALIDATE_PWD_FAILED_TO_READ_DICT_FILE = 11231 +ER_VALIDATE_PWD_FAILED_TO_GET_FLD_FROM_SECURITY_CTX = 11232 +ER_VALIDATE_PWD_FAILED_TO_GET_SECURITY_CTX = 11233 +ER_VALIDATE_PWD_LENGTH_CHANGED = 11234 +ER_REWRITER_QUERY_ERROR_MSG = 11235 +ER_REWRITER_QUERY_FAILED = 11236 +ER_XPLUGIN_STARTUP_FAILED = 11237 +ER_XPLUGIN_SERVER_EXITING = 11238 +ER_XPLUGIN_SERVER_EXITED = 11239 +ER_XPLUGIN_USING_SSL_CONF_FROM_SERVER = 11240 +ER_XPLUGIN_USING_SSL_CONF_FROM_MYSQLX = 11241 +ER_XPLUGIN_FAILED_TO_USE_SSL_CONF = 11242 +ER_XPLUGIN_USING_SSL_FOR_TLS_CONNECTION = 11243 +ER_XPLUGIN_REFERENCE_TO_SECURE_CONN_WITH_XPLUGIN = 11244 +ER_XPLUGIN_ERROR_MSG = 11245 +ER_SHA_PWD_FAILED_TO_PARSE_AUTH_STRING = 11246 +ER_SHA_PWD_FAILED_TO_GENERATE_MULTI_ROUND_HASH = 11247 +ER_SHA_PWD_AUTH_REQUIRES_RSA_OR_SSL = 11248 +ER_SHA_PWD_RSA_KEY_TOO_LONG = 11249 +ER_PLUGIN_COMMON_FAILED_TO_OPEN_FILTER_TABLES = 11250 +ER_PLUGIN_COMMON_FAILED_TO_OPEN_TABLE = 11251 +ER_AUTH_LDAP_ERROR_LOGGER_ERROR_MSG = 11252 +ER_CONN_CONTROL_ERROR_MSG = 11253 +ER_GRP_RPL_ERROR_MSG = 11254 +ER_SHA_PWD_SALT_FOR_USER_CORRUPT = 11255 +ER_SYS_VAR_COMPONENT_OOM = 11256 +ER_SYS_VAR_COMPONENT_VARIABLE_SET_READ_ONLY = 11257 +ER_SYS_VAR_COMPONENT_UNKNOWN_VARIABLE_TYPE = 11258 +ER_SYS_VAR_COMPONENT_FAILED_TO_PARSE_VARIABLE_OPTIONS = 11259 +ER_SYS_VAR_COMPONENT_FAILED_TO_MAKE_VARIABLE_PERSISTENT = 11260 +ER_COMPONENT_FILTER_CONFUSED = 11261 +ER_STOP_SLAVE_IO_THREAD_DISK_SPACE = 11262 +ER_LOG_FILE_CANNOT_OPEN = 11263 +OBSOLETE_ER_UNABLE_TO_COLLECT_INSTANCE_LOG_STATUS = 11264 +OBSOLETE_ER_DEPRECATED_UTF8_ALIAS = 11265 +OBSOLETE_ER_DEPRECATED_NATIONAL = 11266 +OBSOLETE_ER_SLAVE_POSSIBLY_DIVERGED_AFTER_DDL = 11267 +ER_PERSIST_OPTION_STATUS = 11268 +ER_NOT_IMPLEMENTED_GET_TABLESPACE_STATISTICS = 11269 +OBSOLETE_ER_UNABLE_TO_SET_OPTION = 11270 +OBSOLETE_ER_RESERVED_TABLESPACE_NAME = 11271 +ER_SSL_FIPS_MODE_ERROR = 11272 +ER_CONN_INIT_CONNECT_IGNORED = 11273 +ER_UNSUPPORTED_SQL_MODE = 11274 +ER_REWRITER_OOM = 11275 +ER_REWRITER_TABLE_MALFORMED_ERROR = 11276 +ER_REWRITER_LOAD_FAILED = 11277 +ER_REWRITER_READ_FAILED = 11278 +ER_CONN_CONTROL_EVENT_COORDINATOR_INIT_FAILED = 11279 +ER_CONN_CONTROL_STAT_CONN_DELAY_TRIGGERED_UPDATE_FAILED = 11280 +ER_CONN_CONTROL_STAT_CONN_DELAY_TRIGGERED_RESET_FAILED = 11281 +ER_CONN_CONTROL_INVALID_CONN_DELAY_TYPE = 11282 +ER_CONN_CONTROL_DELAY_ACTION_INIT_FAILED = 11283 +ER_CONN_CONTROL_FAILED_TO_SET_CONN_DELAY = 11284 +ER_CONN_CONTROL_FAILED_TO_UPDATE_CONN_DELAY_HASH = 11285 +ER_XPLUGIN_FORCE_STOP_CLIENT = 11286 +ER_XPLUGIN_MAX_AUTH_ATTEMPTS_REACHED = 11287 +ER_XPLUGIN_BUFFER_PAGE_ALLOC_FAILED = 11288 +ER_XPLUGIN_DETECTED_HANGING_CLIENTS = 11289 +ER_XPLUGIN_FAILED_TO_ACCEPT_CLIENT = 11290 +ER_XPLUGIN_FAILED_TO_SCHEDULE_CLIENT = 11291 +ER_XPLUGIN_FAILED_TO_PREPARE_IO_INTERFACES = 11292 +ER_XPLUGIN_SRV_SESSION_INIT_THREAD_FAILED = 11293 +ER_XPLUGIN_UNABLE_TO_USE_USER_SESSION_ACCOUNT = 11294 +ER_XPLUGIN_REFERENCE_TO_USER_ACCOUNT_DOC_SECTION = 11295 +ER_XPLUGIN_UNEXPECTED_EXCEPTION_DISPATCHING_CMD = 11296 +ER_XPLUGIN_EXCEPTION_IN_TASK_SCHEDULER = 11297 +ER_XPLUGIN_TASK_SCHEDULING_FAILED = 11298 +ER_XPLUGIN_EXCEPTION_IN_EVENT_LOOP = 11299 +ER_XPLUGIN_LISTENER_SETUP_FAILED = 11300 +ER_XPLUING_NET_STARTUP_FAILED = 11301 +ER_XPLUGIN_FAILED_AT_SSL_CONF = 11302 +ER_XPLUGIN_CLIENT_SSL_HANDSHAKE_FAILED = 11303 +ER_XPLUGIN_SSL_HANDSHAKE_WITH_SERVER_FAILED = 11304 +ER_XPLUGIN_FAILED_TO_CREATE_SESSION_FOR_CONN = 11305 +ER_XPLUGIN_FAILED_TO_INITIALIZE_SESSION = 11306 +ER_XPLUGIN_MESSAGE_TOO_LONG = 11307 +ER_XPLUGIN_UNINITIALIZED_MESSAGE = 11308 +ER_XPLUGIN_FAILED_TO_SET_MIN_NUMBER_OF_WORKERS = 11309 +ER_XPLUGIN_UNABLE_TO_ACCEPT_CONNECTION = 11310 +ER_XPLUGIN_ALL_IO_INTERFACES_DISABLED = 11311 +ER_XPLUGIN_INVALID_MSG_DURING_CLIENT_INIT = 11312 +ER_XPLUGIN_CLOSING_CLIENTS_ON_SHUTDOWN = 11313 +ER_XPLUGIN_ERROR_READING_SOCKET = 11314 +ER_XPLUGIN_PEER_DISCONNECTED_WHILE_READING_MSG_BODY = 11315 +ER_XPLUGIN_READ_FAILED_CLOSING_CONNECTION = 11316 +ER_XPLUGIN_INVALID_AUTH_METHOD = 11317 +ER_XPLUGIN_UNEXPECTED_MSG_DURING_AUTHENTICATION = 11318 +ER_XPLUGIN_ERROR_WRITING_TO_CLIENT = 11319 +ER_XPLUGIN_SCHEDULER_STARTED = 11320 +ER_XPLUGIN_SCHEDULER_STOPPED = 11321 +ER_XPLUGIN_LISTENER_SYS_VARIABLE_ERROR = 11322 +ER_XPLUGIN_LISTENER_STATUS_MSG = 11323 +ER_XPLUGIN_RETRYING_BIND_ON_PORT = 11324 +ER_XPLUGIN_SHUTDOWN_TRIGGERED = 11325 +ER_XPLUGIN_USER_ACCOUNT_WITH_ALL_PERMISSIONS = 11326 +ER_XPLUGIN_EXISTING_USER_ACCOUNT_WITH_INCOMPLETE_GRANTS = 11327 +ER_XPLUGIN_SERVER_STARTS_HANDLING_CONNECTIONS = 11328 +ER_XPLUGIN_SERVER_STOPPED_HANDLING_CONNECTIONS = 11329 +ER_XPLUGIN_FAILED_TO_INTERRUPT_SESSION = 11330 +ER_XPLUGIN_CLIENT_RELEASE_TRIGGERED = 11331 +ER_XPLUGIN_IPv6_AVAILABLE = 11332 +ER_XPLUGIN_UNIX_SOCKET_NOT_CONFIGURED = 11333 +ER_XPLUGIN_CLIENT_KILL_MSG = 11334 +ER_XPLUGIN_FAILED_TO_GET_SECURITY_CTX = 11335 +ER_XPLUGIN_FAILED_TO_SWITCH_SECURITY_CTX_TO_ROOT = 11336 +ER_XPLUGIN_FAILED_TO_CLOSE_SQL_SESSION = 11337 +ER_XPLUGIN_FAILED_TO_EXECUTE_ADMIN_CMD = 11338 +ER_XPLUGIN_EMPTY_ADMIN_CMD = 11339 +ER_XPLUGIN_FAILED_TO_GET_SYS_VAR = 11340 +ER_XPLUGIN_FAILED_TO_GET_CREATION_STMT = 11341 +ER_XPLUGIN_FAILED_TO_GET_ENGINE_INFO = 11342 +ER_XPLUGIN_FAIL_TO_GET_RESULT_DATA = 11343 +ER_XPLUGIN_CAPABILITY_EXPIRED_PASSWORD = 11344 +ER_XPLUGIN_FAILED_TO_SET_SO_REUSEADDR_FLAG = 11345 +ER_XPLUGIN_FAILED_TO_OPEN_INTERNAL_SESSION = 11346 +ER_XPLUGIN_FAILED_TO_SWITCH_CONTEXT = 11347 +ER_XPLUGIN_FAILED_TO_UNREGISTER_UDF = 11348 +ER_XPLUGIN_GET_PEER_ADDRESS_FAILED = 11349 +ER_XPLUGIN_CAPABILITY_CLIENT_INTERACTIVE_FAILED = 11350 +ER_XPLUGIN_FAILED_TO_RESET_IPV6_V6ONLY_FLAG = 11351 +ER_KEYRING_INVALID_KEY_TYPE = 11352 +ER_KEYRING_INVALID_KEY_LENGTH = 11353 +ER_KEYRING_FAILED_TO_CREATE_KEYRING_DIR = 11354 +ER_KEYRING_FILE_INIT_FAILED = 11355 +ER_KEYRING_INTERNAL_EXCEPTION_FAILED_FILE_INIT = 11356 +ER_KEYRING_FAILED_TO_GENERATE_KEY = 11357 +ER_KEYRING_CHECK_KEY_FAILED_DUE_TO_INVALID_KEY = 11358 +ER_KEYRING_CHECK_KEY_FAILED_DUE_TO_EMPTY_KEY_ID = 11359 +ER_KEYRING_OPERATION_FAILED_DUE_TO_INTERNAL_ERROR = 11360 +ER_KEYRING_INCORRECT_FILE = 11361 +ER_KEYRING_FOUND_MALFORMED_BACKUP_FILE = 11362 +ER_KEYRING_FAILED_TO_RESTORE_FROM_BACKUP_FILE = 11363 +ER_KEYRING_FAILED_TO_FLUSH_KEYRING_TO_FILE = 11364 +ER_KEYRING_FAILED_TO_GET_FILE_STAT = 11365 +ER_KEYRING_FAILED_TO_REMOVE_FILE = 11366 +ER_KEYRING_FAILED_TO_TRUNCATE_FILE = 11367 +ER_KEYRING_UNKNOWN_ERROR = 11368 +ER_KEYRING_FAILED_TO_SET_KEYRING_FILE_DATA = 11369 +ER_KEYRING_FILE_IO_ERROR = 11370 +ER_KEYRING_FAILED_TO_LOAD_KEYRING_CONTENT = 11371 +ER_KEYRING_FAILED_TO_FLUSH_KEYS_TO_KEYRING = 11372 +ER_KEYRING_FAILED_TO_FLUSH_KEYS_TO_KEYRING_BACKUP = 11373 +ER_KEYRING_KEY_FETCH_FAILED_DUE_TO_EMPTY_KEY_ID = 11374 +ER_KEYRING_FAILED_TO_REMOVE_KEY_DUE_TO_EMPTY_ID = 11375 +ER_KEYRING_OKV_INCORRECT_KEY_VAULT_CONFIGURED = 11376 +ER_KEYRING_OKV_INIT_FAILED_DUE_TO_INCORRECT_CONF = 11377 +ER_KEYRING_OKV_INIT_FAILED_DUE_TO_INTERNAL_ERROR = 11378 +ER_KEYRING_OKV_INVALID_KEY_TYPE = 11379 +ER_KEYRING_OKV_INVALID_KEY_LENGTH_FOR_CIPHER = 11380 +ER_KEYRING_OKV_FAILED_TO_GENERATE_KEY_DUE_TO_INTERNAL_ERROR = 11381 +ER_KEYRING_OKV_FAILED_TO_FIND_SERVER_ENTRY = 11382 +ER_KEYRING_OKV_FAILED_TO_FIND_STANDBY_SERVER_ENTRY = 11383 +ER_KEYRING_OKV_FAILED_TO_PARSE_CONF_FILE = 11384 +ER_KEYRING_OKV_FAILED_TO_LOAD_KEY_UID = 11385 +ER_KEYRING_OKV_FAILED_TO_INIT_SSL_LAYER = 11386 +ER_KEYRING_OKV_FAILED_TO_INIT_CLIENT = 11387 +ER_KEYRING_OKV_CONNECTION_TO_SERVER_FAILED = 11388 +ER_KEYRING_OKV_FAILED_TO_REMOVE_KEY = 11389 +ER_KEYRING_OKV_FAILED_TO_ADD_ATTRIBUTE = 11390 +ER_KEYRING_OKV_FAILED_TO_GENERATE_KEY = 11391 +ER_KEYRING_OKV_FAILED_TO_STORE_KEY = 11392 +ER_KEYRING_OKV_FAILED_TO_ACTIVATE_KEYS = 11393 +ER_KEYRING_OKV_FAILED_TO_FETCH_KEY = 11394 +ER_KEYRING_OKV_FAILED_TO_STORE_OR_GENERATE_KEY = 11395 +ER_KEYRING_OKV_FAILED_TO_RETRIEVE_KEY_SIGNATURE = 11396 +ER_KEYRING_OKV_FAILED_TO_RETRIEVE_KEY = 11397 +ER_KEYRING_OKV_FAILED_TO_LOAD_SSL_TRUST_STORE = 11398 +ER_KEYRING_OKV_FAILED_TO_SET_CERTIFICATE_FILE = 11399 +ER_KEYRING_OKV_FAILED_TO_SET_KEY_FILE = 11400 +ER_KEYRING_OKV_KEY_MISMATCH = 11401 +ER_KEYRING_ENCRYPTED_FILE_INCORRECT_KEYRING_FILE = 11402 +ER_KEYRING_ENCRYPTED_FILE_DECRYPTION_FAILED = 11403 +ER_KEYRING_ENCRYPTED_FILE_FOUND_MALFORMED_BACKUP_FILE = 11404 +ER_KEYRING_ENCRYPTED_FILE_FAILED_TO_RESTORE_KEYRING = 11405 +ER_KEYRING_ENCRYPTED_FILE_FAILED_TO_FLUSH_KEYRING = 11406 +ER_KEYRING_ENCRYPTED_FILE_ENCRYPTION_FAILED = 11407 +ER_KEYRING_ENCRYPTED_FILE_INVALID_KEYRING_DIR = 11408 +ER_KEYRING_ENCRYPTED_FILE_FAILED_TO_CREATE_KEYRING_DIR = 11409 +ER_KEYRING_ENCRYPTED_FILE_PASSWORD_IS_INVALID = 11410 +ER_KEYRING_ENCRYPTED_FILE_PASSWORD_IS_TOO_LONG = 11411 +ER_KEYRING_ENCRYPTED_FILE_INIT_FAILURE = 11412 +ER_KEYRING_ENCRYPTED_FILE_INIT_FAILED_DUE_TO_INTERNAL_ERROR = 11413 +ER_KEYRING_ENCRYPTED_FILE_GEN_KEY_FAILED_DUE_TO_INTERNAL_ERROR = 11414 +ER_KEYRING_AWS_FAILED_TO_SET_CMK_ID = 11415 +ER_KEYRING_AWS_FAILED_TO_SET_REGION = 11416 +ER_KEYRING_AWS_FAILED_TO_OPEN_CONF_FILE = 11417 +ER_KEYRING_AWS_FAILED_TO_ACCESS_KEY_ID_FROM_CONF_FILE = 11418 +ER_KEYRING_AWS_FAILED_TO_ACCESS_KEY_FROM_CONF_FILE = 11419 +ER_KEYRING_AWS_INVALID_CONF_FILE_PATH = 11420 +ER_KEYRING_AWS_INVALID_DATA_FILE_PATH = 11421 +ER_KEYRING_AWS_FAILED_TO_ACCESS_OR_CREATE_KEYRING_DIR = 11422 +ER_KEYRING_AWS_FAILED_TO_ACCESS_OR_CREATE_KEYRING_DATA_FILE = 11423 +ER_KEYRING_AWS_FAILED_TO_INIT_DUE_TO_INTERNAL_ERROR = 11424 +ER_KEYRING_AWS_FAILED_TO_ACCESS_DATA_FILE = 11425 +ER_KEYRING_AWS_CMK_ID_NOT_SET = 11426 +ER_KEYRING_AWS_FAILED_TO_GET_KMS_CREDENTIAL_FROM_CONF_FILE = 11427 +ER_KEYRING_AWS_INIT_FAILURE = 11428 +ER_KEYRING_AWS_FAILED_TO_INIT_DUE_TO_PLUGIN_INTERNAL_ERROR = 11429 +ER_KEYRING_AWS_INVALID_KEY_LENGTH_FOR_CIPHER = 11430 +ER_KEYRING_AWS_FAILED_TO_GENERATE_KEY_DUE_TO_INTERNAL_ERROR = 11431 +ER_KEYRING_AWS_INCORRECT_FILE = 11432 +ER_KEYRING_AWS_FOUND_MALFORMED_BACKUP_FILE = 11433 +ER_KEYRING_AWS_FAILED_TO_RESTORE_FROM_BACKUP_FILE = 11434 +ER_KEYRING_AWS_FAILED_TO_FLUSH_KEYRING_TO_FILE = 11435 +ER_KEYRING_AWS_INCORRECT_REGION = 11436 +ER_KEYRING_AWS_FAILED_TO_CONNECT_KMS = 11437 +ER_KEYRING_AWS_FAILED_TO_GENERATE_NEW_KEY = 11438 +ER_KEYRING_AWS_FAILED_TO_ENCRYPT_KEY = 11439 +ER_KEYRING_AWS_FAILED_TO_RE_ENCRYPT_KEY = 11440 +ER_KEYRING_AWS_FAILED_TO_DECRYPT_KEY = 11441 +ER_KEYRING_AWS_FAILED_TO_ROTATE_CMK = 11442 +ER_GRP_RPL_GTID_ALREADY_USED = 11443 +ER_GRP_RPL_APPLIER_THD_KILLED = 11444 +ER_GRP_RPL_EVENT_HANDLING_ERROR = 11445 +ER_GRP_RPL_ERROR_GTID_EXECUTION_INFO = 11446 +ER_GRP_RPL_CERTIFICATE_SIZE_ERROR = 11447 +ER_GRP_RPL_CREATE_APPLIER_CACHE_ERROR = 11448 +ER_GRP_RPL_UNBLOCK_WAITING_THD = 11449 +ER_GRP_RPL_APPLIER_PIPELINE_NOT_DISPOSED = 11450 +ER_GRP_RPL_APPLIER_THD_EXECUTION_ABORTED = 11451 +ER_GRP_RPL_APPLIER_EXECUTION_FATAL_ERROR = 11452 +ER_GRP_RPL_ERROR_STOPPING_CHANNELS = 11453 +ER_GRP_RPL_ERROR_SENDING_SINGLE_PRIMARY_MSSG = 11454 +ER_GRP_RPL_UPDATE_TRANS_SNAPSHOT_VER_ERROR = 11455 +ER_GRP_RPL_SIDNO_FETCH_ERROR = 11456 +ER_GRP_RPL_BROADCAST_COMMIT_TRANS_MSSG_FAILED = 11457 +ER_GRP_RPL_GROUP_NAME_PARSE_ERROR = 11458 +ER_GRP_RPL_ADD_GRPSID_TO_GRPGTIDSID_MAP_ERROR = 11459 +ER_GRP_RPL_UPDATE_GRPGTID_EXECUTED_ERROR = 11460 +ER_GRP_RPL_DONOR_TRANS_INFO_ERROR = 11461 +ER_GRP_RPL_SERVER_CONN_ERROR = 11462 +ER_GRP_RPL_ERROR_FETCHING_GTID_EXECUTED_SET = 11463 +ER_GRP_RPL_ADD_GTID_TO_GRPGTID_EXECUTED_ERROR = 11464 +ER_GRP_RPL_ERROR_FETCHING_GTID_SET = 11465 +ER_GRP_RPL_ADD_RETRIEVED_SET_TO_GRP_GTID_EXECUTED_ERROR = 11466 +ER_GRP_RPL_CERTIFICATION_INITIALIZATION_FAILURE = 11467 +ER_GRP_RPL_UPDATE_LAST_CONFLICT_FREE_TRANS_ERROR = 11468 +ER_GRP_RPL_UPDATE_TRANS_SNAPSHOT_REF_VER_ERROR = 11469 +ER_GRP_RPL_FETCH_TRANS_SIDNO_ERROR = 11470 +ER_GRP_RPL_ERROR_VERIFYING_SIDNO = 11471 +ER_GRP_RPL_CANT_GENERATE_GTID = 11472 +ER_GRP_RPL_INVALID_GTID_SET = 11473 +ER_GRP_RPL_UPDATE_GTID_SET_ERROR = 11474 +ER_GRP_RPL_RECEIVED_SET_MISSING_GTIDS = 11475 +ER_GRP_RPL_SKIP_COMPUTATION_TRANS_COMMITTED = 11476 +ER_GRP_RPL_NULL_PACKET = 11477 +ER_GRP_RPL_CANT_READ_GTID = 11478 +ER_GRP_RPL_PROCESS_GTID_SET_ERROR = 11479 +ER_GRP_RPL_PROCESS_INTERSECTION_GTID_SET_ERROR = 11480 +ER_GRP_RPL_SET_STABLE_TRANS_ERROR = 11481 +ER_GRP_RPL_CANT_READ_GRP_GTID_EXTRACTED = 11482 +ER_GRP_RPL_CANT_READ_WRITE_SET_ITEM = 11483 +ER_GRP_RPL_INIT_CERTIFICATION_INFO_FAILURE = 11484 +ER_GRP_RPL_CONFLICT_DETECTION_DISABLED = 11485 +ER_GRP_RPL_MSG_DISCARDED = 11486 +ER_GRP_RPL_MISSING_GRP_RPL_APPLIER = 11487 +ER_GRP_RPL_CERTIFIER_MSSG_PROCESS_ERROR = 11488 +ER_GRP_RPL_SRV_NOT_ONLINE = 11489 +ER_GRP_RPL_SRV_ONLINE = 11490 +ER_GRP_RPL_DISABLE_SRV_READ_MODE_RESTRICTED = 11491 +ER_GRP_RPL_MEM_ONLINE = 11492 +ER_GRP_RPL_MEM_UNREACHABLE = 11493 +ER_GRP_RPL_MEM_REACHABLE = 11494 +ER_GRP_RPL_SRV_BLOCKED = 11495 +ER_GRP_RPL_SRV_BLOCKED_FOR_SECS = 11496 +ER_GRP_RPL_CHANGE_GRP_MEM_NOT_PROCESSED = 11497 +ER_GRP_RPL_MEMBER_CONTACT_RESTORED = 11498 +ER_GRP_RPL_MEMBER_REMOVED = 11499 +ER_GRP_RPL_PRIMARY_MEMBER_LEFT_GRP = 11500 +ER_GRP_RPL_MEMBER_ADDED = 11501 +ER_GRP_RPL_MEMBER_EXIT_PLUGIN_ERROR = 11502 +ER_GRP_RPL_MEMBER_CHANGE = 11503 +ER_GRP_RPL_MEMBER_LEFT_GRP = 11504 +ER_GRP_RPL_MEMBER_EXPELLED = 11505 +ER_GRP_RPL_SESSION_OPEN_FAILED = 11506 +ER_GRP_RPL_NEW_PRIMARY_ELECTED = 11507 +ER_GRP_RPL_DISABLE_READ_ONLY_FAILED = 11508 +ER_GRP_RPL_ENABLE_READ_ONLY_FAILED = 11509 +ER_GRP_RPL_SRV_PRIMARY_MEM = 11510 +ER_GRP_RPL_SRV_SECONDARY_MEM = 11511 +ER_GRP_RPL_NO_SUITABLE_PRIMARY_MEM = 11512 +ER_GRP_RPL_SUPER_READ_ONLY_ACTIVATE_ERROR = 11513 +ER_GRP_RPL_EXCEEDS_AUTO_INC_VALUE = 11514 +ER_GRP_RPL_DATA_NOT_PROVIDED_BY_MEM = 11515 +ER_GRP_RPL_MEMBER_ALREADY_EXISTS = 11516 +ER_GRP_RPL_GRP_CHANGE_INFO_EXTRACT_ERROR = 11517 +ER_GRP_RPL_GTID_EXECUTED_EXTRACT_ERROR = 11518 +ER_GRP_RPL_GTID_SET_EXTRACT_ERROR = 11519 +ER_GRP_RPL_START_FAILED = 11520 +ER_GRP_RPL_MEMBER_VER_INCOMPATIBLE = 11521 +ER_GRP_RPL_TRANS_NOT_PRESENT_IN_GRP = 11522 +ER_GRP_RPL_TRANS_GREATER_THAN_GRP = 11523 +ER_GRP_RPL_MEMBER_VERSION_LOWER_THAN_GRP = 11524 +ER_GRP_RPL_LOCAL_GTID_SETS_PROCESS_ERROR = 11525 +ER_GRP_RPL_MEMBER_TRANS_GREATER_THAN_GRP = 11526 +ER_GRP_RPL_BLOCK_SIZE_DIFF_FROM_GRP = 11527 +ER_GRP_RPL_TRANS_WRITE_SET_EXTRACT_DIFF_FROM_GRP = 11528 +ER_GRP_RPL_MEMBER_CFG_INCOMPATIBLE_WITH_GRP_CFG = 11529 +ER_GRP_RPL_MEMBER_STOP_RPL_CHANNELS_ERROR = 11530 +ER_GRP_RPL_PURGE_APPLIER_LOGS = 11531 +ER_GRP_RPL_RESET_APPLIER_MODULE_LOGS_ERROR = 11532 +ER_GRP_RPL_APPLIER_THD_SETUP_ERROR = 11533 +ER_GRP_RPL_APPLIER_THD_START_ERROR = 11534 +ER_GRP_RPL_APPLIER_THD_STOP_ERROR = 11535 +ER_GRP_RPL_FETCH_TRANS_DATA_FAILED = 11536 +ER_GRP_RPL_SLAVE_IO_THD_PRIMARY_UNKNOWN = 11537 +ER_GRP_RPL_SALVE_IO_THD_ON_SECONDARY_MEMBER = 11538 +ER_GRP_RPL_SLAVE_SQL_THD_PRIMARY_UNKNOWN = 11539 +ER_GRP_RPL_SLAVE_SQL_THD_ON_SECONDARY_MEMBER = 11540 +ER_GRP_RPL_NEEDS_INNODB_TABLE = 11541 +ER_GRP_RPL_PRIMARY_KEY_NOT_DEFINED = 11542 +ER_GRP_RPL_FK_WITH_CASCADE_UNSUPPORTED = 11543 +ER_GRP_RPL_AUTO_INC_RESET = 11544 +ER_GRP_RPL_AUTO_INC_OFFSET_RESET = 11545 +ER_GRP_RPL_AUTO_INC_SET = 11546 +ER_GRP_RPL_AUTO_INC_OFFSET_SET = 11547 +ER_GRP_RPL_FETCH_TRANS_CONTEXT_FAILED = 11548 +ER_GRP_RPL_FETCH_FORMAT_DESC_LOG_EVENT_FAILED = 11549 +ER_GRP_RPL_FETCH_TRANS_CONTEXT_LOG_EVENT_FAILED = 11550 +ER_GRP_RPL_FETCH_SNAPSHOT_VERSION_FAILED = 11551 +ER_GRP_RPL_FETCH_GTID_LOG_EVENT_FAILED = 11552 +ER_GRP_RPL_UPDATE_SERV_CERTIFICATE_FAILED = 11553 +ER_GRP_RPL_ADD_GTID_INFO_WITH_LOCAL_GTID_FAILED = 11554 +ER_GRP_RPL_ADD_GTID_INFO_WITHOUT_LOCAL_GTID_FAILED = 11555 +ER_GRP_RPL_NOTIFY_CERTIFICATION_OUTCOME_FAILED = 11556 +ER_GRP_RPL_ADD_GTID_INFO_WITH_REMOTE_GTID_FAILED = 11557 +ER_GRP_RPL_ADD_GTID_INFO_WITHOUT_REMOTE_GTID_FAILED = 11558 +ER_GRP_RPL_FETCH_VIEW_CHANGE_LOG_EVENT_FAILED = 11559 +ER_GRP_RPL_CONTACT_WITH_SRV_FAILED = 11560 +ER_GRP_RPL_SRV_WAIT_TIME_OUT = 11561 +ER_GRP_RPL_FETCH_LOG_EVENT_FAILED = 11562 +ER_GRP_RPL_START_GRP_RPL_FAILED = 11563 +ER_GRP_RPL_CONN_INTERNAL_PLUGIN_FAIL = 11564 +ER_GRP_RPL_SUPER_READ_ON = 11565 +ER_GRP_RPL_SUPER_READ_OFF = 11566 +ER_GRP_RPL_KILLED_SESSION_ID = 11567 +ER_GRP_RPL_KILLED_FAILED_ID = 11568 +ER_GRP_RPL_INTERNAL_QUERY = 11569 +ER_GRP_RPL_COPY_FROM_EMPTY_STRING = 11570 +ER_GRP_RPL_QUERY_FAIL = 11571 +ER_GRP_RPL_CREATE_SESSION_UNABLE = 11572 +ER_GRP_RPL_MEMBER_NOT_FOUND = 11573 +ER_GRP_RPL_MAXIMUM_CONNECTION_RETRIES_REACHED = 11574 +ER_GRP_RPL_ALL_DONORS_LEFT_ABORT_RECOVERY = 11575 +ER_GRP_RPL_ESTABLISH_RECOVERY_WITH_DONOR = 11576 +ER_GRP_RPL_ESTABLISH_RECOVERY_WITH_ANOTHER_DONOR = 11577 +ER_GRP_RPL_NO_VALID_DONOR = 11578 +ER_GRP_RPL_CONFIG_RECOVERY = 11579 +ER_GRP_RPL_ESTABLISHING_CONN_GRP_REC_DONOR = 11580 +ER_GRP_RPL_CREATE_GRP_RPL_REC_CHANNEL = 11581 +ER_GRP_RPL_DONOR_SERVER_CONN = 11582 +ER_GRP_RPL_CHECK_STATUS_TABLE = 11583 +ER_GRP_RPL_STARTING_GRP_REC = 11584 +ER_GRP_RPL_DONOR_CONN_TERMINATION = 11585 +ER_GRP_RPL_STOPPING_GRP_REC = 11586 +ER_GRP_RPL_PURGE_REC = 11587 +ER_GRP_RPL_UNABLE_TO_KILL_CONN_REC_DONOR_APPLIER = 11588 +ER_GRP_RPL_UNABLE_TO_KILL_CONN_REC_DONOR_FAILOVER = 11589 +ER_GRP_RPL_FAILED_TO_NOTIFY_GRP_MEMBERSHIP_EVENT = 11590 +ER_GRP_RPL_FAILED_TO_BROADCAST_GRP_MEMBERSHIP_NOTIFICATION = 11591 +ER_GRP_RPL_FAILED_TO_BROADCAST_MEMBER_STATUS_NOTIFICATION = 11592 +ER_GRP_RPL_OOM_FAILED_TO_GENERATE_IDENTIFICATION_HASH = 11593 +ER_GRP_RPL_WRITE_IDENT_HASH_BASE64_ENCODING_FAILED = 11594 +ER_GRP_RPL_INVALID_BINLOG_FORMAT = 11595 +ER_GRP_RPL_BINLOG_CHECKSUM_SET = 11596 +ER_GRP_RPL_TRANS_WRITE_SET_EXTRACTION_NOT_SET = 11597 +ER_GRP_RPL_UNSUPPORTED_TRANS_ISOLATION = 11598 +ER_GRP_RPL_CANNOT_EXECUTE_TRANS_WHILE_STOPPING = 11599 +ER_GRP_RPL_CANNOT_EXECUTE_TRANS_WHILE_RECOVERING = 11600 +ER_GRP_RPL_CANNOT_EXECUTE_TRANS_IN_ERROR_STATE = 11601 +ER_GRP_RPL_CANNOT_EXECUTE_TRANS_IN_OFFLINE_MODE = 11602 +ER_GRP_RPL_MULTIPLE_CACHE_TYPE_NOT_SUPPORTED_FOR_SESSION = 11603 +ER_GRP_RPL_FAILED_TO_REINIT_BINLOG_CACHE_FOR_READ = 11604 +ER_GRP_RPL_FAILED_TO_CREATE_TRANS_CONTEXT = 11605 +ER_GRP_RPL_FAILED_TO_EXTRACT_TRANS_WRITE_SET = 11606 +ER_GRP_RPL_FAILED_TO_GATHER_TRANS_WRITE_SET = 11607 +ER_GRP_RPL_TRANS_SIZE_EXCEEDS_LIMIT = 11608 +ER_GRP_RPL_REINIT_OF_INTERNAL_CACHE_FOR_READ_FAILED = 11609 +ER_GRP_RPL_APPENDING_DATA_TO_INTERNAL_CACHE_FAILED = 11610 +ER_GRP_RPL_WRITE_TO_BINLOG_CACHE_FAILED = 11611 +ER_GRP_RPL_FAILED_TO_REGISTER_TRANS_OUTCOME_NOTIFICTION = 11612 +ER_GRP_RPL_MSG_TOO_LONG_BROADCASTING_TRANS_FAILED = 11613 +ER_GRP_RPL_BROADCASTING_TRANS_TO_GRP_FAILED = 11614 +ER_GRP_RPL_ERROR_WHILE_WAITING_FOR_CONFLICT_DETECTION = 11615 +ER_GRP_RPL_REINIT_OF_INTERNAL_CACHE_FOR_WRITE_FAILED = 11616 +ER_GRP_RPL_FAILED_TO_CREATE_COMMIT_CACHE = 11617 +ER_GRP_RPL_REINIT_OF_COMMIT_CACHE_FOR_WRITE_FAILED = 11618 +ER_GRP_RPL_PREV_REC_SESSION_RUNNING = 11619 +ER_GRP_RPL_FATAL_REC_PROCESS = 11620 +ER_GRP_RPL_WHILE_STOPPING_REP_CHANNEL = 11621 +ER_GRP_RPL_UNABLE_TO_EVALUATE_APPLIER_STATUS = 11622 +ER_GRP_RPL_ONLY_ONE_SERVER_ALIVE = 11623 +ER_GRP_RPL_CERTIFICATION_REC_PROCESS = 11624 +ER_GRP_RPL_UNABLE_TO_ENSURE_EXECUTION_REC = 11625 +ER_GRP_RPL_WHILE_SENDING_MSG_REC = 11626 +ER_GRP_RPL_READ_UNABLE_FOR_SUPER_READ_ONLY = 11627 +ER_GRP_RPL_READ_UNABLE_FOR_READ_ONLY_SUPER_READ_ONLY = 11628 +ER_GRP_RPL_UNABLE_TO_RESET_SERVER_READ_MODE = 11629 +ER_GRP_RPL_UNABLE_TO_CERTIFY_PLUGIN_TRANS = 11630 +ER_GRP_RPL_UNBLOCK_CERTIFIED_TRANS = 11631 +ER_GRP_RPL_SERVER_WORKING_AS_SECONDARY = 11632 +ER_GRP_RPL_FAILED_TO_START_WITH_INVALID_SERVER_ID = 11633 +ER_GRP_RPL_FORCE_MEMBERS_MUST_BE_EMPTY = 11634 +ER_GRP_RPL_PLUGIN_STRUCT_INIT_NOT_POSSIBLE_ON_SERVER_START = 11635 +ER_GRP_RPL_FAILED_TO_ENABLE_SUPER_READ_ONLY_MODE = 11636 +ER_GRP_RPL_FAILED_TO_INIT_COMMUNICATION_ENGINE = 11637 +ER_GRP_RPL_FAILED_TO_START_ON_SECONDARY_WITH_ASYNC_CHANNELS = 11638 +ER_GRP_RPL_FAILED_TO_START_COMMUNICATION_ENGINE = 11639 +ER_GRP_RPL_TIMEOUT_ON_VIEW_AFTER_JOINING_GRP = 11640 +ER_GRP_RPL_FAILED_TO_CALL_GRP_COMMUNICATION_INTERFACE = 11641 +ER_GRP_RPL_MEMBER_SERVER_UUID_IS_INCOMPATIBLE_WITH_GRP = 11642 +ER_GRP_RPL_MEMBER_CONF_INFO = 11643 +ER_GRP_RPL_FAILED_TO_CONFIRM_IF_SERVER_LEFT_GRP = 11644 +ER_GRP_RPL_SERVER_IS_ALREADY_LEAVING = 11645 +ER_GRP_RPL_SERVER_ALREADY_LEFT = 11646 +ER_GRP_RPL_WAITING_FOR_VIEW_UPDATE = 11647 +ER_GRP_RPL_TIMEOUT_RECEIVING_VIEW_CHANGE_ON_SHUTDOWN = 11648 +ER_GRP_RPL_REQUESTING_NON_MEMBER_SERVER_TO_LEAVE = 11649 +ER_GRP_RPL_IS_STOPPING = 11650 +ER_GRP_RPL_IS_STOPPED = 11651 +ER_GRP_RPL_FAILED_TO_ENABLE_READ_ONLY_MODE_ON_SHUTDOWN = 11652 +ER_GRP_RPL_RECOVERY_MODULE_TERMINATION_TIMED_OUT_ON_SHUTDOWN = 11653 +ER_GRP_RPL_APPLIER_TERMINATION_TIMED_OUT_ON_SHUTDOWN = 11654 +ER_GRP_RPL_FAILED_TO_SHUTDOWN_REGISTRY_MODULE = 11655 +ER_GRP_RPL_FAILED_TO_INIT_HANDLER = 11656 +ER_GRP_RPL_FAILED_TO_REGISTER_SERVER_STATE_OBSERVER = 11657 +ER_GRP_RPL_FAILED_TO_REGISTER_TRANS_STATE_OBSERVER = 11658 +ER_GRP_RPL_FAILED_TO_REGISTER_BINLOG_STATE_OBSERVER = 11659 +ER_GRP_RPL_FAILED_TO_START_ON_BOOT = 11660 +ER_GRP_RPL_FAILED_TO_STOP_ON_PLUGIN_UNINSTALL = 11661 +ER_GRP_RPL_FAILED_TO_UNREGISTER_SERVER_STATE_OBSERVER = 11662 +ER_GRP_RPL_FAILED_TO_UNREGISTER_TRANS_STATE_OBSERVER = 11663 +ER_GRP_RPL_FAILED_TO_UNREGISTER_BINLOG_STATE_OBSERVER = 11664 +ER_GRP_RPL_ALL_OBSERVERS_UNREGISTERED = 11665 +ER_GRP_RPL_FAILED_TO_PARSE_THE_GRP_NAME = 11666 +ER_GRP_RPL_FAILED_TO_GENERATE_SIDNO_FOR_GRP = 11667 +ER_GRP_RPL_APPLIER_NOT_STARTED_DUE_TO_RUNNING_PREV_SHUTDOWN = 11668 +ER_GRP_RPL_FAILED_TO_INIT_APPLIER_MODULE = 11669 +ER_GRP_RPL_APPLIER_INITIALIZED = 11670 +ER_GRP_RPL_COMMUNICATION_SSL_CONF_INFO = 11671 +ER_GRP_RPL_ABORTS_AS_SSL_NOT_SUPPORTED_BY_MYSQLD = 11672 +ER_GRP_RPL_SSL_DISABLED = 11673 +ER_GRP_RPL_UNABLE_TO_INIT_COMMUNICATION_ENGINE = 11674 +ER_GRP_RPL_BINLOG_DISABLED = 11675 +ER_GRP_RPL_GTID_MODE_OFF = 11676 +ER_GRP_RPL_LOG_SLAVE_UPDATES_NOT_SET = 11677 +ER_GRP_RPL_INVALID_TRANS_WRITE_SET_EXTRACTION_VALUE = 11678 +ER_GRP_RPL_RELAY_LOG_INFO_REPO_MUST_BE_TABLE = 11679 +ER_GRP_RPL_MASTER_INFO_REPO_MUST_BE_TABLE = 11680 +ER_GRP_RPL_INCORRECT_TYPE_SET_FOR_PARALLEL_APPLIER = 11681 +ER_GRP_RPL_SLAVE_PRESERVE_COMMIT_ORDER_NOT_SET = 11682 +ER_GRP_RPL_SINGLE_PRIM_MODE_NOT_ALLOWED_WITH_UPDATE_EVERYWHERE = 11683 +ER_GRP_RPL_MODULE_TERMINATE_ERROR = 11684 +ER_GRP_RPL_GRP_NAME_OPTION_MANDATORY = 11685 +ER_GRP_RPL_GRP_NAME_IS_TOO_LONG = 11686 +ER_GRP_RPL_GRP_NAME_IS_NOT_VALID_UUID = 11687 +ER_GRP_RPL_FLOW_CTRL_MIN_QUOTA_GREATER_THAN_MAX_QUOTA = 11688 +ER_GRP_RPL_FLOW_CTRL_MIN_RECOVERY_QUOTA_GREATER_THAN_MAX_QUOTA = 11689 +ER_GRP_RPL_FLOW_CTRL_MAX_QUOTA_SMALLER_THAN_MIN_QUOTAS = 11690 +ER_GRP_RPL_INVALID_SSL_RECOVERY_STRING = 11691 +ER_GRP_RPL_SUPPORTS_ONLY_ONE_FORCE_MEMBERS_SET = 11692 +ER_GRP_RPL_FORCE_MEMBERS_SET_UPDATE_NOT_ALLOWED = 11693 +ER_GRP_RPL_GRP_COMMUNICATION_INIT_WITH_CONF = 11694 +ER_GRP_RPL_UNKNOWN_GRP_RPL_APPLIER_PIPELINE_REQUESTED = 11695 +ER_GRP_RPL_FAILED_TO_BOOTSTRAP_EVENT_HANDLING_INFRASTRUCTURE = 11696 +ER_GRP_RPL_APPLIER_HANDLER_NOT_INITIALIZED = 11697 +ER_GRP_RPL_APPLIER_HANDLER_IS_IN_USE = 11698 +ER_GRP_RPL_APPLIER_HANDLER_ROLE_IS_IN_USE = 11699 +ER_GRP_RPL_FAILED_TO_INIT_APPLIER_HANDLER = 11700 +ER_GRP_RPL_SQL_SERVICE_FAILED_TO_INIT_SESSION_THREAD = 11701 +ER_GRP_RPL_SQL_SERVICE_COMM_SESSION_NOT_INITIALIZED = 11702 +ER_GRP_RPL_SQL_SERVICE_SERVER_SESSION_KILLED = 11703 +ER_GRP_RPL_SQL_SERVICE_FAILED_TO_RUN_SQL_QUERY = 11704 +ER_GRP_RPL_SQL_SERVICE_SERVER_INTERNAL_FAILURE = 11705 +ER_GRP_RPL_SQL_SERVICE_RETRIES_EXCEEDED_ON_SESSION_STATE = 11706 +ER_GRP_RPL_SQL_SERVICE_FAILED_TO_FETCH_SECURITY_CTX = 11707 +ER_GRP_RPL_SQL_SERVICE_SERVER_ACCESS_DENIED_FOR_USER = 11708 +ER_GRP_RPL_SQL_SERVICE_MAX_CONN_ERROR_FROM_SERVER = 11709 +ER_GRP_RPL_SQL_SERVICE_SERVER_ERROR_ON_CONN = 11710 +ER_GRP_RPL_UNREACHABLE_MAJORITY_TIMEOUT_FOR_MEMBER = 11711 +ER_GRP_RPL_SERVER_SET_TO_READ_ONLY_DUE_TO_ERRORS = 11712 +ER_GRP_RPL_GMS_LISTENER_FAILED_TO_LOG_NOTIFICATION = 11713 +ER_GRP_RPL_GRP_COMMUNICATION_ENG_INIT_FAILED = 11714 +ER_GRP_RPL_SET_GRP_COMMUNICATION_ENG_LOGGER_FAILED = 11715 +ER_GRP_RPL_DEBUG_OPTIONS = 11716 +ER_GRP_RPL_INVALID_DEBUG_OPTIONS = 11717 +ER_GRP_RPL_EXIT_GRP_GCS_ERROR = 11718 +ER_GRP_RPL_GRP_MEMBER_OFFLINE = 11719 +ER_GRP_RPL_GCS_INTERFACE_ERROR = 11720 +ER_GRP_RPL_FORCE_MEMBER_VALUE_SET_ERROR = 11721 +ER_GRP_RPL_FORCE_MEMBER_VALUE_SET = 11722 +ER_GRP_RPL_FORCE_MEMBER_VALUE_TIME_OUT = 11723 +ER_GRP_RPL_BROADCAST_COMMIT_MSSG_TOO_BIG = 11724 +ER_GRP_RPL_SEND_STATS_ERROR = 11725 +ER_GRP_RPL_MEMBER_STATS_INFO = 11726 +ER_GRP_RPL_FLOW_CONTROL_STATS = 11727 +ER_GRP_RPL_UNABLE_TO_CONVERT_PACKET_TO_EVENT = 11728 +ER_GRP_RPL_PIPELINE_CREATE_FAILED = 11729 +ER_GRP_RPL_PIPELINE_REINIT_FAILED_WRITE = 11730 +ER_GRP_RPL_UNABLE_TO_CONVERT_EVENT_TO_PACKET = 11731 +ER_GRP_RPL_PIPELINE_FLUSH_FAIL = 11732 +ER_GRP_RPL_PIPELINE_REINIT_FAILED_READ = 11733 +ER_GRP_RPL_STOP_REP_CHANNEL = 11734 +ER_GRP_RPL_GCS_GR_ERROR_MSG = 11735 +ER_GRP_RPL_SLAVE_IO_THREAD_UNBLOCKED = 11736 +ER_GRP_RPL_SLAVE_IO_THREAD_ERROR_OUT = 11737 +ER_GRP_RPL_SLAVE_APPLIER_THREAD_UNBLOCKED = 11738 +ER_GRP_RPL_SLAVE_APPLIER_THREAD_ERROR_OUT = 11739 +ER_LDAP_AUTH_FAILED_TO_CREATE_OR_GET_CONNECTION = 11740 +ER_LDAP_AUTH_DEINIT_FAILED = 11741 +ER_LDAP_AUTH_SKIPPING_USER_GROUP_SEARCH = 11742 +ER_LDAP_AUTH_POOL_DISABLE_MAX_SIZE_ZERO = 11743 +ER_LDAP_AUTH_FAILED_TO_CREATE_LDAP_OBJECT_CREATOR = 11744 +ER_LDAP_AUTH_FAILED_TO_CREATE_LDAP_OBJECT = 11745 +ER_LDAP_AUTH_TLS_CONF = 11746 +ER_LDAP_AUTH_TLS_CONNECTION = 11747 +ER_LDAP_AUTH_CONN_POOL_NOT_CREATED = 11748 +ER_LDAP_AUTH_CONN_POOL_INITIALIZING = 11749 +ER_LDAP_AUTH_CONN_POOL_DEINITIALIZING = 11750 +ER_LDAP_AUTH_ZERO_MAX_POOL_SIZE_UNCHANGED = 11751 +ER_LDAP_AUTH_POOL_REINITIALIZING = 11752 +ER_LDAP_AUTH_FAILED_TO_WRITE_PACKET = 11753 +ER_LDAP_AUTH_SETTING_USERNAME = 11754 +ER_LDAP_AUTH_USER_AUTH_DATA = 11755 +ER_LDAP_AUTH_INFO_FOR_USER = 11756 +ER_LDAP_AUTH_USER_GROUP_SEARCH_INFO = 11757 +ER_LDAP_AUTH_GRP_SEARCH_SPECIAL_HDL = 11758 +ER_LDAP_AUTH_GRP_IS_FULL_DN = 11759 +ER_LDAP_AUTH_USER_NOT_FOUND_IN_ANY_GRP = 11760 +ER_LDAP_AUTH_USER_FOUND_IN_MANY_GRPS = 11761 +ER_LDAP_AUTH_USER_HAS_MULTIPLE_GRP_NAMES = 11762 +ER_LDAP_AUTH_SEARCHED_USER_GRP_NAME = 11763 +ER_LDAP_AUTH_OBJECT_CREATE_TIMESTAMP = 11764 +ER_LDAP_AUTH_CERTIFICATE_NAME = 11765 +ER_LDAP_AUTH_FAILED_TO_POOL_DEINIT = 11766 +ER_LDAP_AUTH_FAILED_TO_INITIALIZE_POOL_IN_RECONSTRUCTING = 11767 +ER_LDAP_AUTH_FAILED_TO_INITIALIZE_POOL_IN_INIT_STATE = 11768 +ER_LDAP_AUTH_FAILED_TO_INITIALIZE_POOL_IN_DEINIT_STATE = 11769 +ER_LDAP_AUTH_FAILED_TO_DEINITIALIZE_POOL_IN_RECONSTRUCT_STATE = 11770 +ER_LDAP_AUTH_FAILED_TO_DEINITIALIZE_NOT_READY_POOL = 11771 +ER_LDAP_AUTH_FAILED_TO_GET_CONNECTION_AS_PLUGIN_NOT_READY = 11772 +ER_LDAP_AUTH_CONNECTION_POOL_INIT_FAILED = 11773 +ER_LDAP_AUTH_MAX_ALLOWED_CONNECTION_LIMIT_HIT = 11774 +ER_LDAP_AUTH_MAX_POOL_SIZE_SET_FAILED = 11775 +ER_LDAP_AUTH_PLUGIN_FAILED_TO_READ_PACKET = 11776 +ER_LDAP_AUTH_CREATING_LDAP_CONNECTION = 11777 +ER_LDAP_AUTH_GETTING_CONNECTION_FROM_POOL = 11778 +ER_LDAP_AUTH_RETURNING_CONNECTION_TO_POOL = 11779 +ER_LDAP_AUTH_SEARCH_USER_GROUP_ATTR_NOT_FOUND = 11780 +ER_LDAP_AUTH_LDAP_INFO_NULL = 11781 +ER_LDAP_AUTH_FREEING_CONNECTION = 11782 +ER_LDAP_AUTH_CONNECTION_PUSHED_TO_POOL = 11783 +ER_LDAP_AUTH_CONNECTION_CREATOR_ENTER = 11784 +ER_LDAP_AUTH_STARTING_TLS = 11785 +ER_LDAP_AUTH_CONNECTION_GET_LDAP_INFO_NULL = 11786 +ER_LDAP_AUTH_DELETING_CONNECTION_KEY = 11787 +ER_LDAP_AUTH_POOLED_CONNECTION_KEY = 11788 +ER_LDAP_AUTH_CREATE_CONNECTION_KEY = 11789 +ER_LDAP_AUTH_COMMUNICATION_HOST_INFO = 11790 +ER_LDAP_AUTH_METHOD_TO_CLIENT = 11791 +ER_LDAP_AUTH_SASL_REQUEST_FROM_CLIENT = 11792 +ER_LDAP_AUTH_SASL_PROCESS_SASL = 11793 +ER_LDAP_AUTH_SASL_BIND_SUCCESS_INFO = 11794 +ER_LDAP_AUTH_STARTED_FOR_USER = 11795 +ER_LDAP_AUTH_DISTINGUISHED_NAME = 11796 +ER_LDAP_AUTH_INIT_FAILED = 11797 +ER_LDAP_AUTH_OR_GROUP_RETRIEVAL_FAILED = 11798 +ER_LDAP_AUTH_USER_GROUP_SEARCH_FAILED = 11799 +ER_LDAP_AUTH_USER_BIND_FAILED = 11800 +ER_LDAP_AUTH_POOL_GET_FAILED_TO_CREATE_CONNECTION = 11801 +ER_LDAP_AUTH_FAILED_TO_CREATE_LDAP_CONNECTION = 11802 +ER_LDAP_AUTH_FAILED_TO_ESTABLISH_TLS_CONNECTION = 11803 +ER_LDAP_AUTH_FAILED_TO_SEARCH_DN = 11804 +ER_LDAP_AUTH_CONNECTION_POOL_REINIT_ENTER = 11805 +ER_SYSTEMD_NOTIFY_PATH_TOO_LONG = 11806 +ER_SYSTEMD_NOTIFY_CONNECT_FAILED = 11807 +ER_SYSTEMD_NOTIFY_WRITE_FAILED = 11808 +ER_FOUND_MISSING_GTIDS = 11809 +ER_PID_FILE_PRIV_DIRECTORY_INSECURE = 11810 +ER_CANT_CHECK_PID_PATH = 11811 +ER_VALIDATE_PWD_STATUS_VAR_REGISTRATION_FAILED = 11812 +ER_VALIDATE_PWD_STATUS_VAR_UNREGISTRATION_FAILED = 11813 +ER_VALIDATE_PWD_DICT_FILE_OPEN_FAILED = 11814 +ER_VALIDATE_PWD_COULD_BE_NULL = 11815 +ER_VALIDATE_PWD_STRING_CONV_TO_LOWERCASE_FAILED = 11816 +ER_VALIDATE_PWD_STRING_CONV_TO_BUFFER_FAILED = 11817 +ER_VALIDATE_PWD_STRING_HANDLER_MEM_ALLOCATION_FAILED = 11818 +ER_VALIDATE_PWD_STRONG_POLICY_DICT_FILE_UNSPECIFIED = 11819 +ER_VALIDATE_PWD_CONVERT_TO_BUFFER_FAILED = 11820 +ER_VALIDATE_PWD_VARIABLE_REGISTRATION_FAILED = 11821 +ER_VALIDATE_PWD_VARIABLE_UNREGISTRATION_FAILED = 11822 +ER_KEYRING_MIGRATION_EXTRA_OPTIONS = 11823 +OBSOLETE_ER_INVALID_DEFAULT_UTF8MB4_COLLATION = 11824 +ER_IB_MSG_0 = 11825 +ER_IB_MSG_1 = 11826 +ER_IB_MSG_2 = 11827 +ER_IB_MSG_3 = 11828 +ER_IB_MSG_4 = 11829 +ER_IB_MSG_5 = 11830 +ER_IB_MSG_6 = 11831 +ER_IB_MSG_7 = 11832 +ER_IB_MSG_8 = 11833 +ER_IB_MSG_9 = 11834 +ER_IB_MSG_10 = 11835 +ER_IB_MSG_11 = 11836 +ER_IB_MSG_12 = 11837 +ER_IB_MSG_13 = 11838 +ER_IB_MSG_14 = 11839 +ER_IB_MSG_15 = 11840 +ER_IB_MSG_16 = 11841 +ER_IB_MSG_17 = 11842 +ER_IB_MSG_18 = 11843 +ER_IB_MSG_19 = 11844 +ER_IB_MSG_20 = 11845 +ER_IB_MSG_21 = 11846 +ER_IB_MSG_22 = 11847 +ER_IB_MSG_23 = 11848 +ER_IB_MSG_24 = 11849 +ER_IB_MSG_25 = 11850 +ER_IB_MSG_26 = 11851 +ER_IB_MSG_27 = 11852 +ER_IB_MSG_28 = 11853 +ER_IB_MSG_29 = 11854 +ER_IB_MSG_30 = 11855 +ER_IB_MSG_31 = 11856 +ER_IB_MSG_32 = 11857 +ER_IB_MSG_33 = 11858 +ER_IB_MSG_34 = 11859 +ER_IB_MSG_35 = 11860 +ER_IB_MSG_36 = 11861 +ER_IB_MSG_37 = 11862 +ER_IB_MSG_38 = 11863 +ER_IB_MSG_39 = 11864 +ER_IB_MSG_40 = 11865 +ER_IB_MSG_41 = 11866 +ER_IB_MSG_42 = 11867 +ER_IB_MSG_43 = 11868 +ER_IB_MSG_44 = 11869 +ER_IB_MSG_45 = 11870 +ER_IB_MSG_46 = 11871 +ER_IB_MSG_47 = 11872 +ER_IB_MSG_48 = 11873 +ER_IB_MSG_49 = 11874 +ER_IB_MSG_50 = 11875 +ER_IB_MSG_51 = 11876 +ER_IB_MSG_52 = 11877 +ER_IB_MSG_53 = 11878 +ER_IB_MSG_54 = 11879 +ER_IB_MSG_55 = 11880 +ER_IB_MSG_56 = 11881 +ER_IB_MSG_57 = 11882 +ER_IB_MSG_58 = 11883 +ER_IB_MSG_59 = 11884 +ER_IB_MSG_60 = 11885 +ER_IB_MSG_61 = 11886 +ER_IB_MSG_62 = 11887 +ER_IB_MSG_63 = 11888 +ER_IB_MSG_64 = 11889 +ER_IB_MSG_65 = 11890 +ER_IB_MSG_66 = 11891 +ER_IB_MSG_67 = 11892 +ER_IB_MSG_68 = 11893 +ER_IB_MSG_69 = 11894 +ER_IB_MSG_70 = 11895 +ER_IB_MSG_71 = 11896 +ER_IB_MSG_72 = 11897 +ER_IB_MSG_73 = 11898 +ER_IB_MSG_74 = 11899 +ER_IB_MSG_75 = 11900 +ER_IB_MSG_76 = 11901 +ER_IB_MSG_77 = 11902 +ER_IB_MSG_78 = 11903 +ER_IB_MSG_79 = 11904 +ER_IB_MSG_80 = 11905 +ER_IB_MSG_81 = 11906 +ER_IB_MSG_82 = 11907 +ER_IB_MSG_83 = 11908 +ER_IB_MSG_84 = 11909 +ER_IB_MSG_85 = 11910 +ER_IB_MSG_86 = 11911 +ER_IB_MSG_87 = 11912 +ER_IB_MSG_88 = 11913 +ER_IB_MSG_89 = 11914 +ER_IB_MSG_90 = 11915 +ER_IB_MSG_91 = 11916 +ER_IB_MSG_92 = 11917 +ER_IB_MSG_93 = 11918 +ER_IB_MSG_94 = 11919 +ER_IB_MSG_95 = 11920 +ER_IB_MSG_96 = 11921 +ER_IB_MSG_97 = 11922 +ER_IB_MSG_98 = 11923 +ER_IB_MSG_99 = 11924 +ER_IB_MSG_100 = 11925 +ER_IB_MSG_101 = 11926 +ER_IB_MSG_102 = 11927 +ER_IB_MSG_103 = 11928 +ER_IB_MSG_104 = 11929 +ER_IB_MSG_105 = 11930 +ER_IB_MSG_106 = 11931 +ER_IB_MSG_107 = 11932 +ER_IB_MSG_108 = 11933 +ER_IB_MSG_109 = 11934 +ER_IB_MSG_110 = 11935 +ER_IB_MSG_111 = 11936 +ER_IB_MSG_112 = 11937 +ER_IB_MSG_113 = 11938 +ER_IB_MSG_114 = 11939 +ER_IB_MSG_115 = 11940 +ER_IB_MSG_116 = 11941 +ER_IB_MSG_117 = 11942 +ER_IB_MSG_118 = 11943 +ER_IB_MSG_119 = 11944 +ER_IB_MSG_120 = 11945 +ER_IB_MSG_121 = 11946 +ER_IB_MSG_122 = 11947 +ER_IB_MSG_123 = 11948 +ER_IB_MSG_124 = 11949 +ER_IB_MSG_125 = 11950 +ER_IB_MSG_126 = 11951 +ER_IB_MSG_127 = 11952 +ER_IB_MSG_128 = 11953 +ER_IB_MSG_129 = 11954 +ER_IB_MSG_130 = 11955 +ER_IB_MSG_131 = 11956 +ER_IB_MSG_132 = 11957 +ER_IB_MSG_133 = 11958 +ER_IB_MSG_134 = 11959 +ER_IB_MSG_135 = 11960 +ER_IB_MSG_136 = 11961 +ER_IB_MSG_137 = 11962 +ER_IB_MSG_138 = 11963 +ER_IB_MSG_139 = 11964 +ER_IB_MSG_140 = 11965 +ER_IB_MSG_141 = 11966 +ER_IB_MSG_142 = 11967 +ER_IB_MSG_143 = 11968 +ER_IB_MSG_144 = 11969 +ER_IB_MSG_145 = 11970 +ER_IB_MSG_146 = 11971 +ER_IB_MSG_147 = 11972 +ER_IB_MSG_148 = 11973 +ER_IB_MSG_149 = 11974 +ER_IB_MSG_150 = 11975 +ER_IB_MSG_151 = 11976 +ER_IB_MSG_152 = 11977 +ER_IB_MSG_153 = 11978 +ER_IB_MSG_154 = 11979 +ER_IB_MSG_155 = 11980 +ER_IB_MSG_156 = 11981 +ER_IB_MSG_157 = 11982 +ER_IB_MSG_158 = 11983 +ER_IB_MSG_159 = 11984 +ER_IB_MSG_160 = 11985 +ER_IB_MSG_161 = 11986 +ER_IB_MSG_162 = 11987 +ER_IB_MSG_163 = 11988 +ER_IB_MSG_164 = 11989 +ER_IB_MSG_165 = 11990 +ER_IB_MSG_166 = 11991 +ER_IB_MSG_167 = 11992 +ER_IB_MSG_168 = 11993 +ER_IB_MSG_169 = 11994 +ER_IB_MSG_170 = 11995 +ER_IB_MSG_171 = 11996 +ER_IB_MSG_172 = 11997 +ER_IB_MSG_173 = 11998 +ER_IB_MSG_174 = 11999 +ER_IB_MSG_175 = 12000 +ER_IB_MSG_176 = 12001 +ER_IB_MSG_177 = 12002 +ER_IB_MSG_178 = 12003 +ER_IB_MSG_179 = 12004 +ER_IB_MSG_180 = 12005 +ER_IB_MSG_181 = 12006 +ER_IB_MSG_182 = 12007 +ER_IB_MSG_183 = 12008 +ER_IB_MSG_184 = 12009 +ER_IB_MSG_185 = 12010 +ER_IB_MSG_186 = 12011 +ER_IB_MSG_187 = 12012 +ER_IB_MSG_188 = 12013 +ER_IB_MSG_189 = 12014 +ER_IB_MSG_190 = 12015 +ER_IB_MSG_191 = 12016 +ER_IB_MSG_192 = 12017 +ER_IB_MSG_193 = 12018 +ER_IB_MSG_194 = 12019 +ER_IB_MSG_195 = 12020 +ER_IB_MSG_196 = 12021 +ER_IB_MSG_197 = 12022 +ER_IB_MSG_198 = 12023 +ER_IB_MSG_199 = 12024 +ER_IB_MSG_200 = 12025 +ER_IB_MSG_201 = 12026 +ER_IB_MSG_202 = 12027 +ER_IB_MSG_203 = 12028 +ER_IB_MSG_204 = 12029 +ER_IB_MSG_205 = 12030 +ER_IB_MSG_206 = 12031 +ER_IB_MSG_207 = 12032 +ER_IB_MSG_208 = 12033 +ER_IB_MSG_209 = 12034 +ER_IB_MSG_210 = 12035 +ER_IB_MSG_211 = 12036 +ER_IB_MSG_212 = 12037 +ER_IB_MSG_213 = 12038 +ER_IB_MSG_214 = 12039 +ER_IB_MSG_215 = 12040 +ER_IB_MSG_216 = 12041 +ER_IB_MSG_217 = 12042 +ER_IB_MSG_218 = 12043 +ER_IB_MSG_219 = 12044 +ER_IB_MSG_220 = 12045 +ER_IB_MSG_221 = 12046 +ER_IB_MSG_222 = 12047 +ER_IB_MSG_223 = 12048 +ER_IB_MSG_224 = 12049 +ER_IB_MSG_225 = 12050 +ER_IB_MSG_226 = 12051 +ER_IB_MSG_227 = 12052 +ER_IB_MSG_228 = 12053 +ER_IB_MSG_229 = 12054 +ER_IB_MSG_230 = 12055 +ER_IB_MSG_231 = 12056 +ER_IB_MSG_232 = 12057 +ER_IB_MSG_233 = 12058 +ER_IB_MSG_234 = 12059 +ER_IB_MSG_235 = 12060 +ER_IB_MSG_236 = 12061 +ER_IB_MSG_237 = 12062 +ER_IB_MSG_238 = 12063 +ER_IB_MSG_239 = 12064 +ER_IB_MSG_240 = 12065 +ER_IB_MSG_241 = 12066 +ER_IB_MSG_242 = 12067 +ER_IB_MSG_243 = 12068 +ER_IB_MSG_244 = 12069 +ER_IB_MSG_245 = 12070 +ER_IB_MSG_246 = 12071 +ER_IB_MSG_247 = 12072 +ER_IB_MSG_248 = 12073 +ER_IB_MSG_249 = 12074 +ER_IB_MSG_250 = 12075 +ER_IB_MSG_251 = 12076 +ER_IB_MSG_252 = 12077 +ER_IB_MSG_253 = 12078 +ER_IB_MSG_254 = 12079 +ER_IB_MSG_255 = 12080 +ER_IB_MSG_256 = 12081 +ER_IB_MSG_257 = 12082 +ER_IB_MSG_258 = 12083 +ER_IB_MSG_259 = 12084 +ER_IB_MSG_260 = 12085 +ER_IB_MSG_261 = 12086 +ER_IB_MSG_262 = 12087 +ER_IB_MSG_263 = 12088 +ER_IB_MSG_264 = 12089 +ER_IB_MSG_265 = 12090 +ER_IB_MSG_266 = 12091 +ER_IB_MSG_267 = 12092 +ER_IB_MSG_268 = 12093 +ER_IB_MSG_269 = 12094 +ER_IB_MSG_270 = 12095 +ER_IB_MSG_271 = 12096 +ER_IB_MSG_272 = 12097 +ER_IB_MSG_273 = 12098 +ER_IB_MSG_274 = 12099 +ER_IB_MSG_275 = 12100 +ER_IB_MSG_276 = 12101 +ER_IB_MSG_277 = 12102 +ER_IB_MSG_278 = 12103 +ER_IB_MSG_279 = 12104 +ER_IB_MSG_280 = 12105 +ER_IB_MSG_281 = 12106 +ER_IB_MSG_282 = 12107 +ER_IB_MSG_283 = 12108 +ER_IB_MSG_284 = 12109 +ER_IB_MSG_285 = 12110 +ER_IB_MSG_286 = 12111 +ER_IB_MSG_287 = 12112 +ER_IB_MSG_288 = 12113 +ER_IB_MSG_289 = 12114 +ER_IB_MSG_290 = 12115 +ER_IB_MSG_291 = 12116 +ER_IB_MSG_292 = 12117 +ER_IB_MSG_293 = 12118 +ER_IB_MSG_294 = 12119 +ER_IB_MSG_295 = 12120 +ER_IB_MSG_296 = 12121 +ER_IB_MSG_297 = 12122 +ER_IB_MSG_298 = 12123 +ER_IB_MSG_299 = 12124 +ER_IB_MSG_300 = 12125 +ER_IB_MSG_301 = 12126 +ER_IB_MSG_302 = 12127 +ER_IB_MSG_303 = 12128 +ER_IB_MSG_304 = 12129 +ER_IB_MSG_305 = 12130 +ER_IB_MSG_306 = 12131 +ER_IB_MSG_307 = 12132 +ER_IB_MSG_308 = 12133 +ER_IB_MSG_309 = 12134 +ER_IB_MSG_310 = 12135 +ER_IB_MSG_311 = 12136 +ER_IB_MSG_312 = 12137 +ER_IB_MSG_313 = 12138 +ER_IB_MSG_314 = 12139 +ER_IB_MSG_315 = 12140 +ER_IB_MSG_316 = 12141 +ER_IB_MSG_317 = 12142 +ER_IB_MSG_318 = 12143 +ER_IB_MSG_319 = 12144 +ER_IB_MSG_320 = 12145 +ER_IB_MSG_321 = 12146 +ER_IB_MSG_322 = 12147 +ER_IB_MSG_323 = 12148 +ER_IB_MSG_324 = 12149 +ER_IB_MSG_325 = 12150 +ER_IB_MSG_326 = 12151 +ER_IB_MSG_327 = 12152 +ER_IB_MSG_328 = 12153 +ER_IB_MSG_329 = 12154 +ER_IB_MSG_330 = 12155 +ER_IB_MSG_331 = 12156 +ER_IB_MSG_332 = 12157 +ER_IB_MSG_333 = 12158 +ER_IB_MSG_334 = 12159 +ER_IB_MSG_335 = 12160 +ER_IB_MSG_336 = 12161 +ER_IB_MSG_337 = 12162 +ER_IB_MSG_338 = 12163 +ER_IB_MSG_339 = 12164 +ER_IB_MSG_340 = 12165 +ER_IB_MSG_341 = 12166 +ER_IB_MSG_342 = 12167 +ER_IB_MSG_343 = 12168 +ER_IB_MSG_344 = 12169 +ER_IB_MSG_345 = 12170 +ER_IB_MSG_346 = 12171 +ER_IB_MSG_347 = 12172 +ER_IB_MSG_348 = 12173 +ER_IB_MSG_349 = 12174 +ER_IB_MSG_350 = 12175 +ER_IB_MSG_351 = 12176 +ER_IB_MSG_352 = 12177 +ER_IB_MSG_353 = 12178 +ER_IB_MSG_354 = 12179 +ER_IB_MSG_355 = 12180 +ER_IB_MSG_356 = 12181 +ER_IB_MSG_357 = 12182 +ER_IB_MSG_358 = 12183 +ER_IB_MSG_359 = 12184 +ER_IB_MSG_360 = 12185 +ER_IB_MSG_361 = 12186 +ER_IB_MSG_362 = 12187 +ER_IB_MSG_363 = 12188 +ER_IB_MSG_364 = 12189 +ER_IB_MSG_365 = 12190 +ER_IB_MSG_366 = 12191 +ER_IB_MSG_367 = 12192 +ER_IB_MSG_368 = 12193 +ER_IB_MSG_369 = 12194 +ER_IB_MSG_370 = 12195 +ER_IB_MSG_371 = 12196 +ER_IB_MSG_372 = 12197 +ER_IB_MSG_373 = 12198 +ER_IB_MSG_374 = 12199 +ER_IB_MSG_375 = 12200 +ER_IB_MSG_376 = 12201 +ER_IB_MSG_377 = 12202 +ER_IB_MSG_378 = 12203 +ER_IB_MSG_379 = 12204 +ER_IB_MSG_380 = 12205 +ER_IB_MSG_381 = 12206 +ER_IB_MSG_382 = 12207 +ER_IB_MSG_383 = 12208 +ER_IB_MSG_384 = 12209 +ER_IB_MSG_385 = 12210 +ER_IB_MSG_386 = 12211 +ER_IB_MSG_387 = 12212 +ER_IB_MSG_388 = 12213 +ER_IB_MSG_389 = 12214 +ER_IB_MSG_390 = 12215 +ER_IB_MSG_391 = 12216 +ER_IB_MSG_392 = 12217 +ER_IB_MSG_393 = 12218 +ER_IB_MSG_394 = 12219 +ER_IB_MSG_395 = 12220 +ER_IB_MSG_396 = 12221 +ER_IB_MSG_397 = 12222 +ER_IB_MSG_398 = 12223 +ER_IB_MSG_399 = 12224 +ER_IB_MSG_400 = 12225 +ER_IB_MSG_401 = 12226 +ER_IB_MSG_402 = 12227 +ER_IB_MSG_403 = 12228 +ER_IB_MSG_404 = 12229 +ER_IB_MSG_405 = 12230 +ER_IB_MSG_406 = 12231 +ER_IB_MSG_407 = 12232 +ER_IB_MSG_408 = 12233 +ER_IB_MSG_409 = 12234 +ER_IB_MSG_410 = 12235 +ER_IB_MSG_411 = 12236 +ER_IB_MSG_412 = 12237 +ER_IB_MSG_413 = 12238 +ER_IB_MSG_414 = 12239 +ER_IB_MSG_415 = 12240 +ER_IB_MSG_416 = 12241 +ER_IB_MSG_417 = 12242 +ER_IB_MSG_418 = 12243 +ER_IB_MSG_419 = 12244 +ER_IB_MSG_420 = 12245 +ER_IB_MSG_421 = 12246 +ER_IB_MSG_422 = 12247 +ER_IB_MSG_423 = 12248 +ER_IB_MSG_424 = 12249 +ER_IB_MSG_425 = 12250 +ER_IB_MSG_426 = 12251 +ER_IB_MSG_427 = 12252 +ER_IB_MSG_428 = 12253 +ER_IB_MSG_429 = 12254 +ER_IB_MSG_430 = 12255 +ER_IB_MSG_431 = 12256 +ER_IB_MSG_432 = 12257 +ER_IB_MSG_433 = 12258 +ER_IB_MSG_434 = 12259 +ER_IB_MSG_435 = 12260 +ER_IB_MSG_436 = 12261 +ER_IB_MSG_437 = 12262 +ER_IB_MSG_438 = 12263 +ER_IB_MSG_439 = 12264 +ER_IB_MSG_440 = 12265 +ER_IB_MSG_441 = 12266 +ER_IB_MSG_442 = 12267 +ER_IB_MSG_443 = 12268 +ER_IB_MSG_444 = 12269 +ER_IB_MSG_445 = 12270 +ER_IB_MSG_446 = 12271 +ER_IB_MSG_447 = 12272 +ER_IB_MSG_448 = 12273 +ER_IB_MSG_449 = 12274 +ER_IB_MSG_450 = 12275 +ER_IB_MSG_451 = 12276 +ER_IB_MSG_452 = 12277 +ER_IB_MSG_453 = 12278 +ER_IB_MSG_454 = 12279 +ER_IB_MSG_455 = 12280 +ER_IB_MSG_456 = 12281 +ER_IB_MSG_457 = 12282 +ER_IB_MSG_458 = 12283 +ER_IB_MSG_459 = 12284 +ER_IB_MSG_460 = 12285 +ER_IB_MSG_461 = 12286 +ER_IB_MSG_462 = 12287 +ER_IB_MSG_463 = 12288 +ER_IB_MSG_464 = 12289 +ER_IB_MSG_465 = 12290 +ER_IB_MSG_466 = 12291 +ER_IB_MSG_467 = 12292 +ER_IB_MSG_468 = 12293 +ER_IB_MSG_469 = 12294 +ER_IB_MSG_470 = 12295 +ER_IB_MSG_471 = 12296 +ER_IB_MSG_472 = 12297 +ER_IB_MSG_473 = 12298 +ER_IB_MSG_474 = 12299 +ER_IB_MSG_475 = 12300 +ER_IB_MSG_476 = 12301 +ER_IB_MSG_477 = 12302 +ER_IB_MSG_478 = 12303 +ER_IB_MSG_479 = 12304 +ER_IB_MSG_480 = 12305 +ER_IB_MSG_481 = 12306 +ER_IB_MSG_482 = 12307 +ER_IB_MSG_483 = 12308 +ER_IB_MSG_484 = 12309 +ER_IB_MSG_485 = 12310 +ER_IB_MSG_486 = 12311 +ER_IB_MSG_487 = 12312 +ER_IB_MSG_488 = 12313 +ER_IB_MSG_489 = 12314 +ER_IB_MSG_490 = 12315 +ER_IB_MSG_491 = 12316 +ER_IB_MSG_492 = 12317 +ER_IB_MSG_493 = 12318 +ER_IB_MSG_494 = 12319 +ER_IB_MSG_495 = 12320 +ER_IB_MSG_496 = 12321 +ER_IB_MSG_497 = 12322 +ER_IB_MSG_498 = 12323 +ER_IB_MSG_499 = 12324 +ER_IB_MSG_500 = 12325 +ER_IB_MSG_501 = 12326 +ER_IB_MSG_502 = 12327 +ER_IB_MSG_503 = 12328 +ER_IB_MSG_504 = 12329 +ER_IB_MSG_505 = 12330 +ER_IB_MSG_506 = 12331 +ER_IB_MSG_507 = 12332 +ER_IB_MSG_508 = 12333 +ER_IB_MSG_509 = 12334 +ER_IB_MSG_510 = 12335 +ER_IB_MSG_511 = 12336 +ER_IB_MSG_512 = 12337 +ER_IB_MSG_513 = 12338 +ER_IB_MSG_514 = 12339 +ER_IB_MSG_515 = 12340 +ER_IB_MSG_516 = 12341 +ER_IB_MSG_517 = 12342 +ER_IB_MSG_518 = 12343 +ER_IB_MSG_519 = 12344 +ER_IB_MSG_520 = 12345 +ER_IB_MSG_521 = 12346 +ER_IB_MSG_522 = 12347 +ER_IB_MSG_523 = 12348 +ER_IB_MSG_524 = 12349 +ER_IB_MSG_525 = 12350 +ER_IB_MSG_526 = 12351 +ER_IB_MSG_527 = 12352 +ER_IB_MSG_528 = 12353 +ER_IB_MSG_529 = 12354 +ER_IB_MSG_530 = 12355 +ER_IB_MSG_531 = 12356 +ER_IB_MSG_532 = 12357 +ER_IB_MSG_533 = 12358 +ER_IB_MSG_534 = 12359 +ER_IB_MSG_535 = 12360 +ER_IB_MSG_536 = 12361 +ER_IB_MSG_537 = 12362 +ER_IB_MSG_538 = 12363 +ER_IB_MSG_539 = 12364 +ER_IB_MSG_540 = 12365 +ER_IB_MSG_541 = 12366 +ER_IB_MSG_542 = 12367 +ER_IB_MSG_543 = 12368 +ER_IB_MSG_544 = 12369 +ER_IB_MSG_545 = 12370 +ER_IB_MSG_546 = 12371 +ER_IB_MSG_547 = 12372 +ER_IB_MSG_548 = 12373 +ER_IB_MSG_549 = 12374 +ER_IB_MSG_550 = 12375 +ER_IB_MSG_551 = 12376 +ER_IB_MSG_552 = 12377 +ER_IB_MSG_553 = 12378 +ER_IB_MSG_554 = 12379 +ER_IB_MSG_555 = 12380 +ER_IB_MSG_556 = 12381 +ER_IB_MSG_557 = 12382 +ER_IB_MSG_558 = 12383 +ER_IB_MSG_559 = 12384 +ER_IB_MSG_560 = 12385 +ER_IB_MSG_561 = 12386 +ER_IB_MSG_562 = 12387 +ER_IB_MSG_563 = 12388 +ER_IB_MSG_564 = 12389 +ER_IB_MSG_565 = 12390 +ER_IB_MSG_566 = 12391 +ER_IB_MSG_567 = 12392 +ER_IB_MSG_568 = 12393 +ER_IB_MSG_569 = 12394 +ER_IB_MSG_570 = 12395 +ER_IB_MSG_571 = 12396 +ER_IB_MSG_572 = 12397 +ER_IB_MSG_573 = 12398 +ER_IB_MSG_574 = 12399 +ER_IB_MSG_575 = 12400 +ER_IB_MSG_576 = 12401 +ER_IB_MSG_577 = 12402 +ER_IB_MSG_578 = 12403 +ER_IB_MSG_579 = 12404 +ER_IB_MSG_580 = 12405 +ER_IB_MSG_581 = 12406 +ER_IB_MSG_582 = 12407 +ER_IB_MSG_583 = 12408 +ER_IB_MSG_584 = 12409 +ER_IB_MSG_585 = 12410 +ER_IB_MSG_586 = 12411 +ER_IB_MSG_587 = 12412 +ER_IB_MSG_588 = 12413 +ER_IB_MSG_589 = 12414 +ER_IB_MSG_590 = 12415 +ER_IB_MSG_591 = 12416 +ER_IB_MSG_592 = 12417 +ER_IB_MSG_593 = 12418 +ER_IB_MSG_594 = 12419 +ER_IB_MSG_595 = 12420 +ER_IB_MSG_596 = 12421 +ER_IB_MSG_597 = 12422 +ER_IB_MSG_598 = 12423 +ER_IB_MSG_599 = 12424 +ER_IB_MSG_600 = 12425 +ER_IB_MSG_601 = 12426 +ER_IB_MSG_602 = 12427 +ER_IB_MSG_603 = 12428 +ER_IB_MSG_604 = 12429 +ER_IB_MSG_605 = 12430 +ER_IB_MSG_606 = 12431 +ER_IB_MSG_607 = 12432 +ER_IB_MSG_608 = 12433 +ER_IB_MSG_609 = 12434 +ER_IB_MSG_610 = 12435 +ER_IB_MSG_611 = 12436 +ER_IB_MSG_612 = 12437 +ER_IB_MSG_613 = 12438 +ER_IB_MSG_614 = 12439 +ER_IB_MSG_615 = 12440 +ER_IB_MSG_616 = 12441 +ER_IB_MSG_617 = 12442 +ER_IB_MSG_618 = 12443 +ER_IB_MSG_619 = 12444 +ER_IB_MSG_620 = 12445 +ER_IB_MSG_621 = 12446 +ER_IB_MSG_622 = 12447 +ER_IB_MSG_623 = 12448 +ER_IB_MSG_624 = 12449 +ER_IB_MSG_625 = 12450 +ER_IB_MSG_626 = 12451 +ER_IB_MSG_627 = 12452 +ER_IB_MSG_628 = 12453 +ER_IB_MSG_629 = 12454 +ER_IB_MSG_630 = 12455 +ER_IB_MSG_631 = 12456 +ER_IB_MSG_632 = 12457 +ER_IB_MSG_633 = 12458 +ER_IB_MSG_634 = 12459 +ER_IB_MSG_635 = 12460 +ER_IB_MSG_636 = 12461 +ER_IB_MSG_637 = 12462 +ER_IB_MSG_638 = 12463 +ER_IB_MSG_639 = 12464 +ER_IB_MSG_640 = 12465 +ER_IB_MSG_641 = 12466 +ER_IB_MSG_642 = 12467 +ER_IB_MSG_643 = 12468 +ER_IB_MSG_644 = 12469 +ER_IB_MSG_645 = 12470 +ER_IB_MSG_646 = 12471 +ER_IB_MSG_647 = 12472 +ER_IB_MSG_648 = 12473 +ER_IB_MSG_649 = 12474 +ER_IB_MSG_650 = 12475 +ER_IB_MSG_651 = 12476 +ER_IB_MSG_652 = 12477 +ER_IB_MSG_653 = 12478 +ER_IB_MSG_654 = 12479 +ER_IB_MSG_655 = 12480 +ER_IB_MSG_656 = 12481 +ER_IB_MSG_657 = 12482 +ER_IB_MSG_658 = 12483 +ER_IB_MSG_659 = 12484 +ER_IB_MSG_660 = 12485 +ER_IB_MSG_661 = 12486 +ER_IB_MSG_662 = 12487 +ER_IB_MSG_663 = 12488 +ER_IB_MSG_664 = 12489 +ER_IB_MSG_665 = 12490 +ER_IB_MSG_666 = 12491 +ER_IB_MSG_667 = 12492 +ER_IB_MSG_668 = 12493 +ER_IB_MSG_669 = 12494 +ER_IB_MSG_670 = 12495 +ER_IB_MSG_671 = 12496 +ER_IB_MSG_672 = 12497 +ER_IB_MSG_673 = 12498 +ER_IB_MSG_674 = 12499 +ER_IB_MSG_675 = 12500 +ER_IB_MSG_676 = 12501 +ER_IB_MSG_677 = 12502 +ER_IB_MSG_678 = 12503 +ER_IB_MSG_679 = 12504 +ER_IB_MSG_680 = 12505 +ER_IB_MSG_681 = 12506 +ER_IB_MSG_682 = 12507 +ER_IB_MSG_683 = 12508 +ER_IB_MSG_684 = 12509 +ER_IB_MSG_685 = 12510 +ER_IB_MSG_686 = 12511 +ER_IB_MSG_687 = 12512 +ER_IB_MSG_688 = 12513 +ER_IB_MSG_689 = 12514 +ER_IB_MSG_690 = 12515 +ER_IB_MSG_691 = 12516 +ER_IB_MSG_692 = 12517 +ER_IB_MSG_693 = 12518 +ER_IB_MSG_694 = 12519 +ER_IB_MSG_695 = 12520 +ER_IB_MSG_696 = 12521 +ER_IB_MSG_697 = 12522 +ER_IB_MSG_698 = 12523 +ER_IB_MSG_699 = 12524 +ER_IB_MSG_700 = 12525 +ER_IB_MSG_701 = 12526 +ER_IB_MSG_702 = 12527 +ER_IB_MSG_703 = 12528 +ER_IB_MSG_704 = 12529 +ER_IB_MSG_705 = 12530 +ER_IB_MSG_706 = 12531 +ER_IB_MSG_707 = 12532 +ER_IB_MSG_708 = 12533 +ER_IB_MSG_709 = 12534 +ER_IB_MSG_710 = 12535 +ER_IB_MSG_711 = 12536 +ER_IB_MSG_712 = 12537 +ER_IB_MSG_713 = 12538 +ER_IB_MSG_714 = 12539 +ER_IB_MSG_715 = 12540 +ER_IB_MSG_716 = 12541 +ER_IB_MSG_717 = 12542 +ER_IB_MSG_718 = 12543 +ER_IB_MSG_719 = 12544 +ER_IB_MSG_720 = 12545 +ER_IB_MSG_721 = 12546 +ER_IB_MSG_722 = 12547 +ER_IB_MSG_723 = 12548 +ER_IB_MSG_724 = 12549 +ER_IB_MSG_725 = 12550 +ER_IB_MSG_726 = 12551 +ER_IB_MSG_727 = 12552 +ER_IB_MSG_728 = 12553 +ER_IB_MSG_729 = 12554 +ER_IB_MSG_730 = 12555 +ER_IB_MSG_731 = 12556 +ER_IB_MSG_732 = 12557 +ER_IB_MSG_733 = 12558 +ER_IB_MSG_734 = 12559 +ER_IB_MSG_735 = 12560 +ER_IB_MSG_736 = 12561 +ER_IB_MSG_737 = 12562 +ER_IB_MSG_738 = 12563 +ER_IB_MSG_739 = 12564 +ER_IB_MSG_740 = 12565 +ER_IB_MSG_741 = 12566 +ER_IB_MSG_742 = 12567 +ER_IB_MSG_743 = 12568 +ER_IB_MSG_744 = 12569 +ER_IB_MSG_745 = 12570 +ER_IB_MSG_746 = 12571 +ER_IB_MSG_747 = 12572 +ER_IB_MSG_748 = 12573 +ER_IB_MSG_749 = 12574 +ER_IB_MSG_750 = 12575 +ER_IB_MSG_751 = 12576 +ER_IB_MSG_752 = 12577 +ER_IB_MSG_753 = 12578 +ER_IB_MSG_754 = 12579 +ER_IB_MSG_755 = 12580 +ER_IB_MSG_756 = 12581 +ER_IB_MSG_757 = 12582 +ER_IB_MSG_758 = 12583 +ER_IB_MSG_759 = 12584 +ER_IB_MSG_760 = 12585 +ER_IB_MSG_761 = 12586 +ER_IB_MSG_762 = 12587 +ER_IB_MSG_763 = 12588 +ER_IB_MSG_764 = 12589 +ER_IB_MSG_765 = 12590 +ER_IB_MSG_766 = 12591 +ER_IB_MSG_767 = 12592 +ER_IB_MSG_768 = 12593 +ER_IB_MSG_769 = 12594 +ER_IB_MSG_770 = 12595 +ER_IB_MSG_771 = 12596 +ER_IB_MSG_772 = 12597 +ER_IB_MSG_773 = 12598 +ER_IB_MSG_774 = 12599 +ER_IB_MSG_775 = 12600 +ER_IB_MSG_776 = 12601 +ER_IB_MSG_777 = 12602 +ER_IB_MSG_778 = 12603 +ER_IB_MSG_779 = 12604 +ER_IB_MSG_780 = 12605 +ER_IB_MSG_781 = 12606 +ER_IB_MSG_782 = 12607 +ER_IB_MSG_783 = 12608 +ER_IB_MSG_784 = 12609 +ER_IB_MSG_785 = 12610 +ER_IB_MSG_786 = 12611 +ER_IB_MSG_787 = 12612 +ER_IB_MSG_788 = 12613 +ER_IB_MSG_789 = 12614 +ER_IB_MSG_790 = 12615 +ER_IB_MSG_791 = 12616 +ER_IB_MSG_792 = 12617 +ER_IB_MSG_793 = 12618 +ER_IB_MSG_794 = 12619 +ER_IB_MSG_795 = 12620 +ER_IB_MSG_796 = 12621 +ER_IB_MSG_797 = 12622 +ER_IB_MSG_798 = 12623 +ER_IB_MSG_799 = 12624 +ER_IB_MSG_800 = 12625 +ER_IB_MSG_801 = 12626 +ER_IB_MSG_802 = 12627 +ER_IB_MSG_803 = 12628 +ER_IB_MSG_804 = 12629 +ER_IB_MSG_805 = 12630 +ER_IB_MSG_806 = 12631 +ER_IB_MSG_807 = 12632 +ER_IB_MSG_808 = 12633 +ER_IB_MSG_809 = 12634 +ER_IB_MSG_810 = 12635 +ER_IB_MSG_811 = 12636 +ER_IB_MSG_812 = 12637 +ER_IB_MSG_813 = 12638 +ER_IB_MSG_814 = 12639 +ER_IB_MSG_815 = 12640 +ER_IB_MSG_816 = 12641 +ER_IB_MSG_817 = 12642 +ER_IB_MSG_818 = 12643 +ER_IB_MSG_819 = 12644 +ER_IB_MSG_820 = 12645 +ER_IB_MSG_821 = 12646 +ER_IB_MSG_822 = 12647 +ER_IB_MSG_823 = 12648 +ER_IB_MSG_824 = 12649 +ER_IB_MSG_825 = 12650 +ER_IB_MSG_826 = 12651 +ER_IB_MSG_827 = 12652 +ER_IB_MSG_828 = 12653 +ER_IB_MSG_829 = 12654 +ER_IB_MSG_830 = 12655 +ER_IB_MSG_831 = 12656 +ER_IB_MSG_832 = 12657 +ER_IB_MSG_833 = 12658 +ER_IB_MSG_834 = 12659 +ER_IB_MSG_835 = 12660 +ER_IB_MSG_836 = 12661 +ER_IB_MSG_837 = 12662 +ER_IB_MSG_838 = 12663 +ER_IB_MSG_839 = 12664 +ER_IB_MSG_840 = 12665 +ER_IB_MSG_841 = 12666 +ER_IB_MSG_842 = 12667 +ER_IB_MSG_843 = 12668 +ER_IB_MSG_844 = 12669 +ER_IB_MSG_845 = 12670 +ER_IB_MSG_846 = 12671 +ER_IB_MSG_847 = 12672 +ER_IB_MSG_848 = 12673 +ER_IB_MSG_849 = 12674 +ER_IB_MSG_850 = 12675 +ER_IB_MSG_851 = 12676 +ER_IB_MSG_852 = 12677 +ER_IB_MSG_853 = 12678 +ER_IB_MSG_854 = 12679 +ER_IB_MSG_855 = 12680 +ER_IB_MSG_856 = 12681 +ER_IB_MSG_857 = 12682 +ER_IB_MSG_858 = 12683 +ER_IB_MSG_859 = 12684 +ER_IB_MSG_860 = 12685 +ER_IB_MSG_861 = 12686 +ER_IB_MSG_862 = 12687 +ER_IB_MSG_863 = 12688 +ER_IB_MSG_864 = 12689 +ER_IB_MSG_865 = 12690 +ER_IB_MSG_866 = 12691 +ER_IB_MSG_867 = 12692 +ER_IB_MSG_868 = 12693 +ER_IB_MSG_869 = 12694 +ER_IB_MSG_870 = 12695 +ER_IB_MSG_871 = 12696 +ER_IB_MSG_872 = 12697 +ER_IB_MSG_873 = 12698 +ER_IB_MSG_874 = 12699 +ER_IB_MSG_875 = 12700 +ER_IB_MSG_876 = 12701 +ER_IB_MSG_877 = 12702 +ER_IB_MSG_878 = 12703 +ER_IB_MSG_879 = 12704 +ER_IB_MSG_880 = 12705 +ER_IB_MSG_881 = 12706 +ER_IB_MSG_882 = 12707 +ER_IB_MSG_883 = 12708 +ER_IB_MSG_884 = 12709 +ER_IB_MSG_885 = 12710 +ER_IB_MSG_886 = 12711 +ER_IB_MSG_887 = 12712 +ER_IB_MSG_888 = 12713 +ER_IB_MSG_889 = 12714 +ER_IB_MSG_890 = 12715 +ER_IB_MSG_891 = 12716 +ER_IB_MSG_892 = 12717 +ER_IB_MSG_893 = 12718 +ER_IB_MSG_894 = 12719 +ER_IB_MSG_895 = 12720 +ER_IB_MSG_896 = 12721 +ER_IB_MSG_897 = 12722 +ER_IB_MSG_898 = 12723 +ER_IB_MSG_899 = 12724 +ER_IB_MSG_900 = 12725 +ER_IB_MSG_901 = 12726 +ER_IB_MSG_902 = 12727 +ER_IB_MSG_903 = 12728 +ER_IB_MSG_904 = 12729 +ER_IB_MSG_905 = 12730 +ER_IB_MSG_906 = 12731 +ER_IB_MSG_907 = 12732 +ER_IB_MSG_908 = 12733 +ER_IB_MSG_909 = 12734 +ER_IB_MSG_910 = 12735 +ER_IB_MSG_911 = 12736 +ER_IB_MSG_912 = 12737 +ER_IB_MSG_913 = 12738 +ER_IB_MSG_914 = 12739 +ER_IB_MSG_915 = 12740 +ER_IB_MSG_916 = 12741 +ER_IB_MSG_917 = 12742 +ER_IB_MSG_918 = 12743 +ER_IB_MSG_919 = 12744 +ER_IB_MSG_920 = 12745 +ER_IB_MSG_921 = 12746 +ER_IB_MSG_922 = 12747 +ER_IB_MSG_923 = 12748 +ER_IB_MSG_924 = 12749 +ER_IB_MSG_925 = 12750 +ER_IB_MSG_926 = 12751 +ER_IB_MSG_927 = 12752 +ER_IB_MSG_928 = 12753 +ER_IB_MSG_929 = 12754 +ER_IB_MSG_930 = 12755 +ER_IB_MSG_931 = 12756 +ER_IB_MSG_932 = 12757 +ER_IB_MSG_933 = 12758 +ER_IB_MSG_934 = 12759 +ER_IB_MSG_935 = 12760 +ER_IB_MSG_936 = 12761 +ER_IB_MSG_937 = 12762 +ER_IB_MSG_938 = 12763 +ER_IB_MSG_939 = 12764 +ER_IB_MSG_940 = 12765 +ER_IB_MSG_941 = 12766 +ER_IB_MSG_942 = 12767 +ER_IB_MSG_943 = 12768 +ER_IB_MSG_944 = 12769 +ER_IB_MSG_945 = 12770 +ER_IB_MSG_946 = 12771 +ER_IB_MSG_947 = 12772 +ER_IB_MSG_948 = 12773 +ER_IB_MSG_949 = 12774 +ER_IB_MSG_950 = 12775 +ER_IB_MSG_951 = 12776 +ER_IB_MSG_952 = 12777 +ER_IB_MSG_953 = 12778 +ER_IB_MSG_954 = 12779 +ER_IB_MSG_955 = 12780 +ER_IB_MSG_956 = 12781 +ER_IB_MSG_957 = 12782 +ER_IB_MSG_958 = 12783 +ER_IB_MSG_959 = 12784 +ER_IB_MSG_960 = 12785 +ER_IB_MSG_961 = 12786 +ER_IB_MSG_962 = 12787 +ER_IB_MSG_963 = 12788 +ER_IB_MSG_964 = 12789 +ER_IB_MSG_965 = 12790 +ER_IB_MSG_966 = 12791 +ER_IB_MSG_967 = 12792 +ER_IB_MSG_968 = 12793 +ER_IB_MSG_969 = 12794 +ER_IB_MSG_970 = 12795 +ER_IB_MSG_971 = 12796 +ER_IB_MSG_972 = 12797 +ER_IB_MSG_973 = 12798 +ER_IB_MSG_974 = 12799 +ER_IB_MSG_975 = 12800 +ER_IB_MSG_976 = 12801 +ER_IB_MSG_977 = 12802 +ER_IB_MSG_978 = 12803 +ER_IB_MSG_979 = 12804 +ER_IB_MSG_980 = 12805 +ER_IB_MSG_981 = 12806 +ER_IB_MSG_982 = 12807 +ER_IB_MSG_983 = 12808 +ER_IB_MSG_984 = 12809 +ER_IB_MSG_985 = 12810 +ER_IB_MSG_986 = 12811 +ER_IB_MSG_987 = 12812 +ER_IB_MSG_988 = 12813 +ER_IB_MSG_989 = 12814 +ER_IB_MSG_990 = 12815 +ER_IB_MSG_991 = 12816 +ER_IB_MSG_992 = 12817 +ER_IB_MSG_993 = 12818 +ER_IB_MSG_994 = 12819 +ER_IB_MSG_995 = 12820 +ER_IB_MSG_996 = 12821 +ER_IB_MSG_997 = 12822 +ER_IB_MSG_998 = 12823 +ER_IB_MSG_999 = 12824 +ER_IB_MSG_1000 = 12825 +ER_IB_MSG_1001 = 12826 +ER_IB_MSG_1002 = 12827 +ER_IB_MSG_1003 = 12828 +ER_IB_MSG_1004 = 12829 +ER_IB_MSG_1005 = 12830 +ER_IB_MSG_1006 = 12831 +ER_IB_MSG_1007 = 12832 +ER_IB_MSG_1008 = 12833 +ER_IB_MSG_1009 = 12834 +ER_IB_MSG_1010 = 12835 +ER_IB_MSG_1011 = 12836 +ER_IB_MSG_1012 = 12837 +ER_IB_MSG_1013 = 12838 +ER_IB_MSG_1014 = 12839 +ER_IB_MSG_1015 = 12840 +ER_IB_MSG_1016 = 12841 +ER_IB_MSG_1017 = 12842 +ER_IB_MSG_1018 = 12843 +ER_IB_MSG_1019 = 12844 +ER_IB_MSG_1020 = 12845 +ER_IB_MSG_1021 = 12846 +ER_IB_MSG_1022 = 12847 +ER_IB_MSG_1023 = 12848 +ER_IB_MSG_1024 = 12849 +ER_IB_MSG_1025 = 12850 +ER_IB_MSG_1026 = 12851 +ER_IB_MSG_1027 = 12852 +ER_IB_MSG_1028 = 12853 +ER_IB_MSG_1029 = 12854 +ER_IB_MSG_1030 = 12855 +ER_IB_MSG_1031 = 12856 +ER_IB_MSG_1032 = 12857 +ER_IB_MSG_1033 = 12858 +ER_IB_MSG_1034 = 12859 +ER_IB_MSG_1035 = 12860 +ER_IB_MSG_1036 = 12861 +ER_IB_MSG_1037 = 12862 +ER_IB_MSG_1038 = 12863 +ER_IB_MSG_1039 = 12864 +ER_IB_MSG_1040 = 12865 +ER_IB_MSG_1041 = 12866 +ER_IB_MSG_1042 = 12867 +ER_IB_MSG_1043 = 12868 +ER_IB_MSG_1044 = 12869 +ER_IB_MSG_1045 = 12870 +ER_IB_MSG_1046 = 12871 +ER_IB_MSG_1047 = 12872 +ER_IB_MSG_1048 = 12873 +ER_IB_MSG_1049 = 12874 +ER_IB_MSG_1050 = 12875 +ER_IB_MSG_1051 = 12876 +ER_IB_MSG_1052 = 12877 +ER_IB_MSG_1053 = 12878 +ER_IB_MSG_1054 = 12879 +ER_IB_MSG_1055 = 12880 +ER_IB_MSG_1056 = 12881 +ER_IB_MSG_1057 = 12882 +ER_IB_MSG_1058 = 12883 +ER_IB_MSG_1059 = 12884 +ER_IB_MSG_1060 = 12885 +ER_IB_MSG_1061 = 12886 +ER_IB_MSG_1062 = 12887 +ER_IB_MSG_1063 = 12888 +ER_IB_MSG_1064 = 12889 +ER_IB_MSG_1065 = 12890 +ER_IB_MSG_1066 = 12891 +ER_IB_MSG_1067 = 12892 +ER_IB_MSG_1068 = 12893 +ER_IB_MSG_1069 = 12894 +ER_IB_MSG_1070 = 12895 +ER_IB_MSG_1071 = 12896 +ER_IB_MSG_1072 = 12897 +ER_IB_MSG_1073 = 12898 +ER_IB_MSG_1074 = 12899 +ER_IB_MSG_1075 = 12900 +ER_IB_MSG_1076 = 12901 +ER_IB_MSG_1077 = 12902 +ER_IB_MSG_1078 = 12903 +ER_IB_MSG_1079 = 12904 +ER_IB_MSG_1080 = 12905 +ER_IB_MSG_1081 = 12906 +ER_IB_MSG_1082 = 12907 +ER_IB_MSG_1083 = 12908 +ER_IB_MSG_1084 = 12909 +ER_IB_MSG_1085 = 12910 +ER_IB_MSG_1086 = 12911 +ER_IB_MSG_1087 = 12912 +ER_IB_MSG_1088 = 12913 +ER_IB_MSG_1089 = 12914 +ER_IB_MSG_1090 = 12915 +ER_IB_MSG_1091 = 12916 +ER_IB_MSG_1092 = 12917 +ER_IB_MSG_1093 = 12918 +ER_IB_MSG_1094 = 12919 +ER_IB_MSG_1095 = 12920 +ER_IB_MSG_1096 = 12921 +ER_IB_MSG_1097 = 12922 +ER_IB_MSG_1098 = 12923 +ER_IB_MSG_1099 = 12924 +ER_IB_MSG_1100 = 12925 +ER_IB_MSG_1101 = 12926 +ER_IB_MSG_1102 = 12927 +ER_IB_MSG_1103 = 12928 +ER_IB_MSG_1104 = 12929 +ER_IB_MSG_1105 = 12930 +ER_IB_MSG_1106 = 12931 +ER_IB_MSG_1107 = 12932 +ER_IB_MSG_1108 = 12933 +ER_IB_MSG_1109 = 12934 +ER_IB_MSG_1110 = 12935 +ER_IB_MSG_1111 = 12936 +ER_IB_MSG_1112 = 12937 +ER_IB_MSG_1113 = 12938 +ER_IB_MSG_1114 = 12939 +ER_IB_MSG_1115 = 12940 +ER_IB_MSG_1116 = 12941 +ER_IB_MSG_1117 = 12942 +ER_IB_MSG_1118 = 12943 +ER_IB_MSG_1119 = 12944 +ER_IB_MSG_1120 = 12945 +ER_IB_MSG_1121 = 12946 +ER_IB_MSG_1122 = 12947 +ER_IB_MSG_1123 = 12948 +ER_IB_MSG_1124 = 12949 +ER_IB_MSG_1125 = 12950 +ER_IB_MSG_1126 = 12951 +ER_IB_MSG_1127 = 12952 +ER_IB_MSG_1128 = 12953 +ER_IB_MSG_1129 = 12954 +ER_IB_MSG_1130 = 12955 +ER_IB_MSG_1131 = 12956 +ER_IB_MSG_1132 = 12957 +ER_IB_MSG_1133 = 12958 +ER_IB_MSG_1134 = 12959 +ER_IB_MSG_1135 = 12960 +ER_IB_MSG_1136 = 12961 +ER_IB_MSG_1137 = 12962 +ER_IB_MSG_1138 = 12963 +ER_IB_MSG_1139 = 12964 +ER_IB_MSG_1140 = 12965 +ER_IB_MSG_1141 = 12966 +ER_IB_MSG_1142 = 12967 +ER_IB_MSG_1143 = 12968 +ER_IB_MSG_1144 = 12969 +ER_IB_MSG_1145 = 12970 +ER_IB_MSG_1146 = 12971 +ER_IB_MSG_1147 = 12972 +ER_IB_MSG_1148 = 12973 +ER_IB_MSG_1149 = 12974 +ER_IB_MSG_1150 = 12975 +ER_IB_MSG_1151 = 12976 +ER_IB_MSG_1152 = 12977 +ER_IB_MSG_1153 = 12978 +ER_IB_MSG_1154 = 12979 +ER_IB_MSG_1155 = 12980 +ER_IB_MSG_1156 = 12981 +ER_IB_MSG_1157 = 12982 +ER_IB_MSG_1158 = 12983 +ER_IB_MSG_1159 = 12984 +ER_IB_MSG_1160 = 12985 +ER_IB_MSG_1161 = 12986 +ER_IB_MSG_1162 = 12987 +ER_IB_MSG_1163 = 12988 +ER_IB_MSG_1164 = 12989 +ER_IB_MSG_1165 = 12990 +ER_IB_MSG_1166 = 12991 +ER_IB_MSG_1167 = 12992 +ER_IB_MSG_1168 = 12993 +ER_IB_MSG_1169 = 12994 +ER_IB_MSG_1170 = 12995 +ER_IB_MSG_1171 = 12996 +ER_IB_MSG_1172 = 12997 +ER_IB_MSG_1173 = 12998 +ER_IB_MSG_1174 = 12999 +ER_IB_MSG_1175 = 13000 +ER_IB_MSG_1176 = 13001 +ER_IB_MSG_1177 = 13002 +ER_IB_MSG_1178 = 13003 +ER_IB_MSG_1179 = 13004 +ER_IB_MSG_1180 = 13005 +ER_IB_MSG_1181 = 13006 +ER_IB_MSG_1182 = 13007 +ER_IB_MSG_1183 = 13008 +ER_IB_MSG_1184 = 13009 +ER_IB_MSG_1185 = 13010 +ER_IB_MSG_1186 = 13011 +ER_IB_MSG_1187 = 13012 +ER_IB_MSG_1188 = 13013 +ER_IB_MSG_1189 = 13014 +ER_IB_MSG_1190 = 13015 +ER_IB_MSG_1191 = 13016 +ER_IB_MSG_1192 = 13017 +ER_IB_MSG_1193 = 13018 +ER_IB_MSG_1194 = 13019 +ER_IB_MSG_1195 = 13020 +ER_IB_MSG_1196 = 13021 +ER_IB_MSG_1197 = 13022 +ER_IB_MSG_1198 = 13023 +ER_IB_MSG_1199 = 13024 +ER_IB_MSG_1200 = 13025 +ER_IB_MSG_1201 = 13026 +ER_IB_MSG_1202 = 13027 +ER_IB_MSG_1203 = 13028 +ER_IB_MSG_1204 = 13029 +ER_IB_MSG_1205 = 13030 +ER_IB_MSG_1206 = 13031 +ER_IB_MSG_1207 = 13032 +ER_IB_MSG_1208 = 13033 +ER_IB_MSG_1209 = 13034 +ER_IB_MSG_1210 = 13035 +ER_IB_MSG_1211 = 13036 +ER_IB_MSG_1212 = 13037 +ER_IB_MSG_1213 = 13038 +ER_IB_MSG_1214 = 13039 +ER_IB_MSG_1215 = 13040 +ER_IB_MSG_1216 = 13041 +ER_IB_MSG_1217 = 13042 +ER_IB_MSG_1218 = 13043 +ER_IB_MSG_1219 = 13044 +ER_IB_MSG_1220 = 13045 +ER_IB_MSG_1221 = 13046 +ER_IB_MSG_1222 = 13047 +ER_IB_MSG_1223 = 13048 +ER_IB_MSG_1224 = 13049 +ER_IB_MSG_1225 = 13050 +ER_IB_MSG_1226 = 13051 +ER_IB_MSG_1227 = 13052 +ER_IB_MSG_1228 = 13053 +ER_IB_MSG_1229 = 13054 +ER_IB_MSG_1230 = 13055 +ER_IB_MSG_1231 = 13056 +ER_IB_MSG_1232 = 13057 +ER_IB_MSG_1233 = 13058 +ER_IB_MSG_1234 = 13059 +ER_IB_MSG_1235 = 13060 +ER_IB_MSG_1236 = 13061 +ER_IB_MSG_1237 = 13062 +ER_IB_MSG_1238 = 13063 +ER_IB_MSG_1239 = 13064 +ER_IB_MSG_1240 = 13065 +ER_IB_MSG_1241 = 13066 +ER_IB_MSG_1242 = 13067 +ER_IB_MSG_1243 = 13068 +ER_IB_MSG_1244 = 13069 +ER_IB_MSG_1245 = 13070 +ER_IB_MSG_1246 = 13071 +ER_IB_MSG_1247 = 13072 +ER_IB_MSG_1248 = 13073 +ER_IB_MSG_1249 = 13074 +ER_IB_MSG_1250 = 13075 +ER_IB_MSG_1251 = 13076 +ER_IB_MSG_1252 = 13077 +ER_IB_MSG_1253 = 13078 +ER_IB_MSG_1254 = 13079 +ER_IB_MSG_1255 = 13080 +ER_IB_MSG_1256 = 13081 +ER_IB_MSG_1257 = 13082 +ER_IB_MSG_1258 = 13083 +ER_IB_MSG_1259 = 13084 +ER_IB_MSG_1260 = 13085 +ER_IB_MSG_1261 = 13086 +ER_IB_MSG_1262 = 13087 +ER_IB_MSG_1263 = 13088 +ER_IB_MSG_1264 = 13089 +ER_IB_MSG_1265 = 13090 +ER_IB_MSG_1266 = 13091 +ER_IB_MSG_1267 = 13092 +ER_IB_MSG_1268 = 13093 +ER_IB_MSG_1269 = 13094 +ER_IB_MSG_1270 = 13095 +ER_RPL_SLAVE_SQL_THREAD_STOP_CMD_EXEC_TIMEOUT = 13096 +ER_RPL_SLAVE_IO_THREAD_STOP_CMD_EXEC_TIMEOUT = 13097 +ER_RPL_GTID_UNSAFE_STMT_ON_NON_TRANS_TABLE = 13098 +ER_RPL_GTID_UNSAFE_STMT_CREATE_SELECT = 13099 +ER_RPL_GTID_UNSAFE_STMT_ON_TEMPORARY_TABLE = 13100 +ER_BINLOG_ROW_VALUE_OPTION_IGNORED = 13101 +ER_BINLOG_USE_V1_ROW_EVENTS_IGNORED = 13102 +ER_BINLOG_ROW_VALUE_OPTION_USED_ONLY_FOR_AFTER_IMAGES = 13103 +ER_CONNECTION_ABORTED = 13104 +ER_NORMAL_SERVER_SHUTDOWN = 13105 +ER_KEYRING_MIGRATE_FAILED = 13106 +ER_GRP_RPL_LOWER_CASE_TABLE_NAMES_DIFF_FROM_GRP = 13107 +ER_OOM_SAVE_GTIDS = 13108 +ER_LCTN_NOT_FOUND = 13109 +ER_REGEXP_INVALID_CAPTURE_GROUP_NAME = 13110 +ER_COMPONENT_FILTER_WRONG_VALUE = 13111 +ER_XPLUGIN_FAILED_TO_STOP_SERVICES = 13112 +ER_INCONSISTENT_ERROR = 13113 +ER_SERVER_MASTER_FATAL_ERROR_READING_BINLOG = 13114 +ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 13115 +ER_SLAVE_CREATE_EVENT_FAILURE = 13116 +ER_SLAVE_FATAL_ERROR = 13117 +ER_SLAVE_HEARTBEAT_FAILURE = 13118 +ER_SLAVE_INCIDENT = 13119 +ER_SLAVE_MASTER_COM_FAILURE = 13120 +ER_SLAVE_RELAY_LOG_READ_FAILURE = 13121 +ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 13122 +ER_SERVER_SLAVE_MI_INIT_REPOSITORY = 13123 +ER_SERVER_SLAVE_RLI_INIT_REPOSITORY = 13124 +ER_SERVER_NET_PACKET_TOO_LARGE = 13125 +ER_SERVER_NO_SYSTEM_TABLE_ACCESS = 13126 +ER_SERVER_UNKNOWN_ERROR = 13127 +ER_SERVER_UNKNOWN_SYSTEM_VARIABLE = 13128 +ER_SERVER_NO_SESSION_TO_SEND_TO = 13129 +ER_SERVER_NEW_ABORTING_CONNECTION = 13130 +ER_SERVER_OUT_OF_SORTMEMORY = 13131 +ER_SERVER_RECORD_FILE_FULL = 13132 +ER_SERVER_DISK_FULL_NOWAIT = 13133 +ER_SERVER_HANDLER_ERROR = 13134 +ER_SERVER_NOT_FORM_FILE = 13135 +ER_SERVER_CANT_OPEN_FILE = 13136 +ER_SERVER_FILE_NOT_FOUND = 13137 +ER_SERVER_FILE_USED = 13138 +ER_SERVER_CANNOT_LOAD_FROM_TABLE_V2 = 13139 +ER_ERROR_INFO_FROM_DA = 13140 +ER_SERVER_TABLE_CHECK_FAILED = 13141 +ER_SERVER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 13142 +ER_SERVER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 13143 +ER_SERVER_ACL_TABLE_ERROR = 13144 +ER_SERVER_SLAVE_INIT_QUERY_FAILED = 13145 +ER_SERVER_SLAVE_CONVERSION_FAILED = 13146 +ER_SERVER_SLAVE_IGNORED_TABLE = 13147 +ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 13148 +ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 13149 +ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 13150 +ER_SERVER_TEST_MESSAGE = 13151 +ER_AUDIT_LOG_JSON_FILTER_PARSING_ERROR = 13152 +ER_AUDIT_LOG_JSON_FILTERING_NOT_ENABLED = 13153 +ER_PLUGIN_FAILED_TO_OPEN_TABLES = 13154 +ER_PLUGIN_FAILED_TO_OPEN_TABLE = 13155 +ER_AUDIT_LOG_JSON_FILTER_NAME_CANNOT_BE_EMPTY = 13156 +ER_AUDIT_LOG_USER_NAME_INVALID_CHARACTER = 13157 +ER_AUDIT_LOG_UDF_INSUFFICIENT_PRIVILEGE = 13158 +ER_AUDIT_LOG_NO_KEYRING_PLUGIN_INSTALLED = 13159 +ER_AUDIT_LOG_HOST_NAME_INVALID_CHARACTER = 13160 +ER_AUDIT_LOG_ENCRYPTION_PASSWORD_HAS_NOT_BEEN_SET = 13161 +ER_AUDIT_LOG_COULD_NOT_CREATE_AES_KEY = 13162 +ER_AUDIT_LOG_ENCRYPTION_PASSWORD_CANNOT_BE_FETCHED = 13163 +ER_COULD_NOT_REINITIALIZE_AUDIT_LOG_FILTERS = 13164 +ER_AUDIT_LOG_JSON_USER_NAME_CANNOT_BE_EMPTY = 13165 +ER_AUDIT_LOG_USER_FIRST_CHARACTER_MUST_BE_ALPHANUMERIC = 13166 +ER_AUDIT_LOG_JSON_FILTER_DOES_NOT_EXIST = 13167 CR_UNKNOWN_ERROR = 2000 CR_SOCKET_CREATE_ERROR = 2001 CR_CONNECTION_ERROR = 2002 @@ -1155,5 +4600,7 @@ CR_DUPLICATE_CONNECTION_ATTR = 2060 CR_AUTH_PLUGIN_ERR = 2061 CR_INSECURE_API_ERR = 2062 +CR_FILE_NAME_TOO_LONG = 2063 +CR_SSL_FIPS_MODE_ERR = 2064 # End MySQL Errors diff --git a/lib/mysql/connector/errors.py b/lib/mysql/connector/errors.py index ea354f27..c0225a77 100644 --- a/lib/mysql/connector/errors.py +++ b/lib/mysql/connector/errors.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -72,7 +72,7 @@ def custom_error_exception(error=None, exception=None): """ global _CUSTOM_ERROR_EXCEPTIONS # pylint: disable=W0603 - if isinstance(error, dict) and not len(error): + if isinstance(error, dict) and not error: _CUSTOM_ERROR_EXCEPTIONS = {} return _CUSTOM_ERROR_EXCEPTIONS @@ -86,15 +86,15 @@ def custom_error_exception(error=None, exception=None): if isinstance(error, int): error = {error: exception} - for errno, exception in error.items(): + for errno, _exception in error.items(): if not isinstance(errno, int): raise ValueError("error number should be an integer") try: - if not issubclass(exception, Exception): + if not issubclass(_exception, Exception): raise TypeError except TypeError: raise ValueError("exception should be subclass of Exception") - _CUSTOM_ERROR_EXCEPTIONS[errno] = exception + _CUSTOM_ERROR_EXCEPTIONS[errno] = _exception return _CUSTOM_ERROR_EXCEPTIONS @@ -301,4 +301,5 @@ class MySQLFabricError(Error): 2049: NotSupportedError, 2055: OperationalError, 2061: InterfaceError, + 2026: InterfaceError, } diff --git a/lib/mysql/connector/fabric/__init__.py b/lib/mysql/connector/fabric/__init__.py index b3d6a06c..c88fe033 100644 --- a/lib/mysql/connector/fabric/__init__.py +++ b/lib/mysql/connector/fabric/__init__.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -26,6 +26,15 @@ from collections import namedtuple +from .connection import ( + MODE_READONLY, MODE_READWRITE, + STATUS_PRIMARY, STATUS_SECONDARY, + SCOPE_GLOBAL, SCOPE_LOCAL, + Fabric, FabricConnection, + MySQLFabricConnection, + FabricSet, +) + # Order of field_names must match how Fabric is returning the data FabricMySQLServer = namedtuple( 'FabricMySQLServer', @@ -39,15 +48,6 @@ 'shard', 'shard_type', 'group', 'global_group'] ) -from .connection import ( - MODE_READONLY, MODE_READWRITE, - STATUS_PRIMARY, STATUS_SECONDARY, - SCOPE_GLOBAL, SCOPE_LOCAL, - Fabric, FabricConnection, - MySQLFabricConnection, - FabricSet, -) - def connect(**kwargs): """Create a MySQLFabricConnection object""" diff --git a/lib/mysql/connector/fabric/caching.py b/lib/mysql/connector/fabric/caching.py index a24d6b1c..b508fa4f 100644 --- a/lib/mysql/connector/fabric/caching.py +++ b/lib/mysql/connector/fabric/caching.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -116,32 +116,32 @@ def __getattr__(self, attr): def add_partition(self, key, group): """Add sharding information for a group""" if self.shard_type == 'RANGE': - key = int(key) + _key = int(key) elif self.shard_type == 'RANGE_DATETIME': try: if ':' in key: - key = datetime.strptime(key, "%Y-%m-%d %H:%M:%S") + _key = datetime.strptime(key, "%Y-%m-%d %H:%M:%S") else: - key = datetime.strptime(key, "%Y-%m-%d").date() + _key = datetime.strptime(key, "%Y-%m-%d").date() except: raise ValueError( "RANGE_DATETIME key could not be parsed, was: {0}".format( key )) elif self.shard_type == 'RANGE_STRING': - pass + _key = key elif self.shard_type == "HASH": - pass + _key = key else: raise ValueError("Unsupported sharding type {0}".format( self.shard_type )) - self.partitioning[key] = { + self.partitioning[_key] = { 'group': group, } self.reset_ttl() - bisect.insort_right(self.keys, key) - insort_right_rev(self.keys_reversed, key) + bisect.insort_right(self.keys, _key) + insort_right_rev(self.keys_reversed, _key) @classmethod def hash_index(cls, part1, part2=None): @@ -175,6 +175,7 @@ def __repr__(self): group=self.group_name, ) + class FabricCache(object): """Singleton class for caching Fabric data diff --git a/lib/mysql/connector/fabric/connection.py b/lib/mysql/connector/fabric/connection.py index 44da1752..2c9a1337 100644 --- a/lib/mysql/connector/fabric/connection.py +++ b/lib/mysql/connector/fabric/connection.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -27,13 +27,34 @@ import datetime import time import uuid -from base64 import b16decode -from bisect import bisect -from hashlib import md5 import logging import socket import collections +from base64 import b16decode +from bisect import bisect +from hashlib import md5 + +import mysql.connector + +from ..connection import MySQLConnection +from ..conversion import MySQLConverter +from ..pooling import MySQLConnectionPool +from ..errors import ( + Error, InterfaceError, NotSupportedError, MySQLFabricError, InternalError, + DatabaseError +) +from ..cursor import ( + MySQLCursor, MySQLCursorBuffered, + MySQLCursorRaw, MySQLCursorBufferedRaw +) +from .. import errorcode +from . import FabricMySQLServer, FabricShard +from .caching import FabricCache +from .balancing import WeightedRoundRobin +from .. import version +from ..catch23 import PY2, isunicode, UNICODE_TYPES + # pylint: disable=F0401,E0611 try: from xmlrpclib import Fault, ServerProxy, Transport @@ -47,7 +68,7 @@ if sys.version_info[0] == 2: try: - from httplib import HTTPSConnection + from httplib import HTTPSConnection # pylint: disable=C0412 except ImportError: HAVE_SSL = False else: @@ -59,26 +80,7 @@ HAVE_SSL = False else: HAVE_SSL = True -# pylint: enable=F0401,E0611 -import mysql.connector -from ..connection import MySQLConnection -from ..conversion import MySQLConverter -from ..pooling import MySQLConnectionPool -from ..errors import ( - Error, InterfaceError, NotSupportedError, MySQLFabricError, InternalError, - DatabaseError -) -from ..cursor import ( - MySQLCursor, MySQLCursorBuffered, - MySQLCursorRaw, MySQLCursorBufferedRaw -) -from .. import errorcode -from . import FabricMySQLServer, FabricShard -from .caching import FabricCache -from .balancing import WeightedRoundRobin -from .. import version -from ..catch23 import PY2, isunicode, UNICODE_TYPES RESET_CACHE_ON_ERROR = ( errorcode.CR_SERVER_LOST, @@ -213,8 +215,7 @@ def create_params(self, *args, **kwargs): kwargs = self._process_params_dict(kwargs) params.extend(kwargs) - params = ', '.join(params) - return params + return ', '.join(params) def execute(self, group, command, *args, **kwargs): """Executes the given command with MySQL protocol @@ -358,7 +359,7 @@ def __init__(self, data): self.__names = self.coded_rows[0]['info']['names'] self.__rows = self.coded_rows[0]['rows'] assert all(len(self.__names) == len(row) for row in self.__rows) or \ - len(self.__rows) == 0 + not self.__rows self.__result = collections.namedtuple('ResultSet', self.__names) def rowcount(self): @@ -460,7 +461,7 @@ def __init__(self, ssl_config): #pylint: disable=E1002 if PY2: urllib2.HTTPSHandler.__init__(self) else: - super().__init__() # pylint: disable=W0104 + super().__init__() # pylint: disable=W0104,E1004 self._ssl_config = ssl_config def https_open(self, req): @@ -488,7 +489,7 @@ def __init__(self, username, password, #pylint: disable=E1002 if PY2: Transport.__init__(self, use_datetime=False) else: - super().__init__(use_datetime=False) + super().__init__(use_datetime=False) # pylint: disable=E1004 self._username = username self._password = password self._use_datetime = use_datetime @@ -1139,6 +1140,8 @@ def _xmlrpc_get_proxy(self): if delay > 0: time.sleep(delay) + return None + def connect(self): """Connect with MySQL Fabric""" self._proxy = self._xmlrpc_get_proxy() diff --git a/lib/mysql/connector/locales/__init__.py b/lib/mysql/connector/locales/__init__.py index ad784e63..cd5e54f8 100644 --- a/lib/mysql/connector/locales/__init__.py +++ b/lib/mysql/connector/locales/__init__.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -68,4 +68,3 @@ def get_client_error(error, language='eng'): return None raise ValueError("error argument needs to be either an integer or string") - diff --git a/lib/mysql/connector/locales/eng/client_error.py b/lib/mysql/connector/locales/eng/client_error.py index d145a174..05ad6dbb 100644 --- a/lib/mysql/connector/locales/eng/client_error.py +++ b/lib/mysql/connector/locales/eng/client_error.py @@ -24,8 +24,8 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # This file was auto-generated. -_GENERATED_ON = '2015-12-13' -_MYSQL_VERSION = (5, 7, 10) +_GENERATED_ON = '2018-03-16' +_MYSQL_VERSION = (8, 0, 11) # Start MySQL Error messages CR_UNKNOWN_ERROR = u"Unknown MySQL error" @@ -91,5 +91,7 @@ CR_DUPLICATE_CONNECTION_ATTR = u"There is an attribute with the same name already" CR_AUTH_PLUGIN_ERR = u"Authentication plugin '%s' reported error: %s" CR_INSECURE_API_ERR = u"Insecure API function call: '%s' Use instead: '%s'" +CR_FILE_NAME_TOO_LONG = u"File name is too long" +CR_SSL_FIPS_MODE_ERR = u"Set FIPS mode ON/STRICT failed" # End MySQL Error messages diff --git a/lib/mysql/connector/network.py b/lib/mysql/connector/network.py index 1ef55a3b..ad853ba5 100644 --- a/lib/mysql/connector/network.py +++ b/lib/mysql/connector/network.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -181,7 +181,7 @@ def send_compressed(self, buf, packet_number=None, zpkts.append(header + zbuf) tmpbuf = tmpbuf[16384:] pllen = len(tmpbuf) - self.next_compressed_packet_number + self.next_compressed_packet_number # pylint: disable=W0104 while pllen > maxpktlen: zbuf = zlib.compress(tmpbuf[:maxpktlen]) header = (struct.pack(', like most @@ -95,7 +95,7 @@ def read_option_files(**config): config_options[option][1] <= value[1]): config_options[option] = value except KeyError: - if group is 'connector_python': + if group == 'connector_python': raise AttributeError("Unsupported argument " "'{0}'".format(option)) except KeyError: @@ -282,23 +282,23 @@ def get_groups(self, *args): Returns a dictionary """ - if len(args) == 0: + if not args: args = self._options_dict.keys() options = {} + priority = {} for group in args: try: - for option, value in self._options_dict[group].items(): - if option not in options or options[option][1] <= value[1]: - options[option] = value + for option, value in [(key, value,) for key, value in + self._options_dict[group].items() if + key != "__name__" and + not key.startswith("!")]: + if option not in options or priority[option] <= value[1]: + priority[option] = value[1] + options[option] = value[0] except KeyError: pass - for key in options.keys(): - if key == '__name__' or key.startswith('!'): - del options[key] - else: - options[key] = options[key][0] return options def get_groups_as_dict_with_priority(self, *args): # pylint: disable=C0103 @@ -315,20 +315,19 @@ def get_groups_as_dict_with_priority(self, *args): # pylint: disable=C0103 Returns an dictionary of dictionaries """ - if len(args) == 0: + if not args: args = self._options_dict.keys() options = dict() for group in args: try: - options[group] = dict(self._options_dict[group]) + options[group] = dict((key, value,) for key, value in + self._options_dict[group].items() if + key != "__name__" and + not key.startswith("!")) except KeyError: pass - for group in options.keys(): - for key in options[group].keys(): - if key == '__name__' or key.startswith('!'): - del options[group][key] return options def get_groups_as_dict(self, *args): @@ -341,20 +340,17 @@ def get_groups_as_dict(self, *args): Returns an dictionary of dictionaries """ - if len(args) == 0: + if not args: args = self._options_dict.keys() options = dict() for group in args: try: - options[group] = dict(self._options_dict[group]) + options[group] = dict((key, value[0],) for key, value in + self._options_dict[group].items() if + key != "__name__" and + not key.startswith("!")) except KeyError: pass - for group in options.keys(): - for key in options[group].keys(): - if key == '__name__' or key.startswith('!'): - del options[group][key] - else: - options[group][key] = options[group][key][0] return options diff --git a/lib/mysql/connector/pooling.py b/lib/mysql/connector/pooling.py index 17d2f59a..b6711202 100644 --- a/lib/mysql/connector/pooling.py +++ b/lib/mysql/connector/pooling.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -112,12 +112,13 @@ def close(self): When the pool is configured to reset the session, the session state will be cleared by re-authenticating the user. """ - cnx = self._cnx - if self._cnx_pool.reset_session: - cnx.reset_session() - - self._cnx_pool.add_connection(cnx) - self._cnx = None + try: + cnx = self._cnx + if self._cnx_pool.reset_session: + cnx.reset_session() + finally: + self._cnx_pool.add_connection(cnx) + self._cnx = None def config(self, **kwargs): """Configuration is done through the pool""" diff --git a/lib/mysql/connector/protocol.py b/lib/mysql/connector/protocol.py index 72f9369a..7daf93bd 100644 --- a/lib/mysql/connector/protocol.py +++ b/lib/mysql/connector/protocol.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,7 +29,7 @@ from decimal import Decimal from .constants import ( - FieldFlag, ServerCmd, FieldType, ClientFlag, MAX_MYSQL_TABLE_COLUMNS) + FieldFlag, ServerCmd, FieldType, ClientFlag) from . import errors, utils from .authentication import get_auth_plugin from .catch23 import PY2, struct_unpack @@ -61,7 +61,7 @@ def _auth_response(self, client_flags, username, password, database, ssl_enabled=ssl_enabled) plugin_auth_response = auth.auth_response() except (TypeError, errors.InterfaceError) as exc: - raise errors.ProgrammingError( + raise errors.InterfaceError( "Failed authentication: {0}".format(str(exc))) if client_flags & ClientFlag.SECURE_CONNECTION: @@ -96,10 +96,23 @@ def make_auth(self, handshake, username=None, password=None, database=None, client_flags, max_allowed_packet, charset, username_bytes) - packet += self._auth_response(client_flags, username, password, - database, - auth_plugin, - auth_data, ssl_enabled) + try: + packet += self._auth_response(client_flags, username, password, + database, + auth_plugin, + auth_data, ssl_enabled) + except errors.NotSupportedError: + # IF the default server authentication plugin is unsupported, + # fall back to default auth_plugin if default server auth plugin. + # In case our default auth_plugin is the one required to identify + # the user, the server will ask for the authentification data using + # this plugin, otherwise server will request the plugin used by the + # user and a AuthSwitchRequest will occur. + auth_plugin = "mysql_native_password" + packet += self._auth_response(client_flags, username, password, + database, + auth_plugin, + auth_data, ssl_enabled) packet += self._connect_with_db(client_flags, database) @@ -123,6 +136,10 @@ def make_command(self, command, argument=None): data += argument return data + def make_stmt_fetch(self, statement_id, rows=1): + """Make a MySQL packet with Fetch Statement command""" + return utils.int4store(statement_id) + utils.int4store(rows) + def make_change_user(self, handshake, username=None, password=None, database=None, charset=33, client_flags=0, ssl_enabled=False, auth_plugin=None): @@ -227,8 +244,6 @@ def parse_column_count(self, packet): """Parse a MySQL packet with the number of columns in result set""" try: count = utils.read_lc_int(packet[4:])[1] - if count > MAX_MYSQL_TABLE_COLUMNS: - return None return count except (struct.error, ValueError): raise errors.InterfaceError("Failed parsing column count") @@ -318,7 +333,6 @@ def read_text_result(self, sock, version, count=1): eof = None rowdata = None i = 0 - eof57 = version >= (5, 7, 5) while True: if eof or i == count: break @@ -331,13 +345,9 @@ def read_text_result(self, sock, version, count=1): packet = sock.recv() datas.append(packet[4:]) rowdata = utils.read_lc_string_list(bytearray(b'').join(datas)) - elif (packet[4] == 254 and packet[0] < 7): + elif packet[4] == 254 and packet[0] < 7: eof = self.parse_eof(packet) rowdata = None - elif eof57 and (packet[4] == 0 and packet[0] > 9): - # EOF deprecation: make sure we catch it whether flag is set or not - eof = self.parse_ok(packet) - rowdata = None else: eof = None rowdata = utils.read_lc_string_list(packet[4:]) @@ -421,7 +431,7 @@ def _parse_binary_time(self, packet, field): return (packet[length + 1:], tmp) - def _parse_binary_values(self, fields, packet): + def _parse_binary_values(self, fields, packet, charset='utf-8'): """Parse values from a binary result packet""" null_bitmap_length = (len(fields) + 7 + 2) // 8 null_bitmap = [int(i) for i in packet[0:null_bitmap_length]] @@ -449,11 +459,11 @@ def _parse_binary_values(self, fields, packet): values.append(value) else: (packet, value) = utils.read_lc_string(packet) - values.append(value) + values.append(value.decode(charset)) return tuple(values) - def read_binary_result(self, sock, columns, count=1): + def read_binary_result(self, sock, columns, count=1, charset='utf-8'): """Read MySQL binary protocol result Reads all or given number of binary resultset rows from the socket. @@ -473,7 +483,7 @@ def read_binary_result(self, sock, columns, count=1): values = None elif packet[4] == 0: eof = None - values = self._parse_binary_values(columns, packet[5:]) + values = self._parse_binary_values(columns, packet[5:], charset) if eof is None and values is not None: rows.append(values) elif eof is None and values is None: @@ -629,6 +639,8 @@ def make_stmt_execute(self, statement_id, data=(), parameters=(), values = [] types = [] packed = b'' + if charset == 'utf8mb4': + charset = 'utf8' if long_data_used is None: long_data_used = {} if parameters and data: @@ -718,7 +730,7 @@ def parse_auth_switch_request(self, packet): "Failed parsing AuthSwitchRequest packet") (packet, plugin_name) = utils.read_string(packet[5:], end=b'\x00') - if packet[-1] == 0: + if packet and packet[-1] == 0: packet = packet[:-1] return plugin_name.decode('utf8'), packet diff --git a/lib/mysql/connector/utils.py b/lib/mysql/connector/utils.py index acbde809..af743a7b 100644 --- a/lib/mysql/connector/utils.py +++ b/lib/mysql/connector/utils.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -43,9 +43,8 @@ def intread(buf): elif length <= 4: tmp = buf + b'\x00'*(4-length) return struct_unpack(', like most @@ -26,7 +26,7 @@ as mysql.connector.version. """ -VERSION = (2, 1, 4, '', 0) +VERSION = (2, 1, 8, '', 0) if VERSION[3] and VERSION[4]: VERSION_TEXT = '{0}.{1}.{2}{3}{4}'.format(*VERSION) diff --git a/setupinfo.py b/setupinfo.py index 6784a384..cb31f889 100644 --- a/setupinfo.py +++ b/setupinfo.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -59,7 +59,6 @@ package_dir = {'': 'lib'} name = 'mysql-connector-python' version = '{0}.{1}.{2}'.format(*VERSION[0:3]) - extensions = [ Extension("_mysql_connector", sources=[ @@ -69,8 +68,7 @@ "src/mysql_connector.c", "src/force_cpp_linkage.cc", ], - include_dirs=['src/include'], - ) + include_dirs=['src/include']), ] packages = [ @@ -88,8 +86,8 @@ """ author = 'Oracle and/or its affiliates' author_email = '' -maintainer = 'Geert Vanderkelen' -maintainer_email = 'geert.vanderkelen@oracle.com' +maintainer = 'Nuno Mariz' +maintainer_email = 'nuno.mariz@oracle.com' cpy_gpl_license = "GNU GPLv2 (with FOSS License Exception)" keywords = "mysql db", url = 'http://dev.mysql.com/doc/connector-python/en/index.html' @@ -109,6 +107,9 @@ 'Programming Language :: Python :: 3.1', 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Topic :: Database', 'Topic :: Software Development', 'Topic :: Software Development :: Libraries :: Application Frameworks', diff --git a/src/exceptions.c b/src/exceptions.c index 5fa144fe..2009cff8 100644 --- a/src/exceptions.c +++ b/src/exceptions.c @@ -1,6 +1,6 @@ /* # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -25,6 +25,9 @@ #include +#ifdef MS_WINDOWS +#include +#endif #include #include "catch23.h" diff --git a/src/mysql_capi.c b/src/mysql_capi.c index ea1fe3fd..6d60d0eb 100644 --- a/src/mysql_capi.c +++ b/src/mysql_capi.c @@ -1,6 +1,6 @@ /* # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -30,6 +30,9 @@ #include #include +#ifdef MS_WINDOWS +#include +#endif #include #include "catch23.h" @@ -363,7 +366,7 @@ MySQL_init(MySQL *self, PyObject *args, PyObject *kwds) // Initialization expect -1 when parsing arguments failed if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|O!O!O!O!O!O", kwlist, + "|O!O!O!O!O!O!", kwlist, &PyBool_Type, &self->buffered_at_connect, &PyBool_Type, &self->raw_at_connect, &PyStringType, &self->charset_name, @@ -393,6 +396,10 @@ MySQL_init(MySQL *self, PyObject *args, PyObject *kwds) if (auth_plugin) { + if (strcmp(PyStringAsString(auth_plugin), "") == 0) + { + auth_plugin= Py_None; + } if (auth_plugin != Py_None) { tmp= self->auth_plugin; @@ -1025,33 +1032,45 @@ MySQL_commit(MySQL *self) PyObject* MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) { - char *host= NULL, *user= NULL, *password= NULL, *database= NULL, - *unix_socket= NULL; + char *host= NULL, *user= NULL, *database= NULL, *unix_socket= NULL; char *ssl_ca= NULL, *ssl_cert= NULL, *ssl_key= NULL; - PyObject *charset_name, *compress, *ssl_verify_cert; + PyObject *charset_name, *compress, *ssl_verify_cert, *password, *ssl_disabled; const char* auth_plugin; - unsigned long ver; unsigned long client_flags= 0; unsigned int port= 3306, tmp_uint; unsigned int protocol= 0; - my_bool abool; +#if MYSQL_VERSION_ID >= 50711 + unsigned int ssl_mode; +#endif +#if MYSQL_VERSION_ID >= 80001 + bool abool; + bool ssl_enabled= 0; +#else + my_bool abool; + my_bool ssl_enabled= 0; +#endif MYSQL *res; static char *kwlist[]= { "host", "user", "password", "database", "port", "unix_socket", "client_flags", - "ssl_ca", "ssl_cert", "ssl_key", "ssl_verify_cert", + "ssl_ca", "ssl_cert", "ssl_key", "ssl_verify_cert", "ssl_disabled", "compress", NULL }; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zzzzkzkzzzO!O!", kwlist, +#ifdef PY3 + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zzzzkzkzzzO!O!O!", kwlist, +#else + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|zzOzkzkzzzO!O!O!", kwlist, +#endif &host, &user, &password, &database, &port, &unix_socket, &client_flags, &ssl_ca, &ssl_cert, &ssl_key, &PyBool_Type, &ssl_verify_cert, + &PyBool_Type, &ssl_disabled, &PyBool_Type, &compress)) { return NULL; @@ -1065,7 +1084,6 @@ MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) } mysql_init(&self->session); - ver= mysql_get_client_version(); #ifdef MS_WINDOWS if (NULL == host) @@ -1107,33 +1125,24 @@ MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) mysql_options(&self->session, MYSQL_OPT_READ_TIMEOUT, (char*)&tmp_uint); mysql_options(&self->session, MYSQL_OPT_WRITE_TIMEOUT, (char*)&tmp_uint); - if (ssl_ca || ssl_cert || ssl_key) { -#if MYSQL_VERSION_ID > 50703 && MYSQL_VERSION_ID < 50711 - printf(">>>> %d\n", MYSQL_VERSION_ID); - { - abool= 1; - mysql_options(&self->session, MYSQL_OPT_SSL_ENFORCE, (char*)&abool); - } -#endif -#if MYSQL_VERSION_ID >= 50711 - { - mysql_options(&self->session, MYSQL_OPT_SSL_MODE, SSL_MODE_REQUIRED); - } -#endif - + if (ssl_disabled && ssl_disabled == Py_False) { + ssl_enabled= 1; + client_flags |= CLIENT_SSL; if (ssl_verify_cert && ssl_verify_cert == Py_True) { #if MYSQL_VERSION_ID >= 50711 - { - mysql_options(&self->session, MYSQL_OPT_SSL_MODE, SSL_MODE_VERIFY_IDENTITY); - } + ssl_mode= SSL_MODE_VERIFY_IDENTITY; + mysql_options(&self->session, MYSQL_OPT_SSL_MODE, &ssl_mode); #else - { - abool= 1; - mysql_options(&self->session, - MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (char*)&abool); - } + abool= 1; +#if MYSQL_VERSION_ID > 50703 + mysql_options(&self->session, MYSQL_OPT_SSL_ENFORCE, (char*)&abool); +#endif + mysql_options(&self->session, + MYSQL_OPT_SSL_VERIFY_SERVER_CERT, (char*)&abool); #endif + } else { + ssl_ca= NULL; } mysql_ssl_set(&self->session, ssl_key, ssl_cert, ssl_ca, NULL, NULL); } else { @@ -1146,14 +1155,33 @@ MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) #endif #if MYSQL_VERSION_ID >= 50711 { - mysql_options(&self->session, MYSQL_OPT_SSL_ENFORCE, SSL_MODE_DISABLED); + ssl_mode= SSL_MODE_DISABLED; + mysql_options(&self->session, MYSQL_OPT_SSL_MODE, &ssl_mode); } #endif } + Py_END_ALLOW_THREADS if (PyString_Check(self->auth_plugin)) { auth_plugin= PyStringAsString(self->auth_plugin); mysql_options(&self->session, MYSQL_DEFAULT_AUTH, auth_plugin); + if (strcmp(auth_plugin, "sha256_password") == 0 && !ssl_enabled) + { + PyObject *exc_type= MySQLInterfaceError; + PyObject *err_no= PyInt_FromLong(2002); + PyObject *err_msg= PyStringFromString("sha256_password requires SSL"); + PyObject *err_obj= NULL; + err_obj= PyObject_CallFunctionObjArgs(exc_type, err_msg, NULL); + PyObject_SetAttr(err_obj, PyStringFromString("sqlstate"), Py_None); + PyObject_SetAttr(err_obj, PyStringFromString("errno"), err_no); + PyObject_SetAttr(err_obj, PyStringFromString("msg"), err_msg); + PyErr_SetObject(exc_type, err_obj); + Py_XDECREF(exc_type); + Py_XDECREF(err_no); + Py_XDECREF(err_msg); + return NULL; + } + if (strcmp(auth_plugin, "mysql_clear_password") == 0) { abool= 1; @@ -1161,6 +1189,7 @@ MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) (char*)&abool); } } + Py_BEGIN_ALLOW_THREADS if (database && strlen(database) == 0) { @@ -1172,9 +1201,31 @@ MySQL_connect(MySQL *self, PyObject *args, PyObject *kwds) client_flags= client_flags & ~CLIENT_CONNECT_WITH_DB; } - res= mysql_real_connect(&self->session, - host, user, password, database, - port, unix_socket, client_flags); + if (client_flags & CLIENT_LOCAL_FILES) { + abool= 1; + mysql_options(&self->session, MYSQL_OPT_LOCAL_INFILE, (unsigned int*)&abool); + } + +#ifdef PY3 + res= mysql_real_connect(&self->session, host, user, password, database, + port, unix_socket, client_flags); +#else +{ + char* c_password; + if (PyUnicode_Check(password)) + { + PyObject* u_password= PyUnicode_AsUTF8String(password); + c_password= PyString_AsString(u_password); + Py_DECREF(u_password); + } + else + { + c_password= PyString_AsString(password); + } + res= mysql_real_connect(&self->session, host, user, c_password, database, + port, unix_socket, client_flags); +} +#endif Py_END_ALLOW_THREADS @@ -1255,20 +1306,20 @@ MySQL_escape_string(MySQL *self, PyObject *value) { return NULL; } + from_size= BytesSize(from); + from_str= PyBytesAsString(from); } #ifndef PY3 // Python v2 str else if (PyString_Check(value)) - { - from= value; - } #else // Python v3 bytes else if (PyBytes_Check(value)) +#endif { - from= value; + from_size= BytesSize(value); + from_str= PyBytesAsString(value); } -#endif else { #ifdef PY3 @@ -1279,10 +1330,8 @@ MySQL_escape_string(MySQL *self, PyObject *value) return NULL; } - from_size= BytesSize(from); to= BytesFromStringAndSize(NULL, from_size * 2 + 1); to_str= PyBytesAsString(to); - from_str= PyBytesAsString(from); Py_BEGIN_ALLOW_THREADS escaped_size= (Py_ssize_t)mysql_real_escape_string(&self->session, to_str, @@ -1291,6 +1340,7 @@ MySQL_escape_string(MySQL *self, PyObject *value) Py_END_ALLOW_THREADS BytesResize(&to, escaped_size); + Py_XDECREF(from); if (!to) { diff --git a/src/mysql_capi_conversion.c b/src/mysql_capi_conversion.c index d2d16556..56178ebd 100644 --- a/src/mysql_capi_conversion.c +++ b/src/mysql_capi_conversion.c @@ -1,6 +1,6 @@ /* # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,6 +29,9 @@ #include #include +#ifdef MS_WINDOWS +#include +#endif #include #include "catch23.h" @@ -760,4 +763,4 @@ mytopy_string(const char *data, const unsigned long length, return PyBytes_FromStringAndSize(data, length); #endif } -} \ No newline at end of file +} diff --git a/src/mysql_connector.c b/src/mysql_connector.c index bd6efd6f..8f991251 100644 --- a/src/mysql_connector.c +++ b/src/mysql_connector.c @@ -1,6 +1,6 @@ /* # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -30,6 +30,9 @@ #include "datetime.h" #include "structmember.h" +#ifdef MS_WINDOWS +#include +#endif #include #include "catch23.h" diff --git a/support/style/pylint.rc b/support/style/pylint.rc index 7af1b422..e9d40125 100644 --- a/support/style/pylint.rc +++ b/support/style/pylint.rc @@ -9,7 +9,7 @@ load-plugins= [MESSAGES CONTROL] #enable= -disable=W0702,W0142,R0902,R0903,R0904,R0911,R0913,R0914,R0915,W0613,R0201,I0011,R0922,I0012 +disable=W0702,W0142,R0902,R0903,R0904,R0911,R0913,R0914,R0915,W0613,R0201,I0011,R0922,I0012,W1202 [REPORTS] @@ -81,6 +81,7 @@ max-parents=7 max-attributes=7 min-public-methods=2 max-public-methods=20 +max-nested-blocks=7 [IMPORTS] diff --git a/tests/__init__.py b/tests/__init__.py index bc753543..4788e908 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -41,7 +41,6 @@ from functools import wraps from pkgutil import walk_packages - LOGGER_NAME = "myconnpy_tests" LOGGER = logging.getLogger(LOGGER_NAME) PY2 = sys.version_info[0] == 2 @@ -752,7 +751,8 @@ def setup_logger(logger, debug=False, logfile=None): LOGGER.addHandler(handler) -def install_connector(root_dir, install_dir, connc_location=None): +def install_connector(root_dir, install_dir, connc_location=None, + extra_compile_args=None, extra_link_args=None): """Install Connector/Python in working directory """ logfile = 'myconnpy_install.log' @@ -775,11 +775,18 @@ def install_connector(root_dir, install_dir, connc_location=None): cmd.extend([ 'install', '--root', install_dir, - '--install-lib', '.' + '--install-lib', '.', + '--static', ]) if connc_location: - cmd.extend(['--static', '--with-mysql-capi', connc_location]) + cmd.extend(['--with-mysql-capi', connc_location]) + + if extra_compile_args: + cmd.extend(['--extra-compile-args', extra_compile_args]) + + if extra_link_args: + cmd.extend(['--extra-link-args', extra_link_args]) prc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, diff --git a/tests/cext/test_cext_api.py b/tests/cext/test_cext_api.py index fff08ed9..9a15d086 100644 --- a/tests/cext/test_cext_api.py +++ b/tests/cext/test_cext_api.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -301,10 +301,10 @@ def test_get_server_version(self): version = cmy.get_server_version() self.assertIsInstance(version, tuple) self.assertEqual(3, len(version)) - self.assertTrue(all([isinstance(v, int) and v > 0 for v in version])) + self.assertTrue(all([isinstance(v, int) for v in version])) - self.assertTrue(3 < version[0] < 7) - self.assertTrue(0 < version[1] < 20) + self.assertTrue(3 < version[0] < 9) + self.assertTrue(0 <= version[1] < 20) self.assertTrue(0 < version[2] < 99) def test_thread_id(self): @@ -426,6 +426,7 @@ def test_autocommit(self): cmy2.query("SELECT * FROM {0} WHERE c1 > 3".format(table)) self.assertEqual([(4,), (5,), (6,)], fetch_rows(cmy2)) + cmy1.query("DROP TABLE IF EXISTS {0}".format(table)) cmy1.close() cmy2.close() @@ -454,9 +455,11 @@ def test_commit(self): cmy1.query("DROP TABLE IF EXISTS {0}".format(table)) + @unittest.skipIf(tests.MYSQL_VERSION < (8, 0, 0), "Plugin unavailable.") def test_change_user(self): connect_kwargs = self.connect_kwargs.copy() connect_kwargs['unix_socket'] = None + connect_kwargs['ssl_disabled'] = False cmy1 = MySQL(buffered=True) cmy1.connect(**connect_kwargs) cmy2 = MySQL(buffered=True) @@ -476,11 +479,15 @@ def test_change_user(self): pass stmt = ("CREATE USER '{user}'@'{host}' IDENTIFIED WITH " - "mysql_native_password").format(**new_user) + "caching_sha2_password").format(**new_user) cmy1.query(stmt) - cmy1.query("SET old_passwords = 0") - res = cmy1.query("SET PASSWORD FOR '{user}'@'{host}' = " - "PASSWORD('{password}')".format(**new_user)) + if tests.MYSQL_VERSION < (8, 0, 5): + cmy1.query("SET old_passwords = 0") + res = cmy1.query("SET PASSWORD FOR '{user}'@'{host}' = " + "PASSWORD('{password}')".format(**new_user)) + else: + res = cmy1.query("ALTER USER '{user}'@'{host}' IDENTIFIED BY " + "'{password}'".format(**new_user)) cmy1.query("GRANT ALL ON {database}.* " "TO '{user}'@'{host}'".format(**new_user)) @@ -529,6 +536,8 @@ def test_set_character_set(self): cmy1.set_character_set('big5') self.assertEqual(exp, get_variables(cmy1, variables=variables)) + @unittest.skipIf(tests.MYSQL_VERSION == (5, 7, 4), + "test_get_ssl_cipher not tested with MySQL version 5.7.4") def test_get_ssl_cipher(self): cmy1 = MySQL(buffered=True) self.assertRaises(MySQLInterfaceError, cmy1.get_ssl_cipher) @@ -768,3 +777,4 @@ def test_next_result(self): have_more = cmy.next_result() self.assertEqual(exp, result) + cmy.query("DROP TABLE IF EXISTS {0}".format(table)) diff --git a/tests/cext/test_cext_connection.py b/tests/cext/test_cext_connection.py index c6e389e9..d0d3baaa 100644 --- a/tests/cext/test_cext_connection.py +++ b/tests/cext/test_cext_connection.py @@ -118,6 +118,6 @@ def test_cmd_query(self): info = self.cnx.cmd_query("SET @a = 1") exp = { 'warning_count': 0, 'insert_id': 0, 'affected_rows': 0, - 'server_status': 0, 'field_count': 0 + 'status_flag': 0, 'field_count': 0 } self.assertEqual(exp, info) diff --git a/tests/cext/test_cext_cursor.py b/tests/cext/test_cext_cursor.py index 2584c575..ea809eeb 100644 --- a/tests/cext/test_cext_cursor.py +++ b/tests/cext/test_cext_cursor.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -29,6 +29,7 @@ import unittest from mysql.connector import errors, errorcode +from .. import PY2 import tests @@ -516,6 +517,28 @@ def tests_execute_multi(self): cur.close() self.cnx.rollback() + cur = self._get_cursor(self.cnx) + cur.execute("DROP PROCEDURE IF EXISTS multi_results") + procedure = ( + "CREATE PROCEDURE multi_results () " + "BEGIN SELECT 1; SELECT 'ham'; END" + ) + cur.execute(procedure) + stmt = "CALL multi_results()" + if not PY2: + stmt = b"CALL multi_results()" + exp_result = [[(1,)], [(u'ham',)]] + results = [] + for result in cur.execute(stmt, multi=True): + if result.with_rows: + self.assertEqual(stmt, result._executed) + results.append(result.fetchall()) + + self.assertEqual(exp_result, results) + cur.execute("DROP PROCEDURE multi_results") + + cur.close() + class CExtMySQLCursorBufferedTests(tests.CMySQLCursorTests): diff --git a/tests/data/ssl/generate.sh b/tests/data/ssl/generate.sh index 7cc7f25d..9e457db4 100755 --- a/tests/data/ssl/generate.sh +++ b/tests/data/ssl/generate.sh @@ -1,6 +1,6 @@ #!/bin/sh # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -47,16 +47,58 @@ if [ ! -d $DESTDIR ]; then exit 2 fi +mkdir -p $DESTDIR/ca.db.certs # Signed certificates storage +touch $DESTDIR/ca.db.index # Index of signed certificates +echo 01 > $DESTDIR/ca.db.serial # Next (sequential) serial number + +# Configuration +cat>$DESTDIR/ca.conf<<'EOF' +[ ca ] +default_ca = ca_default + +[ ca_default ] +dir = REPLACE_LATER +certs = $dir +new_certs_dir = $dir/ca.db.certs +database = $dir/ca.db.index +serial = $dir/ca.db.serial +RANDFILE = $dir/ca.db.rand +certificate = $dir/ca.crt +private_key = $dir/ca.key +default_days = 365 +default_crl_days = 30 +default_md = md5 +preserve = no +policy = generic_policy +[ generic_policy ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional +EOF + +sed -i "s|REPLACE_LATER|$DESTDIR|" $DESTDIR/ca.conf + echo echo "Generating Root Certificate" echo -$OPENSSL genrsa 2048 > $DESTDIR/tests_CA_key.pem +$OPENSSL genrsa -out $DESTDIR/tests_CA_key.pem 2048 if [ $? -ne 0 ]; then exit 3 fi SUBJ="/OU=$OU Root CA/CN=MyConnPy Root CA" -$OPENSSL req -batch -new -x509 -nodes -days $DAYS -subj "$SUBJ" \ - -key $DESTDIR/tests_CA_key.pem -out $DESTDIR/tests_CA_cert.pem +$OPENSSL req -new -key $DESTDIR/tests_CA_key.pem \ + -out $DESTDIR/tests_CA_req.csr -subj "$SUBJ" +if [ $? -ne 0 ]; then + exit 3 +fi +$OPENSSL x509 -req -days $DAYS \ + -in $DESTDIR/tests_CA_req.csr \ + -out $DESTDIR/tests_CA_cert.pem \ + -signkey $DESTDIR/tests_CA_key.pem if [ $? -ne 0 ]; then exit 3 fi @@ -66,41 +108,63 @@ echo echo "Generating Server Certificate" echo SUBJ="/OU=$OU Server Cert/CN=localhost" -$OPENSSL req -batch -newkey rsa:2048 -days $DAYS -nodes -subj "$SUBJ" \ - -keyout $DESTDIR/tests_server_key.pem -out $DESTDIR/tests_server_req.pem +$OPENSSL genrsa -out $DESTDIR/tests_server_key.pem 2048 +if [ $? -ne 0 ]; then + exit 3 +fi +$OPENSSL req -new -key $DESTDIR/tests_server_key.pem \ + -out $DESTDIR/tests_server_req.csr -subj "$SUBJ" if [ $? -ne 0 ]; then exit 3 fi -$OPENSSL rsa -in $DESTDIR/tests_server_key.pem \ - -out $DESTDIR/tests_server_key.pem +$OPENSSL ca -config $DESTDIR/ca.conf -in $DESTDIR/tests_server_req.csr \ + -cert $DESTDIR/tests_CA_cert.pem \ + -keyfile $DESTDIR/tests_CA_key.pem \ + -out $DESTDIR/tests_server_cert.pem -batch +if [ $? -ne 0 ]; then + exit 3 +fi + +# MySQL Root Certificate: generate, remove passphrase, sign +echo +echo "Generating Another Root Certificate" +echo +$OPENSSL genrsa -out $DESTDIR/tests_CA_key_1.pem 2048 +if [ $? -ne 0 ]; then + exit 3 +fi +SUBJ="/OU=$OU Root CA/CN=MyConnPy Root CA" +$OPENSSL req -new -key $DESTDIR/tests_CA_key_1.pem \ + -out $DESTDIR/tests_CA_req_1.csr -subj "$SUBJ" if [ $? -ne 0 ]; then exit 3 fi -$OPENSSL x509 -req -in $DESTDIR/tests_server_req.pem -days $DAYS \ - -CA $DESTDIR/tests_CA_cert.pem -CAkey $DESTDIR/tests_CA_key.pem \ - -set_serial 01 -out $DESTDIR/tests_server_cert.pem +$OPENSSL x509 -req -days $DAYS \ + -in $DESTDIR/tests_CA_req_1.csr \ + -out $DESTDIR/tests_CA_cert_1.pem \ + -signkey $DESTDIR/tests_CA_key_1.pem if [ $? -ne 0 ]; then exit 3 fi -# MySQL Client Certificate: generate, remove passphase, sign +# MySQL Client Certificate: generate, remove passphrase, sign echo echo "Generating Client Certificate" echo SUBJ="/OU=$OU Client Cert/CN=localhost" -$OPENSSL req -batch -newkey rsa:2048 -days $DAYS -nodes -subj "$SUBJ" \ - -keyout $DESTDIR/tests_client_key.pem -out $DESTDIR/tests_client_req.pem +$OPENSSL genrsa -out $DESTDIR/tests_client_key.pem 2048 if [ $? -ne 0 ]; then exit 3 fi -$OPENSSL rsa -in $DESTDIR/tests_client_key.pem \ - -out $DESTDIR/tests_client_key.pem +$OPENSSL req -new -key $DESTDIR/tests_client_key.pem \ + -out $DESTDIR/tests_client_req.csr -subj "$SUBJ" if [ $? -ne 0 ]; then exit 3 fi -$OPENSSL x509 -req -in $DESTDIR/tests_client_req.pem -days $DAYS \ - -CA $DESTDIR/tests_CA_cert.pem -CAkey $DESTDIR/tests_CA_key.pem \ - -set_serial 01 -out $DESTDIR/tests_client_cert.pem +$OPENSSL ca -config $DESTDIR/ca.conf -in $DESTDIR/tests_client_req.csr \ + -cert $DESTDIR/tests_CA_cert.pem \ + -keyfile $DESTDIR/tests_CA_key.pem \ + -out $DESTDIR/tests_client_cert.pem -batch if [ $? -ne 0 ]; then exit 3 fi @@ -109,5 +173,7 @@ fi echo echo "Cleaning up" echo -(cd $DESTDIR; rm tests_server_req.pem tests_client_req.pem) +(cd $DESTDIR; rm -rf tests_server_req.pem tests_client_req.pem \ + ca.db.certs ca.db.index* ca.db.serial* ca.conf tests_CA_req.csr \ + tests_server_req.csr tests_CA_req_1.csr tests_client_req.csr) diff --git a/tests/data/ssl/tests_CA_cert.pem b/tests/data/ssl/tests_CA_cert.pem index b2032c0e..f25b1173 100644 --- a/tests/data/ssl/tests_CA_cert.pem +++ b/tests/data/ssl/tests_CA_cert.pem @@ -1,20 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDVzCCAj+gAwIBAgIJAIUsZ/vX9kOGMA0GCSqGSIb3DQEBBQUAMEIxJTAjBgNV -BAsMHE15U1FMQ29ubmVjdG9yUHl0aG9uIFJvb3QgQ0ExGTAXBgNVBAMMEE15Q29u -blB5IFJvb3QgQ0EwHhcNMTMwMzI2MTUzNTUyWhcNMjIwNDE0MTUzNTUyWjBCMSUw -IwYDVQQLDBxNeVNRTENvbm5lY3RvclB5dGhvbiBSb290IENBMRkwFwYDVQQDDBBN -eUNvbm5QeSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -qWcX9kD+b8c3hkPtPlIgwTsfGvhm/bJ64RHjCtQc2pi/fv9hlcryor8tWmdCCcw7 -ajg5n/QAIJ8crD5D0kheGEnWVI7dyVxZVfT3CiKuS+GBxuQP2ejJi4aDGh2McVv4 -aq1dXRqf2YWkM8PUjM0lzUD9MC9S4APtP6ux0TBhz5rv2ZWdg2EAjAl7Q56KM5m6 -odpF+Z1ExnfVpNzWnpvlYHJ+GhbVWb2F0NbqBTmz4OLEAxU/O2fo43dwVlHp+yNd -ib2V+VxeeyZmTt1CIeK6DStAiKdNLN5/N/+2FHZ9/XcA6qqxLFLeuTIySlPmuaX6 -u2C8tmOWp99TCUL+GZ2iBwIDAQABo1AwTjAdBgNVHQ4EFgQU1objOGh5rgtBTmjK -gPkN6SgXl64wHwYDVR0jBBgwFoAU1objOGh5rgtBTmjKgPkN6SgXl64wDAYDVR0T -BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAWgHZzUo8oGP7YxMn9YACdbipTRYU -IzGF+Cf0ueXktcEDbq7AIa6MsxXTp8pFOObvLiiecrMngYlqfHlYPL2HG+zOLDig -nmkO4pGwTqCDZHO4aYBdiVMlaxSpxMX9R/kFYRP1P4AGLOp66FirNO5iLNlTIjpf -PGebF+k0B1zUSUPsrZfa/d29XcJxBaw7aEOhARQYsymItasnTdcKvjZp1ahGnZYz -yCDtJjVbXK/4qEtiSA4qcV1HrNuHmhZEwWahntLqo++x3oLK7DrWfHwTX5gHMyv2 -DGTggnNfB8uzzNe3giT0j6ie9DJEnvv1hB0GpUToUNECusrKsYnWLdJkIA== +MIIDADCCAegCCQCZfblCD1izGzANBgkqhkiG9w0BAQsFADBCMSUwIwYDVQQLDBxN +eVNRTENvbm5lY3RvclB5dGhvbiBSb290IENBMRkwFwYDVQQDDBBNeUNvbm5QeSBS +b290IENBMB4XDTE3MDcxMjA5NDIyOFoXDTI2MDczMTA5NDIyOFowQjElMCMGA1UE +CwwcTXlTUUxDb25uZWN0b3JQeXRob24gUm9vdCBDQTEZMBcGA1UEAwwQTXlDb25u +UHkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOHbedXD +M/g7KuSURqBOHo49S/9lGarUt/YOkTDjKlNhqNQ4YrG3Au/PlBi4v4sE+4ILgrrc +19/Knj/+DI/jGIxmdheYiTacynDodfT4DVLZghI3bGqST+OG03KHtB0BMsovAdt+ +CiwDNU4M8OkM57D00ijEcSmVrQuEFoyrxm5EWE9E9F4Hc45TQKCP0ge8VVk1rzZi +1z+Yjrvqu/m6T6r0jF+WpDNc3ZqMQNHkenMSmNdZelCIbwwZh8G3zLnIOrOEEfwx +hNbMFJl1vdQjqZODrXmjCM34v0ZAjBfbwWOZGhOw+kFXFfIv6F46LMfabukgWLGU +5/JO7bvxCpS32hkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA2Fq6Ll8dnmrTJXTu +kC6qVomZ5J2zfjUWRGY1bOYCWzCwANnsgwhN5Q5AuSV4CwctXBhDYVunyyxTuJ9P +Usz9FppKgdwAR4XPQq+Eh57PMZAl5l4LGskwzTwu+Ud94D0s23yBXdFReZgPtGM3 +T03pGKf8nGtt692CFdnQ+EtSFOtzt+VaaZy6SSg0MAGaRRLRpfAa1uzzTrlmEQ9w +cUOemtIWKC1016gmtjU+N7suzqGPuDuVyfl6VqariGzpM5z10n5XFM9z9G7QCb2Q +/5LnLll3R2caaa6QVmeW1Dpew4lUhoQ12mUpEELsJPIsSVxRxAVEzCFAMldeNgfw +Fs9KxQ== -----END CERTIFICATE----- diff --git a/tests/data/ssl/tests_CA_cert_1.pem b/tests/data/ssl/tests_CA_cert_1.pem new file mode 100644 index 00000000..9fdff899 --- /dev/null +++ b/tests/data/ssl/tests_CA_cert_1.pem @@ -0,0 +1,19 @@ +-----BEGIN CERTIFICATE----- +MIIDADCCAegCCQClgkE5NPaTKTANBgkqhkiG9w0BAQsFADBCMSUwIwYDVQQLDBxN +eVNRTENvbm5lY3RvclB5dGhvbiBSb290IENBMRkwFwYDVQQDDBBNeUNvbm5QeSBS +b290IENBMB4XDTE3MDcxMjA5NDIyOVoXDTI2MDczMTA5NDIyOVowQjElMCMGA1UE +CwwcTXlTUUxDb25uZWN0b3JQeXRob24gUm9vdCBDQTEZMBcGA1UEAwwQTXlDb25u +UHkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMWRBnCR +Fnkqd+QhuJC26CWX34ChTeIeqat6WR3bpD79a9NbLnOZp9it/fw7s8AM9dngREeu +X8xgO5pduohW3fyk0my/ojrb6XQPZA1heDOrjYgC+0m0IGzXGzaHP5bU0G4BRdxQ +9eOHgzGKmV2SLxNcIxVKCFZqtxElfyLD3/asB7wcVRpgbZ/fhdYHxYnhgO8Q8p6c +uhuk7g0mF2akoVrP0j2jieqO9yvAFF/HD5pi9SRzoPFJTm3wmI8y0R+fvnvOjvM+ +uaW3iC2KgabOuvN4AfiNKPJW4nhQO2Wu3wuWKUxN0H6xgd8yGy0Azuthcr8+idk1 +iZrPfeTXpBTRXfUCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAasvgyREtD5whbYCt +ZRbWKgkYnnahYTVmejNurlNAuFj+JAuFFeDa20MVsPqfR0OFrYdmddFQqu9dFJPs +jmP+aqXnvE+HZPqtyM1uRrLuzM2/yaDFQ7SZAtJDTBllNCjEU/gi0PfruLZ2K2BQ +i0D1puzuNBL1VcfIBGkJWiE97bCRXOFs71TPgRP4F3+NQ665dUWcakvH/ChXx/x+ +br/c0ppBIKLhJECnvTCLpBiFoxlWBs5gGzKNXItIgbDaOUMQCeYnhXU1tRxIIlap +vjUNvBKJrHja2se9QXeehplyQgvQdOKloCrBaA+rNS7+cExRW2We7xYo4gc9ocGr +ll3Kqw== +-----END CERTIFICATE----- diff --git a/tests/data/ssl/tests_CA_key.pem b/tests/data/ssl/tests_CA_key.pem index bfccf214..90d1ab05 100644 --- a/tests/data/ssl/tests_CA_key.pem +++ b/tests/data/ssl/tests_CA_key.pem @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAqWcX9kD+b8c3hkPtPlIgwTsfGvhm/bJ64RHjCtQc2pi/fv9h -lcryor8tWmdCCcw7ajg5n/QAIJ8crD5D0kheGEnWVI7dyVxZVfT3CiKuS+GBxuQP -2ejJi4aDGh2McVv4aq1dXRqf2YWkM8PUjM0lzUD9MC9S4APtP6ux0TBhz5rv2ZWd -g2EAjAl7Q56KM5m6odpF+Z1ExnfVpNzWnpvlYHJ+GhbVWb2F0NbqBTmz4OLEAxU/ -O2fo43dwVlHp+yNdib2V+VxeeyZmTt1CIeK6DStAiKdNLN5/N/+2FHZ9/XcA6qqx -LFLeuTIySlPmuaX6u2C8tmOWp99TCUL+GZ2iBwIDAQABAoIBAAKXtFMtfXdieiQQ -6BGbGis652f3Q0RAtga5ylrBEkv6KHweFnU/bOU2vc/zYpxZxtMCV0duaY4WQU8V -iN4wA1il0KTsptJNGoTpQdqi2z4IDn9nwCJaoLME9P6yUxLtEGk5jAM/xBCFLhUo -uxkIjrqMcxOIteD9zmS6EPedoPGXbBFK2jBheArszZ/fiNhi7D2w03/s/Dhu14Px -5gjG5f+A/lS0l81RC5aeUt+wghA5y7TxY20fN1QU+XX2+Oft/HBq6xNloMlmPhzN -loi952HlWLZS31QJRgEhXZ3aJMHDQ3z9I4M6RfdngW2aJTbuJq/weFgN0Z8ogDLK -k/kuTfECgYEA2F5uRlUEW/0MKPrd10q5Ln3i3o0dQmW/QaPZ+SCjGan7xiC8Hm/2 -awkZIIaHQThkgRtxgsLOY+o7NVWkzTeLBlCKl12O0TQ3ZofwXdWPdI2b7adiFnEd -6/htxQd90En7BgNls39j9bK7UVDDilJrRDKvyNzQKwHP95QRxJellJkCgYEAyG5p -lB9j78CLWL9lZZgG7Xu/+DR63gceLLBAYclIfHzIb5B49TakasEgsT6JKbqmmwcC -VXs+SSw0b1dYaFajOL9ceMkOFEn9KV5bESKcPJ2/JxBW6e5j6i4eo+oQxTTiAn75 -UEcmPx8aBCtxhj4LFPKSwzi8mJNliRH2lLAYb58CgYEAlRrGLauq3GWOurLeq92v -ra1M6YcfkcEiQu7SaI8oNqhgfBHU8bjAfNSBP1vV24ksIZiy6aSrrEkfUkrZzh4n -rUtVpqfvopW0U/D8IP3p5S0tNmIyAzsinpnNs4jNF/vThDpVHJR+YzQvSAM7LZhM -mWvAndAlmG2gToH4mJzUm4kCgYBKFk4ee4/0Uobvsifn6s88v46RT8zO/3CO8kOK -Id4Sbgmk+5FKiv0xnNvZyJTpAN6O1YNuV5UJdTaYpX+/aa8BzfJ/j0oOA995iDA/ -YDzCR0keRnLqG72BFbUrv9ydGNQmOgssOnCPyo5SVkCrb4mnH5dSZEmKWImipiow -gfs2XwKBgQDSjbMlJme1fwNEt7EvwLJ6Zd4wSLs70IWvcX3k0g4PMhSj9J1zXRP+ -wpOZCa4GW2y21t5dpHG2B+a9Sd+z0/NMSSBZ8SUfrbZza3gC6cJyPoBYy7w/PFx3 -CgHcWRVI3n6+dkMYzpu2J1zzB2y0aiBE4icDq5+Uq7kO2OIytPVnHA== +MIIEogIBAAKCAQEA4dt51cMz+Dsq5JRGoE4ejj1L/2UZqtS39g6RMOMqU2Go1Dhi +sbcC78+UGLi/iwT7gguCutzX38qeP/4Mj+MYjGZ2F5iJNpzKcOh19PgNUtmCEjds +apJP44bTcoe0HQEyyi8B234KLAM1Tgzw6QznsPTSKMRxKZWtC4QWjKvGbkRYT0T0 +XgdzjlNAoI/SB7xVWTWvNmLXP5iOu+q7+bpPqvSMX5akM1zdmoxA0eR6cxKY11l6 +UIhvDBmHwbfMucg6s4QR/DGE1swUmXW91COpk4OteaMIzfi/RkCMF9vBY5kaE7D6 +QVcV8i/oXjosx9pu6SBYsZTn8k7tu/EKlLfaGQIDAQABAoIBAD3W8gztXZVh3eSo +FI5f1U3sypoq/FQh2hys8GQKTtR1sNwqdBtkmJFArLP4IbnWq2Z38FtpjFHiEGJF +FPtwmpAWnc7oHOmvFF7Fx0ZDhKJim5KRSkYDuYv6pnp9XXtzkIx7Qm7um6phVn8A +XBXzSpzQ65nt724LZU355JKvla0q1bXfj88zS8JX7jsbmC0+nDCZRLcnenKeWtBS +Kn4mjIZSYNIo45lybJCPn/jyE0ma7U8JTipjNDsVGW7yxb4yVuDIfJDKd0kv72RF +QrhTeuRTm5189m8YWD+2H0m+RLIxTCDelRP4lO2p9KCnj3Kmz70BngPlznEXynGx +Uz3eYAECgYEA8U1V4LbUyw9I+qyF47v58ES+RdCnJAk4g18fmFxLz4VZ6QOGxdkP +RwivpR5zSgpzX5dkQCXoSWhIFAElv7n+hmT7su/xxpTMddcvUEOGA5tLlbwjDOTU +HNotzgi+0qpG+NocaSuhfSItfUksz4M9Tj6MxgezQFcouhNCLtE27JkCgYEA751O +wM9xRmAr7ytAyCnhE3x6Tag2e/Ey/6Asy/TXsWH++R9u2+wxbPuaZ05KjUKkJZdK +EV5O53ZCm4bfmB0BNvHAcsZMo5zcAJ/4CHpFfelnOv3c1QwzBkmg2iM8Oii+PNBs +4LaOUogfJab35+hrVOJ7cqCyQZZESEu5oXQLSYECgYBjDCCFFecw1rxZEPoAaceF +RWJo2+XPl+1Xl3Mroi8IJq+qQuVOTvPDb6BRgbdHHBURlt3yqty3TRPRCkuJcHo2 +hjr+zxkKL0fh0ws7wgu/bT5QXyJwB3m9whztJo/Vf0mUmkrxLJSj/aR4edHn9/Hx +LSGxo7WDYoN4JbGT8BLAeQKBgB+uQ9BYXRi59HUd2eXdK6Yg6ibEW9fNTznfGq0o +xS/tzgFwN38aXnqTVZndDxxYOE3EEAX12ybdSvc3QO7ivttd4V0LfOyQ+8GVZPzx +9agtKPnywLTmdQSazYqp5/eklWqDADJB0NV2q++VgOeHolFJ1JqWRptHW+XXJUcE +ic2BAoGAH+iwDqyAHX92TcH+jzbt91Bil2/tj7s9NaXBaOFlM46mHSMwiYPjaYwf +2NGJhsFdICV6kA2GiAKyDr8zqwl0lGYwaTpxzKUf1VZaGrKBuNcGuUaQJLkTbK59 +DdHDUNdo8BXPn3qsLbV3aLlXSCp0cirbpJfy7W0pYvLEfrX8lGY= -----END RSA PRIVATE KEY----- diff --git a/tests/data/ssl/tests_CA_key_1.pem b/tests/data/ssl/tests_CA_key_1.pem new file mode 100644 index 00000000..afa459de --- /dev/null +++ b/tests/data/ssl/tests_CA_key_1.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAxZEGcJEWeSp35CG4kLboJZffgKFN4h6pq3pZHdukPv1r01su +c5mn2K39/DuzwAz12eBER65fzGA7ml26iFbd/KTSbL+iOtvpdA9kDWF4M6uNiAL7 +SbQgbNcbNoc/ltTQbgFF3FD144eDMYqZXZIvE1wjFUoIVmq3ESV/IsPf9qwHvBxV +GmBtn9+F1gfFieGA7xDynpy6G6TuDSYXZqShWs/SPaOJ6o73K8AUX8cPmmL1JHOg +8UlObfCYjzLRH5++e86O8z65pbeILYqBps6683gB+I0o8lbieFA7Za7fC5YpTE3Q +frGB3zIbLQDO62Fyvz6J2TWJms995NekFNFd9QIDAQABAoIBAQC0GmEkfR9flbd1 +4MfAJP28R5cYS/QUDp/eEsrqzTANvDhvlM/j0k+Q2AyRxFs42JfG5wtXzT7HsXKk +Zo2FfKshhZ/OQ2RBA/juNJmhGRnbAKklNJKfvfVRQ0crjmAJwDfCEKb/EU8W/JI8 +t3zYMEt5+qSA49x16xK4LtaXerjQxKce7gNU+um22JTR+27g/HATSGG0LFHWmJ6h +DroOK1Md1KSvZ+Pc3ucfNV65ZueLrVmk9DwKl27Ul7wLe+WqmANjv1wzyLX3nmTL +B+6JwxdGlnaIw1T0JZV+9RrYMcUqeOgOqRfonVlQF9rDmdTQl1Kjsmxd+LmQEF+x +4znvh2QBAoGBAPXXR8Z7usgJBWSJxioomiRLfdSz4kelTYshGIv0GABXvEfjrhkk +Ain/p7QVo95A+xKf2LrXTh25NYvq783cZkVgY1ftE643G/1HN4P5XguUwa1EBMyC +0gwluys4RMkZOstuXaJk8+xDqDvGx8EFX6X/f+cQ0j7Dj0TO2BVjPnhJAoGBAM27 +DkY1WQDVgV1PejuvzJFct4AbwbBKSBNIjPLZF0AHtIGyEm1TxSPW0pd8KVvp1spx +n4585bDcMU+twekuqqxFOmaoxPyfMoZ4tkrMoKwJo9UNIy1wxr/z7NhzSmw109B3 +Kb3cob25xKZgpl7A7t0WYbzm8YU3MO9xlLEHrbBNAoGANNbOoISbgr8dn5xVMV6E +suRe6Ua4jfmjjxHP+tS+C+TPnQv8sX6h0HEYlIZKMEz7KeedZ5s7OPxD3Azk+fQz +LxomgBF+t2U06N1Tu1PvuMGCV0FVXreHegDqF8ICVs7LakoQagUUwGVSVXbGHGCR +TFZ8ISfmaIMT2hAzNXWdSbECgYEAyPS+rLXPipEDHDJWI5dFK3h1hh2WxKzKWouz +okOMAm+EUmuutDvvhWKBspcFj1KLDJSQVo6JjoiHYl1H3I5JCJ1WvpB8Wobmw5OF +/OqEx4djEOkUQ361pSqPX56+Q5UQocDEdUDefITJIfumh0fOCweh0POFV6rhkgJQ +S9xEPMECgYEAzevAAJ2PqnEfw5/Nm2ho4gzRXPtk495kEdYHI20ZZF8l/3LUU5xe +j1dDIFeQTYJiAxmdomZssYqPy90zRTelx+MAhHRlZyaEyLWs/AFaW9m89+T/Fan9 +x4AUeJ5xgyEdQKJ9GlPbWFFG90oK9AKsKgH9J7yZxGn4sTMWzakTmLQ= +-----END RSA PRIVATE KEY----- diff --git a/tests/data/ssl/tests_client_cert.pem b/tests/data/ssl/tests_client_cert.pem index 82fcf77f..16a22b74 100644 --- a/tests/data/ssl/tests_client_cert.pem +++ b/tests/data/ssl/tests_client_cert.pem @@ -1,18 +1,67 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 2 (0x2) + Signature Algorithm: md5WithRSAEncryption + Issuer: OU=MySQLConnectorPython Root CA, CN=MyConnPy Root CA + Validity + Not Before: Jul 12 09:42:29 2017 GMT + Not After : Jul 12 09:42:29 2018 GMT + Subject: OU=MySQLConnectorPython Client Cert, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e9:3c:0c:d4:ef:ee:41:5f:f6:d3:ca:81:3c:08: + 59:50:37:c9:a4:79:8d:65:71:41:72:93:6a:a3:1b: + 87:db:38:98:7a:4a:f9:3b:95:73:3a:4a:42:c5:56: + c8:2d:14:c5:11:2c:fe:ca:14:64:87:3c:49:db:5d: + a1:49:0f:de:b8:3d:33:49:48:8d:b6:13:66:07:b7: + 0c:9a:bb:bd:01:ab:54:8c:f1:08:e5:3a:f7:4e:16: + b9:7d:bc:2f:51:ca:7d:94:b9:b1:09:23:30:e6:6e: + 2b:e8:0a:05:07:ac:1c:20:b3:25:6f:61:89:8a:53: + 08:aa:46:31:28:df:63:04:13:12:44:9e:21:e0:15: + 87:81:33:34:6d:71:90:40:10:4c:ab:3a:c7:10:5c: + 3a:c4:72:6b:f9:4b:74:4f:f6:d7:4f:19:fb:60:83: + 88:d2:8e:d8:45:01:40:4e:9c:7a:68:4c:d7:cc:7a: + 48:a6:20:6b:35:a5:c1:bc:69:65:67:9c:07:06:7f: + 6a:9a:62:9b:42:93:72:af:10:78:04:d7:5f:df:68: + 34:a6:ec:e7:4b:55:84:84:e0:1b:4b:e8:a3:3f:21: + b9:41:a2:5e:d5:03:39:23:94:22:42:b0:44:18:4a: + 0c:29:87:2e:45:58:01:eb:f5:27:94:08:70:bb:c1: + 89:1f + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 8d:da:56:ae:94:99:f6:6f:fb:bb:ce:92:36:11:cb:d3:1c:a9: + 8c:1f:98:fd:37:82:93:cc:50:91:bc:5f:41:86:ed:21:15:e2: + 1f:6b:c9:98:33:d1:f2:a0:87:a2:38:ac:b2:4b:36:ce:66:e8: + 9e:14:a9:9e:67:64:d3:01:17:5a:c4:3a:20:9b:a5:0e:08:92: + d7:b5:30:81:35:8e:fe:81:59:9b:f5:d2:4e:49:81:ff:c9:35: + b3:fe:25:de:da:4e:51:50:24:10:5a:17:29:9c:d0:5b:67:dd: + 11:d4:ed:4b:c6:3a:1b:bb:61:44:9a:8a:e4:81:0d:de:0d:8b: + b9:ee:67:d2:3c:49:1a:cb:e1:77:21:10:9c:fa:2e:40:42:2f: + d9:f6:79:b7:2b:13:7f:13:51:87:58:5c:68:9d:36:a6:e2:15: + 13:29:07:3a:41:f3:99:ed:c3:41:af:4a:41:88:7f:a1:bd:30: + d4:9e:5b:fd:d9:6d:dc:d7:f8:85:3e:95:49:d2:76:a9:ba:4e: + e0:f8:37:f7:87:5d:00:a6:55:a3:f3:46:00:98:51:37:a8:f3: + 8c:02:02:ef:26:85:b8:80:93:0c:bc:98:c7:80:2d:bf:55:41: + 4a:67:97:a2:6a:e2:99:3a:2c:5b:28:4d:03:a9:b0:c1:89:f1: + 0d:7a:1c:f4 -----BEGIN CERTIFICATE----- -MIIC9TCCAd0CAQEwDQYJKoZIhvcNAQEFBQAwQjElMCMGA1UECwwcTXlTUUxDb25u +MIIC9TCCAd0CAQIwDQYJKoZIhvcNAQEEBQAwQjElMCMGA1UECwwcTXlTUUxDb25u ZWN0b3JQeXRob24gUm9vdCBDQTEZMBcGA1UEAwwQTXlDb25uUHkgUm9vdCBDQTAe -Fw0xMzAzMjYxNTM1NTJaFw0yMjA0MTQxNTM1NTJaMD8xKTAnBgNVBAsMIE15U1FM +Fw0xNzA3MTIwOTQyMjlaFw0xODA3MTIwOTQyMjlaMD8xKTAnBgNVBAsMIE15U1FM Q29ubmVjdG9yUHl0aG9uIENsaWVudCBDZXJ0MRIwEAYDVQQDDAlsb2NhbGhvc3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXbL7sr/k/W4LwwzTKJj5i -1QtcZL0tMyBhAwuI7XQVyJBVvY7dRUM+G30ADOcUw5DscYbkkVu3L2NtsnmuyB8o -0Y5bbHpTv4xTrVfsQuDkMLe+/LwFfL7XrY1Bm13xdEn345b6edfvhre7eatCgIaG -IKfFr5JDv5oN4faGEJpqYahE/WdxM7zv6xb7Wx+yqLlezldU34VcLcghi8zfDkxb -Fb4cZSgko/9RT7lTUGBJSSgITnq3Re0qANah7UbqFkTM2wfltoXGerbWMYuzOfQo -5r0FiScjuvACkDALHAdUbX4UbXasArqpGovyVqHp4OWu3FWRfcCUnxAxfj3G3x79 -AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFi+U6Fyc1L0qCTCiMvUMQuXacnOMH4q -rHm7qDKkHHcMMGsspNXvLcVKEwJrX3dhP3dZ52eKyFsOjuTkO9eU5H8V2alO8iGD -Zb6vHT/pQRInoc39SVDFx1QnJ7RlC2Z99xzncHMQChSlDCC+Lft/K5am7vXFwQ3e -icfLqmR5hz6nc+opnPc7WbQu/cc7PesP5uroyKScYoqAiDJ2cKQJQFPM4Cvt/KZ3 -22H/yCyQNkplIcrlQRF+l+sInNlJZr36INF0o91GcucyuLQzOXUn0L5eAyFzA9RQ -8xkVztqRN++CgbGAhqIt8ERBtxBvCpNxuFpgm4dPKCTLm+r7fJcKwDI= +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpPAzU7+5BX/bTyoE8CFlQ +N8mkeY1lcUFyk2qjG4fbOJh6Svk7lXM6SkLFVsgtFMURLP7KFGSHPEnbXaFJD964 +PTNJSI22E2YHtwyau70Bq1SM8QjlOvdOFrl9vC9Ryn2UubEJIzDmbivoCgUHrBwg +syVvYYmKUwiqRjEo32MEExJEniHgFYeBMzRtcZBAEEyrOscQXDrEcmv5S3RP9tdP +Gftgg4jSjthFAUBOnHpoTNfMekimIGs1pcG8aWVnnAcGf2qaYptCk3KvEHgE11/f +aDSm7OdLVYSE4BtL6KM/IblBol7VAzkjlCJCsEQYSgwphy5FWAHr9SeUCHC7wYkf +AgMBAAEwDQYJKoZIhvcNAQEEBQADggEBAI3aVq6UmfZv+7vOkjYRy9McqYwfmP03 +gpPMUJG8X0GG7SEV4h9ryZgz0fKgh6I4rLJLNs5m6J4UqZ5nZNMBF1rEOiCbpQ4I +kte1MIE1jv6BWZv10k5Jgf/JNbP+Jd7aTlFQJBBaFymc0Ftn3RHU7UvGOhu7YUSa +iuSBDd4Ni7nuZ9I8SRrL4XchEJz6LkBCL9n2ebcrE38TUYdYXGidNqbiFRMpBzpB +85ntw0GvSkGIf6G9MNSeW/3ZbdzX+IU+lUnSdqm6TuD4N/eHXQCmVaPzRgCYUTeo +84wCAu8mhbiAkwy8mMeALb9VQUpnl6Jq4pk6LFsoTQOpsMGJ8Q16HPQ= -----END CERTIFICATE----- diff --git a/tests/data/ssl/tests_client_key.pem b/tests/data/ssl/tests_client_key.pem index 3c2b5c96..13683dd5 100644 --- a/tests/data/ssl/tests_client_key.pem +++ b/tests/data/ssl/tests_client_key.pem @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA12y+7K/5P1uC8MM0yiY+YtULXGS9LTMgYQMLiO10FciQVb2O -3UVDPht9AAznFMOQ7HGG5JFbty9jbbJ5rsgfKNGOW2x6U7+MU61X7ELg5DC3vvy8 -BXy+162NQZtd8XRJ9+OW+nnX74a3u3mrQoCGhiCnxa+SQ7+aDeH2hhCaamGoRP1n -cTO87+sW+1sfsqi5Xs5XVN+FXC3IIYvM3w5MWxW+HGUoJKP/UU+5U1BgSUkoCE56 -t0XtKgDWoe1G6hZEzNsH5baFxnq21jGLszn0KOa9BYknI7rwApAwCxwHVG1+FG12 -rAK6qRqL8lah6eDlrtxVkX3AlJ8QMX49xt8e/QIDAQABAoIBAQCjSd5+cfSvvaHG -9XAyOkLXjz0JT6LFfBdy8Wfw5mwzhs9A7mo39qQ9k4BwZVdTOdnEH1lsL3IhrF3l -bH8nqLFVs2IAkn02td6cHqyifR8SWIsuzUuHrULLINYNgML4nnji2TQ7r9epy6fB -Bzx1MA7H5EDHa4mmqLkRBNJkVHl3YCGM25tXyhixC5MsNdSpTwLMvv/RVLqsHtH6 -WZ3P8VZi/iOk28TQwLcFTQz4g6RM3jO/1O9tXhob9g1iUoLNd3mLR3+sdkhHf5bU -ttEzxvfVl4Fe0463J4I/JeofGtDBkWgR4UI5ZVfC0xLvmVA4J3cxgUeAKsIwuqQT -9Gi4MDOBAoGBAP6MGCwZUmVqoaqaNF/XckwieJctYLUxhf/KA9S3pq2Y4PPFb7FO -srqn90c2Qb4o13iZzak9rPKUVKwcL+VYknrVGb1ALyWySI7WEaUzsXLIGF2w010l -TNUyL82NynGUx3/4gxvJf/K9weVkTU7KK2tfdB+ridv1ZcSn9bETMvVJAoGBANin -fdqLh8tFMqTsc+bMvlogzns9y+MluJeqz+On706sVR6XsEF8LtzcnHAwOYFef6h5 -cgrKGzfWaz88tNdgB82p/smLQcz4ouFAzTBX3y/+LG/+ybbkR9a2sO+gHA1eAukB -Ia5q/t5jI0XiTa4lVoj2IJK7/hBjIYYBLA2TKQAVAoGBAPP6k7CxFKjga9R5uXmj -p4oSAEPm2qrRrP5fQwzAeqIpxnPg6g2owObn17wJ5Tm/K8gMo3N0CjD4u6+71Kyf -GMdjOiiLPKWFHMbLqF4QDiVWZQRoWC8PcXVnhSogncoAMLgYGpKnsFuaRh745KCA -Zt2jwEoawShzLfgwhO4U2OMBAoGAULfuctsjZ79LRBj4gZfsn6WzaEU4zlNCd/di -5t2tkjEwsWowd+VtjEoBWucMtb9gboN40r5D78TKRlA2zDtyDNT2IV7p0BUeki/T -gtxqQfY/1iYmPybEASIlv9F2QiCxkuAiDVq9xFtJTAMpj+VHXVXeAu1Zlf9pAQU0 -xYX7c5UCgYA8Iux1dO7bakTlqwFUQCMM5IlzJJVT90Z8JQOCFk6a7bzTdOkyxYg2 -BxiGjiFhNer6UshTNZj2svdUvVh9yH/iRGEP6eQAZR1AXIr1YazNmaG7tjIEZ4Yw -zx8gdGTIDYBDChFQmJIB9Y7iNF8bu8JmyVuo2SJHhIVyXN/cM9T6gg== +MIIEpAIBAAKCAQEA6TwM1O/uQV/208qBPAhZUDfJpHmNZXFBcpNqoxuH2ziYekr5 +O5VzOkpCxVbILRTFESz+yhRkhzxJ212hSQ/euD0zSUiNthNmB7cMmru9AatUjPEI +5Tr3Tha5fbwvUcp9lLmxCSMw5m4r6AoFB6wcILMlb2GJilMIqkYxKN9jBBMSRJ4h +4BWHgTM0bXGQQBBMqzrHEFw6xHJr+Ut0T/bXTxn7YIOI0o7YRQFATpx6aEzXzHpI +piBrNaXBvGllZ5wHBn9qmmKbQpNyrxB4BNdf32g0puznS1WEhOAbS+ijPyG5QaJe +1QM5I5QiQrBEGEoMKYcuRVgB6/UnlAhwu8GJHwIDAQABAoIBAQDS0x0mPds37O7I +cvxur31MLaFvsxBE6iMm1mpGFdSwLHBn2u1/FpCZ2BaTGubHGUcpR2rob5aPR8fb +Kr9ns5i3IVsCmzq9ortPrf8OvzUSFTTQUfCghLSXOaNiLID5hfgOP+vvPogtQtkd +XjE9xi2GwWjNTXVuO7BRejFlqMdwHbL0nFb3V4vatKxzyfZM/7bxyWHKxKQfK8kf +qVY2nbz1Xn/5uZFoGBjYCXbSIwv7MRuxxFlsGxKc7pgSltgvYskrmCLCAY4W9BN/ +PNM/WUp3Q+HS/DqGDUSdlBAVLlL/7t+uHv5xbd6QFYEnPXq9B4Tzhg84TjPIw/Zu +FYHHQxaBAoGBAP8LYK2h7nortAwvr/rCDhBimBN+PPSk1/2Vl17RZJq969zSElbA +6BTPDYEjIkf+YC0l53y+7f5PM3ud5R3Lgur64UggBqV+8MwpuDZ60g8CKhJ2IPyM +agVxIuvOv8D+FIgz4Fmi4Me+P31+eUf9bBeqxQh7/CsoLdEwbNHgNUGZAoGBAOob +wPtvWpWAFhB0SCkmhHucm5B2ioTI3UprpOqXeuKz+ns9rVYEDvUJCvLxJcg38nHf +Tfxnkzr6sy1TlpcqcxiYYtolS5t/GxYIioviQvLT/BkIvKWyeaRMS2vy2NnB0j/U +IiSnYax8pg20SInWD3yxUrZwjm78gtr2AAQYnUN3AoGAE9fjxr6hmlnKIWSYcY8l +nvq80E9zGKm2sGEyLMtn425BaqXhjWRm6i+N4m1EXouZGgon75m/VJj+7XBEgkPy +RKwOWRk8yyWMQKZCUeLOcyJ8+YC9YkjeetvplqU4YCCkolA+9Vpp2MChmfb8IrDB +9zlvKRDUdtsibXMyFEY4fokCgYEA6Y/W8QMfdJfda30XoTZ0Zn7QFUiu2dssK9tJ +JWMLjrHQ7LOUA4T5By6GZeqAr0hh8Ym/3FnZYbZMnKQQUbBgM+GUfd9Hl1MwSsMq +tnR+JpWnpbI5w3ZUNb6IYKJgBqCAin2xsq/rmpKheHqtBBc0TEr9IlcZQ1FZm+pi +CbQk8fECgYAOEXqVzJE6UtDw7/1vR0ZtrBFyI2CzKAuG5ZoCpFfjDTFpG/ULfKXq +9nWy335MtT8mgvsQCJ1jTlxkqFXaVK6SUBdGezz006n0NosAnaQKO/1OPRgFrxlM +b3b/+9lYrIzTQbfNKE+HGalmV5mnZ5fa+CczyA6F0ZW+BK2HpzySpA== -----END RSA PRIVATE KEY----- diff --git a/tests/data/ssl/tests_expired_server_cert.pem b/tests/data/ssl/tests_expired_server_cert.pem new file mode 100644 index 00000000..cfba3025 --- /dev/null +++ b/tests/data/ssl/tests_expired_server_cert.pem @@ -0,0 +1,68 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 2 (0x2) + Signature Algorithm: md5WithRSAEncryption + Issuer: OU=MySQLConnectorPython Root CA, CN=MyConnPy Root CA + Validity + Not Before: Aug 15 08:00:00 2012 GMT + Not After : Aug 15 09:00:00 2012 GMT + Subject: OU=MySQLConnectorPython Expired Server Cert, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:df:5a:5b:72:42:5f:46:e5:bb:6c:e5:76:2e:6f: + fd:b8:10:2f:04:10:55:43:0c:bf:af:f1:eb:f0:4f: + 6f:6b:d9:61:9f:2a:39:35:2d:cc:0c:05:5c:88:cc: + 98:a3:5c:78:9e:8c:6b:ba:33:3f:f2:46:96:f2:bb: + 78:63:ca:bd:72:2c:70:34:56:8b:12:e5:e9:ff:82: + d5:50:bb:28:c2:99:83:af:3f:f1:67:77:b4:41:66: + 79:ee:f7:3a:93:8c:55:da:c3:d5:3a:44:40:82:e8: + fa:4c:11:a7:13:20:31:78:48:1d:2e:95:8c:0f:4c: + ea:ac:96:9d:9e:2a:37:c5:7a:42:f2:b1:8f:9b:15: + 69:9d:1c:19:26:69:84:a9:c6:9e:08:65:c0:7c:bf: + 72:a7:b0:ae:60:78:ad:7d:ea:0b:ed:ff:45:fc:24: + 56:f5:c6:f4:b5:00:0f:90:76:3e:52:08:ec:06:c4: + 30:51:66:60:f9:c6:0b:b9:f2:96:6a:c2:39:b8:b7: + 48:b8:3f:02:26:b5:95:f8:55:8d:d3:23:f1:dc:d0: + ab:2c:05:3b:b5:99:4d:9a:81:78:27:60:0d:da:2e: + 23:e8:38:26:0b:6d:6c:f6:fd:a7:42:95:4c:d2:a5: + 7c:05:13:21:7b:c7:6d:ca:f1:e3:3d:ad:d4:32:79: + 5a:d3 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 36:e4:ba:6c:3b:99:29:ba:33:8b:da:ef:07:b8:7e:f6:07:b6: + 79:7b:c7:b2:0c:0c:48:ff:52:25:05:34:f4:d9:f6:0a:0c:77: + 10:a7:e5:40:f4:47:bf:4c:06:7b:8a:22:53:5a:91:dd:75:32: + d3:58:97:4f:d4:01:e8:b5:8d:ca:52:23:7f:72:1b:e2:c5:9a: + 89:a4:be:e4:17:9b:fa:1f:c0:26:93:5f:c2:d2:1b:e0:c2:9e: + 36:d1:3f:95:bd:6f:af:cd:f3:8f:6a:c6:5c:b0:6b:ae:07:60: + 59:be:fa:fd:f8:43:5b:20:38:02:b8:a6:f5:eb:35:be:46:55: + 7b:84:9f:e5:cb:5d:6b:af:2a:28:d1:af:32:1f:e3:71:d8:f8: + 96:4a:f1:88:f3:10:27:ed:c5:a2:65:f4:b5:2b:58:77:93:25: + e7:36:e1:4b:cb:18:10:cd:81:fc:80:e6:24:0f:27:4c:33:22: + af:36:88:ee:f8:0d:ef:ff:47:74:87:50:e8:ea:03:da:71:a1: + 65:fd:00:8c:c8:a8:27:fa:e0:40:43:60:8f:aa:1f:25:4f:05: + d7:a5:fe:9b:a3:82:90:0b:50:bf:bd:62:a3:9e:14:20:80:18: + 8b:8c:5e:f7:97:b8:b7:a5:63:d8:22:1a:98:6c:32:da:38:7b: + fc:e6:2c:f3 +-----BEGIN CERTIFICATE----- +MIIC/TCCAeUCAQIwDQYJKoZIhvcNAQEEBQAwQjElMCMGA1UECwwcTXlTUUxDb25u +ZWN0b3JQeXRob24gUm9vdCBDQTEZMBcGA1UEAwwQTXlDb25uUHkgUm9vdCBDQTAe +Fw0xMjA4MTUwODAwMDBaFw0xMjA4MTUwOTAwMDBaMEcxMTAvBgNVBAsMKE15U1FM +Q29ubmVjdG9yUHl0aG9uIEV4cGlyZWQgU2VydmVyIENlcnQxEjAQBgNVBAMMCWxv +Y2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN9aW3JCX0bl +u2zldi5v/bgQLwQQVUMMv6/x6/BPb2vZYZ8qOTUtzAwFXIjMmKNceJ6Ma7ozP/JG +lvK7eGPKvXIscDRWixLl6f+C1VC7KMKZg68/8Wd3tEFmee73OpOMVdrD1TpEQILo ++kwRpxMgMXhIHS6VjA9M6qyWnZ4qN8V6QvKxj5sVaZ0cGSZphKnGnghlwHy/cqew +rmB4rX3qC+3/RfwkVvXG9LUAD5B2PlII7AbEMFFmYPnGC7nylmrCObi3SLg/Aia1 +lfhVjdMj8dzQqywFO7WZTZqBeCdgDdouI+g4JgttbPb9p0KVTNKlfAUTIXvHbcrx +4z2t1DJ5WtMCAwEAATANBgkqhkiG9w0BAQQFAAOCAQEANuS6bDuZKbozi9rvB7h+ +9ge2eXvHsgwMSP9SJQU09Nn2Cgx3EKflQPRHv0wGe4oiU1qR3XUy01iXT9QB6LWN +ylIjf3Ib4sWaiaS+5Beb+h/AJpNfwtIb4MKeNtE/lb1vr83zj2rGXLBrrgdgWb76 +/fhDWyA4Arim9es1vkZVe4Sf5ctda68qKNGvMh/jcdj4lkrxiPMQJ+3FomX0tStY +d5Ml5zbhS8sYEM2B/IDmJA8nTDMirzaI7vgN7/9HdIdQ6OoD2nGhZf0AjMioJ/rg +QENgj6ofJU8F16X+m6OCkAtQv71io54UIIAYi4xe95e4t6Vj2CIamGwy2jh7/OYs +8w== +-----END CERTIFICATE----- diff --git a/tests/data/ssl/tests_expired_server_key.pem b/tests/data/ssl/tests_expired_server_key.pem new file mode 100644 index 00000000..6b68fe2d --- /dev/null +++ b/tests/data/ssl/tests_expired_server_key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA31pbckJfRuW7bOV2Lm/9uBAvBBBVQwy/r/Hr8E9va9lhnyo5 +NS3MDAVciMyYo1x4noxrujM/8kaW8rt4Y8q9cixwNFaLEuXp/4LVULsowpmDrz/x +Z3e0QWZ57vc6k4xV2sPVOkRAguj6TBGnEyAxeEgdLpWMD0zqrJadnio3xXpC8rGP +mxVpnRwZJmmEqcaeCGXAfL9yp7CuYHitfeoL7f9F/CRW9cb0tQAPkHY+UgjsBsQw +UWZg+cYLufKWasI5uLdIuD8CJrWV+FWN0yPx3NCrLAU7tZlNmoF4J2AN2i4j6Dgm +C21s9v2nQpVM0qV8BRMhe8dtyvHjPa3UMnla0wIDAQABAoIBAC7IP0U0b75q2hIa +EeHyJSOLiD2Cqkkr/2577p5cFQty8caj0m24FPgjm1kv+XymHsGeyeWrXGaDsJRQ +/gtw6LNkaXAc/G5N5/BT2Bhby1LPUsy/SPISGZhlPX73G7bR+x2iTSQyLYz9/Yc3 +X1ZbNOFrwWkDe92sj67ssUDyuNHMwLpw35/OWX2W7YsGzi7j2zbZdmhp2c3E0/bD +NL2217BsPMLD1/f0og6Ix9kvSt+2Z3XW6RlhP7LDNDRI7F8oRRVvYgQGHBHibvlG +I4n07lycLo0dPsc08PcUvJ5UyhI7VYk/MZACLNhrjgPxYz1HdL7deVoQbW6z4q19 +g1JjI2kCgYEA+eOIvGkz9wga74VVKMZIqXPaMmccNkwbzUb7Ay1CM50pdYLk6E6R +LdEIx0/qQC8Zpw47NhSFzZT8sakHqmK7VIJRdMJWSTKu/4QMooigRasFJXPWwJVa +LsTE1gg3LGL+RkuoQNIlPle6nTGcCLGfnB8Js1GA3/SunFQCoJr+stcCgYEA5NCx +BSmZz07Rso3FWzRMjR52m2JDWvMm4+eU/HxXGrPdYfBQEowxzesORRBRIlp8Z5ki +929ayJ5qONLjMFx1l/QguT9BNkbzO3gpbH3/G187wFQ0v8jXmDRjU7ftgyL6PAD+ +eJsj39+TfA+Hua6m6VkLH5XUpy3Vl8nBkM2cFGUCgYEAl1zEiWOsD1lAf48i2zTn +9IRxSZB9XUJSoM/64Zy7eeobn8tufmyAseDpUVlNyhz9i9wp74MU3Ub+nVqGgyWU +1Qau8mt4upPRvoIs6RKbCjgiQOJe1X5iBuw3UnHdgaxg2xGe08y2tIGNTwQqwHVe ++cEvLggTaRSb46NbiA76cjcCgYBGkWZG5VGecfySSM75FeQWEbMasO98+UihOSbl +x6NFhPtd3TOUxNAHZdr8yc97/NQpTz1NenZRMSopZEDVBW7u8ke1WiDOkIsraB++ +ag1nb7OJ2W57R4HWWzHW+/6wVvU91ECnCZHC1b0yoceGKKsphGC92QPAm44oRf0A +n6jnUQKBgD0MqIjngDIRMwGpkXpsJJDt9/dw6izz3sWhBDkBLKCt63nwT3pykDDF +qJ8dq9TSGwO6H1c/obKdFlx53PBDUpZV9txI8ScF2YNlfs3Ts4+oElkU/jCMJPKi +M73I0Jgg+GwToDcjC4d7oREIBlfXjBLBjCcHx1315NMUW42QkrNo +-----END RSA PRIVATE KEY----- diff --git a/tests/data/ssl/tests_server_cert.pem b/tests/data/ssl/tests_server_cert.pem index dc7938c7..6a725692 100644 --- a/tests/data/ssl/tests_server_cert.pem +++ b/tests/data/ssl/tests_server_cert.pem @@ -1,18 +1,67 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: md5WithRSAEncryption + Issuer: OU=MySQLConnectorPython Root CA, CN=MyConnPy Root CA + Validity + Not Before: Jul 12 09:42:28 2017 GMT + Not After : Jul 12 09:42:28 2018 GMT + Subject: OU=MySQLConnectorPython Server Cert, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:ea:77:37:62:c6:d7:fb:96:17:d6:87:11:f3:dd: + 4e:ee:28:34:73:7f:96:c1:06:4f:2d:6e:e9:02:8c: + b0:82:49:5f:43:7b:6b:06:b9:71:45:72:1a:d8:c6: + 24:00:7c:8d:cf:6d:0f:61:e5:62:2b:56:68:a8:9f: + 94:87:7a:f6:9d:04:99:ed:15:d2:af:f3:f3:f7:72: + 3b:cc:15:fa:53:52:6e:7d:3b:1d:70:f4:f1:9f:04: + f0:ce:2f:38:46:cd:30:07:01:46:07:f9:c0:c3:32: + 0f:24:35:52:92:d4:ed:36:c3:69:a2:91:b5:48:81: + 2a:34:5a:b0:bb:2d:eb:d4:65:b9:e5:23:16:e1:0c: + 24:9c:27:29:38:8b:77:f1:21:25:90:8c:19:f3:e1: + a5:f2:98:63:90:c1:da:bb:19:6c:b0:b4:23:76:43: + 09:c3:0b:13:c7:d8:a0:8b:70:68:3c:49:e0:36:29: + c4:6e:90:59:fa:85:64:d1:a3:5e:8f:fb:af:ff:61: + 4a:ea:fd:10:80:25:0f:e6:cc:f1:c1:f2:71:30:ac: + 21:d3:39:77:9f:25:82:a7:b9:e0:31:c8:78:10:12: + da:18:bf:13:9f:e5:a2:75:e3:0c:13:1d:56:d9:3f: + 0b:25:62:a2:8d:b2:18:94:c2:23:7e:94:04:05:06: + fb:33 + Exponent: 65537 (0x10001) + Signature Algorithm: md5WithRSAEncryption + 1a:e8:5f:e0:f4:44:9c:32:0d:51:01:79:01:f6:26:1c:47:d2: + d9:36:88:e3:24:ec:95:df:20:56:40:33:51:e7:b8:9b:20:cd: + 03:89:33:49:03:45:1d:d3:2d:00:69:ec:08:ed:01:63:45:84: + d7:ba:bd:1c:a7:f9:49:e8:1b:95:5f:15:f9:a9:ee:01:f6:d6: + f6:de:79:89:32:f6:d8:bc:9e:c1:30:ed:48:bb:c9:4d:32:ca: + 13:b0:f5:92:12:fe:03:65:22:7b:f5:42:8b:c8:1b:2d:3a:a2: + 30:10:7a:a4:58:6f:25:65:a0:a2:b5:ea:bf:d6:74:73:ae:16: + 45:ed:cb:b2:ab:0e:b6:3a:fd:0f:2f:07:9a:a6:59:f3:dd:8d: + 40:84:38:55:16:d6:f6:ad:f2:8d:67:e6:fc:99:c9:84:b3:f0: + 38:94:cd:d9:89:24:dd:a7:54:67:16:d5:b3:3b:27:c1:10:79: + f4:7b:3f:f9:de:18:1a:8b:29:0b:24:e8:37:4e:2c:70:0f:4b: + d4:dd:8b:6e:7f:c1:ab:54:eb:b9:54:e8:de:87:03:81:53:2f: + 5a:94:d4:c4:f1:d8:49:4b:4d:37:81:4f:be:dd:69:a5:36:c7: + 72:84:1b:f1:a0:d9:20:a1:2f:6a:a1:5f:33:62:a8:86:7d:08: + e7:31:6a:85 -----BEGIN CERTIFICATE----- -MIIC9TCCAd0CAQEwDQYJKoZIhvcNAQEFBQAwQjElMCMGA1UECwwcTXlTUUxDb25u +MIIC9TCCAd0CAQEwDQYJKoZIhvcNAQEEBQAwQjElMCMGA1UECwwcTXlTUUxDb25u ZWN0b3JQeXRob24gUm9vdCBDQTEZMBcGA1UEAwwQTXlDb25uUHkgUm9vdCBDQTAe -Fw0xMzAzMjYxNTM1NTJaFw0yMjA0MTQxNTM1NTJaMD8xKTAnBgNVBAsMIE15U1FM +Fw0xNzA3MTIwOTQyMjhaFw0xODA3MTIwOTQyMjhaMD8xKTAnBgNVBAsMIE15U1FM Q29ubmVjdG9yUHl0aG9uIFNlcnZlciBDZXJ0MRIwEAYDVQQDDAlsb2NhbGhvc3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDv6WQ/Ssum4RchjXSlwbcB -au3WNccfodThBOAM27AOnJQWIjG4e5s9H7lLznI+VF5MgUbgbp/yz4D+CrSFvLgU -4xxzd1/SVbnzRJ5iD2EmaZPjoMkBmvDRd4ow6IdFN80Fpwxij6fUBHdRkyXyiYsG -FE94PQCyD1R47LSubd/gfcjXw8Bt5cWqcopiolZ01bYuMzeZIw0et9gf6Iih2Zh1 -bs9RthHfL3BfN4knljF3XmRQhfsc4w3MvdulX4mcfzS+E+keOOgPjfjo9KVCD1Zl -F00wQdbSCWzf9uCP4OpKJGURyMQEmGMFPBOP98kqns1CqaE0PxKOpbcTX86nSEO5 -AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAFy4ONx0zFYgVNL046lfRmimyRf1gbmB -pyyug9eW6QuuTfqbzFWOYZY8pG2lzKnHNUMmgzMNMpiRLRJ38Dj5rApg+7OkiTT+ -l4DMIR/YblJryEvx6tNUq2Cu9GXKW2qrGJO3XVniuBpmg1srugdwyxS+LdFofgBc -I4cKIDuXYATUpOFhEsFbMY6tGVeOXQN2jSWtUj6+mKiUWMyr+5NYD8xhjDV7q4GH -JfQqWFzw7prtSYzwB8lc0PM2SLwxeE9cQUYN/UkW8HRxM7Ft5KyyXUk+2Jg61sZ2 -QxMCV6NAGYMX40WRDqIZbs9AbHWoCxEwoXWtcmNb0GInsk39lFMJqw4= +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDqdzdixtf7lhfWhxHz3U7u +KDRzf5bBBk8tbukCjLCCSV9De2sGuXFFchrYxiQAfI3PbQ9h5WIrVmion5SHevad +BJntFdKv8/P3cjvMFfpTUm59Ox1w9PGfBPDOLzhGzTAHAUYH+cDDMg8kNVKS1O02 +w2mikbVIgSo0WrC7LevUZbnlIxbhDCScJyk4i3fxISWQjBnz4aXymGOQwdq7GWyw +tCN2QwnDCxPH2KCLcGg8SeA2KcRukFn6hWTRo16P+6//YUrq/RCAJQ/mzPHB8nEw +rCHTOXefJYKnueAxyHgQEtoYvxOf5aJ14wwTHVbZPwslYqKNshiUwiN+lAQFBvsz +AgMBAAEwDQYJKoZIhvcNAQEEBQADggEBABroX+D0RJwyDVEBeQH2JhxH0tk2iOMk +7JXfIFZAM1HnuJsgzQOJM0kDRR3TLQBp7AjtAWNFhNe6vRyn+UnoG5VfFfmp7gH2 +1vbeeYky9ti8nsEw7Ui7yU0yyhOw9ZIS/gNlInv1QovIGy06ojAQeqRYbyVloKK1 +6r/WdHOuFkXty7KrDrY6/Q8vB5qmWfPdjUCEOFUW1vat8o1n5vyZyYSz8DiUzdmJ +JN2nVGcW1bM7J8EQefR7P/neGBqLKQsk6DdOLHAPS9Tdi25/watU67lU6N6HA4FT +L1qU1MTx2ElLTTeBT77daaU2x3KEG/Gg2SChL2qhXzNiqIZ9COcxaoU= -----END CERTIFICATE----- diff --git a/tests/data/ssl/tests_server_key.pem b/tests/data/ssl/tests_server_key.pem index 13c39fea..1d79f88c 100644 --- a/tests/data/ssl/tests_server_key.pem +++ b/tests/data/ssl/tests_server_key.pem @@ -1,27 +1,27 @@ -----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA7+lkP0rLpuEXIY10pcG3AWrt1jXHH6HU4QTgDNuwDpyUFiIx -uHubPR+5S85yPlReTIFG4G6f8s+A/gq0hby4FOMcc3df0lW580SeYg9hJmmT46DJ -AZrw0XeKMOiHRTfNBacMYo+n1AR3UZMl8omLBhRPeD0Asg9UeOy0rm3f4H3I18PA -beXFqnKKYqJWdNW2LjM3mSMNHrfYH+iIodmYdW7PUbYR3y9wXzeJJ5Yxd15kUIX7 -HOMNzL3bpV+JnH80vhPpHjjoD4346PSlQg9WZRdNMEHW0gls3/bgj+DqSiRlEcjE -BJhjBTwTj/fJKp7NQqmhND8SjqW3E1/Op0hDuQIDAQABAoIBAQCyfCuVntq2E532 -21td+ilhh6DcDfRPh0FuCwd46XQo2rqdYOEmw+bxaYmcaUG7N19UgZUuYX7j0RbB -aUt2d7ln6LMBAF2siRSndHR0tcZsIn3hCnygkhn5bHrF+iixCVuhie7/4KpWZOA0 -M0o3D7b7Vd7tsEy1LAyHTmr5nkrBosIpLXQvnjj8kF6MOQW09/72l7eiFwnRQ3yW -eUn8l+vkIRpYzI/l1MFnj1lcGeDKRDFJMXZV7OropJaQabWuGyaddizP8ihhU/Vf -VEHFJnW+AS3JpMO2Bf8ICMGu+0d4AJsNPW7KNNlqv79Nws2ijl6bcWz+E7NAG55C -DY1LU5iBAoGBAPjf0QRpdDLd9+ntAkJMfSwhl0yqarZPuaGsKWnG5C7BPcj3wLaP -GHn3CI0SF0JiwN0zOrLv821im5Wr5Ux/OoSDdIR/y9Vp8joTno0+7MUU5zuN93r+ -8EAHY5GEZoJ0ndU7xP50jEYq0AZinginyqtGyL6HpJL3VJoL14cCYYuRAoGBAPbH -4bHPWSEJY3X8Hq4KRbtyyTfT1s7zFrvDZHkWFH+tVD+DsKpmRQ5A0lWVBPhPaS1Y -GJcu9h9VKSEjBgM2ZJpB8A4zJGYIgsPXQTOQm/s9fbWj76zJ8r2z4W7P2Ry9U1e5 -cwZnQgLoPvBL7IHm4J92RfoRZO5IohRyUDaAdpGpAoGAIL3hU8FD5kVJjl7+Axbp -CNtKem2ZKG8IrvplYGMoNfZ6WGwv0FS3FaSoXVbZ9IPld7R7rnre/a8RZPl+azf5 -zOE2fRALEwKjOXzHSTHUGIGNgkpFGstbdDEEqmpOyi7pbNo2KnvO0JRlVdG3lM/u -W+YuFtLllegwGywfqMVpa+ECgYEAp4/StFv4xdDNIuh8oGnDLWLkM674FO7DydwD -FaCjbInxQWsWgq0MSIBFEO0tQbkRzkMZ91VgsqetVJ2mUHoXVxJcgBfDqDAxMe6v -i+atsqru922HqMg6tQo1kHs6jSQUOeVmr7te/ABb8+dpgE6WyE+Tdhdnc9AHlWCF -DGyvlXkCgYB2OYDiXSne2DYglcEk2pyr6h5sQRuKuYXnq7NWFTYIiLb/Bz6g9oLs -fV5LkBfCWRSg3PoR8hX3F8PC1i2G+50gXucoFdvlvS5bawPABxtYGqhyz63awNud -JnJIdqY3vLoUWeEZF3HmdBMN8jy6Am7pMynHFvoEjMBRmGNOjedZrA== +MIIEpAIBAAKCAQEA6nc3YsbX+5YX1ocR891O7ig0c3+WwQZPLW7pAoywgklfQ3tr +BrlxRXIa2MYkAHyNz20PYeViK1ZoqJ+Uh3r2nQSZ7RXSr/Pz93I7zBX6U1JufTsd +cPTxnwTwzi84Rs0wBwFGB/nAwzIPJDVSktTtNsNpopG1SIEqNFqwuy3r1GW55SMW +4QwknCcpOIt38SElkIwZ8+Gl8phjkMHauxlssLQjdkMJwwsTx9igi3BoPEngNinE +bpBZ+oVk0aNej/uv/2FK6v0QgCUP5szxwfJxMKwh0zl3nyWCp7ngMch4EBLaGL8T +n+WideMMEx1W2T8LJWKijbIYlMIjfpQEBQb7MwIDAQABAoIBAQCBtbJOUvLpm/9U +DyU/ZA9mcZeSzeL4piTnXZRKdMqxSSYKjxyGe9DOOnHfur3wBvfs6Mi5v8yvbP45 +Sw9AZCZKd2EwaAJGlQ9CtU+feAkkT1YQscN32gpRjsopRrY7dQg819eGUgTx95+o +yFcGJAWXZkPqS/GeStauX/2lj6IHva//jpQDyszIb9HUE6rZEv45dQiJwONKGhFS +L7N3zhf2p1rACkt/LtIoCRHuhSpzY2dA63c2uQfLXp0XIJLHxLw1Fi9V67fkGuYJ +3QGRFcxyZys7GSkoACwbI8my4aoHjaYVuLFEdAEIfcrSfFwRJeEDncaWlghpDoAf +ihyXO+QBAoGBAP1XQXnFdqE9O2xt/LrX/rS5SV4IbsEkXW3LaPKfPaZOSxtgZf4/ ++x1Wx1G1LdIPwYcyXy+pesJuXnt7nfG2wYVCZg+DORNfNOuPzF96LW42XoxPLK1+ +foXSbGAi2b5zbL8cNBE5QBEzm6MtFgMMuE0flm5nffKcPMG5dUPnKJnDAoGBAOzt +PeN5XHUAC9zZNJe6BnwM5ohpdjDfa8wcGrsXje/s6/WBYSTAVaiNy/v5HnwEN0UZ +zVkamq+xY2fwljA8QLD+1ByXP+/pcqsymlyhiD+zN3UwavrsnkJ1Y2ISsYPFYN5o +jh+RijBaAwlu5yPNapisjnKX4TtxPerSYPsUbpHRAoGAIkDS9IDzWjeqOi3g1u5v +XMYUmmcvemPNUhQHm45WSo8ZbpkpEShbbosWJgEGMfm5Y+s2nX4fv/wmQDHlmBHq +tnbUz9IhPHJJ+HOX4WzmiZlGTVhDJS4OM0/RIWp04GBA2tIYZB/GfszohTaKXF0y +6hKUR1cs20mumU7XARhXD/sCgYB+FRJmR2NIcCnf8Ubnp3tj8ImN9nGLOJppGFux +TKugDnjTQXKs2B29gRgYk04BuUygXUbGMD45WTEJUyLZsHbMug+u116TEayQJnG2 +8c9L9teAaa/EsL7XpxioTEJjWVpfgUyAyDa93GjZUEd46gvcC5gSq3iU5YKJwEMT +2p+swQKBgQCkorpj+2b4PPZMkTWmFagwvkyWbtTAheRevnGy92ZNjAEn81t4qaoX +6tYBDyE2K/pObelVYm72OECJGYjgrh3PPcTE9vUPELKTzszJCtXZtfW3nBJaN0ty +zN+qYoo5w9q3nnKZmH0mg9a7j7+yiRKmATAnFQfFnLcaVKaq7uskfA== -----END RSA PRIVATE KEY----- diff --git a/tests/issues/test_bug21449996.py b/tests/issues/test_bug21449996.py index 7cf3d282..b4e428f6 100644 --- a/tests/issues/test_bug21449996.py +++ b/tests/issues/test_bug21449996.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -22,14 +22,12 @@ # along with this program; if not, write to the Free Software # Foundation, Incur., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -import os.path -import unittest - import mysql.connector -from tests import foreach_cnx, cnx_config +from tests import foreach_cnx import tests -DATA_FILE = os.path.join('tests', 'data', 'random_big_bin.csv') +# using "/" (slash) to avoid windows scape characters +DATA_FILE = "/".join(['tests', 'data', 'random_big_bin.csv']) class Bug21449996(tests.MySQLConnectorTests): @@ -37,7 +35,8 @@ def setUp(self): self.table_name = 'Bug21449996' cnx = mysql.connector.connect(**tests.get_mysql_config()) cnx.cmd_query("DROP TABLE IF EXISTS %s" % self.table_name) - cnx.cmd_query("CREATE TABLE %s (c1 BLOB)" % self.table_name) + cnx.cmd_query("CREATE TABLE {0} (c1 BLOB) DEFAULT CHARSET=latin1" + "".format(self.table_name)) cnx.close() def tearDown(self): @@ -49,10 +48,11 @@ def tearDown(self): def test_load_data_compressed(self): try: cur = self.cnx.cursor() - sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE %s" % ( - DATA_FILE, self.table_name) + sql = ("LOAD DATA LOCAL INFILE '{0}' INTO TABLE {1} CHARACTER " + "SET latin1".format(DATA_FILE, self.table_name)) cur.execute(sql) except mysql.connector.errors.InterfaceError as exc: + raise self.fail(exc) cur.execute("SELECT COUNT(*) FROM %s" % self.table_name) diff --git a/tests/issues/test_bug21879914.py b/tests/issues/test_bug21879914.py index b80ba07e..7300e8bb 100644 --- a/tests/issues/test_bug21879914.py +++ b/tests/issues/test_bug21879914.py @@ -52,6 +52,7 @@ def test_ssl_cipher_in_option_file(self): config = tests.get_mysql_config() config['ssl_ca'] = TEST_SSL['ca'] config['use_pure'] = False + config.pop('unix_socket') cnx = mysql.connector.connect(**config) cnx.cmd_query("SHOW STATUS LIKE 'Ssl_cipher'") diff --git a/tests/mysqld.py b/tests/mysqld.py index 6d6463d5..1495f034 100644 --- a/tests/mysqld.py +++ b/tests/mysqld.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -344,8 +344,10 @@ class MySQLServer(MySQLServerBase): """Class for managing a MySQL server""" def __init__(self, basedir, topdir, cnf, bind_address, port, - name, datadir=None, tmpdir=None, - unix_socket_folder=None, ssl_folder=None, sharedir=None): + name, datadir=None, tmpdir=None, extra_args={}, + unix_socket_folder=None, ssl_folder=None, ssl_ca=None, + ssl_cert=None, ssl_key=None, sharedir=None): + self._extra_args = extra_args self._cnf = cnf self._option_file = os.path.join(topdir, 'my.cnf') self._bind_address = bind_address @@ -353,6 +355,9 @@ def __init__(self, basedir, topdir, cnf, bind_address, port, self._topdir = topdir self._basedir = basedir self._ssldir = ssl_folder or topdir + self._ssl_ca = os.path.join(self._ssldir, ssl_ca) + self._ssl_cert = os.path.join(self._ssldir, ssl_cert) + self._ssl_key = os.path.join(self._ssldir, ssl_key) self._datadir = datadir or os.path.join(topdir, 'data') self._tmpdir = tmpdir or os.path.join(topdir, 'tmp') self._name = name @@ -371,6 +376,7 @@ def __init__(self, basedir, topdir, cnf, bind_address, port, super(MySQLServer, self).__init__(self._basedir, self._option_file, sharedir=self._sharedir) + self._init_sql = os.path.join(self._topdir, 'init.sql') def _create_directories(self): """Create directory structure for bootstrapping @@ -384,9 +390,13 @@ def _create_directories(self): dirs = [ self._topdir, os.path.join(self._topdir, 'tmp'), - self._datadir, - os.path.join(self._datadir, 'mysql') ] + + if self._version[0:3] < (8, 0, 1): + dirs.append(self._datadir) + if self._version[0:3] < (5, 7, 21): + dirs.append(os.path.join(self._datadir, 'mysql')) + for adir in dirs: LOGGER.debug("Creating directory %s", adir) os.mkdir(adir) @@ -402,16 +412,24 @@ def _get_bootstrap_cmd(self): cmd = [ os.path.join(self._sbindir, EXEC_MYSQLD), '--no-defaults', - '--bootstrap', '--basedir=%s' % self._basedir, '--datadir=%s' % self._datadir, - '--log-warnings=0', '--max_allowed_packet=8M', '--default-storage-engine=myisam', '--net_buffer_length=16K', '--tmpdir=%s' % self._tmpdir, '--innodb_log_file_size=1Gb', ] + + if self._version[0:2] >= (8, 0) or self._version >= (5, 7, 21): + cmd.append("--initialize-insecure") + cmd.append("--init-file={0}".format(self._init_sql)) + else: + cmd.append("--bootstrap") + + if self._version < (8, 0, 3): + cmd.append('--log-warnings=0') + if self._version[0:2] < (5, 5): cmd.append('--language={0}/english'.format(self._lc_messages_dir)) else: @@ -419,7 +437,7 @@ def _get_bootstrap_cmd(self): '--lc-messages-dir={0}'.format(self._lc_messages_dir), '--lc-messages=en_US' ]) - if self._version[0:2] >= (5, 1): + if self._version[0:2] >= (5, 1) and self._version < (8, 0, 11): cmd.append('--loose-skip-ndbcluster') return cmd @@ -448,63 +466,72 @@ def bootstrap(self): extra_sql = [ "CREATE DATABASE myconnpy;" ] - insert = ( - "INSERT INTO mysql.user VALUES ('localhost','root'{0}," - "'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'," - "'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'," - "'Y','Y','Y','Y','Y','','','','',0,0,0,0," - "@@default_authentication_plugin,'','N'," - "CURRENT_TIMESTAMP,NULL{1});" - ) - # MySQL 5.7.5+ creates no user while bootstrapping - if self._version[0:3] >= (5, 7, 6): - # MySQL 5.7.6+ have extra account_locked col and no password col - extra_sql.append(insert.format("", ",'N'")) - elif self._version[0:3] >= (5, 7, 5): - extra_sql.append(insert.format(",''", "")) - - insert_localhost = ( - "INSERT INTO mysql.user SELECT '127.0.0.1', `User`{0}," - " `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`," - " `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`," - " `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`," - " `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`," - " `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`," - " `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`," - " `Show_view_priv`, `Create_routine_priv`, " - "`Alter_routine_priv`," - " `Create_user_priv`, `Event_priv`, `Trigger_priv`, " - "`Create_tablespace_priv`, `ssl_type`, `ssl_cipher`," - "`x509_issuer`, `x509_subject`, `max_questions`, `max_updates`," - "`max_connections`, `max_user_connections`, `plugin`," - "`authentication_string`, `password_expired`," - "`password_last_changed`, `password_lifetime`{1} FROM mysql.user " - "WHERE `user` = 'root' and `host` = 'localhost';" - ) - # MySQL 5.7.4+ only creates root@localhost - if self._version[0:3] >= (5, 7, 6): - extra_sql.append(insert_localhost.format("", ",`account_locked`")) - elif self._version[0:3] >= (5, 7, 4): - extra_sql.append(insert_localhost.format(",`Password`", "")) + + if self._version > (5, 7, 5) and self._version < (5, 7, 21): + # Note: server is running with --skip-grant-tables + # (can not user 'CREATE USER' statements). + defaults = ("'root'{0}, " + "'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'," + "'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'," + "'Y','Y','Y','Y','Y','','','','',0,0,0,0," + "@@default_authentication_plugin,'','N'," + "CURRENT_TIMESTAMP,NULL{1}") + + hosts = ["::1", "127.0.0.1", "localhost"] + + insert = "INSERT INTO mysql.user VALUES {0};".format( + ", ".join("('{0}', {{0}})".format(host) for host in hosts)) + + if self._version[0:3] >= (5, 7, 6): + # No password column, has account_locked column + defaults = defaults.format("", ", 'N'") + elif self._version[0:3] >= (5, 7, 5): + # The password column + defaults = defaults.format(", ''", "") + + extra_sql.append(insert.format(defaults)) + elif self._version[0:3] >= (5, 6, 39) and \ + self._version[0:3] < (5, 7, 5): + # Following required user accounts are created by the server itself: + # 'root'@'127.0.0.1', 'root'@'localhost' and 'root'@'::1' + # Note: server is running with --skip-grant-tables. + pass + else: + extra_sql.extend([ + "CREATE USER IF NOT EXISTS 'root'@'127.0.0.1';", + "GRANT ALL ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;", + "CREATE USER IF NOT EXISTS 'root'@'::1';", + "GRANT ALL ON *.* TO 'root'@'::1' WITH GRANT OPTION;" + ]) bootstrap_log = os.path.join(self._topdir, 'bootstrap.log') try: self._create_directories() cmd = self._get_bootstrap_cmd() sql = ["USE mysql;"] - for filename in script_files: - full_path = os.path.join(self._scriptdir, filename) - LOGGER.debug("Reading SQL from '%s'", full_path) - with open(full_path, 'r') as fp: - sql.extend([line.strip() for line in fp.readlines()]) - sql.extend(extra_sql) + + if self._version[0:2] >= (8, 0) or self._version >= (5, 7, 21): + test_sql = open(self._init_sql, "w") + test_sql.write("\n".join(extra_sql)) + test_sql.close() + else: + for filename in script_files: + full_path = os.path.join(self._scriptdir, filename) + LOGGER.debug("Reading SQL from '%s'", full_path) + with open(full_path, 'r') as fp: + sql.extend([line.strip() for line in fp.readlines()]) + fp_log = open(bootstrap_log, 'w') - prc = subprocess.Popen(cmd, stdin=subprocess.PIPE, - stderr=subprocess.STDOUT, stdout=fp_log) - if sys.version_info[0] == 2: - prc.communicate('\n'.join(sql)) + if self._version[0:2] < (8, 0) or self._version < (5, 7, 21): + sql.extend(extra_sql) + prc = subprocess.Popen(cmd, stdin=subprocess.PIPE, + stderr=subprocess.STDOUT, + stdout=fp_log) + prc.communicate('\n'.join(sql) if sys.version_info[0] == 2 + else bytearray('\n'.join(sql), 'utf8')) else: - prc.communicate(bytearray('\n'.join(sql), 'utf8')) + prc = subprocess.call(cmd, stderr=subprocess.STDOUT, + stdout=fp_log) fp_log.close() except OSError as err: raise MySQLBootstrapError( @@ -540,13 +567,7 @@ def unix_socket(self): """Return the unix socket of the server""" return self._unix_socket - def start(self): - """Start a MySQL server""" - if self.check_running(): - LOGGER.error("MySQL server '{name}' already running".format( - name=self.name)) - return - + def update_config(self, **kwargs): options = { 'name': self._name, 'basedir': _convert_forward_slash(self._basedir), @@ -556,15 +577,39 @@ def start(self): 'port': self._port, 'unix_socket': _convert_forward_slash(self._unix_socket), 'ssl_dir': _convert_forward_slash(self._ssldir), + 'ssl_ca': _convert_forward_slash(self._ssl_ca), + 'ssl_cert': _convert_forward_slash(self._ssl_cert), + 'ssl_key': _convert_forward_slash(self._ssl_key), 'pid_file': _convert_forward_slash(self._pid_file), 'serverid': self._serverid, 'lc_messages_dir': _convert_forward_slash( self._lc_messages_dir), + 'ssl': 1, } + + for arg in self._extra_args: + if self._version < arg["version"]: + options.update(dict([(key, '') for key in + arg["options"].keys()])) + else: + options.update(arg["options"]) + options.update(**kwargs) try: fp = open(self._option_file, 'w') fp.write(self._cnf.format(**options)) fp.close() + except Exception as ex: + LOGGER.error("Failed to write config file {0}".format(ex)) + sys.exit(1) + + def start(self, **kwargs): + if self.check_running(): + LOGGER.error("MySQL server '{name}' already running".format( + name=self.name)) + return + + self.update_config(**kwargs) + try: self._start_server() for i in range(10): if self.check_running(): diff --git a/tests/test_abstracts.py b/tests/test_abstracts.py index f90b5075..7e4f0d28 100644 --- a/tests/test_abstracts.py +++ b/tests/test_abstracts.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -27,6 +27,7 @@ from decimal import Decimal from operator import attrgetter +import unittest import tests from tests import PY2, foreach_cnx @@ -88,9 +89,12 @@ def test_sql_mode(self): exp = ('STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,' 'NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,' 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION') - else: + elif tests.MYSQL_VERSION[0:3] < (8, 0, 5): exp = ('STRICT_TRANS_TABLES,STRICT_ALL_TABLES,TRADITIONAL,' 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION') + else: + exp = ('STRICT_TRANS_TABLES,STRICT_ALL_TABLES,TRADITIONAL,' + 'NO_ENGINE_SUBSTITUTION') try: self.cnx.sql_mode = exp @@ -175,23 +179,31 @@ def test_reset_session(self): self.assertEqual(exp, [self.cnx.autocommit, self.cnx.sql_mode, self.cnx.time_zone, self.cnx._charset_id]) - exp_user_variables = {'ham': '1', 'spam': '2'} + exp_user_variables = {'ham': 1, 'spam': 2} exp_session_variables = {'wait_timeout': 100000} for key, value in exp_user_variables.items(): row = self.cnx.info_query("SELECT @{0}".format(key)) - self.assertEqual(value, row[0]) + self.assertEqual(value, int(row[0])) for key, value in exp_session_variables.items(): row = self.cnx.info_query("SELECT @@session.{0}".format(key)) self.assertEqual(value, row[0]) + @unittest.skipIf(tests.MYSQL_VERSION > (5, 7, 10), + "As of MySQL 5.7.11, mysql_refresh() is deprecated") @foreach_cnx() def test_cmd_refresh(self): refresh = RefreshOption.LOG | RefreshOption.THREADS exp = {'insert_id': 0, 'affected_rows': 0, 'field_count': 0, 'warning_count': 0, 'status_flag': 0} - self.assertEqual(exp, self.cnx.cmd_refresh(refresh)) + result = self.cnx.cmd_refresh(refresh) + for key in set(result.keys()) ^ set(exp.keys()): + try: + del result[key] + except KeyError: + del exp[key] + self.assertEqual(exp, result) query = "SHOW GLOBAL STATUS LIKE 'Uptime_since_flush_status'" pre_flush = int(self.cnx.info_query(query)[1]) @@ -204,6 +216,10 @@ def test_cmd_quit(self): self.cnx.cmd_quit() self.assertFalse(self.cnx.is_connected()) + @unittest.skipIf(tests.MYSQL_VERSION >= (8, 0, 1), + "As of MySQL 8.0.1, CMD_SHUTDOWN is not recognized.") + @unittest.skipIf(tests.MYSQL_VERSION <= (5, 7, 1), + "BugOra17422299 not tested with MySQL version 5.6") @foreach_cnx() def test_cmd_shutdown(self): server = tests.MYSQL_SERVERS[0] diff --git a/tests/test_bugs.py b/tests/test_bugs.py index 99fda35b..32e500ec 100644 --- a/tests/test_bugs.py +++ b/tests/test_bugs.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -39,19 +39,26 @@ import os import gc import tempfile -from datetime import datetime, timedelta, time +from datetime import date, datetime, timedelta, time from threading import Thread import traceback import time import unittest +import pickle +import sys import tests +if tests.SSL_AVAILABLE: + import ssl + from tests import foreach_cnx, cnx_config from . import PY2 from mysql.connector import (connection, cursor, conversion, protocol, errors, constants, pooling) from mysql.connector.optionfiles import read_option_files +from mysql.connector.catch23 import STRING_TYPES import mysql.connector +import cpy_distutils try: from mysql.connector.connection_cext import CMySQLConnection @@ -60,8 +67,14 @@ CMySQLConnection = None ERR_NO_CEXT = "C Extension not available" +if tests.SSL_AVAILABLE: + TLS_VERSIONS = {"TLSv1": ssl.PROTOCOL_TLSv1, + "TLSv1.1": ssl.PROTOCOL_TLSv1_1, + "TLSv1.2": ssl.PROTOCOL_TLSv1_2} +@unittest.skipIf(tests.MYSQL_VERSION == (5, 7, 4), + "Bug328998 not tested with MySQL version 5.7.4") class Bug328998Tests(tests.MySQLConnectorTests): """Tests where connection timeout has been set""" @@ -109,6 +122,8 @@ def test_execute_return(self): self.assertEqual(6, cur.rowcount) res = cur.execute("UPDATE %s SET id = id + %%s" % tbl, (10,)) self.assertEqual(8, cur.rowcount) + + cur.execute("DROP TABLE IF EXISTS {0}".format(tbl)) cur.close() self.cnx.close() @@ -379,6 +394,7 @@ class Bug519301(tests.MySQLConnectorTests): @foreach_cnx() def test_auth(self): config = self.config.copy() + config.pop('unix_socket') config['user'] = 'ham' config['password'] = 'spam' @@ -657,6 +673,13 @@ class BugOra13395083(tests.MySQLConnectorTests): def setUp(self): self.table_name = 'BugOra13395083' + def tearDown(self): + config = tests.get_mysql_config() + cnx = connection.MySQLConnection(**config) + cur = cnx.cursor() + + cur.execute("DROP TABLE IF EXISTS {0}".format(self.table_name)) + @cnx_config(time_zone="+00:00") @foreach_cnx() def test_time_zone(self): @@ -759,7 +782,8 @@ def _assert_flat_line(self, samples): counters[value] = 1 if len(counters) > self.tolerate: - self.fail("Counters of collected object higher than tolerated.") + self.fail("Counters {} of collected object higher than tolerated." + "".format(len(counters))) def test_converter(self): for i in range(0, self.sample_size): @@ -856,6 +880,12 @@ def _setup(self): self.cnx.cmd_query("DROP TABLE IF EXISTS %s" % self.table) self.cnx.cmd_query("CREATE TABLE %s (id INT)" % self.table) + def tearDown(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.table)) + @foreach_cnx(connection.MySQLConnection) def test_cmd_query(self): self._setup() @@ -943,6 +973,12 @@ def _setup(self): "PRIMARY KEY (`id`,`c1`))" % (self.tbl)) cur.execute(create) + def tearDown(self): + config = tests.get_mysql_config() + cnx = connection.MySQLConnection(**config) + cur = cnx.cursor() + cur.execute("DROP TABLE IF EXISTS {0}".format(self.tbl)) + @foreach_cnx() def test_executemany(self): self._setup() @@ -1104,6 +1140,8 @@ def test_callproc_without_args(self): @unittest.skipIf(os.name == 'nt', "Cannot test error handling when doing handshake on Windows") +@unittest.skipIf(tests.MYSQL_VERSION > (8, 0, 4), + "Revoked users can no more grant") class BugOra15836979(tests.MySQLConnectorTests): """BUG#15836979: UNCLEAR ERROR MESSAGE CONNECTING USING UNALLOWED IP ADDRESS @@ -1188,9 +1226,25 @@ def setUp(self): self.admin_cnx = connection.MySQLConnection(**config) self.admin_cnx.cmd_query( - "GRANT ALL ON {db}.* TO 'ssluser'@'{host}' REQUIRE X509".format( + "CREATE USER 'ssluser'@'{host}'".format( db=config['database'], host=tests.get_mysql_config()['host'])) + if tests.MYSQL_VERSION < (5, 7, 21): + self.admin_cnx.cmd_query( + "GRANT ALL ON {db}.* TO 'ssluser'@'{host}' REQUIRE X509" + "".format(db=config['database'], + host=tests.get_mysql_config()['host'])) + else: + self.admin_cnx.cmd_query( + "GRANT ALL ON {db}.* TO 'ssluser'@'{host}'" + "".format(db=config['database'], + host=tests.get_mysql_config()['host'])) + + self.admin_cnx.cmd_query( + "ALTER USER 'ssluser'@'{host}' REQUIRE X509" + "".format(db=config['database'], + host=tests.get_mysql_config()['host'])) + def tearDown(self): self.admin_cnx.cmd_query("DROP USER 'ssluser'@'{0}'".format( tests.get_mysql_config()['host'])) @@ -1230,9 +1284,27 @@ def setUp(self): config = tests.get_mysql_config() self.host = config['host'] cnx = connection.MySQLConnection(**config) - cnx.cmd_query( + + if tests.MYSQL_VERSION < (5, 7, 21): + cnx.cmd_query( "GRANT ALL ON {db}.* TO 'ssluser'@'{host}' REQUIRE SSL".format( - db=config['database'], host=self.host)) + db=config['database'], host=tests.get_mysql_config()['host'])) + else: + cnx.cmd_query( + "CREATE USER 'ssluser'@'{host}'".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) + + cnx.cmd_query( + "GRANT ALL ON {db}.* TO 'ssluser'@'{host}'".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) + + cnx.cmd_query( + "ALTER USER 'ssluser'@'{host}' REQUIRE SSL".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) + cnx.close() def tearDown(self): @@ -1724,10 +1796,16 @@ def test_load_csv(self): cur.execute(sql, (self.data_file,)) cur.execute("SELECT * FROM local_data") - exp = [ - (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), - (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), - (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + if os.name != 'nt': + exp = [ + (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), + (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), + (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + else: + exp = [ + (1, 'c1_1', 'c2_1\r'), (2, 'c1_2', 'c2_2\r'), + (3, 'c1_3', 'c2_3\r'), (4, 'c1_4', 'c2_4\r'), + (5, 'c1_5', 'c2_5\r'), (6, 'c1_6', 'c2_6')] self.assertEqual(exp, cur.fetchall()) @cnx_config(compress=True) @@ -1739,10 +1817,16 @@ def test_load_csv_with_compress(self): cur.execute(sql, (self.data_file,)) cur.execute("SELECT * FROM local_data") - exp = [ - (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), - (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), - (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + if os.name != 'nt': + exp = [ + (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), + (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), + (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + else: + exp = [ + (1, 'c1_1', 'c2_1\r'), (2, 'c1_2', 'c2_2\r'), + (3, 'c1_3', 'c2_3\r'), (4, 'c1_4', 'c2_4\r'), + (5, 'c1_5', 'c2_5\r'), (6, 'c1_6', 'c2_6')] self.assertEqual(exp, cur.fetchall()) @foreach_cnx() @@ -1800,6 +1884,10 @@ def test_load_csv(self): self.assertEqual(self.exp_rows, cur.fetchone()[0]) +@unittest.skipIf(tests.MYSQL_VERSION >= (8, 0, 1), + "BugOra17422299 not tested with MySQL version >= 8.0.1") +@unittest.skipIf(tests.MYSQL_VERSION <= (5, 7, 1), + "BugOra17422299 not tested with MySQL version 5.6") class BugOra17422299(tests.MySQLConnectorTests): """BUG#17422299: cmd_shutdown fails with malformed connection packet """ @@ -2110,6 +2198,10 @@ def setUp(self): "PRIMARY KEY (`id`))" % (self.city_tbl)) self.cursor.execute(create) + def tearDown(self): + self.cursor.execute("DROP TABLE IF EXISTS {0}".format(self.city_tbl)) + self.cursor.execute("DROP TABLE IF EXISTS {0}".format(self.emp_tbl)) + def test_executemany(self): stmt = "INSERT INTO {0} (id,name) VALUES (%s,%s)".format( self.city_tbl) @@ -2201,9 +2293,25 @@ def setUp(self): config = tests.get_mysql_config() self.admin_cnx = connection.MySQLConnection(**config) - self.admin_cnx.cmd_query( - "GRANT ALL ON %s.* TO 'ssluser'@'%s' REQUIRE SSL" % ( - config['database'], config['host'])) + if tests.MYSQL_VERSION < (5, 7, 21): + self.admin_cnx.cmd_query( + "GRANT ALL ON %s.* TO 'ssluser'@'%s' REQUIRE SSL" % ( + config['database'], config['host'])) + else: + self.admin_cnx.cmd_query( + "CREATE USER 'ssluser'@'{host}'".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) + + self.admin_cnx.cmd_query( + "GRANT ALL ON {db}.* TO 'ssluser'@'{host}'".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) + + self.admin_cnx.cmd_query( + "ALTER USER 'ssluser'@'{host}' REQUIRE SSL".format( + db=config['database'], + host=tests.get_mysql_config()['host'])) def tearDown(self): config = tests.get_mysql_config() @@ -2278,10 +2386,11 @@ def _create_user(self, cnx, user, password, host, database, "IDENTIFIED WITH {plugin}") cnx.cmd_query(create_user.format(user=user, host=host, plugin=plugin)) - if plugin == 'sha256_password': - cnx.cmd_query("SET old_passwords = 2") - else: - cnx.cmd_query("SET old_passwords = 0") + if tests.MYSQL_VERSION[0:3] < (8, 0, 5): + if plugin == 'sha256_password': + cnx.cmd_query("SET old_passwords = 2") + else: + cnx.cmd_query("SET old_passwords = 0") if tests.MYSQL_VERSION < (5, 7, 5): passwd = ("SET PASSWORD FOR '{user}'@'{host}' = " @@ -2376,11 +2485,13 @@ def test_sha256(self): def test_sha256_nonssl(self): config = tests.get_mysql_config() config['unix_socket'] = None + config['ssl_disabled'] = True config['client_flags'] = [constants.ClientFlag.PLUGIN_AUTH] user = self.users['sha256user'] config['user'] = user['username'] config['password'] = user['password'] + config['auth_plugin'] = user['auth_plugin'] self.assertRaises(errors.InterfaceError, connection.MySQLConnection, **config) if CMySQLConnection: @@ -2448,6 +2559,15 @@ def _setup(self): cur.execute(create) cnx.close() + def tearDown(self): + config = tests.get_mysql_config() + config['use_unicode'] = True + cnx = connection.MySQLConnection(**config) + cur = cnx.cursor() + + cur.execute("DROP TABLE IF EXISTS {0}".format(self.table)) + cur.execute("DROP TABLE IF EXISTS {0}".format(self.table_cp1251)) + @cnx_config(use_unicode=True) @foreach_cnx(connection.MySQLConnection) def test_prepared_statement(self): @@ -2456,8 +2576,7 @@ def test_prepared_statement(self): stmt = "INSERT INTO {0} VALUES (?,?,?)".format( self.table) data = [(1, b'bytes', '1234'), (2, u'aaaаффф', '1111')] - exp = [(1, b'bytes', b'1234'), - (2, u'aaaаффф'.encode('cp1251'), b'1111')] + exp = [(1, 'bytes', '1234'), (2, u'aaaаффф', '1111')] cur.execute(stmt, data[0]) self.cnx.commit() cur.execute("SELECT * FROM {0}".format(self.table)) @@ -2653,7 +2772,6 @@ def setUp(self): self.cnx.cmd_query(create) def tearDown(self): - return if self.cnx: self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) @@ -3035,8 +3153,8 @@ def test_null(self): "VALUES (?, ?, ?, ?, ?, ?, ?)".format(self.tbl)) params = (100, None, 'foo', None, datetime(2014, 8, 4, 9, 11, 14), 10, 'bar') - exp = (100, None, bytearray(b'foo'), None, - datetime(2014, 8, 4, 9, 11, 14), 10, bytearray(b'bar')) + exp = (100, None, 'foo', None, + datetime(2014, 8, 4, 9, 11, 14), 10, 'bar') cur.execute(sql, params) sql = "SELECT * FROM {0}".format(self.tbl) @@ -3086,6 +3204,46 @@ def test_unsupported_arguments(self): self.assertEqual(exp, new_config) +class BugOra21530100(tests.MySQLConnectorTests): + """BUG#21530100: CONNECT FAILS WHEN USING MULTIPLE OPTION_GROUPS WITH + PYTHON 3.3 + """ + def test_option_files_with_option_groups(self): + temp_cnf_file = os.path.join(os.getcwd(), 'temp.cnf') + temp_include_file = os.path.join(os.getcwd(), 'include.cnf') + + try: + cnf_file = open(temp_cnf_file, "w+") + include_file = open(temp_include_file, "w+") + + config = tests.get_mysql_config() + + cnf = "[group32]\n" + cnf += '\n'.join(['{0} = {1}'.format(key, value) + for key, value in config.items()]) + + cnf += "\n[group31]\n" + cnf += "!include {0}\n".format(temp_include_file) + + include_cnf = "[group41]\n" + include_cnf += "charset=utf8\n" + + cnf_file.write(cnf) + include_file.write(include_cnf) + + cnf_file.close() + include_file.close() + + conn = mysql.connector.connect(option_files=temp_cnf_file, + option_groups=['group31','group32','group41']) + except Exception as exc: + self.fail("Connection failed with option_files argument: {0}" + "".format(exc)) + finally: + os.remove(temp_cnf_file) + os.remove(temp_include_file) + + class BugOra19481761(tests.MySQLConnectorTests): """BUG#19481761: OPTION_FILES + !INCLUDE FAILS WITH TRAILING NEWLINE """ @@ -3821,10 +3979,16 @@ def test_with_raw(self): select_stmt = "SELECT 'a'+'b'" cur.execute(select_stmt) self.assertRaises(errors.DatabaseError, cur.fetchall) - exp = [ - ('Warning', 1292, "Truncated incorrect DOUBLE value: 'a'"), - ('Warning', 1292, "Truncated incorrect DOUBLE value: 'b'"), - ] + if os.name != 'nt': + exp = [ + ('Warning', 1292, "Truncated incorrect DOUBLE value: 'a'"), + ('Warning', 1292, "Truncated incorrect DOUBLE value: 'b'"), + ] + else: + exp = [ + ('Warning', 1292, "Truncated incorrect DOUBLE value: 'b'"), + ('Warning', 1292, "Truncated incorrect DOUBLE value: 'a'"), + ] self.assertEqual(exp, cur.fetchwarnings()) try: cur.close() @@ -3928,6 +4092,85 @@ def test_password_with_spaces(self): cnx.close() +class BugOra21476495(tests.MySQLConnectorTests): + """Bug 21476495 - CHARSET VALUE REMAINS INVALID AFTER FAILED + SET_CHARSET_COLLATION() CALL + """ + def setUp(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + + def test_bad_set_charset_number(self): + old_val = self.cnx._charset_id + self.assertRaises(mysql.connector.Error, + self.cnx.set_charset_collation, 19999) + + config = tests.get_mysql_config() + cnx = connection.MySQLConnection(**config) + cursor = cnx.cursor(raw="true",buffered="true") + cursor.execute("SHOW VARIABLES LIKE 'character_set_connection'") + row = cursor.fetchone() + self.assertEqual(row[1], u"utf8") + cursor.close() + + self.assertEqual(self.cnx._charset_id, old_val) + + +class BugOra21477493(tests.MySQLConnectorTests): + """Bug 21477493 - EXECUTEMANY() API WITH INSERT INTO .. SELECT STATEMENT + RETURNS INTERFACEERROR + """ + def setUp(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + cursor = self.cnx.cursor() + cursor.execute("DROP TABLE IF EXISTS fun1") + cursor.execute("CREATE TABLE fun1(a CHAR(50), b INT)") + data=[('A',1),('B',2)] + cursor.executemany("INSERT INTO fun1 (a, b) VALUES (%s, %s)",data) + cursor.close() + + def tearDown(self): + cursor = self.cnx.cursor() + cursor.execute("DROP TABLE IF EXISTS fun1") + cursor.close() + + def test_insert_into_select_type1(self): + data = [('A',1),('B',2)] + cursor = self.cnx.cursor() + cursor.executemany("INSERT INTO fun1 SELECT CONCAT('VALUES', %s), " + "b + %s FROM fun1", data) + cursor.close() + + cursor = self.cnx.cursor() + cursor.execute("SELECT * FROM fun1") + self.assertEqual(8, len(cursor.fetchall())) + + def test_insert_into_select_type2(self): + data = [('A',1),('B',2)] + cursor = self.cnx.cursor() + cursor.executemany("INSERT INTO fun1 SELECT CONCAT('VALUES(ab, cd)'," + "%s), b + %s FROM fun1", data) + cursor.close() + + cursor = self.cnx.cursor() + cursor.execute("SELECT * FROM fun1") + self.assertEqual(8, len(cursor.fetchall())) + + def test_insert_into_select_type3(self): + config = tests.get_mysql_config() + data = [('A',1),('B',2)] + cursor = self.cnx.cursor() + cursor.executemany("INSERT INTO `{0}`.`fun1` SELECT CONCAT('" + "VALUES(ab, cd)', %s), b + %s FROM fun1" + "".format(config["database"]), data) + cursor.close() + + cursor = self.cnx.cursor() + cursor.execute("SELECT * FROM fun1") + self.assertEqual(8, len(cursor.fetchall())) + + class BugOra21492815(tests.MySQLConnectorTests): """BUG#21492815: CALLPROC() HANGS WHEN CONSUME_RESULTS=TRUE """ @@ -3991,3 +4234,920 @@ def test_set(self): results.append(result.fetchall()) self.assertEqual(exp, results) cur.close() + + +@unittest.skipIf(not CMySQLConnection, ERR_NO_CEXT) +class BugOra21656282(tests.MySQLConnectorTests): + """BUG#21656282: CONNECT FAILURE WITH C-EXT WHEN PASSWORD CONTAINS UNICODE + CHARACTER + """ + def setUp(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + self.host = '127.0.0.1' if config['unix_socket'] and os.name != 'nt' \ + else config['host'] + self.user = 'unicode_user' + self.password = u'步' + + # Use utf8mb4 character set + self.cnx.cmd_query("SET character_set_server='utf8mb4'") + + # Drop user if exists + self._drop_user(self.host, self.user) + + # Create the user with unicode password + create_user = (u"CREATE USER '{user}'@'{host}' IDENTIFIED BY " + u"'{password}'") + self.cnx.cmd_query(create_user.format(user=self.user, host=self.host, + password=self.password)) + + # Grant all to new user on database + grant = "GRANT ALL ON {database}.* TO '{user}'@'{host}'" + self.cnx.cmd_query(grant.format(database=config['database'], + user=self.user, host=self.host)) + + def tearDown(self): + self._drop_user(self.host, self.user) + + def _drop_user(self, host, user): + try: + drop_user = "DROP USER '{user}'@'{host}'" + self.cnx.cmd_query(drop_user.format(user=user, host=host)) + except errors.DatabaseError: + # It's OK when drop user fails + pass + + def test_unicode_password(self): + config = tests.get_mysql_config() + config.pop('unix_socket') + config['user'] = self.user + config['password'] = self.password + try: + cnx = CMySQLConnection(**config) + except Exception as err: + self.fail('Failed using password with unicode characters: ' + 'e->{} t->{}'.format(err, type(err))) + else: + cnx.close() + + +class BugOra21530841(tests.MySQLConnectorTests): + """BUG#21530841: SELECT FAILS WITH ILLEGAL RESULT SET ERROR WHEN COLUMN + COUNT IN RESULT > 4096 + """ + def setUp(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + self.tbl = "Bug21530841" + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + + def tearDown(self): + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cnx.close() + + def test_big_column_count(self): + cur = self.cnx.cursor(raw=False, buffered=False) + # Create table with 512 Columns + table = "CREATE TABLE {0} ({1})".format(self.tbl, + ", ".join(["c{0} INT".format(idx) for idx in range(512)])) + cur.execute(table) + + # Insert 1 record + cur.execute("INSERT INTO {0}(c1) values (1) ".format(self.tbl)) + self.cnx.commit() + + # Select from 10 tables + query = "SELECT * FROM {0} WHERE a1.c1 > 0".format( + ", ".join(["{0} a{1}".format(self.tbl, idx) for idx in range(10)])) + cur.execute(query) + cur.fetchone() + cur.close() + + +@unittest.skipIf(sys.version_info < (2, 7, 9), + "Python 2.7.9+ is required for SSL") +class BugOra25397650(tests.MySQLConnectorTests): + """BUG#25397650: CERTIFICATE VALIDITY NOT VERIFIED + """ + def setUp(self): + self.config = tests.get_mysql_config().copy() + self.config.pop('unix_socket') + self.config['host'] = 'localhost' + self.ca = os.path.abspath( + os.path.join(tests.SSL_DIR, 'tests_CA_cert.pem')) + self.ca_1 = os.path.abspath( + os.path.join(tests.SSL_DIR, 'tests_CA_cert_1.pem')) + + def _verify_cert(self, config): + # Test with a bad CA + config['ssl_ca'] = self.ca_1 + config['ssl_verify_cert'] = True + self.assertRaises(errors.InterfaceError, + mysql.connector.connect, **config) + config['ssl_verify_cert'] = False + mysql.connector.connect(**config) + + # Test with the correct CA + config['ssl_ca'] = self.ca + config['ssl_verify_cert'] = True + mysql.connector.connect(**config) + config['ssl_verify_cert'] = False + mysql.connector.connect(**config) + + def test_pure_verify_server_certifcate(self): + config = self.config.copy() + config['use_pure'] = True + + self._verify_cert(config) + + def test_cext_verify_server_certifcate(self): + config = self.config.copy() + config['use_pure'] = False + + self._verify_cert(config) + + +class BugOra21947091(tests.MySQLConnectorTests): + """BUG#21947091: """ + def setUp(self): + self.config = tests.get_mysql_config() + self.config.pop('unix_socket') + self.server = tests.MYSQL_SERVERS[0] + + def _disable_ssl(self): + self.server.stop() + self.server.wait_down() + + self.server.start(ssl_ca='', ssl_cert='', ssl_key='', ssl=0) + self.server.wait_up() + time.sleep(1) + + def _enable_ssl(self): + self.server.stop() + self.server.wait_down() + + self.server.start() + self.server.wait_up() + time.sleep(1) + + def _verify_ssl(self, cnx, available=True): + cur = cnx.cursor() + cur.execute("SHOW STATUS LIKE 'Ssl_version'") + result = cur.fetchall()[0] + if available: + self.assertNotEqual(result[1], '') + else: + self.assertEqual(result[1], '') + + def test_ssl_disabled_pure(self): + self.config['use_pure'] = True + self._test_ssl_modes() + + def test_ssl_disabled_cext(self): + self.config['use_pure'] = False + self._test_ssl_modes() + + def _test_ssl_modes(self): + config = self.config.copy() + # With SSL on server + # default + cnx = mysql.connector.connect(**config) + self._verify_ssl(cnx) + + # disabled + config['ssl_disabled'] = True + cnx = mysql.connector.connect(**config) + self._verify_ssl(cnx, False) + + self._disable_ssl() + config = self.config.copy() + config['ssl_ca'] = tests.SSL_CA + # Without SSL on server + try: + # default + cnx = mysql.connector.connect(**config) + self._verify_ssl(cnx, False) + + # disabled + config['ssl_disabled'] = True + cnx = mysql.connector.connect(**config) + self._verify_ssl(cnx, False) + + finally: + self._enable_ssl() + + +class BugOra25589496(tests.MySQLConnectorTests): + """BUG#25589496: COMMITS RELATED TO "BUG22529828" BROKE BINARY DATA + HANDLING FOR PYTHON 2.7 + """ + def setUp(self): + config = tests.get_mysql_config() + self.cnx = connection.MySQLConnection(**config) + self.tbl = "Bug25589496" + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + + def tearDown(self): + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cnx.close() + + def test_insert_binary(self): + table = """ + CREATE TABLE {0} ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, + `section` VARCHAR(50) NOT NULL, + `pickled` LONGBLOB NOT NULL + ) + """.format(self.tbl) + cursor = self.cnx.cursor() + cursor.execute(table) + + pickled = pickle.dumps({'a': 'b'}, pickle.HIGHEST_PROTOCOL) + add_row_q = "INSERT INTO {0} (section, pickled) " \ + "VALUES (%(section)s, %(pickled)s)".format(self.tbl) + + new_row = cursor.execute(add_row_q, {'section': 'foo', + 'pickled': pickled}) + self.cnx.commit() + self.assertEqual(1, cursor.lastrowid) + cursor.close() + + +class BugOra25383644(tests.MySQLConnectorTests): + """BUG#25383644: LOST SERVER CONNECTION LEAKS POOLED CONNECTIONS + """ + def setUp(self): + config = tests.get_mysql_config() + config["pool_size"] = 3 + self.cnxpool = pooling.MySQLConnectionPool(**config) + self.mysql_server = tests.MYSQL_SERVERS[0] + + def test_pool_exhaustion(self): + sql = "SELECT * FROM dummy" + + i = 4 + while i > 0: + cnx = self.cnxpool.get_connection() + cur = cnx.cursor() + try: + self.mysql_server.stop() + self.mysql_server.wait_down() + cur.execute(sql) + except (mysql.connector.errors.OperationalError, + mysql.connector.errors.ProgrammingError): + try: + cur.close() + cnx.close() + except mysql.connector.errors.OperationalError: + pass + finally: + i -= 1 + if not self.mysql_server.check_running(): + self.mysql_server.start() + self.mysql_server.wait_up() + + +class BugOra25558885(tests.MySQLConnectorTests): + """BUG#25558885: ERROR 2013 (LOST CONNECTION TO MYSQL SERVER) USING C + EXTENSIONS + """ + def setUp(self): + pass + + def _long_query(self, config, cursor_class): + db_conn = mysql.connector.connect(**config) + cur = db_conn.cursor(cursor_class=cursor_class) + cur.execute("select sleep(15)") + cur.close() + db_conn.disconnect() + + def test_cext_cnx(self): + config = tests.get_mysql_config() + config["use_pure"] = False + del config["connection_timeout"] + cursor_class = mysql.connector.cursor_cext.CMySQLCursorBufferedRaw + self._long_query(config, cursor_class) + + def test_pure_cnx(self): + config = tests.get_mysql_config() + config["use_pure"] = True + del config["connection_timeout"] + cursor_class = mysql.connector.cursor.MySQLCursorBufferedRaw + self._long_query(config, cursor_class) + + +class BugOra20736339(tests.MySQLConnectorTests): + """BUG#20736339: C EXTENSION FAILS TO COMPILE IF MYSQL_CONFIG RETURN MORE + THAN ONE INCLUDE DIR + """ + def test_parse_mysql_config(self): + options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version'] + includes = ["/mysql/include", "/mysql/another_include"] + config = """ + -I/mysql/include -fabi-version=2 -fno-omit-frame-pointer + -I{0} + -L/mysql/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl + -L/mysql/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl + /mysql/lib/plugin + 5.7.17 + """ + + info = cpy_distutils.parse_mysql_config_info(options, + config.strip().format(includes[0])) + self.assertEqual(1, len(info["include"])) + self.assertEqual(includes[0], info["include"][0]) + + info = cpy_distutils.parse_mysql_config_info(options, + config.strip().format(" -I".join(includes))) + self.assertEqual(2, len(info["include"])) + self.assertEqual(includes[0], info["include"][0]) + self.assertEqual(includes[1], info["include"][1]) + + +class BugOra22564149(tests.MySQLConnectorTests): + """BUG#22564149: CMD_QUERY_ITER ERRONEOUSLY CALLS ".ENCODE('UTF8')" ON + BYTESTRINGS + """ + def setUp(self): + config = tests.get_mysql_config() + self.tbl = "BugOra22564149" + self.cnx = connection.MySQLConnection(**config) + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cnx.cmd_query("CREATE TABLE {0} (id INT, name VARCHAR(50))" + "".format(self.tbl)) + + def tearDown(self): + self.cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cnx.close() + + def test_cmd_query_iter(self): + stmt = (u"SELECT 1; INSERT INTO {0} VALUES (1, 'João'),(2, 'André'); " + u"SELECT 3") + results = [] + for result in self.cnx.cmd_query_iter( + stmt.format(self.tbl).encode("utf-8")): + results.append(result) + if "columns" in result: + results.append(self.cnx.get_rows()) + + +class BugOra24659561(tests.MySQLConnectorTests): + """BUG#24659561: LOOKUPERROR: UNKNOWN ENCODING: UTF8MB4 + """ + def setUp(self): + config = tests.get_mysql_config() + config["charset"] = "utf8mb4" + self.tbl = "BugOra24659561" + self.cnx = connection.MySQLConnection(**config) + self.cur = self.cnx.cursor() + self.cur.execute("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cur.execute("CREATE TABLE {0} (id INT, name VARCHAR(100))" + "".format(self.tbl)) + + def tearDown(self): + self.cur.execute("DROP TABLE IF EXISTS {0}".format(self.tbl)) + self.cur.close() + + def test_executemany_utf8mb4(self): + self.cur.executemany( + "INSERT INTO {0} VALUES (%s, %s)".format(self.tbl), + [(1, "Nuno"), (2, "Amitabh"), (3, "Rafael")] + ) + + +@unittest.skipIf(tests.MYSQL_VERSION < (5, 7, 8), + "Support for native JSON data types introduced on 5.7.8 ") +class BugOra24948205(tests.MySQLConnectorTests): + """BUG#24948205: RESULT OF JSON_TYPE IS BYTEARRAY INSTEAD OF STR + """ + def setUp(self): + config = tests.get_mysql_config() + self.tbl = "BugOra24948205" + self.cnx = connection.MySQLConnection(**config) + self.cur = self.cnx.cursor() + + def test_execute_get_json_type_as_str(self): + self.cur.execute("SELECT j, JSON_TYPE(j), 'foo'" + "FROM (SELECT json_object('foo', 'bar') AS j) jdata") + data = [('{"foo": "bar"}', 'OBJECT', 'foo')] + rows = self.cur.fetchall() + self.assertEqual(data, rows) + for col in rows[0]: + self.assertTrue(isinstance(col, STRING_TYPES), + "{} is type {} and not the expected type " + "string".format(col, type(col))) + + +class BugOra27364914(tests.MySQLConnectorTests): + """BUG#27364914: CURSOR PREPARED STATEMENTS DO NOT CONVERT STRINGS + """ + charsets_list = ('gbk', 'sjis', 'big5', 'utf8', 'utf8mb4', 'latin1') + + def setUp(self): + cnx = connection.MySQLConnection(**tests.get_mysql_config()) + cur = cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) + + for charset in self.charsets_list: + tablename = '{0}_ps_test'.format(charset) + cur.execute("DROP TABLE IF EXISTS {0}".format(tablename)) + table = ( + "CREATE TABLE {table} (" + " id INT AUTO_INCREMENT KEY," + " c1 VARCHAR(40)," + " val2 datetime" + ") CHARACTER SET '{charset}'" + ).format(table=tablename, charset=charset) + cur.execute(table) + cnx.commit() + cur.close() + cnx.close() + + def tearDown(self): + cnx = connection.MySQLConnection(**tests.get_mysql_config()) + for charset in self.charsets_list: + tablename = '{0}_ps_test'.format(charset) + cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(tablename)) + cnx.close() + + def _test_charset(self, charset, data): + config = tests.get_mysql_config() + config['charset'] = charset + config['use_unicode'] = True + self.cnx = connection.MySQLConnection(**tests.get_mysql_config()) + cur = self.cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) + + tablename = '{0}_ps_test'.format(charset) + cur.execute("TRUNCATE {0}".format(tablename)) + self.cnx.commit() + + insert = "INSERT INTO {0} (c1) VALUES (%s)".format(tablename) + for value in data: + cur.execute(insert, (value,)) + self.cnx.commit() + + cur.execute("SELECT id, c1 FROM {0} ORDER BY id".format(tablename)) + for row in cur: + self.assertTrue(isinstance(row[1], STRING_TYPES), + "The value is expected to be a string") + self.assertEqual(data[row[0] - 1], row[1]) + + cur.close() + self.cnx.close() + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_gbk(self): + self._test_charset('gbk', [u'赵孟頫', u'赵\孟\頫\\', u'遜']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_sjis(self): + self._test_charset('sjis', ['\u005c']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_big5(self): + self._test_charset('big5', ['\u5C62']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_utf8mb4(self): + self._test_charset('utf8mb4', ['\u5C62']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_utf8(self): + self._test_charset('utf8', [u'データベース', u'데이터베이스']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_latin1(self): + self._test_charset('latin1', [u'ñ', u'Ñ']) + + +@unittest.skipIf(tests.MYSQL_VERSION < (5, 7, 8), + "Support for native JSON data types introduced on 5.7.8 ") +class BugOra24948186(tests.MySQLConnectorTests): + """BUG#24948186: MySQL JSON TYPES RETURNED AS BYTES INSTEAD OF PYTHON TYPES + """ + def setUp(self): + pass + + def tearDown(self): + pass + + def run_test_mysql_json_type(self, stm, test_values, expected_values, + mysql_type, expected_type): + config = tests.get_mysql_config() + config['charset'] = "utf8" + config['use_unicode'] = True + cnx = connection.MySQLConnection(**config) + cur = cnx.cursor() + + for test_value, expected_value in zip(test_values, expected_values): + cur.execute(stm.format(value=test_value)) + row = cur.fetchall()[0] + self.assertEqual(row[0], expected_value) #,"value is not the expected") + self.assertTrue(isinstance(row[0], expected_type), + u"value {} is not python type {}" + u"".format(row[0], expected_type)) + self.assertEqual(row[1], mysql_type, + u"value {} is mysql type {} but expected {}" + u"".format(row[0], row[1], mysql_type)) + cur.close() + cnx.close() + + @foreach_cnx() + def test_retrieve_mysql_json_boolean(self): + stm = ("SELECT j, JSON_TYPE(j)" + "from (SELECT CAST({value} AS JSON) as J) jdata") + test_values = ["true", "false"] + expected_values = [True, False] + mysql_type = "BOOLEAN" + expected_type = bool + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_integer(self): + stm = ("SELECT j->>'$.foo', JSON_TYPE(j->>'$.foo')" + "FROM (SELECT json_object('foo', {value}) AS j) jdata") + test_values = [-2147483648, -1, 0, 1, 2147483647] + expected_values = test_values + mysql_type = "INTEGER" + expected_type = int + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + test_values = [-9223372036854775808] + expected_values = test_values + mysql_type = "INTEGER" + expected_type = int + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + test_values = [92233720368547760, + 18446744073709551615] + expected_values = test_values + mysql_type = "UNSIGNED INTEGER" + expected_type = int + self.run_test_mysql_json_type(stm, test_values[0:1], + expected_values[0:1], + mysql_type, expected_type) + if PY2: + expected_type = long + else: + expected_type = int + self.run_test_mysql_json_type(stm, test_values[1:], + expected_values[1:], + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_double(self): + # Because floating-point values are approximate and not stored as exact + # values the test values are not the true maximun or minum values + stm = ("SELECT j->>'$.foo', JSON_TYPE(j->>'$.foo')" + "FROM (SELECT json_object('foo', {value}) AS j) jdata") + test_values = [-12345.555, -1.55, 1.55, 12345.555] + expected_values = test_values + mysql_type = "DOUBLE" + expected_type = float + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_string(self): + stm = (u"SELECT j->>'$.foo', JSON_TYPE(j->>'$.foo')" + u"FROM (SELECT json_object('foo', {value}) AS j) jdata") + test_values = ['\'" "\'', '\'"some text"\'', u'\'"データベース"\''] + expected_values = ['" "', '"some text"', u'"データベース"'] + mysql_type = "STRING" + expected_type = STRING_TYPES + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_datetime_types(self): + stm = ("SELECT j, JSON_TYPE(j)" + "from (SELECT CAST({value} AS JSON) as J) jdata") + test_values = ["cast('1972-01-01 00:42:49.000000' as DATETIME)", + "cast('2018-01-01 23:59:59.000000' as DATETIME)"] + expected_values = [datetime(1972, 1, 1, 0, 42, 49), + datetime(2018, 1, 1, 23, 59, 59)] + mysql_type = "DATETIME" + expected_type = datetime + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_date_types(self): + stm = ("SELECT j, JSON_TYPE(j)" + "from (SELECT CAST({value} AS JSON) as J) jdata") + test_values = ["DATE('1972-01-01')", + "DATE('2018-12-31')"] + expected_values = [date(1972, 1, 1), + date(2018, 12, 31)] + mysql_type = "DATE" + expected_type = date + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + @foreach_cnx() + def test_retrieve_mysql_json_time_types(self): + stm = ("SELECT j, JSON_TYPE(j)" + "from (SELECT CAST({value} AS JSON) as J) jdata") + test_values = ["TIME('00:42:49.000000')", + "TIME('23:59:59.000001')"] + expected_values = [timedelta(hours=0, minutes=42, seconds=49), + timedelta(hours=23, minutes=59, seconds=59, + microseconds=1)] + mysql_type = "TIME" + expected_type = timedelta + self.run_test_mysql_json_type(stm, test_values, expected_values, + mysql_type, expected_type) + + +unittest.skipIf(tests.MYSQL_VERSION < (5, 6, 7), + "BugOra16217765 not tested with MySQL version < 5.6.7") +@unittest.skipIf(not CMySQLConnection, ERR_NO_CEXT) +class Bug28443941(tests.MySQLConnectorTests): + """BUG#28443941: DIFFERENCE PURE AND C-EXT ON CMD_CHANGE_USER() + """ + + users = { + 'sha256user': { + 'username': 'sha256user', + 'password': 'sha256P@ss', + 'auth_plugin': 'sha256_password', + }, + 'nativeuser': { + 'username': 'nativeuser', + 'password': 'nativeP@ss', + 'auth_plugin': 'mysql_native_password', + } + } + + def _create_user(self, cnx, user, password, host, database, + plugin): + + self._drop_user(user, host) + create_user = ("CREATE USER '{user}'@'{host}' " + "IDENTIFIED WITH {plugin}") + cnx.cmd_query(create_user.format(user=user, host=host, plugin=plugin)) + + if tests.MYSQL_VERSION[0:3] < (8, 0, 5): + if plugin == 'sha256_password': + cnx.cmd_query("SET old_passwords = 2") + else: + cnx.cmd_query("SET old_passwords = 0") + + if tests.MYSQL_VERSION < (5, 7, 5): + passwd = ("SET PASSWORD FOR '{user}'@'{host}' = " + "PASSWORD('{password}')").format(user=user, host=host, + password=password) + else: + passwd = ("ALTER USER '{user}'@'{host}' IDENTIFIED BY " + "'{password}'").format(user=user, host=host, + password=password) + cnx.cmd_query(passwd) + + grant = "GRANT ALL ON {database}.* TO '{user}'@'{host}'" + cnx.cmd_query(grant.format(database=database, user=user, host=host)) + + def _drop_user(self, user, host): + try: + self.admin_cnx.cmd_query("DROP USER '{user}'@'{host}'".format( + host=host, + user=user)) + except errors.DatabaseError: + # It's OK when drop fails + pass + + def setUp(self): + config = tests.get_mysql_config() + self.admin_cnx = connection.MySQLConnection(**config) + for _, user in self.users.items(): + self._create_user(self.admin_cnx, user['username'], + user['password'], + config['host'], + config['database'], + plugin=user['auth_plugin']) + + def tearDown(self): + config = tests.get_mysql_config() + for _, user in self.users.items(): + self._drop_user(user['username'], config['host']) + + def test_cmd_change_user(self): + config = tests.get_mysql_config() + config['unix_socket'] = None + + user = self.users['sha256user'] + config['user'] = user['username'] + config['password'] = user['password'] + config['client_flags'] = [constants.ClientFlag.PLUGIN_AUTH] + config['auth_plugin'] = user['auth_plugin'] + + try: + cnx = connection.MySQLConnection(**config) + except Exception as exc: + import traceback + traceback.print_exc() + self.fail(self.errmsg.format(config['auth_plugin'], exc)) + + user2 = self.users['nativeuser'] + config2 = {'user': user2['username'], + 'password': user2['password'], + 'client_flags': [constants.ClientFlag.PLUGIN_AUTH], + 'auth_plugin': user2['auth_plugin']} + try: + status_p = cnx.cmd_change_user(config2['user'], + config2['password']) + except: + self.fail("Changing user failed with pure Python connector") + + try: + cnx = CMySQLConnection(**config) + except Exception as exc: + import traceback + traceback.print_exc() + self.fail(self.errmsg.format(config['auth_plugin'], exc)) + + try: + status_c = cnx.cmd_change_user(config2['user'], + config2['password']) + except: + self.fail("cmd_change_user did not return any result.") + + if status_c is None: + self.fail("Changing user failed with c-extension") + + # Server status can be different, therefore we only check that exists. + for key in status_p.keys(): + try: + value = status_c.pop(key) + if key is not 'status_flag': + self.assertEqual(status_p[key], value, "status {} not " + "equal: {} differs from {}" + "".format(key, value, status_p[key])) + except KeyError as err: + self.fail("The cmd_change_user from c-ext is missing an" + "element: {}".format(err)) + if status_c: + self.fail("The cmd_change_user from c-ext has additional elements:" + " {}".format(status_c)) + + +class BugOra27364914(tests.MySQLConnectorTests): + """BUG#27364914: CURSOR PREPARED STATEMENTS DO NOT CONVERT STRINGS + """ + charsets_list = ('gbk', 'sjis', 'big5', 'utf8', 'utf8mb4', 'latin1') + + def setUp(self): + cnx = connection.MySQLConnection(**tests.get_mysql_config()) + cur = cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) + + for charset in self.charsets_list: + tablename = '{0}_ps_test'.format(charset) + cur.execute("DROP TABLE IF EXISTS {0}".format(tablename)) + table = ( + "CREATE TABLE {table} (" + " id INT AUTO_INCREMENT KEY," + " c1 VARCHAR(40)," + " val2 datetime" + ") CHARACTER SET '{charset}'" + ).format(table=tablename, charset=charset) + cur.execute(table) + cnx.commit() + cur.close() + cnx.close() + + def tearDown(self): + cnx = connection.MySQLConnection(**tests.get_mysql_config()) + for charset in self.charsets_list: + tablename = '{0}_ps_test'.format(charset) + cnx.cmd_query("DROP TABLE IF EXISTS {0}".format(tablename)) + cnx.close() + + def _test_charset(self, charset, data): + config = tests.get_mysql_config() + config['charset'] = charset + config['use_unicode'] = True + self.cnx = connection.MySQLConnection(**tests.get_mysql_config()) + cur = self.cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) + + tablename = '{0}_ps_test'.format(charset) + cur.execute("TRUNCATE {0}".format(tablename)) + self.cnx.commit() + + insert = "INSERT INTO {0} (c1) VALUES (%s)".format(tablename) + for value in data: + cur.execute(insert, (value,)) + self.cnx.commit() + + cur.execute("SELECT id, c1 FROM {0} ORDER BY id".format(tablename)) + for row in cur: + self.assertTrue(isinstance(row[1], STRING_TYPES), + "The value is expected to be a string") + self.assertEqual(data[row[0] - 1], row[1]) + + cur.close() + self.cnx.close() + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_gbk(self): + self._test_charset('gbk', [u'赵孟頫', u'赵\孟\頫\\', u'遜']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_sjis(self): + self._test_charset('sjis', ['\u005c']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_big5(self): + self._test_charset('big5', ['\u5C62']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_utf8mb4(self): + self._test_charset('utf8mb4', ['\u5C62']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_utf8(self): + self._test_charset('utf8', [u'データベース', u'데이터베이스']) + + @foreach_cnx() + def test_cursor_prepared_statement_with_charset_latin1(self): + self._test_charset('latin1', [u'ñ', u'Ñ']) + + +@unittest.skipIf(tests.MYSQL_VERSION < (8, 0, 11), + "Not support for TLSv1.2 or not available by default") +class Bug26484601(tests.MySQLConnectorTests): + """UNABLE TO CONNECT TO A MYSQL SERVER USING TLSV1.2""" + + def try_connect(self, tls_version, expected_ssl_version): + config = tests.get_mysql_config().copy() + config['ssl_version'] = tls_version + config['ssl_ca'] = '' + cnx = connection.MySQLConnection(**config) + query = "SHOW STATUS LIKE 'ssl_version%'" + cur = cnx.cursor() + cur.execute(query) + res = cur.fetchall() + msg = ("Not using the expected TLS version: {}, instead the " + "connection used: {}.") + self.assertEqual(res[0][1], expected_ssl_version, + msg.format(expected_ssl_version, res)) + + def test_get_connection_using_given_TLS_version(self): + """Test connect using the given TLS version + + The system variable tls_version determines which protocols the + server is permitted to use from those that are available (note#3). + +---------------+-----------------------+ + | Variable_name | Value | + +---------------+-----------------------+ + | tls_version | TLSv1,TLSv1.1,TLSv1.2 | + +---------------+-----------------------+ + + To restrict and permit only connections with a specific version, the + variable can be set with those specific versions that will be allowed, + changing the configuration file. + + [mysqld] + tls_version=TLSv1.1,TLSv1.2 + + This test will take adventage of the fact that the connector can + request to use a defined version of TLS to test that the connector can + connect to the server using such version instead of changing the + configuration of the server that will imply the stoping and restarting + of the server incrementing the time to run the test. In addition the + test relay in the default value of the 'tls_version' variable is set to + 'TLSv1,TLSv1.1,TLSv1.2' (note#2). + + On this test a connection will be + attempted forcing to use a determined version of TLS, (all of them + must be successfully) finally making sure that the connection was done + using the given TLS_version using the ssl.version() method (note#3). + + Notes: + 1.- tls_version is only available on MySQL 5.7 + 2.- 5.6.39 does not support TLSv1.2 so for test will be skip. Currently + in 5.7.21 is set to default values TLSv1,TLSv1.1,TLSv1.2 same as in + 8.0.11+. This test will be only run in such versions and above. + 3.- The ssl.version() method returns the version of tls used in during + the connection, however the version returned using ssl.cipher() is + not correct on windows, only indicates the newer version supported. + + """ + for tls_v_name, tls_version in TLS_VERSIONS.items(): + self.try_connect(tls_version, tls_v_name) + + def test_get_connection_using_servers_TLS_version(self): + """Test connect using the servers default TLS version + + The TLS version used during the secured connection is chosen by the + server at the time the ssl handshake is made if the connector does not + specifies any specific version to use. The default value of the + ssl_version is None, however this only mean to the connector that none + specific version will be chosen by the server when the ssl handshake + occurs. + """ + # The default value for the connector 'ssl_version' is None + # For the expected version, the server will use the latest version of + # TLS available "TLSv1.2". + tls_version = None + self.try_connect(tls_version, "TLSv1.2") diff --git a/tests/test_connection.py b/tests/test_connection.py index e58b5774..7ee0db4d 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -285,15 +285,27 @@ def test__handle_result(self): 'status_flag': 1, 'affected_rows': 6} self.assertEqual(exp, self.cnx._handle_result(packet)) - exp = [ - bytearray(b'\x47\x00\x00\x04\x31\x09\x63\x31\x5f\x31\x09\x63\x32' - b'\x5f\x31\x0a\x32\x09\x63\x31\x5f\x32\x09\x63\x32\x5f' - b'\x32\x0a\x33\x09\x63\x31\x5f\x33\x09\x63\x32\x5f\x33' - b'\x0a\x34\x09\x63\x31\x5f\x34\x09\x63\x32\x5f\x34\x0a' - b'\x35\x09\x63\x31\x5f\x35\x09\x63\x32\x5f\x35\x0a\x36' - b'\x09\x63\x31\x5f\x36\x09\x63\x32\x5f\x36'), - bytearray(b'\x00\x00\x00\x05') - ] + if os.name != 'nt': + exp = [ + bytearray(b'\x47\x00\x00\x04\x31\x09\x63\x31\x5f\x31\x09\x63\x32' + b'\x5f\x31\x0a\x32\x09\x63\x31\x5f\x32\x09\x63\x32\x5f' + b'\x32\x0a\x33\x09\x63\x31\x5f\x33\x09\x63\x32\x5f\x33' + b'\x0a\x34\x09\x63\x31\x5f\x34\x09\x63\x32\x5f\x34\x0a' + b'\x35\x09\x63\x31\x5f\x35\x09\x63\x32\x5f\x35\x0a\x36' + b'\x09\x63\x31\x5f\x36\x09\x63\x32\x5f\x36'), + bytearray(b'\x00\x00\x00\x05') + ] + else: + exp = [ + bytearray(b'\x4c\x00\x00\x04\x31\x09\x63\x31\x5f\x31\x09\x63' + b'\x32\x5f\x31\x0d\x0a\x32\x09\x63\x31\x5f\x32\x09' + b'\x63\x32\x5f\x32\x0d\x0a\x33\x09\x63\x31\x5f\x33' + b'\x09\x63\x32\x5f\x33\x0d\x0a\x34\x09\x63\x31\x5f' + b'\x34\x09\x63\x32\x5f\x34\x0d\x0a\x35\x09\x63\x31' + b'\x5f\x35\x09\x63\x32\x5f\x35\x0d\x0a\x36\x09\x63' + b'\x31\x5f\x36\x09\x63\x32\x5f\x36'), + bytearray(b'\x00\x00\x00\x05') + ] self.assertEqual(exp, self.cnx._socket.sock._client_sends) # Column count is invalid ( more than 4096) @@ -742,6 +754,7 @@ def recv(self): def test__do_auth(self): """Authenticate with the MySQL server""" self.cnx._socket.sock = tests.DummySocket() + self.cnx._handshake["auth_plugin"] = "mysql_native_password" flags = constants.ClientFlag.get_default() kwargs = { 'username': 'ham', @@ -781,6 +794,196 @@ def test__do_auth(self): self.assertRaises(errors.ProgrammingError, self.cnx._do_auth, **kwargs) + @unittest.skipIf(not tests.SSL_AVAILABLE, "Python has no SSL support") + @unittest.skipIf(tests.MYSQL_VERSION < (8, 0, 3), + "caching_sha2_password plugin not supported by server.") + def test_caching_sha2_password(self): + """Authenticate with the MySQL server using caching_sha2_password""" + self.cnx._socket.sock = tests.DummySocket() + flags = constants.ClientFlag.get_default() + flags |= constants.ClientFlag.SSL + kwargs = { + 'username': 'ham', + 'password': 'spam', + 'database': 'test', + 'charset': 33, + 'client_flags': flags, + 'ssl_options': { + 'ca': os.path.join(tests.SSL_DIR, 'tests_CA_cert.pem'), + 'cert': os.path.join(tests.SSL_DIR, 'tests_client_cert.pem'), + 'key': os.path.join(tests.SSL_DIR, 'tests_client_key.pem'), + }, + } + + self.cnx._handshake['auth_plugin'] = 'caching_sha2_password' + self.cnx._handshake['auth_data'] = b'h4i6oP!OLng9&PD@WrYH' + self.cnx._socket.switch_to_ssl = \ + lambda ca, cert, key, verify_cert, cipher, ssl_version: None + + # Test perform_full_authentication + # Exchange: + # Client Server + # ------ ------ + # make_ssl_auth + # first_auth + # full_auth + # second_auth + # OK + self.cnx._socket.sock.reset() + self.cnx._socket.sock.add_packets([ + bytearray(b'\x02\x00\x00\x03\x01\x04'), # full_auth request + bytearray(b'\x07\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00') # OK + ]) + self.cnx._do_auth(**kwargs) + packets = self.cnx._socket.sock._client_sends + self.assertEqual(3, len(packets)) + ssl_pkt = self.cnx._protocol.make_auth_ssl( + charset=kwargs['charset'], client_flags=kwargs['client_flags']) + # Check the SSL request packet + self.assertEqual(packets[0][4:], ssl_pkt) + auth_pkt = self.cnx._protocol.make_auth( + self.cnx._handshake, kwargs['username'], + kwargs['password'], kwargs['database'], + charset=kwargs['charset'], + client_flags=kwargs['client_flags'], + ssl_enabled=True) + # Check the first_auth packet + self.assertEqual(packets[1][4:], auth_pkt) + # Check the second_auth packet + self.assertEqual(packets[2][4:], + bytearray(kwargs["password"].encode('utf-8') + b"\x00")) + + # Test fast_auth_success + # Exchange: + # Client Server + # ------ ------ + # make_ssl_auth + # first_auth + # fast_auth + # OK + self.cnx._socket.sock.reset() + self.cnx._socket.sock.add_packets([ + bytearray(b'\x02\x00\x00\x03\x01\x03'), # fast_auth success + bytearray(b'\x07\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00') # OK + ]) + self.cnx._do_auth(**kwargs) + packets = self.cnx._socket.sock._client_sends + self.assertEqual(2, len(packets)) + ssl_pkt = self.cnx._protocol.make_auth_ssl( + charset=kwargs['charset'], client_flags=kwargs['client_flags']) + # Check the SSL request packet + self.assertEqual(packets[0][4:], ssl_pkt) + auth_pkt = self.cnx._protocol.make_auth( + self.cnx._handshake, kwargs['username'], + kwargs['password'], kwargs['database'], + charset=kwargs['charset'], + client_flags=kwargs['client_flags'], + ssl_enabled=True) + # Check the first auth packet + self.assertEqual(packets[1][4:], auth_pkt) + + @unittest.skipIf(not tests.SSL_AVAILABLE, "Python has no SSL support") + def test_auth_plugin_is_not_supported_but_required(self): + """Test behavior when server's default auth_plugin is required""" + self.cnx._socket.sock = tests.DummySocket() + flags = constants.ClientFlag.get_default() + flags |= constants.ClientFlag.SSL + kwargs = { + 'username': 'ham', + 'password': 'spam', + 'database': 'test', + 'charset': 33, + 'client_flags': flags, + 'ssl_options': { + 'ca': os.path.join(tests.SSL_DIR, 'tests_CA_cert.pem'), + 'cert': os.path.join(tests.SSL_DIR, 'tests_client_cert.pem'), + 'key': os.path.join(tests.SSL_DIR, 'tests_client_key.pem'), + }, + } + + self.cnx._handshake['auth_plugin'] = 'unsupported_auth_plugin' + self.cnx._handshake['auth_data'] = b'abcdef!012345' + self.cnx._socket.switch_to_ssl = \ + lambda ca, cert, key, verify_cert, cipher, ssl_version: None + + # Test perform_full_authentication + # Exchange: + # Client Server + # ------ ------ + # make_ssl_auth + # first_auth + # Sorry user requires the unsupported_auth_plugin + # second_auth + # OK + self.cnx._socket.sock.reset() + self.cnx._socket.sock.add_packets([ + bytearray(b'\x2c\x00\x00\x03\xfe\x75\x6e\x73\x75\x70\x70\x6f\x72' + b'\x74\x65\x64\x5f\x61\x75\x74\x68\x5f\x70\x6c\x75\x67' + b'\x69\x6e\x00\x60\x1e\x10\x78\x01\x3c\x1e\x33\x38\x6f' + b'\x08\x5f\x0d\x7a\x6f\x01\x7b\x7a\x4a\x0d\x00') + ]) + # Since the fictional authoritation plugin 'unsupported_auth_plugin' is + # not supported a NotSupportedError is raised + self.assertRaises(errors.NotSupportedError, self.cnx._do_auth, **kwargs) + + @unittest.skipIf(not tests.SSL_AVAILABLE, "Python has no SSL support") + @unittest.skipIf(tests.MYSQL_VERSION < (8, 0, 3), + "caching_sha2_password plugin not supported by server.") + def test_auth_plugin_fall_back_if_not_supported(self): + """Test Fall back to dflt auth_plugin if server's plugin is unknown""" + self.cnx._socket.sock = tests.DummySocket() + flags = constants.ClientFlag.get_default() + flags |= constants.ClientFlag.SSL + kwargs = { + 'username': 'ham', + 'password': 'spam', + 'database': 'test', + 'charset': 33, + 'client_flags': flags, + 'ssl_options': { + 'ca': os.path.join(tests.SSL_DIR, 'tests_CA_cert.pem'), + 'cert': os.path.join(tests.SSL_DIR, 'tests_client_cert.pem'), + 'key': os.path.join(tests.SSL_DIR, 'tests_client_key.pem'), + }, + } + + self.cnx._handshake['auth_plugin'] = 'unsupported_auth_plugin' + self.cnx._handshake['auth_data'] = b'abcdef!012345' + self.cnx._socket.switch_to_ssl = \ + lambda ca, cert, key, verify_cert, cipher, ssl_version: None + + # Test perform_full_authentication + # Exchange: + # Client Server + # ------ ------ + # make_ssl_auth + # first_auth + # auth_switch to mysql_native_password + # second_auth + # OK + self.cnx._socket.sock.reset() + self.cnx._socket.sock.add_packets([ + bytearray(b'\x8d\xaa\x0b\x00\x00\x00'), # full_auth request + bytearray(b'\x00@!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), + bytearray(b'\x07\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00') # OK + ]) + + # No exception should be raided + self.cnx._do_auth(**kwargs) + + packets = self.cnx._socket.sock._client_sends + + self.cnx._handshake['auth_plugin'] = 'mysql_native_password' + auth_pkt = self.cnx._protocol.make_auth( + self.cnx._handshake, kwargs['username'], + kwargs['password'], kwargs['database'], + charset=kwargs['charset'], + client_flags=kwargs['client_flags'], + ssl_enabled=True) + # Check the first_auth packet + self.assertEqual(packets[1][4:], auth_pkt) + @unittest.skipIf(not tests.SSL_AVAILABLE, "Python has no SSL support") def test__do_auth_ssl(self): """Authenticate with the MySQL server using SSL""" @@ -812,9 +1015,11 @@ def test__do_auth_ssl(self): self.cnx._handshake, kwargs['username'], kwargs['password'], kwargs['database'], charset=kwargs['charset'], - client_flags=kwargs['client_flags']), + client_flags=kwargs['client_flags'], + ssl_enabled=True), ] - self.cnx._socket.switch_to_ssl = lambda ca, cert, key: None + self.cnx._socket.switch_to_ssl = \ + lambda ca, cert, key, verify_cert, cipher, ssl_version: None self.cnx._socket.sock.reset() self.cnx._socket.sock.add_packets([ bytearray(b'\x07\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00'), @@ -1598,6 +1803,8 @@ def test_cmd_reset_connection(self): else: self.assertNotEqual((b'2',), self.cnx.get_rows()[0][0]) + @unittest.skipIf(tests.MYSQL_VERSION <= (5, 7, 1), "Shutdown CMD " + "not tested with MySQL version 5.6 (BugOra17422299)") def test_shutdown(self): """Shutting down a connection""" config = tests.get_mysql_config() @@ -1671,10 +1878,16 @@ def test_load_local_infile(self): self.cur.execute(sql, (self.data_file, )) self.cur.execute("SELECT * FROM local_data") - exp = [ - (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), - (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), - (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + if os.name != 'nt': + exp = [ + (1, 'c1_1', 'c2_1'), (2, 'c1_2', 'c2_2'), + (3, 'c1_3', 'c2_3'), (4, 'c1_4', 'c2_4'), + (5, 'c1_5', 'c2_5'), (6, 'c1_6', 'c2_6')] + else: + exp = [ + (1, 'c1_1', 'c2_1\r'), (2, 'c1_2', 'c2_2\r'), + (3, 'c1_3', 'c2_3\r'), (4, 'c1_4', 'c2_4\r'), + (5, 'c1_5', 'c2_5\r'), (6, 'c1_6', 'c2_6')] self.assertEqual(exp, self.cur.fetchall()) def test_without_load_local_infile(self): diff --git a/tests/test_cursor.py b/tests/test_cursor.py index acfd0252..a161fd6a 100644 --- a/tests/test_cursor.py +++ b/tests/test_cursor.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -321,7 +321,7 @@ def test_next(self): self.cur = cursor.MySQLCursor(self.cnx) self.assertRaises(StopIteration, self.cur.__next__) self.cur.execute("SELECT BINARY 'ham'") - exp = (b'ham',) + exp = ('ham',) self.assertEqual(exp, next(self.cur)) self.cur.close() @@ -361,6 +361,8 @@ def test__process_params(self): datetime.time(20, 3, 23), st_now, datetime.timedelta(hours=40, minutes=30, seconds=12), + 'foo %(t)s', + 'foo %(s)s', ) exp = ( b'NULL', @@ -382,6 +384,8 @@ def test__process_params(self): b"'" + time.strftime('%Y-%m-%d %H:%M:%S', st_now).encode('ascii') + b"'", b"'40:30:12'", + b"'foo %(t)s'", + b"'foo %(s)s'", ) self.cnx = connection.MySQLConnection(**tests.get_mysql_config()) @@ -421,28 +425,32 @@ def test__process_params_dict(self): 'p': datetime.time(20, 3, 23), 'q': st_now, 'r': datetime.timedelta(hours=40, minutes=30, seconds=12), + 's': 'foo %(t)s', + 't': 'foo %(s)s', } exp = { - b'%(a)s': b'NULL', - b'%(b)s': b'128', - b'%(c)s': b'1281288', - b'%(d)s': repr(float(3.14)) if PY2 else b'3.14', - b'%(e)s': b"'3.14'", - b'%(f)s': b"'back\\\\slash'", - b'%(g)s': b"'newline\\n'", - b'%(h)s': b"'return\\r'", - b'%(i)s': b"'\\'single\\''", - b'%(j)s': b'\'\\"double\\"\'', - b'%(k)s': b"'windows\\\x1a'", - b'%(l)s': b"'Strings are sexy'", - b'%(m)s': b"'\xe8\x8a\xb1'", - b'%(n)s': b"'2008-05-07 20:01:23'", - b'%(o)s': b"'2008-05-07'", - b'%(p)s': b"'20:03:23'", - b'%(q)s': b"'" + + b'a': b'NULL', + b'b': b'128', + b'c': b'1281288', + b'd': repr(float(3.14)) if PY2 else b'3.14', + b'e': b"'3.14'", + b'f': b"'back\\\\slash'", + b'g': b"'newline\\n'", + b'h': b"'return\\r'", + b'i': b"'\\'single\\''", + b'j': b'\'\\"double\\"\'', + b'k': b"'windows\\\x1a'", + b'l': b"'Strings are sexy'", + b'm': b"'\xe8\x8a\xb1'", + b'n': b"'2008-05-07 20:01:23'", + b'o': b"'2008-05-07'", + b'p': b"'20:03:23'", + b'q': b"'" + time.strftime('%Y-%m-%d %H:%M:%S', st_now).encode('ascii') + b"'", - b'%(r)s': b"'40:30:12'", + b'r': b"'40:30:12'", + b's': b"'foo %(t)s'", + b't': b"'foo %(s)s'", } self.cnx = connection.MySQLConnection(**tests.get_mysql_config()) @@ -546,7 +554,7 @@ def test_execute(self): self.assertTrue(tests.cmp_result(exp, self.cur._warnings)) self.cur.execute("SELECT BINARY 'ham'") - exp = [(b'ham',)] + exp = [('ham',)] self.assertEqual(exp, self.cur.fetchall()) self.cur.close() @@ -818,7 +826,7 @@ def test_fetchone(self): self.cnx = connection.MySQLConnection(**tests.get_mysql_config()) self.cur = self.cnx.cursor() self.cur.execute("SELECT BINARY 'ham'") - exp = (b'ham',) + exp = ('ham',) self.assertEqual(exp, self.cur.fetchone()) self.assertEqual(None, self.cur.fetchone()) self.cur.close() @@ -1105,7 +1113,7 @@ def setUp(self): def test_callproc(self): cur = self.cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) - self.assertRaises(errors.NotSupportedError, cur.callproc) + self.assertRaises(errors.NotSupportedError, cur.callproc, None) def test_close(self): cur = self.cnx.cursor(cursor_class=cursor.MySQLCursorPrepared) @@ -1224,7 +1232,7 @@ def test_executemany(self): self.assertEqual(3, cur.rowcount) cur.execute(stmt_select) - self.assertEqual([(1, b'100'), (2, b'200'), (3, b'300')], + self.assertEqual([(1, '100'), (2, '200'), (3, '300')], cur.fetchall(), "Multi insert test failed") data = [(2,), (3,)] @@ -1247,8 +1255,8 @@ def _fetch_row(): return row cur._fetch_row = _fetch_row - cur._test_fetch_row = [(b'ham',)] - self.assertEqual((b'ham',), cur.fetchone()) + cur._test_fetch_row = [('ham',)] + self.assertEqual(('ham',), cur.fetchone()) self.assertEqual(None, cur.fetchone()) def test_fetchmany(self): @@ -1332,6 +1340,7 @@ def setUp(self): 'name VARCHAR(20), city VARCHAR(20))') def tearDown(self): + self.cur.execute('DROP TABLE IF EXISTS MySQLCursorBufferedDictTests') self.cur.close() self.connection.close() @@ -1406,6 +1415,9 @@ def setUp(self): 'id INT(10), name VARCHAR(20), city VARCHAR(20))') def tearDown(self): + self.cur.execute('DROP TABLE IF EXISTS ' + 'MySQLCursorBufferedNamedTupleTests') + self.cur.close() self.connection.close() diff --git a/tests/test_django.py b/tests/test_django.py index 45c2b138..917ed3ba 100644 --- a/tests/test_django.py +++ b/tests/test_django.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -60,6 +60,7 @@ 'TEST_COLLATION': 'utf8_general_ci', 'CONN_MAX_AGE': 0, 'AUTOCOMMIT': True, + 'TIME_ZONE': None, }, } settings.SECRET_KEY = "django_tests_secret_key" @@ -92,15 +93,11 @@ # Have to load django.db to make importing db backend work for Django < 1.6 import django.db # pylint: disable=W0611 -if tests.DJANGO_VERSION >= (1, 6): - if tests.DJANGO_VERSION >= (1, 8): - from django.db.backends.base.introspection import FieldInfo - else: - from django.db.backends import FieldInfo from django.db.backends.signals import connection_created from django.utils.safestring import SafeBytes, SafeText import mysql.connector +from mysql.connector.django.introspection import FieldInfo if DJANGO_AVAILABLE: from mysql.connector.django.base import ( @@ -147,14 +144,18 @@ def tearDownClass(cls): def test_get_table_list(self): cur = self.cnx.cursor() - exp = list(TABLES.keys()) - for exp in list(TABLES.keys()): + for exp in TABLES.keys(): if sys.version_info < (2, 7): self.assertTrue(exp in self.introspect.get_table_list(cur)) else: - self.assertIn(exp, self.introspect.get_table_list(cur), - "Table {table_name} not in table list".format( - table_name=exp)) + if tests.DJANGO_VERSION < (1, 8): + res = any(table == exp + for table in self.introspect.get_table_list(cur)) + else: + res = any(table.name == exp + for table in self.introspect.get_table_list(cur)) + self.assertTrue(res, "Table {table_name} not in table list" + "".format(table_name=exp)) def test_get_table_description(self): cur = self.cnx.cursor() @@ -165,24 +166,51 @@ def test_get_table_description(self): ('c1', 3, None, None, None, None, 1, 16392), ('c2', 253, None, 20, None, None, 1, 16388) ] - else: + elif tests.DJANGO_VERSION < (1, 8): exp = [ - FieldInfo(name='id', type_code=3, display_size=None, + FieldInfo(name=u'id', type_code=3, display_size=None, internal_size=None, precision=None, scale=None, null_ok=0), - FieldInfo(name='c1', type_code=3, display_size=None, + FieldInfo(name=u'c1', type_code=3, display_size=None, internal_size=None, precision=None, scale=None, null_ok=1), - FieldInfo(name='c2', type_code=253, display_size=None, + FieldInfo(name=u'c2', type_code=253, display_size=None, internal_size=20, precision=None, scale=None, null_ok=1) ] + elif tests.DJANGO_VERSION < (1, 11): + exp = [ + FieldInfo(name=u'id', type_code=3, display_size=None, + internal_size=None, precision=10, scale=None, + null_ok=0, extra=u'auto_increment'), + FieldInfo(name=u'c1', type_code=3, display_size=None, + internal_size=None, precision=10, scale=None, + null_ok=1, extra=u''), + FieldInfo(name=u'c2', type_code=253, display_size=None, + internal_size=20, precision=None, scale=None, + null_ok=1, extra=u'') + ] + else: + exp = [ + FieldInfo(name=u'id', type_code=3, display_size=None, + internal_size=None, precision=10, scale=None, + null_ok=0, default=None, extra=u'auto_increment'), + FieldInfo(name=u'c1', type_code=3, display_size=None, + internal_size=None, precision=10, scale=None, + null_ok=1, default=None, extra=u''), + FieldInfo(name=u'c2', type_code=253, display_size=None, + internal_size=20, precision=None, scale=None, + null_ok=1, default=None, extra=u'') + ] res = self.introspect.get_table_description(cur, 'django_t1') self.assertEqual(exp, res) def test_get_relations(self): cur = self.cnx.cursor() - exp = {1: (0, 'django_t1')} + if tests.DJANGO_VERSION < (1, 8): + exp = {1: (0, 'django_t1')} + else: + exp = {u'id_t1': (u'id', u'django_t1')} self.assertEqual(exp, self.introspect.get_relations(cur, 'django_t2')) def test_get_key_columns(self): @@ -204,6 +232,30 @@ def test_get_primary_key_column(self): res = self.introspect.get_primary_key_column(cur, 'django_t1') self.assertEqual('id', res) + def test_get_constraints(self): + cur = self.cnx.cursor() + exp = { + 'PRIMARY': {'check': False, + 'columns': ['id'], + 'foreign_key': None, + 'index': True, + 'primary_key': True, + 'unique': True}, + 'django_t2_ibfk_1': {'check': False, + 'columns': ['id_t1'], + 'foreign_key': ('django_t1', 'id'), + 'index': False, + 'primary_key': False, + 'unique': False}, + 'id_t1': {'check': False, + 'columns': ['id_t1'], + 'foreign_key': None, + 'index': True, + 'primary_key': False, + 'unique': False} + } + self.assertEqual( + exp, self.introspect.get_constraints(cur, 'django_t2')) @unittest.skipIf(not DJANGO_AVAILABLE, "Django not available") class DjangoDatabaseWrapper(tests.MySQLConnectorTests): @@ -277,26 +329,49 @@ def setUp(self): self.dbo = DatabaseOperations(self.cnx) def test_value_to_db_time(self): - self.assertEqual(None, self.dbo.value_to_db_time(None)) + if tests.DJANGO_VERSION < (1, 9): + value_to_db_time = self.dbo.value_to_db_time + else: + value_to_db_time = self.dbo.adapt_timefield_value + + self.assertEqual(None, value_to_db_time(None)) value = datetime.time(0, 0, 0) exp = self.conn.converter._time_to_mysql(value) - self.assertEqual(exp, self.dbo.value_to_db_time(value)) + self.assertEqual(exp, value_to_db_time(value)) value = datetime.time(2, 5, 7) exp = self.conn.converter._time_to_mysql(value) - self.assertEqual(exp, self.dbo.value_to_db_time(value)) + self.assertEqual(exp, value_to_db_time(value)) def test_value_to_db_datetime(self): - self.assertEqual(None, self.dbo.value_to_db_datetime(None)) + if tests.DJANGO_VERSION < (1, 9): + value_to_db_datetime = self.dbo.value_to_db_datetime + else: + value_to_db_datetime = self.dbo.adapt_datetimefield_value + + self.assertEqual(None, value_to_db_datetime(None)) value = datetime.datetime(1, 1, 1) exp = self.conn.converter._datetime_to_mysql(value) - self.assertEqual(exp, self.dbo.value_to_db_datetime(value)) + self.assertEqual(exp, value_to_db_datetime(value)) value = datetime.datetime(2, 5, 7, 10, 10) exp = self.conn.converter._datetime_to_mysql(value) - self.assertEqual(exp, self.dbo.value_to_db_datetime(value)) + self.assertEqual(exp, value_to_db_datetime(value)) + + def test_bulk_insert_sql(self): + num_values = 5 + fields = ["col1", "col2", "col3"] + placeholder_rows = [["%s"] * len(fields) for _ in range(num_values)] + exp = "VALUES {0}".format(", ".join( + ["({0})".format(", ".join(["%s"] * len(fields)))] * num_values)) + if tests.DJANGO_VERSION < (1, 9): + self.assertEqual( + exp, self.dbo.bulk_insert_sql(fields, num_values)) + else: + self.assertEqual( + exp, self.dbo.bulk_insert_sql(fields, placeholder_rows)) class DjangoMySQLConverterTests(tests.MySQLConnectorTests): diff --git a/tests/test_errorcode.py b/tests/test_errorcode.py index 829eacc8..607ad21d 100644 --- a/tests/test_errorcode.py +++ b/tests/test_errorcode.py @@ -45,7 +45,7 @@ def _check_code(self, code, num): def test_server_error_codes(self): cases = { - 'ER_HASHCHK': 1000, + 'OBSOLETE_ER_HASHCHK': 1000, 'ER_TRG_INVALID_CREATION_CTX': 1604, 'ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION': 1792, } diff --git a/tests/test_mysql_datatypes.py b/tests/test_mysql_datatypes.py index 11730d9d..7c4f5797 100644 --- a/tests/test_mysql_datatypes.py +++ b/tests/test_mysql_datatypes.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -84,16 +84,14 @@ def drop_tables(self, cnx): class TestsCursor(TestsDataTypes): def setUp(self): - pass - #self.config = tests.get_mysql_config() - #cnx = connection.MySQLConnection(**self.config) - #self.drop_tables(cnx) + self.config = tests.get_mysql_config() + cnx = connection.MySQLConnection(**self.config) + self.drop_tables(cnx) def tearDown(self): - pass - #cnx = connection.MySQLConnection(**self.config) - #self.drop_tables(cnx) - #cnx.close() + cnx = connection.MySQLConnection(**self.config) + self.drop_tables(cnx) + cnx.close() @foreach_cnx() def test_numeric_int(self): diff --git a/tests/test_protocol.py b/tests/test_protocol.py index 0f4b17ac..269da05c 100644 --- a/tests/test_protocol.py +++ b/tests/test_protocol.py @@ -408,9 +408,9 @@ def test__parse_binary_values(self): b'\x00\x0a\x00\x00\x00\x10\x0f\x1e\x70\x82\x03\x00') # float/double are returned as DECIMAL by MySQL - exp = (bytearray(b'abc'), - bytearray(b'3.14'), - bytearray(b'-3.14159'), + exp = ('abc', + '3.14', + '-3.14159', datetime.date(2003, 1, 31), datetime.datetime(1977, 6, 14, 21, 33, 14), datetime.timedelta(10, 58530, 230000), diff --git a/tests/test_setup.py b/tests/test_setup.py index 11d03622..9be8ffab 100644 --- a/tests/test_setup.py +++ b/tests/test_setup.py @@ -1,5 +1,5 @@ # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -132,7 +132,8 @@ def test_classifiers(self): for clsfr in setupinfo.classifiers: if 'Programming Language :: Python' in clsfr: ver = clsfr.replace('Programming Language :: Python :: ', '') - if ver not in ('2.6', '2.7', '3', '3.1', '3.2', '3.3'): + if ver not in ('2.6', '2.7', '3', '3.1', '3.2', '3.3', '3.4', + '3.5', '3.6'): self.fail('Unsupported version in classifiers') if 'Development Status ::' in clsfr: status = clsfr.replace('Development Status :: ', '') diff --git a/unittests.py b/unittests.py index bb852e00..e6ae1681 100644 --- a/unittests.py +++ b/unittests.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # MySQL Connector/Python - MySQL driver written in Python. -# Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # MySQL Connector/Python is licensed under the terms of the GPLv2 # , like most @@ -96,7 +96,6 @@ tests.TEST_BUILD_DIR = os.path.join(_TOPDIR, 'build', 'testing') sys.path.insert(0, tests.TEST_BUILD_DIR) - # MySQL option file template. Platform specifics dynamically added later. MY_CNF = """ # MySQL option file for MySQL Connector/Python tests @@ -138,27 +137,28 @@ innodb_flush_log_at_trx_commit = 2 innodb_log_file_size = 1Gb general_log_file = general_{name}.log -ssl """ # Platform specifics if os.name == 'nt': MY_CNF += '\n'.join(( - "ssl-ca = {ssl_dir}\\\\tests_CA_cert.pem", - "ssl-cert = {ssl_dir}\\\\tests_server_cert.pem", - "ssl-key = {ssl_dir}\\\\tests_server_key.pem", + "ssl-ca = {ssl_ca}", + "ssl-cert = {ssl_cert}", + "ssl-key = {ssl_key}", )) MYSQL_DEFAULT_BASE = os.path.join( "C:/", "Program Files", "MySQL", "MySQL Server 5.6") else: MY_CNF += '\n'.join(( - "ssl-ca = {ssl_dir}/tests_CA_cert.pem", - "ssl-cert = {ssl_dir}/tests_server_cert.pem", - "ssl-key = {ssl_dir}/tests_server_key.pem", + "ssl-ca = {ssl_ca}", + "ssl-cert = {ssl_cert}", + "ssl-key = {ssl_key}", "innodb_flush_method = O_DIRECT", )) MYSQL_DEFAULT_BASE = os.path.join('/', 'usr', 'local', 'mysql') +MY_CNF += "\nssl={ssl}" + MYSQL_DEFAULT_TOPDIR = _TOPDIR _UNITTESTS_CMD_ARGS = { @@ -330,6 +330,18 @@ 'default': 'xmlrpc', 'help': ("Protocol to talk to MySQL Fabric") }, + + ('', '--extra-compile-args'): { + 'dest': 'extra_compile_args', 'metavar': 'NAME', + 'default': None, + 'help': ("Extra compile args for the C extension") + }, + + ('', '--extra-link-args'): { + 'dest': 'extra_link_args', 'metavar': 'NAME', + 'default': None, + 'help': ("Extra link args for the C extension") + }, } @@ -593,6 +605,7 @@ def setup_stats_db(cnx): def init_mysql_server(port, options): """Initialize a MySQL Server""" name = 'server{0}'.format(len(tests.MYSQL_SERVERS) + 1) + extra_args = [] try: mysql_server = mysqld.MySQLServer( @@ -603,7 +616,11 @@ def init_mysql_server(port, options): port=port, unix_socket_folder=options.unix_socket_folder, ssl_folder=os.path.abspath(tests.SSL_DIR), + ssl_ca="tests_CA_cert.pem", + ssl_cert="tests_server_cert.pem", + ssl_key="tests_server_key.pem", name=name, + extra_args=extra_args, sharedir=options.mysql_sharedir) except tests.mysqld.MySQLBootstrapError as err: LOGGER.error("Failed initializing MySQL server " @@ -755,7 +772,9 @@ def main(): tests.MYSQL_CAPI = options.mysql_capi if not options.skip_install: tests.install_connector(_TOPDIR, tests.TEST_BUILD_DIR, - options.mysql_capi) + options.mysql_capi, + options.extra_compile_args, + options.extra_link_args) # Which tests cases to run testcases = []