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 = [] pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy