// Copyright 2013 The ql Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSES/QL-LICENSE file.

// Copyright 2015 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.

package session

import (
	"fmt"
	// "strconv"

	"github.com/hanchuanchuan/goInception/config"
	"github.com/hanchuanchuan/goInception/mysql"
	"github.com/hanchuanchuan/goInception/terror"
)

//go:generate stringer -type=ErrorCode
type ErrorCode int

var (
	ErrWrongValueForVar = terror.ClassVariable.New(mysql.ErrWrongValueForVar,
		mysql.MySQLErrName[mysql.ErrWrongValueForVar])
	ErrTruncatedWrongValue = terror.ClassVariable.New(mysql.ErrTruncatedWrongValue,
		mysql.MySQLErrName[mysql.ErrTruncatedWrongValue])
	ErrWrongTypeForVar = terror.ClassVariable.New(mysql.ErrWrongTypeForVar,
		mysql.MySQLErrName[mysql.ErrWrongTypeForVar])
)

const (
	ER_ERROR_FIRST ErrorCode = iota
	ER_NOT_SUPPORTED_YET
	ER_SQL_NO_SOURCE
	ER_SQL_NO_OP_TYPE
	ER_SQL_INVALID_OP_TYPE
	ER_PARSE_ERROR
	ER_SYNTAX_ERROR
	ER_REMOTE_EXE_ERROR
	ER_SHUTDOWN_COMPLETE
	ER_WITH_INSERT_FIELD
	ER_WITH_INSERT_VALUES
	ER_WRONG_VALUE_COUNT_ON_ROW
	ER_BAD_FIELD_ERROR
	ER_FIELD_SPECIFIED_TWICE
	ER_BAD_NULL_ERROR
	ER_NO_WHERE_CONDITION
	ER_NORMAL_SHUTDOWN
	ER_FORCING_CLOSE
	ER_CON_COUNT_ERROR
	ER_INVALID_COMMAND
	ER_SQL_INVALID_SOURCE
	ER_WRONG_DB_NAME
	ER_NO_DB_ERROR
	ER_WITH_LIMIT_CONDITION
	ER_WITH_ORDERBY_CONDITION
	ER_SELECT_ONLY_STAR
	ER_ORDERY_BY_RAND
	ER_ID_IS_UPER
	ErrUnknownCharset
	ER_UNKNOWN_COLLATION
	ER_INVALID_DATA_TYPE
	ER_NOT_ALLOWED_NULLABLE
	ER_DUP_FIELDNAME
	ER_WRONG_COLUMN_NAME
	ER_WRONG_AUTO_KEY
	ER_TABLE_CANT_HANDLE_AUTO_INCREMENT
	ER_FOREIGN_KEY
	ER_TOO_MANY_KEY_PARTS
	ER_TOO_LONG_IDENT
	ER_UDPATE_TOO_MUCH_ROWS
	ER_INSERT_TOO_MUCH_ROWS
	ER_CHANGE_TOO_MUCH_ROWS
	ER_WRONG_NAME_FOR_INDEX
	ER_TOO_MANY_KEYS
	ER_NOT_SUPPORTED_KEY_TYPE
	ER_WRONG_SUB_KEY
	ER_WRONG_KEY_COLUMN
	ER_TOO_LONG_KEY
	ER_MULTIPLE_PRI_KEY
	ER_DUP_KEYNAME
	ER_TOO_LONG_INDEX_COMMENT
	ER_DUP_INDEX
	ER_TEMP_TABLE_TMP_PREFIX
	ER_TABLE_PREFIX
	ER_TABLE_CHARSET_MUST_UTF8
	ER_TABLE_CHARSET_MUST_NULL
	ER_TABLE_MUST_HAVE_COMMENT
	ER_COLUMN_HAVE_NO_COMMENT
	ER_TABLE_MUST_HAVE_PK
	ER_PARTITION_NOT_ALLOWED
	ER_USE_ENUM
	ER_USE_TEXT_OR_BLOB
	ER_COLUMN_EXISTED
	ER_COLUMN_NOT_EXISTED
	ER_CANT_DROP_FIELD_OR_KEY
	ER_INVALID_DEFAULT
	ER_USERNAME
	ER_HOSTNAME
	ER_NOT_VALID_PASSWORD
	ER_WRONG_STRING_LENGTH
	ER_BLOB_USED_AS_KEY
	ER_TOO_LONG_BAKDB_NAME
	ER_INVALID_BACKUP_HOST_INFO
	ER_BINLOG_CORRUPTED
	ER_NET_READ_ERROR
	ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE
	ER_SLAVE_RELAY_LOG_WRITE_FAILURE
	ER_INCORRECT_GLOBAL_LOCAL_VAR
	ER_START_AS_BEGIN
	ER_OUTOFMEMORY
	ER_HAVE_BEGIN
	ER_NET_READ_INTERRUPTED
	ER_BINLOG_FORMAT_STATEMENT
	ER_ERROR_EXIST_BEFORE
	ER_UNKNOWN_SYSTEM_VARIABLE
	ER_UNKNOWN_CHARACTER_SET
	ER_END_WITH_COMMIT
	ER_DB_NOT_EXISTED_ERROR
	ER_TABLE_EXISTS_ERROR
	ER_INDEX_NAME_IDX_PREFIX
	ER_INDEX_NAME_UNIQ_PREFIX
	ER_AUTOINC_UNSIGNED
	ER_VARCHAR_TO_TEXT_LEN
	ER_CHAR_TO_VARCHAR_LEN
	ER_KEY_COLUMN_DOES_NOT_EXITS
	ER_INC_INIT_ERR
	ER_WRONG_ARGUMENTS
	ER_SET_DATA_TYPE_INT_BIGINT
	ER_TIMESTAMP_DEFAULT
	ER_CHARSET_ON_COLUMN
	ER_AUTO_INCR_ID_WARNING
	ER_ALTER_TABLE_ONCE
	ER_BLOB_CANT_HAVE_DEFAULT
	ER_END_WITH_SEMICOLON
	ER_NON_UNIQ_ERROR
	ER_TABLE_NOT_EXISTED_ERROR
	ER_UNKNOWN_TABLE
	ER_INVALID_GROUP_FUNC_USE
	ER_INDEX_USE_ALTER_TABLE
	ER_WITH_DEFAULT_ADD_COLUMN
	ER_TRUNCATED_WRONG_VALUE
	ER_TEXT_NOT_NULLABLE_ERROR
	ER_WRONG_VALUE_FOR_VAR
	ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
	ER_INVALID_ON_UPDATE
	ER_DDL_DML_COEXIST
	ER_SLAVE_CORRUPT_EVENT
	ER_COLLATION_CHARSET_MISMATCH
	ER_NOT_SUPPORTED_ALTER_OPTION
	ER_CONFLICTING_DECLARATIONS
	ER_IDENT_USE_KEYWORD
	ER_VIEW_SELECT_CLAUSE
	ER_OSC_KILL_FAILED
	ER_NET_PACKETS_OUT_OF_ORDER
	ER_NOT_SUPPORTED_ITEM_TYPE
	ER_INVALID_IDENT
	ER_INCEPTION_EMPTY_QUERY
	ER_PK_COLS_NOT_INT
	ER_PK_TOO_MANY_PARTS
	ER_REMOVED_SPACES
	ER_CHANGE_COLUMN_TYPE
	ER_CANT_DROP_TABLE
	ER_CANT_DROP_DATABASE
	ER_WRONG_TABLE_NAME
	ER_CANT_SET_CHARSET
	ER_CANT_SET_COLLATION
	ER_CANT_SET_ENGINE
	ER_MUST_AT_LEAST_ONE_COLUMN
	ER_MUST_HAVE_COLUMNS
	ErrColumnsMustHaveIndex
	ErrColumnsMustHaveIndexTypeErr
	ER_PRIMARY_CANT_HAVE_NULL
	ErrCantRemoveAllFields
	ErrNotFoundTableInfo
	ErrMariaDBRollbackWarn
	ErrNotFoundMasterStatus
	ErrNonUniqTable
	ErrWrongUsage
	ErrDataTooLong
	ErrCharsetNotSupport
	ErrCollationNotSupport
	ErrTableCollationNotSupport
	ErrJsonTypeSupport
	ErrEngineNotSupport
	ErrMixOfGroupFuncAndFields
	ErrFieldNotInGroupBy
	ErCantChangeColumnPosition
	ErCantChangeColumn
	ER_DATETIME_DEFAULT
	ER_TOO_MUCH_AUTO_DATETIME_COLS
	ErrFloatDoubleToDecimal
	ErrIdentifierUpper
	ErrIdentifierLower
	ErrWrongAndExpr
	ErrCannotAddForeign
	ErrWrongFkDefWithMatch
	ErrFkDupName
	ErrJoinNoOnCondition
	ErrImplicitTypeConversion
	ErrUseValueExpr
	ErrUseIndexVisibility
	ErrViewSupport
	ErrViewColumnCount
	ErrIncorrectDateTimeValue
	ErrSameNamePartition
	ErrRepeatConstDefinition
	ErrPartitionNotExisted
	ER_ERROR_LAST
)

var ErrorsDefault = map[ErrorCode]string{
	ER_ERROR_FIRST:                         "HelloWorld",
	ER_NOT_SUPPORTED_YET:                   "Not supported statement type.",
	ER_SQL_NO_SOURCE:                       "The sql have no source information.",
	ER_SQL_NO_OP_TYPE:                      "The sql have no operation type.",
	ER_SQL_INVALID_OP_TYPE:                 "Invalid sql operation type.",
	ER_PARSE_ERROR:                         "%s near '%s' at line %d",
	ER_SYNTAX_ERROR:                        "You have an error in your SQL syntax, ",
	ER_REMOTE_EXE_ERROR:                    "Execute in source server failed.",
	ER_SHUTDOWN_COMPLETE:                   "Shutdown complete.",
	ER_WITH_INSERT_FIELD:                   "Set the field list for insert statements.",
	ER_WITH_INSERT_VALUES:                  "Set the values list for insert statements.",
	ER_WRONG_VALUE_COUNT_ON_ROW:            "Column count doesn't match value count at row %d.",
	ER_BAD_FIELD_ERROR:                     "Unknown column '%s' in '%s'.",
	ER_FIELD_SPECIFIED_TWICE:               "Column '%s' specified twice in table '%s'.",
	ER_BAD_NULL_ERROR:                      "Column '%s' cannot be null in %d row.",
	ER_NO_WHERE_CONDITION:                  "Please set the where condition.",
	ER_NORMAL_SHUTDOWN:                     "%s: Normal shutdown\n",
	ER_FORCING_CLOSE:                       "%s: Forcing close of thread %ld  user: '%s'\n",
	ER_CON_COUNT_ERROR:                     "Too many connections",
	ER_INVALID_COMMAND:                     "Invalid command.",
	ER_SQL_INVALID_SOURCE:                  "Invalid source infomation(%s).",
	ER_WRONG_DB_NAME:                       "Incorrect database name '%s'.",
	ER_NO_DB_ERROR:                         "No database selected.",
	ER_WITH_LIMIT_CONDITION:                "Limit is not allowed in update/delete statement.",
	ER_WITH_ORDERBY_CONDITION:              "Order by is not allowed in update/delete statement.",
	ER_SELECT_ONLY_STAR:                    "Select only star is not allowed.",
	ER_ORDERY_BY_RAND:                      "Order by rand is not allowed in select statement.",
	ER_ID_IS_UPER:                          "Identifier is not allowed to been upper-case.",
	ErrUnknownCharset:                      "Unknown charset: '%s'.",
	ER_UNKNOWN_COLLATION:                   "Unknown collation: '%s'.",
	ER_INVALID_DATA_TYPE:                   "Not supported data type on field: '%s'.",
	ER_NOT_ALLOWED_NULLABLE:                "Column '%s' in table '%s' is not allowed to been nullable.",
	ER_DUP_FIELDNAME:                       "Duplicate column name '%s'.",
	ER_WRONG_COLUMN_NAME:                   "Incorrect column name '%s'.",
	ER_WRONG_AUTO_KEY:                      "Incorrect table definition; there can be only one auto column and it must be defined as a key.",
	ER_TABLE_CANT_HANDLE_AUTO_INCREMENT:    "The used table type doesn't support AUTO_INCREMENT columns.",
	ER_FOREIGN_KEY:                         "Foreign key is not allowed in table '%s'.",
	ER_TOO_MANY_KEY_PARTS:                  "Too many key parts in Key '%s' in table '%s' specified, max %d parts allowed.",
	ER_TOO_LONG_IDENT:                      "Identifier name '%s' is too long.",
	ER_UDPATE_TOO_MUCH_ROWS:                "Update(%d rows) more than %d rows.",
	ER_INSERT_TOO_MUCH_ROWS:                "Insert(%d rows) more than %d rows.",
	ER_CHANGE_TOO_MUCH_ROWS:                "%s(%d rows) more than %d rows.",
	ER_WRONG_NAME_FOR_INDEX:                "Incorrect index name '%s' in table '%s'.",
	ER_TOO_MANY_KEYS:                       "Too many keys specified in table '%s', max %d keys allowed.",
	ER_NOT_SUPPORTED_KEY_TYPE:              "Not supported key type: '%s'.",
	ER_WRONG_SUB_KEY:                       "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storagengine doesn't support unique prefix keys",
	ER_WRONG_KEY_COLUMN:                    "The used storage engine can't index column '%s'.",
	ER_TOO_LONG_KEY:                        "Specified key '%s' was too long; max key length is %d bytes.",
	ER_MULTIPLE_PRI_KEY:                    "Multiple primary key defined.",
	ER_DUP_KEYNAME:                         "Duplicate key name '%s'.",
	ER_TOO_LONG_INDEX_COMMENT:              "Comment for index '%s' is too long (max = %lu).",
	ER_DUP_INDEX:                           "Duplicate index '%s' defined on the table '%s.%s'.",
	ER_TEMP_TABLE_TMP_PREFIX:               "Set 'tmp' prefix for temporary table.",
	ER_TABLE_PREFIX:                        "Need set '%s' prefix for table.",
	ER_TABLE_CHARSET_MUST_UTF8:             "Set charset to one of '%s' for table '%s'.",
	ER_TABLE_CHARSET_MUST_NULL:             "Not allowed set charset for table '%s'.",
	ErrTableCollationNotSupport:            "Not allowed set collation for table '%s'.",
	ER_TABLE_MUST_HAVE_COMMENT:             "Set comments for table '%s'.",
	ER_COLUMN_HAVE_NO_COMMENT:              "Column '%s' in table '%s' have no comments.",
	ER_TABLE_MUST_HAVE_PK:                  "Set a primary key for table '%s'.",
	ER_PARTITION_NOT_ALLOWED:               "Partition is not allowed in table.",
	ER_USE_ENUM:                            "Type enum is used in column.",
	ER_USE_TEXT_OR_BLOB:                    "Type blob/text is used in column '%s'.",
	ER_COLUMN_EXISTED:                      "Column '%s' have existed.",
	ER_COLUMN_NOT_EXISTED:                  "Column '%s' not existed.",
	ER_CANT_DROP_FIELD_OR_KEY:              "Can't DROP '%s'; check that column/key exists.",
	ER_INVALID_DEFAULT:                     "Invalid default value for column '%s'.",
	ER_USERNAME:                            "user name",
	ER_HOSTNAME:                            "host name",
	ER_NOT_VALID_PASSWORD:                  "Your password does not satisfy the current policy requirements.",
	ER_WRONG_STRING_LENGTH:                 "String '%s' is too long for %s (should be no longer than %d).",
	ER_BLOB_USED_AS_KEY:                    "BLOB column '%s' can't be used in key specification with the used table type.",
	ER_TOO_LONG_BAKDB_NAME:                 "The backup dbname '%-s-%d-%s' is too long.",
	ER_INVALID_BACKUP_HOST_INFO:            "Invalid remote backup information.",
	ER_BINLOG_CORRUPTED:                    "Binlog is corrupted.",
	ER_NET_READ_ERROR:                      "Got an error reading communication packets.",
	ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from network.",
	ER_SLAVE_RELAY_LOG_WRITE_FAILURE:       "Relay log write failure: %s.",
	ER_INCORRECT_GLOBAL_LOCAL_VAR:          "Variable '%s' is a %s variable.",
	ER_START_AS_BEGIN:                      "Must start as begin statement.",
	ER_OUTOFMEMORY:                         "Out of memory; restart server and try again (needed %d bytes).",
	ER_HAVE_BEGIN:                          "Have you begin twice? Or you didn't commit last time, if so, you can execute commit explicitly.",
	ER_NET_READ_INTERRUPTED:                "Got timeout reading communication packets.",
	ER_BINLOG_FORMAT_STATEMENT:             "The binlog_format is statement, backup is disabled.",
	ER_ERROR_EXIST_BEFORE:                  "Exist error at before statement.",
	ER_UNKNOWN_SYSTEM_VARIABLE:             "Unknown system variable '%s'.",
	ER_UNKNOWN_CHARACTER_SET:               "Unknown character set: '%s'.",
	ER_END_WITH_COMMIT:                     "Must end with commit.",
	ER_DB_NOT_EXISTED_ERROR:                "Selected Database '%s' not existed.",
	ER_TABLE_EXISTS_ERROR:                  "Table '%s' already exists.",
	ER_INDEX_NAME_IDX_PREFIX:               "Index '%s' in table '%s' need '%s' prefix.",
	ER_INDEX_NAME_UNIQ_PREFIX:              "Index '%s' in table '%s' need 'uniq_' prefix.",
	ER_AUTOINC_UNSIGNED:                    "Set unsigned attribute on auto increment column in table '%s'.",
	ER_VARCHAR_TO_TEXT_LEN:                 "Set column '%s' to TEXT type.",
	ER_CHAR_TO_VARCHAR_LEN:                 "Set column '%s' to VARCHAR type.",
	ER_KEY_COLUMN_DOES_NOT_EXITS:           "Key column '%s' doesn't exist in table.",
	ER_INC_INIT_ERR:                        "Set auto-increment initialize value to 1.",
	ER_WRONG_ARGUMENTS:                     "Incorrect arguments to %s.",
	ER_SET_DATA_TYPE_INT_BIGINT:            "Set auto-increment data type to int or bigint.",
	ER_TIMESTAMP_DEFAULT:                   "Set default value for timestamp column '%s'.",
	ER_CHARSET_ON_COLUMN:                   "Not Allowed set charset or collation for column '%s.%s'.",
	ER_AUTO_INCR_ID_WARNING:                "Auto increment column '%s' is meaningful? it's dangerous!",
	ER_ALTER_TABLE_ONCE:                    "Merge the alter statement for table '%s' to ONE.",
	ER_BLOB_CANT_HAVE_DEFAULT:              "BLOB, TEXT, GEOMETRY or JSON column '%s' can't have a default value.",
	ER_END_WITH_SEMICOLON:                  "Add ';' after the last sql statement.",
	ER_NON_UNIQ_ERROR:                      "Column '%s' in field list is ambiguous.",
	ER_TABLE_NOT_EXISTED_ERROR:             "Table '%s' doesn't exist.",
	ER_UNKNOWN_TABLE:                       "Unknown table '%s' in %s.",
	ER_INVALID_GROUP_FUNC_USE:              "Invalid use of group function.",
	ER_INDEX_USE_ALTER_TABLE:               "Create/drop index and rename is not allowed, please replace with alter statement.",
	ER_WITH_DEFAULT_ADD_COLUMN:             "Set Default value for column '%s' in table '%s'",
	ER_TRUNCATED_WRONG_VALUE:               "Truncated incorrect %s value: '%s'",
	ER_TEXT_NOT_NULLABLE_ERROR:             "TEXT/BLOB Column '%s' in table '%s' can't  been not null.",
	ER_WRONG_VALUE_FOR_VAR:                 "Variable '%s' can't be set to the value of '%s'",
	ER_TOO_MUCH_AUTO_TIMESTAMP_COLS:        "Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause",
	ER_INVALID_ON_UPDATE:                   "Invalid ON UPDATE clause for '%s' column",
	ER_DDL_DML_COEXIST:                     "DDL can not coexist with the DML for table '%s'.",
	ER_SLAVE_CORRUPT_EVENT:                 "Corrupted replication event was detected.",
	ER_COLLATION_CHARSET_MISMATCH:          "COLLATION '%s' is not valid for CHARACTER SET '%s'",
	ER_NOT_SUPPORTED_ALTER_OPTION:          "Not supported statement of alter option",
	ER_CONFLICTING_DECLARATIONS:            "Conflicting declarations: '%s%s' and '%s%s'",
	ER_IDENT_USE_KEYWORD:                   "Identifier '%s' is keyword in MySQL.",
	ER_VIEW_SELECT_CLAUSE:                  "View's SELECT contains a '%s' clause",
	ER_OSC_KILL_FAILED:                     "Can not find OSC executing task",
	ER_NET_PACKETS_OUT_OF_ORDER:            "Got packets out of order",
	ER_NOT_SUPPORTED_ITEM_TYPE:             "Not supported expression type '%s'.",
	ER_INVALID_IDENT:                       "Identifier '%s' is invalid, valid options: [a-z|A-Z|0-9|_].",
	ER_INCEPTION_EMPTY_QUERY:               "Inception error, Query was empty.",
	ER_PK_COLS_NOT_INT:                     "Primary key column '%s' is not int or bigint type in table '%s'.'%s'.",
	ER_PK_TOO_MANY_PARTS:                   "Too many primary key part in table '%s'.'%s', max parts: %d",
	ER_REMOVED_SPACES:                      "Leading spaces are removed from name '%s'",
	ER_CHANGE_COLUMN_TYPE:                  "Type conversion warning for column '%s' %s -> %s.",
	ER_CANT_DROP_TABLE:                     "Drop/truncate '%s' is not allowed, please replace with alter rename statement.",
	ER_CANT_DROP_DATABASE:                  "Command is forbidden! Cannot drop database '%s'.",
	ER_WRONG_TABLE_NAME:                    "Incorrect table name '%-.100s'",
	ER_CANT_SET_CHARSET:                    "Cannot set charset '%s'",
	ER_CANT_SET_COLLATION:                  "Cannot set collation '%s'",
	ER_CANT_SET_ENGINE:                     "Cannot set engine '%s'",
	ER_MUST_AT_LEAST_ONE_COLUMN:            "A table must have at least 1 column.",
	ER_MUST_HAVE_COLUMNS:                   "Must have the specified column: '%s'.",
	ErrColumnsMustHaveIndex:                "The specified column: '%s' must have index.",
	ErrColumnsMustHaveIndexTypeErr:         "The specified column: '%s' type must be '%s',current is '%s'.",
	ER_PRIMARY_CANT_HAVE_NULL:              "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead",
	ErrCantRemoveAllFields:                 "You can't delete all columns with ALTER TABLE; use DROP TABLE instead",
	ErrNotFoundTableInfo:                   "Skip backup because there is no table structure information.",
	ErrMariaDBRollbackWarn:                 "MariaDB v%d not supported yet,please confirm that the rollback sql is correct",
	ErrNotFoundMasterStatus:                "Can't found master binlog position.",
	ErrNonUniqTable:                        "Not unique table/alias: '%-.192s'.", // mysql.MySQLErrName[mysql.ErrNonuniqTable],
	ErrWrongUsage:                          "Incorrect usage of %s and %s.",
	ErrDataTooLong:                         "Data too long for column '%s' at row %d",
	ErrCharsetNotSupport:                   "Set charset to one of '%s'.",
	ErrCollationNotSupport:                 "Set collation to one of '%s'",
	ErrEngineNotSupport:                    "Set engine to one of '%s'",
	ErrJsonTypeSupport:                     "Json type not allowed in column '%s'.",
	ErrMixOfGroupFuncAndFields:             "In aggregated query without GROUP BY, expression #%d of SELECT list contains nonaggregated column '%s'; this is incompatible with sql_mode=only_full_group_by.",
	ErrFieldNotInGroupBy:                   "Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.",
	ErCantChangeColumnPosition:             "Cannot change the position of the column '%s'.",
	ErCantChangeColumn:                     "Not supported statement of change column('%s').",
	// ErrMixOfGroupFuncAndFields:             "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause",
	//ER_NULL_NAME_FOR_INDEX:                 "Index name cannot be null in table '%s'.",
	ER_DATETIME_DEFAULT:            "Set default value for DATETIME column '%s'.",
	ER_TOO_MUCH_AUTO_DATETIME_COLS: "Incorrect table definition; there can be only one DATETIME column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause",
	ErrFloatDoubleToDecimal:        "Set column '%s' to DECIMAL type.",
	ErrIdentifierUpper:             "Identifier '%s' must be capitalized.",
	ErrIdentifierLower:             "Identifier '%s' must be lowercase.",
	ErrWrongAndExpr:                "May be the wrong syntax! Separate multiple fields with commas.",
	ErrCannotAddForeign:            "Cannot add foreign key constraint",
	ErrWrongFkDefWithMatch:         "Incorrect foreign key definition for '%-.192s': Key reference and table reference don't match",
	ErrFkDupName:                   "Duplicate foreign key constraint name '%s'",
	ErrJoinNoOnCondition:           "set the on clause for join statement.",
	ErrImplicitTypeConversion:      "Implicit type conversion is not allowed(column '%s.%s',type '%s').",
	ErrUseValueExpr:                "Please confirm if you want to use value expression in where condition.",
	ErrUseIndexVisibility:          "The back-end database does not support the index to specify the visible option.",
	ErrViewSupport:                 "Not allowed to create or use views '%s'.",
	ErrViewColumnCount:             "View's SELECT and view's field list have different column counts",
	ErrIncorrectDateTimeValue:      "Incorrect datetime value: '%v'(column '%s')",
	ErrSameNamePartition:           "Duplicate partition name %-.192s",
	ErrRepeatConstDefinition:       "Duplicate partition constant definition: '%v'",
	ErrPartitionNotExisted:         "Partition '%-.64s' does not exist",
	ER_ERROR_LAST:                  "TheLastError,ByeBye",
}

var ErrorsChinese = map[ErrorCode]string{
	ER_NOT_SUPPORTED_YET:                "不支持的语法类型.",
	ER_SQL_NO_SOURCE:                    "sql没有源信息.",
	ER_SQL_NO_OP_TYPE:                   "sql没有操作类型设置.",
	ER_SQL_INVALID_OP_TYPE:              "无效的sql操作类型.",
	ER_PARSE_ERROR:                      "%s near '%s' at line %d",
	ER_SYNTAX_ERROR:                     "SQL语法有错误, ",
	ER_REMOTE_EXE_ERROR:                 "Execute in source server failed.",
	ER_SHUTDOWN_COMPLETE:                "Shutdown complete.",
	ER_WITH_INSERT_FIELD:                "insert语句需要指定字段列表.",
	ER_WITH_INSERT_VALUES:               "insert语句需要指定值列表.",
	ER_WRONG_VALUE_COUNT_ON_ROW:         "行 %d 的列数和值列表不匹配.",
	ER_BAD_FIELD_ERROR:                  "Unknown column '%s' in '%s'.",
	ER_FIELD_SPECIFIED_TWICE:            "列 '%s' 指定重复(表 '%s').",
	ER_BAD_NULL_ERROR:                   "列 '%s' 不能为null(第 %d 行).",
	ER_NO_WHERE_CONDITION:               "请指定where条件.",
	ER_NORMAL_SHUTDOWN:                  "%s: Normal shutdown\n",
	ER_FORCING_CLOSE:                    "%s: Forcing close of thread %ld  user: '%s'\n",
	ER_CON_COUNT_ERROR:                  "Too many connections",
	ER_INVALID_COMMAND:                  "Invalid command.",
	ER_SQL_INVALID_SOURCE:               "不正确的数据源信息(%s).",
	ER_WRONG_DB_NAME:                    "不正确的的数据库名 '%s'.",
	ER_NO_DB_ERROR:                      "没有选择数据库.",
	ER_WITH_LIMIT_CONDITION:             "update/delete语句不允许Limit.",
	ER_WITH_ORDERBY_CONDITION:           "update/delete语句不允许Order by.",
	ER_SELECT_ONLY_STAR:                 "不允许'select *'语法.",
	ER_ORDERY_BY_RAND:                   "不允许'Order by rand'语法.",
	ER_ID_IS_UPER:                       "标识符不允许大写.",
	ErrUnknownCharset:                   "未知的字符集: '%s'.",
	ER_UNKNOWN_COLLATION:                "未知的排序规则: '%s'.",
	ER_INVALID_DATA_TYPE:                "列 '%s' 数据类型不支持.",
	ER_NOT_ALLOWED_NULLABLE:             "列 '%s' 不允许为null(表 '%s').",
	ER_DUP_FIELDNAME:                    "重复的列名: '%s'.",
	ER_WRONG_COLUMN_NAME:                "不正确的列名: '%s'.",
	ER_WRONG_AUTO_KEY:                   "不正确的表定义,只能有一个自增列且必须为索引键.",
	ER_TABLE_CANT_HANDLE_AUTO_INCREMENT: "使用的表类型不支持自增列.",
	ER_FOREIGN_KEY:                      "不允许使用外键(表 '%s').",
	ER_TOO_MANY_KEY_PARTS:               "索引 '%s'指定了太多的字段(表 '%s'), 最多允许 %d 个字段.",
	ER_TOO_LONG_IDENT:                   "名称 '%s' 过长.",
	ER_UDPATE_TOO_MUCH_ROWS:             "预计一次更新(%d行)超过 %d 行.",
	ER_INSERT_TOO_MUCH_ROWS:             "一次新增(%d行)超过 %d 行.",
	ER_CHANGE_TOO_MUCH_ROWS:             "预计影响行数(%d行)超过 %d 行.",
	ER_WRONG_NAME_FOR_INDEX:             "索引 '%s' 名称不正确(表 '%s').",
	ER_TOO_MANY_KEYS:                    "表 '%s' 指定了太多索引, 最多允许 %d 个.",
	ER_NOT_SUPPORTED_KEY_TYPE:           "不允许的键类型: '%s'.",
	ER_WRONG_SUB_KEY:                    "索引列不能指定长度或指定的长度超出字段长度.",
	// ER_WRONG_KEY_COLUMN:                    "The used storage engine can't index column '%s'.",
	ER_TOO_LONG_KEY:                        "索引 '%s' 过长; 最大长度为 %d 字节.",
	ER_MULTIPLE_PRI_KEY:                    "定义了多个主键.",
	ER_DUP_KEYNAME:                         "索引名 '%s' 重复.",
	ER_TOO_LONG_INDEX_COMMENT:              "索引 '%s' 注释过长(max = %lu).",
	ER_DUP_INDEX:                           "索引 '%s' 定义重复(表'%s.%s').",
	ER_TEMP_TABLE_TMP_PREFIX:               "临时表需要指定'tmp'前缀",
	ER_TABLE_PREFIX:                        "表名需要指定'%s'前缀",
	ER_TABLE_CHARSET_MUST_UTF8:             "允许的字符集为: '%s'(表'%s').",
	ER_TABLE_CHARSET_MUST_NULL:             "表 '%s' 禁止设置字符集!",
	ErrTableCollationNotSupport:            "表 '%s' 禁止设置排序规则!",
	ER_TABLE_MUST_HAVE_COMMENT:             "表 '%s' 需要设置注释.",
	ER_COLUMN_HAVE_NO_COMMENT:              "列 '%s' 需要设置注释(表'%s').",
	ER_TABLE_MUST_HAVE_PK:                  "表 '%s' 需要设置主键.",
	ER_PARTITION_NOT_ALLOWED:               "不允许创建分区表.",
	ER_USE_ENUM:                            "不允许使用enum类型.",
	ER_USE_TEXT_OR_BLOB:                    "不允许使用 blob/text 类型(列'%s').",
	ER_COLUMN_EXISTED:                      "列 '%s' 已存在.",
	ER_COLUMN_NOT_EXISTED:                  "列 '%s' 不存在.",
	ER_CANT_DROP_FIELD_OR_KEY:              "无法删除 '%s'; 请检查字段/键是否存在.",
	ER_INVALID_DEFAULT:                     "列 '%s' 默认值无效.",
	ER_USERNAME:                            "user name",
	ER_HOSTNAME:                            "host name",
	ER_NOT_VALID_PASSWORD:                  "Your password does not satisfy the current policy requirements.",
	ER_WRONG_STRING_LENGTH:                 "String '%s' is too long for %s (should be no longer than %d).",
	ER_BLOB_USED_AS_KEY:                    "BLOB列 '%s' 不允许作为索引列.",
	ER_TOO_LONG_BAKDB_NAME:                 "备份库名 '%-s-%d-%s' 过长.",
	ER_INVALID_BACKUP_HOST_INFO:            "无效备份库信息.",
	ER_BINLOG_CORRUPTED:                    "Binlog is corrupted.",
	ER_NET_READ_ERROR:                      "Got an error reading communication packets.",
	ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE: "Replication event checksum verification failed while reading from network.",
	ER_SLAVE_RELAY_LOG_WRITE_FAILURE:       "Relay log write failure: %s.",
	ER_INCORRECT_GLOBAL_LOCAL_VAR:          "Variable '%s' is a %s variable.",
	ER_START_AS_BEGIN:                      "必须以begin语句开始.",
	ER_OUTOFMEMORY:                         "Out of memory; restart server and try again (needed %d bytes).",
	ER_HAVE_BEGIN:                          "指定了多次begin.",
	ER_NET_READ_INTERRUPTED:                "Got timeout reading communication packets.",
	ER_BINLOG_FORMAT_STATEMENT:             "The binlog_format is statement, backup is disabled.",
	ER_ERROR_EXIST_BEFORE:                  "Exist error at before statement.",
	ER_UNKNOWN_SYSTEM_VARIABLE:             "Unknown system variable '%s'.",
	ER_UNKNOWN_CHARACTER_SET:               "Unknown character set: '%s'.",
	ER_END_WITH_COMMIT:                     "Must end with commit.",
	ER_DB_NOT_EXISTED_ERROR:                "选择的数据库 '%s' 不存在.",
	ER_TABLE_EXISTS_ERROR:                  "表 '%s' 已存在.",
	ER_INDEX_NAME_IDX_PREFIX:               "索引 '%s' 需要指定'%s'前缀(表'%s').",
	ER_INDEX_NAME_UNIQ_PREFIX:              "唯一索引 '%s' 需要指定'%s'前缀(表'%s').",
	ER_AUTOINC_UNSIGNED:                    "自增列建议设置无符号标志unsigned(表'%s').",
	ER_VARCHAR_TO_TEXT_LEN:                 "列 '%s' 建议设置为text类型.",
	ER_CHAR_TO_VARCHAR_LEN:                 "列 '%s' 建议设置为varchar类型.",
	ER_KEY_COLUMN_DOES_NOT_EXITS:           "列 '%s' 不存在.",
	ER_INC_INIT_ERR:                        "建议自增列初始值置为 1.",
	ER_WRONG_ARGUMENTS:                     "Incorrect arguments to %s.",
	ER_SET_DATA_TYPE_INT_BIGINT:            "自增列需要设置为int或bigint类型.",
	ER_TIMESTAMP_DEFAULT:                   "请设置timestamp列 '%s' 的默认值.",
	ER_CHARSET_ON_COLUMN:                   "表 '%s' 列 '%s' 禁止设置字符集或排序规则!",
	ER_AUTO_INCR_ID_WARNING:                "自增列('%s')建议命名为'ID'.",
	ER_ALTER_TABLE_ONCE:                    "表 '%s' 的多个alter操作请合并成一个.",
	ER_BLOB_CANT_HAVE_DEFAULT:              "BLOB,TEXT,GEOMETRY或JSON列 '%s' 禁止设置默认值.",
	ER_END_WITH_SEMICOLON:                  "Add ';' after the last sql statement.",
	ER_NON_UNIQ_ERROR:                      "列 '%s' 有歧义,请指明表前缀.",
	ER_TABLE_NOT_EXISTED_ERROR:             "表 '%s' 不存在.",
	ER_UNKNOWN_TABLE:                       "Unknown table '%s' in %s.",
	ER_INVALID_GROUP_FUNC_USE:              "Invalid use of group function.",
	ER_INDEX_USE_ALTER_TABLE:               "暂不支持create/drop index和rename语法,请使用alter语句替换.",
	ER_WITH_DEFAULT_ADD_COLUMN:             "列 '%s' 请设置默认值(表'%s')",
	ER_TRUNCATED_WRONG_VALUE:               "Truncated incorrect %s value: '%s'",
	ER_TEXT_NOT_NULLABLE_ERROR:             "TEXT/BLOB 列 '%s' 禁止设置为not null(表'%s').",
	ER_WRONG_VALUE_FOR_VAR:                 "Variable '%s' can't be set to the value of '%s'",
	ER_TOO_MUCH_AUTO_TIMESTAMP_COLS:        "表定义不正确,只能有一个TIMESTAMP字段在DEFAULT或ON UPDATE指定CURRENT_TIMESTAMP.",
	ER_INVALID_ON_UPDATE:                   "列 %s' ON UPDATE 设置无效",
	ER_DDL_DML_COEXIST:                     "DDL can not coexist with the DML for table '%s'.",
	ER_SLAVE_CORRUPT_EVENT:                 "Corrupted replication event was detected.",
	ER_COLLATION_CHARSET_MISMATCH:          "COLLATION '%s' is not valid for CHARACTER SET '%s'",
	ER_NOT_SUPPORTED_ALTER_OPTION:          "Not supported statement of alter option",
	ER_CONFLICTING_DECLARATIONS:            "Conflicting declarations: '%s%s' and '%s%s'",
	ER_IDENT_USE_KEYWORD:                   "标识符 '%s' 是MySQL关键字.",
	ER_VIEW_SELECT_CLAUSE:                  "View's SELECT contains a '%s' clause",
	ER_OSC_KILL_FAILED:                     "Can not find OSC executing task",
	ER_NET_PACKETS_OUT_OF_ORDER:            "Got packets out of order",
	ER_NOT_SUPPORTED_ITEM_TYPE:             "Not supported expression type '%s'.",
	ER_INVALID_IDENT:                       "标识符 '%s' 无效, 允许字符为 [a-z|A-Z|0-9|_].",
	ER_INCEPTION_EMPTY_QUERY:               "Inception error, Query was empty.",
	ER_PK_COLS_NOT_INT:                     "主键列 '%s' 建议使用int或bigint类型(表'%s'.'%s').",
	ER_PK_TOO_MANY_PARTS:                   "表 '%s'.'%s' 主键指定了太多的字段, 最多允许 %d 个字段",
	ER_REMOVED_SPACES:                      "Leading spaces are removed from name '%s'",
	ER_CHANGE_COLUMN_TYPE:                  "类型转换警告: 列 '%s' %s -> %s.",
	ER_CANT_DROP_TABLE:                     "禁用【DROP】|【TRUNCATE】删除/清空表 '%s', 请改用RENAME重写.",
	ER_CANT_DROP_DATABASE:                  "命令禁止! 无法删除数据库'%s'.",
	ER_WRONG_TABLE_NAME:                    "不正确的表名: '%-.100s'",
	ER_CANT_SET_CHARSET:                    "禁止指定字符集: '%s'",
	ER_CANT_SET_COLLATION:                  "禁止指定排序规则: '%s'",
	ER_CANT_SET_ENGINE:                     "禁止指定存储引擎:'%s'",
	ER_MUST_AT_LEAST_ONE_COLUMN:            "表至少需要有一个列.",
	ER_MUST_HAVE_COLUMNS:                   "表必须包含以下列: '%s'.",
	ErrColumnsMustHaveIndex:                "列: '%s' 必须建索引.",
	ErrColumnsMustHaveIndexTypeErr:         "列: '%s' 类型必须为 '%s',当前为 '%s'",
	ER_PRIMARY_CANT_HAVE_NULL:              "主键的所有列必须为NOT NULL,如需要NULL列,请改用唯一索引",
	ErrCantRemoveAllFields:                 "禁止删除表的所有列.",
	ErrNotFoundTableInfo:                   "没有表结构信息,跳过备份.",
	ErrMariaDBRollbackWarn:                 "MariaDB v%d 对回滚支持不完美,请注意确认回滚语句是否正确",
	ErrNotFoundMasterStatus:                "无法获取master binlog信息.",
	ErrNonUniqTable:                        "表名或别名: '%-.192s' 不唯一.",
	ErrDataTooLong:                         "数据过长!(列 '%s',行 '%d')",
	ErrCharsetNotSupport:                   "允许的字符集: '%s'.",
	ErrCollationNotSupport:                 "允许的排序规则: '%s'.",
	ErrEngineNotSupport:                    "允许的存储引擎: '%s'.",
	ErrWrongUsage:                          "%s子句无法使用%s",
	ErrJsonTypeSupport:                     "不允许使用json类型(列'%s').",
	ErCantChangeColumnPosition:             "不允许改变列顺序(列'%s').",
	ErCantChangeColumn:                     "不允许change column语法(列'%s').",
	ER_DATETIME_DEFAULT:                    "请设置 datetime 列 '%s' 的默认值.",
	ER_TOO_MUCH_AUTO_DATETIME_COLS:         "表定义不正确,只能有一个 datetime 字段,在 DEFAULT 或 ON UPDATE指定CURRENT_TIMESTAMP.",
	ErrFloatDoubleToDecimal:                "列 '%s' 建议设置为 decimal 类型.",
	ErrIdentifierUpper:                     "标识符 '%s' 必须大写.",
	ErrIdentifierLower:                     "标识符 '%s' 必须小写.",
	ErrWrongAndExpr:                        "可能是错误语法!更新多个字段时请使用逗号分隔.",
	ErrJoinNoOnCondition:                   "join语句请指定on子句.",
	ErrImplicitTypeConversion:              "不允许隐式类型转换(列'%s.%s',类型'%s').",
	ErrUseValueExpr:                        "请确认是否要在where条件中使用值表达式.",
	ErrUseIndexVisibility:                  "后端数据库暂不支持索引指定visible选项",
	ErrViewSupport:                         "不允许创建或使用视图 '%s'.",
	ErrViewColumnCount:                     "视图的SELECT和视图字段列表具有不同的列数",
	ErrIncorrectDateTimeValue:              "不正确的时间:'%v'(列 '%s')",
	ErrSameNamePartition:                   "分区名重复: %-.192s",
	ErrRepeatConstDefinition:               "重复的分区范围定义: '%v'",
	ErrPartitionNotExisted:                 "分区 '%-.64s' 不存在",
}

func GetErrorLevel(code ErrorCode) uint8 {

	switch code {
	case ER_ALTER_TABLE_ONCE,
		ER_AUTO_INCR_ID_WARNING,
		ER_AUTOINC_UNSIGNED,
		ER_BLOB_CANT_HAVE_DEFAULT,
		ER_CANT_SET_CHARSET,
		ER_CANT_SET_COLLATION,
		ER_CANT_SET_ENGINE,
		ER_CHANGE_COLUMN_TYPE,
		ER_CHAR_TO_VARCHAR_LEN,
		ER_CHARSET_ON_COLUMN,
		ER_COLUMN_HAVE_NO_COMMENT,
		ER_IDENT_USE_KEYWORD,
		ER_INC_INIT_ERR,
		ER_INDEX_NAME_IDX_PREFIX,
		ER_INDEX_NAME_UNIQ_PREFIX,
		ER_TEMP_TABLE_TMP_PREFIX,
		ER_TABLE_PREFIX,
		ER_INSERT_TOO_MUCH_ROWS,
		ER_INVALID_DATA_TYPE,
		ER_INVALID_IDENT,
		ER_MUST_HAVE_COLUMNS,
		ErrColumnsMustHaveIndex,
		ErrColumnsMustHaveIndexTypeErr,
		ER_NO_WHERE_CONDITION,
		ErrJoinNoOnCondition,
		ER_NOT_ALLOWED_NULLABLE,
		ER_NOT_SUPPORTED_ALTER_OPTION,
		ER_ORDERY_BY_RAND,
		ER_OUTOFMEMORY,
		ER_PARTITION_NOT_ALLOWED,
		ER_PK_COLS_NOT_INT,
		ER_PK_TOO_MANY_PARTS,
		ER_SELECT_ONLY_STAR,
		ER_TABLE_CHARSET_MUST_NULL,
		ER_TABLE_CHARSET_MUST_UTF8,
		ER_TABLE_MUST_HAVE_COMMENT,
		ER_TABLE_MUST_HAVE_PK,
		ER_TEXT_NOT_NULLABLE_ERROR,
		ER_TIMESTAMP_DEFAULT,
		ER_TOO_LONG_INDEX_COMMENT,
		ER_TOO_MANY_KEY_PARTS,
		ER_TOO_MANY_KEYS,
		ER_UDPATE_TOO_MUCH_ROWS,
		ER_CHANGE_TOO_MUCH_ROWS,
		ErrUnknownCharset,
		ER_UNKNOWN_COLLATION,
		ER_USE_ENUM,
		ER_WITH_DEFAULT_ADD_COLUMN,
		ER_WITH_LIMIT_CONDITION,
		ER_WITH_ORDERBY_CONDITION,
		ErCantChangeColumnPosition,
		ErCantChangeColumn,
		ErrNotFoundTableInfo,
		ErrMariaDBRollbackWarn,
		ErrTableCollationNotSupport,
		ER_DATETIME_DEFAULT,
		ErrWrongAndExpr,
		ErrImplicitTypeConversion,
		ErrUseValueExpr,
		ER_WITH_INSERT_FIELD:
		return 1

	case ER_CONFLICTING_DECLARATIONS,
		ER_NO_DB_ERROR,
		ER_KEY_COLUMN_DOES_NOT_EXITS,
		ER_TOO_LONG_BAKDB_NAME,
		ER_DB_NOT_EXISTED_ERROR,
		ER_TABLE_EXISTS_ERROR,
		ER_COLUMN_EXISTED,
		ER_START_AS_BEGIN,
		ER_COLUMN_NOT_EXISTED,
		ER_WRONG_STRING_LENGTH,
		ER_BLOB_USED_AS_KEY,
		ER_INVALID_DEFAULT,
		ER_NOT_SUPPORTED_KEY_TYPE,
		ER_DUP_INDEX,
		ER_TOO_LONG_KEY,
		ER_MULTIPLE_PRI_KEY,
		ER_DUP_KEYNAME,
		ER_DUP_FIELDNAME,
		ER_WRONG_KEY_COLUMN,
		ER_WRONG_COLUMN_NAME,
		ER_WRONG_AUTO_KEY,
		ER_WRONG_SUB_KEY,
		ER_WRONG_NAME_FOR_INDEX,
		ER_TOO_LONG_IDENT,
		ER_SQL_INVALID_SOURCE,
		ER_WRONG_DB_NAME,
		ER_WITH_INSERT_VALUES,
		ER_WRONG_VALUE_COUNT_ON_ROW,
		ER_BAD_FIELD_ERROR,
		ER_FIELD_SPECIFIED_TWICE,
		ER_SQL_NO_SOURCE,
		ER_PARSE_ERROR,
		ER_SYNTAX_ERROR,
		ER_END_WITH_SEMICOLON,
		ER_INDEX_USE_ALTER_TABLE,
		ER_INVALID_GROUP_FUNC_USE,
		ER_TABLE_NOT_EXISTED_ERROR,
		ER_UNKNOWN_TABLE,
		ER_TOO_MUCH_AUTO_TIMESTAMP_COLS,
		ER_INVALID_ON_UPDATE,
		ER_NON_UNIQ_ERROR,
		ER_DDL_DML_COEXIST,
		ER_COLLATION_CHARSET_MISMATCH,
		ER_VIEW_SELECT_CLAUSE,
		ER_NOT_SUPPORTED_ITEM_TYPE,
		ER_CANT_DROP_TABLE,
		ER_CANT_DROP_DATABASE,
		ER_CANT_DROP_FIELD_OR_KEY,
		ER_NOT_SUPPORTED_YET,
		ErrCharsetNotSupport,
		ErrCollationNotSupport,
		ErrEngineNotSupport,
		ER_FOREIGN_KEY,
		ER_TOO_MUCH_AUTO_DATETIME_COLS,
		ER_INCEPTION_EMPTY_QUERY:
		return 2

	default:
		return 2
	}
}

// GetErrorMessage 获取审核信息,默认为英文
func GetErrorMessage(code ErrorCode, lang string) string {
	if lang == "zh_cn" || lang == "zh-cn" {
		if v, ok := ErrorsChinese[code]; ok {
			return v
		}
	}
	if v, ok := ErrorsDefault[code]; ok {
		return v
	}
	return "Invalid error code!"
}

// SQLError records an error information, from executing SQL.
type SQLError struct {
	Code    ErrorCode
	Message string
}

// Error prints errors, with a formatted string.
func (e *SQLError) Error() string {
	return e.Message
}

// NewErr generates a SQL error, with an error code and default format specifier defined in MySQLErrName.
func NewErr(errCode ErrorCode, args ...interface{}) *SQLError {
	e := &SQLError{Code: errCode}
	e.Message = fmt.Sprintf(GetErrorMessage(errCode, "en_us"), args...)
	return e
}

// NewErrf creates a SQL error, with an error code and a format specifier.
func NewErrf(format string, args ...interface{}) *SQLError {
	e := &SQLError{Code: 0}
	e.Message = fmt.Sprintf(format, args...)
	return e
}

func (e ErrorCode) String() string {
	switch e {
	case ER_ERROR_FIRST:
		return "er_error_first"
	case ER_NOT_SUPPORTED_YET:
		return "er_not_supported_yet"
	case ER_SQL_NO_SOURCE:
		return "er_sql_no_source"
	case ER_SQL_NO_OP_TYPE:
		return "er_sql_no_op_type"
	case ER_SQL_INVALID_OP_TYPE:
		return "er_sql_invalid_op_type"
	case ER_PARSE_ERROR:
		return "er_parse_error"
	case ER_SYNTAX_ERROR:
		return "er_syntax_error"
	case ER_REMOTE_EXE_ERROR:
		return "er_remote_exe_error"
	case ER_SHUTDOWN_COMPLETE:
		return "er_shutdown_complete"
	case ER_WITH_INSERT_FIELD:
		return "er_with_insert_field"
	case ER_WITH_INSERT_VALUES:
		return "er_with_insert_values"
	case ER_WRONG_VALUE_COUNT_ON_ROW:
		return "er_wrong_value_count_on_row"
	case ER_BAD_FIELD_ERROR:
		return "er_bad_field_error"
	case ER_FIELD_SPECIFIED_TWICE:
		return "er_field_specified_twice"
	case ER_BAD_NULL_ERROR:
		return "er_bad_null_error"
	case ER_NO_WHERE_CONDITION:
		return "er_no_where_condition"
	case ER_NORMAL_SHUTDOWN:
		return "er_normal_shutdown"
	case ER_FORCING_CLOSE:
		return "er_forcing_close"
	case ER_CON_COUNT_ERROR:
		return "er_con_count_error"
	case ER_INVALID_COMMAND:
		return "er_invalid_command"
	case ER_SQL_INVALID_SOURCE:
		return "er_sql_invalid_source"
	case ER_WRONG_DB_NAME:
		return "er_wrong_db_name"
	case ER_NO_DB_ERROR:
		return "er_no_db_error"
	case ER_WITH_LIMIT_CONDITION:
		return "er_with_limit_condition"
	case ER_WITH_ORDERBY_CONDITION:
		return "er_with_orderby_condition"
	case ER_SELECT_ONLY_STAR:
		return "er_select_only_star"
	case ER_ORDERY_BY_RAND:
		return "er_ordery_by_rand"
	case ER_ID_IS_UPER:
		return "er_id_is_uper"
	case ErrUnknownCharset:
		return "er_unknown_charset"
	case ER_UNKNOWN_COLLATION:
		return "er_unknown_collation"
	case ER_INVALID_DATA_TYPE:
		return "er_invalid_data_type"
	case ER_NOT_ALLOWED_NULLABLE:
		return "er_not_allowed_nullable"
	case ER_DUP_FIELDNAME:
		return "er_dup_fieldname"
	case ER_WRONG_COLUMN_NAME:
		return "er_wrong_column_name"
	case ER_WRONG_AUTO_KEY:
		return "er_wrong_auto_key"
	case ER_TABLE_CANT_HANDLE_AUTO_INCREMENT:
		return "er_table_cant_handle_auto_increment"
	case ER_FOREIGN_KEY:
		return "er_foreign_key"
	case ER_TOO_MANY_KEY_PARTS:
		return "er_too_many_key_parts"
	case ER_TOO_LONG_IDENT:
		return "er_too_long_ident"
	case ER_UDPATE_TOO_MUCH_ROWS:
		return "er_udpate_too_much_rows"
	case ER_CHANGE_TOO_MUCH_ROWS:
		return "er_change_too_much_rows"
	case ER_INSERT_TOO_MUCH_ROWS:
		return "er_insert_too_much_rows"
	case ER_WRONG_NAME_FOR_INDEX:
		return "er_wrong_name_for_index"
	case ER_TOO_MANY_KEYS:
		return "er_too_many_keys"
	case ER_NOT_SUPPORTED_KEY_TYPE:
		return "er_not_supported_key_type"
	case ER_WRONG_SUB_KEY:
		return "er_wrong_sub_key"
	case ER_WRONG_KEY_COLUMN:
		return "er_wrong_key_column"
	case ER_TOO_LONG_KEY:
		return "er_too_long_key"
	case ER_MULTIPLE_PRI_KEY:
		return "er_multiple_pri_key"
	case ER_DUP_KEYNAME:
		return "er_dup_keyname"
	case ER_TOO_LONG_INDEX_COMMENT:
		return "er_too_long_index_comment"
	case ER_DUP_INDEX:
		return "er_dup_index"
	case ER_TEMP_TABLE_TMP_PREFIX:
		return "er_temp_table_tmp_prefix"
	case ER_TABLE_PREFIX:
		return "er_table_prefix"
	case ER_TABLE_CHARSET_MUST_UTF8:
		return "er_table_charset_must_utf8"
	case ER_TABLE_CHARSET_MUST_NULL:
		return "er_table_charset_must_null"
	case ER_TABLE_MUST_HAVE_COMMENT:
		return "er_table_must_have_comment"
	case ER_COLUMN_HAVE_NO_COMMENT:
		return "er_column_have_no_comment"
	case ER_TABLE_MUST_HAVE_PK:
		return "er_table_must_have_pk"
	case ER_PARTITION_NOT_ALLOWED:
		return "er_partition_not_allowed"
	case ER_USE_ENUM:
		return "er_use_enum"
	case ER_USE_TEXT_OR_BLOB:
		return "er_use_text_or_blob"
	case ER_COLUMN_EXISTED:
		return "er_column_existed"
	case ER_COLUMN_NOT_EXISTED:
		return "er_column_not_existed"
	case ER_CANT_DROP_FIELD_OR_KEY:
		return "er_cant_drop_field_or_key"
	case ER_INVALID_DEFAULT:
		return "er_invalid_default"
	case ER_USERNAME:
		return "er_username"
	case ER_HOSTNAME:
		return "er_hostname"
	case ER_NOT_VALID_PASSWORD:
		return "er_not_valid_password"
	case ER_WRONG_STRING_LENGTH:
		return "er_wrong_string_length"
	case ER_BLOB_USED_AS_KEY:
		return "er_blob_used_as_key"
	case ER_TOO_LONG_BAKDB_NAME:
		return "er_too_long_bakdb_name"
	case ER_INVALID_BACKUP_HOST_INFO:
		return "er_invalid_backup_host_info"
	case ER_BINLOG_CORRUPTED:
		return "er_binlog_corrupted"
	case ER_NET_READ_ERROR:
		return "er_net_read_error"
	case ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE:
		return "er_network_read_event_checksum_failure"
	case ER_SLAVE_RELAY_LOG_WRITE_FAILURE:
		return "er_slave_relay_log_write_failure"
	case ER_INCORRECT_GLOBAL_LOCAL_VAR:
		return "er_incorrect_global_local_var"
	case ER_START_AS_BEGIN:
		return "er_start_as_begin"
	case ER_OUTOFMEMORY:
		return "er_outofmemory"
	case ER_HAVE_BEGIN:
		return "er_have_begin"
	case ER_NET_READ_INTERRUPTED:
		return "er_net_read_interrupted"
	case ER_BINLOG_FORMAT_STATEMENT:
		return "er_binlog_format_statement"
	case ER_ERROR_EXIST_BEFORE:
		return "er_error_exist_before"
	case ER_UNKNOWN_SYSTEM_VARIABLE:
		return "er_unknown_system_variable"
	case ER_UNKNOWN_CHARACTER_SET:
		return "er_unknown_character_set"
	case ER_END_WITH_COMMIT:
		return "er_end_with_commit"
	case ER_DB_NOT_EXISTED_ERROR:
		return "er_db_not_existed_error"
	case ER_TABLE_EXISTS_ERROR:
		return "er_table_exists_error"
	case ER_INDEX_NAME_IDX_PREFIX:
		return "er_index_name_idx_prefix"
	case ER_INDEX_NAME_UNIQ_PREFIX:
		return "er_index_name_uniq_prefix"
	case ER_AUTOINC_UNSIGNED:
		return "er_autoinc_unsigned"
	case ER_VARCHAR_TO_TEXT_LEN:
		return "er_varchar_to_text_len"
	case ER_CHAR_TO_VARCHAR_LEN:
		return "er_char_to_varchar_len"
	case ER_KEY_COLUMN_DOES_NOT_EXITS:
		return "er_key_column_does_not_exits"
	case ER_INC_INIT_ERR:
		return "er_inc_init_err"
	case ER_WRONG_ARGUMENTS:
		return "er_wrong_arguments"
	case ER_SET_DATA_TYPE_INT_BIGINT:
		return "er_set_data_type_int_bigint"
	case ER_TIMESTAMP_DEFAULT:
		return "er_timestamp_default"
	case ER_CHARSET_ON_COLUMN:
		return "er_charset_on_column"
	case ER_AUTO_INCR_ID_WARNING:
		return "er_auto_incr_id_warning"
	case ER_ALTER_TABLE_ONCE:
		return "er_alter_table_once"
	case ER_BLOB_CANT_HAVE_DEFAULT:
		return "er_blob_cant_have_default"
	case ER_END_WITH_SEMICOLON:
		return "er_end_with_semicolon"
	case ER_NON_UNIQ_ERROR:
		return "er_non_uniq_error"
	case ER_TABLE_NOT_EXISTED_ERROR:
		return "er_table_not_existed_error"
	case ER_UNKNOWN_TABLE:
		return "er_unknown_table"
	case ER_INVALID_GROUP_FUNC_USE:
		return "er_invalid_group_func_use"
	case ER_INDEX_USE_ALTER_TABLE:
		return "er_index_use_alter_table"
	case ER_WITH_DEFAULT_ADD_COLUMN:
		return "er_with_default_add_column"
	case ER_TRUNCATED_WRONG_VALUE:
		return "er_truncated_wrong_value"
	case ER_TEXT_NOT_NULLABLE_ERROR:
		return "er_text_not_nullable_error"
	case ER_WRONG_VALUE_FOR_VAR:
		return "er_wrong_value_for_var"
	case ER_TOO_MUCH_AUTO_TIMESTAMP_COLS:
		return "er_too_much_auto_timestamp_cols"
	case ER_INVALID_ON_UPDATE:
		return "er_invalid_on_update"
	case ER_DDL_DML_COEXIST:
		return "er_ddl_dml_coexist"
	case ER_SLAVE_CORRUPT_EVENT:
		return "er_slave_corrupt_event"
	case ER_COLLATION_CHARSET_MISMATCH:
		return "er_collation_charset_mismatch"
	case ER_NOT_SUPPORTED_ALTER_OPTION:
		return "er_not_supported_alter_option"
	case ER_CONFLICTING_DECLARATIONS:
		return "er_conflicting_declarations"
	case ER_IDENT_USE_KEYWORD:
		return "er_ident_use_keyword"
	case ER_VIEW_SELECT_CLAUSE:
		return "er_view_select_clause"
	case ER_OSC_KILL_FAILED:
		return "er_osc_kill_failed"
	case ER_NET_PACKETS_OUT_OF_ORDER:
		return "er_net_packets_out_of_order"
	case ER_NOT_SUPPORTED_ITEM_TYPE:
		return "er_not_supported_item_type"
	case ER_INVALID_IDENT:
		return "er_invalid_ident"
	case ER_INCEPTION_EMPTY_QUERY:
		return "er_inception_empty_query"
	case ER_PK_COLS_NOT_INT:
		return "er_pk_cols_not_int"
	case ER_PK_TOO_MANY_PARTS:
		return "er_pk_too_many_parts"
	case ER_REMOVED_SPACES:
		return "er_removed_spaces"
	case ER_CHANGE_COLUMN_TYPE:
		return "er_change_column_type"
	case ER_CANT_DROP_TABLE:
		return "er_cant_drop_table"
	case ER_CANT_DROP_DATABASE:
		return "er_cant_drop_database"
	case ER_WRONG_TABLE_NAME:
		return "er_wrong_table_name"
	case ER_CANT_SET_CHARSET:
		return "er_cant_set_charset"
	case ER_CANT_SET_COLLATION:
		return "er_cant_set_collation"
	case ER_CANT_SET_ENGINE:
		return "er_cant_set_engine"
	case ER_MUST_AT_LEAST_ONE_COLUMN:
		return "er_must_at_least_one_column"
	case ER_MUST_HAVE_COLUMNS:
		return "er_must_have_columns"
	case ErrColumnsMustHaveIndex:
		return "er_columns_must_have_index"
	case ErrColumnsMustHaveIndexTypeErr:
		return "er_columns_must_have_index_type_err"
	case ER_PRIMARY_CANT_HAVE_NULL:
		return "er_primary_cant_have_null"
	case ErrCantRemoveAllFields:
		return "er_cant_remove_all_fields"
	case ErrNotFoundTableInfo:
		return "er_not_found_table_info"
	case ErrMariaDBRollbackWarn:
		return "er_mariadb_rollback_warn"
	case ErrNotFoundMasterStatus:
		return "er_not_found_master_status"
	case ErrNonUniqTable:
		return "er_non_uniq_table"
	case ErrWrongUsage:
		return "er_wrong_usage"
	case ErrDataTooLong:
		return "er_data_too_long"
	case ErrCharsetNotSupport:
		return "er_charset_not_support"
	case ErrCollationNotSupport:
		return "er_collation_not_support"
	case ErrTableCollationNotSupport:
		return "er_table_collation_not_support"
	case ErrJsonTypeSupport:
		return "er_json_type_support"
	case ErrEngineNotSupport:
		return "er_engine_not_support"
	case ErrMixOfGroupFuncAndFields:
		return "er_mix_of_group_func_and_fields"
	case ErrFieldNotInGroupBy:
		return "er_field_not_in_group_by"
	case ErCantChangeColumnPosition:
		return "er_cant_change_column_position"
	case ErCantChangeColumn:
		return "er_cant_change_column"
	case ErrFloatDoubleToDecimal:
		return "er_float_double_to_decimal"
	case ErrIdentifierUpper:
		return "er_identifier_upper"
	case ErrIdentifierLower:
		return "er_identifier_lower"
	case ErrWrongAndExpr:
		return "er_wrong_and_expr"
	case ErrJoinNoOnCondition:
		return "er_join_no_on_condition"
	case ErrImplicitTypeConversion:
		return "er_implicit_type_conversion"
	case ErrUseValueExpr:
		return "er_use_value_expr"
	case ErrUseIndexVisibility:
		return "er_use_index_visibility"
	case ErrViewSupport:
		return "er_view_support"
	case ErrIncorrectDateTimeValue:
		return "er_incorrect_datetime_value"
	case ErrSameNamePartition:
		return "er_same_name_partition"
	case ErrRepeatConstDefinition:
		return "er_repeat_const_definition"
	case ErrPartitionNotExisted:
		return "er_partition_not_existed"
	case ER_ERROR_LAST:
		return "er_error_last"
	}
	return ""
}

// TestCheckAuditSetting 自动校准旧的审核规则和自定义规则
func TestCheckAuditSetting(cnf *config.Config) {

	if cnf.Inc.CheckInsertField {
		cnf.IncLevel.ER_WITH_INSERT_FIELD = int8(GetErrorLevel(ER_WITH_INSERT_FIELD))
	} else {
		cnf.IncLevel.ER_WITH_INSERT_FIELD = 0
	}

	if cnf.Inc.CheckDMLWhere {
		cnf.IncLevel.ER_NO_WHERE_CONDITION = int8(GetErrorLevel(ER_NO_WHERE_CONDITION))
		cnf.IncLevel.ErrJoinNoOnCondition = int8(GetErrorLevel(ErrJoinNoOnCondition))
	} else {
		cnf.IncLevel.ER_NO_WHERE_CONDITION = 0
		cnf.IncLevel.ErrJoinNoOnCondition = 0
	}

	if cnf.Inc.CheckDMLLimit {
		cnf.IncLevel.ER_WITH_LIMIT_CONDITION = int8(GetErrorLevel(ER_WITH_LIMIT_CONDITION))
	} else {
		cnf.IncLevel.ER_WITH_LIMIT_CONDITION = 0
	}

	if cnf.Inc.CheckDMLOrderBy {
		cnf.IncLevel.ER_WITH_ORDERBY_CONDITION = int8(GetErrorLevel(ER_WITH_ORDERBY_CONDITION))
	} else {
		cnf.IncLevel.ER_WITH_ORDERBY_CONDITION = 0
	}

	if !cnf.Inc.EnableSelectStar {
		cnf.IncLevel.ER_SELECT_ONLY_STAR = int8(GetErrorLevel(ER_SELECT_ONLY_STAR))
	} else {
		cnf.IncLevel.ER_SELECT_ONLY_STAR = 0
	}

	if !cnf.Inc.EnableOrderByRand {
		cnf.IncLevel.ER_ORDERY_BY_RAND = int8(GetErrorLevel(ER_ORDERY_BY_RAND))
	} else {
		cnf.IncLevel.ER_ORDERY_BY_RAND = 0
	}

	if !cnf.Inc.EnableNullable {
		cnf.IncLevel.ER_NOT_ALLOWED_NULLABLE = int8(GetErrorLevel(ER_NOT_ALLOWED_NULLABLE))
	} else {
		cnf.IncLevel.ER_NOT_ALLOWED_NULLABLE = 0
	}

	if !cnf.Inc.EnableForeignKey {
		cnf.IncLevel.ER_FOREIGN_KEY = int8(GetErrorLevel(ER_FOREIGN_KEY))
	} else {
		cnf.IncLevel.ER_FOREIGN_KEY = 0
	}

	if !cnf.Inc.EnableBlobType {
		cnf.IncLevel.ER_USE_TEXT_OR_BLOB = int8(GetErrorLevel(ER_USE_TEXT_OR_BLOB))
	} else {
		cnf.IncLevel.ER_USE_TEXT_OR_BLOB = 0
	}

	if !cnf.Inc.EnableJsonType {
		cnf.IncLevel.ErJsonTypeSupport = int8(GetErrorLevel(ErrJsonTypeSupport))
	} else {
		cnf.IncLevel.ErJsonTypeSupport = 0
	}

	if !cnf.Inc.EnableUseView {
		cnf.IncLevel.ErrViewSupport = int8(GetErrorLevel(ErrViewSupport))
	} else {
		cnf.IncLevel.ErrViewSupport = 0
	}

	if cnf.Inc.EnablePKColumnsOnlyInt {
		cnf.IncLevel.ER_PK_COLS_NOT_INT = int8(GetErrorLevel(ER_PK_COLS_NOT_INT))
	} else {
		cnf.IncLevel.ER_PK_COLS_NOT_INT = 0
	}

	if cnf.Inc.CheckTableComment {
		cnf.IncLevel.ER_TABLE_MUST_HAVE_COMMENT = int8(GetErrorLevel(ER_TABLE_MUST_HAVE_COMMENT))
	} else {
		cnf.IncLevel.ER_TABLE_MUST_HAVE_COMMENT = 0
	}

	if cnf.Inc.CheckColumnComment {
		cnf.IncLevel.ER_COLUMN_HAVE_NO_COMMENT = int8(GetErrorLevel(ER_COLUMN_HAVE_NO_COMMENT))
	} else {
		cnf.IncLevel.ER_COLUMN_HAVE_NO_COMMENT = 0
	}

	if cnf.Inc.CheckPrimaryKey {
		cnf.IncLevel.ER_TABLE_MUST_HAVE_PK = int8(GetErrorLevel(ER_TABLE_MUST_HAVE_PK))
	} else {
		cnf.IncLevel.ER_TABLE_MUST_HAVE_PK = 0
	}

	if !cnf.Inc.EnablePartitionTable {
		cnf.IncLevel.ER_PARTITION_NOT_ALLOWED = int8(GetErrorLevel(ER_PARTITION_NOT_ALLOWED))
	} else {
		cnf.IncLevel.ER_PARTITION_NOT_ALLOWED = 0
	}

	if !cnf.Inc.EnableEnumSetBit {
		cnf.IncLevel.ER_USE_ENUM = int8(GetErrorLevel(ER_USE_ENUM))
		cnf.IncLevel.ER_INVALID_DATA_TYPE = int8(GetErrorLevel(ER_INVALID_DATA_TYPE))
	} else {
		cnf.IncLevel.ER_USE_ENUM = 0
		cnf.IncLevel.ER_INVALID_DATA_TYPE = 0
	}

	if cnf.Inc.CheckIndexPrefix {
		cnf.IncLevel.ER_INDEX_NAME_IDX_PREFIX = int8(GetErrorLevel(ER_INDEX_NAME_IDX_PREFIX))
		cnf.IncLevel.ER_INDEX_NAME_UNIQ_PREFIX = int8(GetErrorLevel(ER_INDEX_NAME_UNIQ_PREFIX))
	} else {
		cnf.IncLevel.ER_INDEX_NAME_IDX_PREFIX = 0
		cnf.IncLevel.ER_INDEX_NAME_UNIQ_PREFIX = 0
	}

	if cnf.Inc.EnableAutoIncrementUnsigned {
		cnf.IncLevel.ER_AUTOINC_UNSIGNED = int8(GetErrorLevel(ER_AUTOINC_UNSIGNED))
	} else {
		cnf.IncLevel.ER_AUTOINC_UNSIGNED = 0
	}

	if cnf.Inc.CheckAutoIncrementInitValue {
		cnf.IncLevel.ER_INC_INIT_ERR = int8(GetErrorLevel(ER_INC_INIT_ERR))
	} else {
		cnf.IncLevel.ER_INC_INIT_ERR = 0
	}

	if cnf.Inc.CheckIdentifier {
		cnf.IncLevel.ER_INVALID_IDENT = int8(GetErrorLevel(ER_INVALID_IDENT))
	} else {
		cnf.IncLevel.ER_INVALID_IDENT = 0
	}

	if cnf.Inc.CheckAutoIncrementDataType {
		cnf.IncLevel.ER_SET_DATA_TYPE_INT_BIGINT = int8(GetErrorLevel(ER_SET_DATA_TYPE_INT_BIGINT))
	} else {
		cnf.IncLevel.ER_SET_DATA_TYPE_INT_BIGINT = 0
	}

	if cnf.Inc.CheckTimestampDefault {
		cnf.IncLevel.ER_TIMESTAMP_DEFAULT = int8(GetErrorLevel(ER_TIMESTAMP_DEFAULT))
	} else {
		cnf.IncLevel.ER_TIMESTAMP_DEFAULT = 0
	}

	if cnf.Inc.CheckTimestampCount {
		cnf.IncLevel.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = int8(GetErrorLevel(ER_TOO_MUCH_AUTO_TIMESTAMP_COLS))
	} else {
		cnf.IncLevel.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 0
	}

	if !cnf.Inc.EnableColumnCharset {
		cnf.IncLevel.ER_CHARSET_ON_COLUMN = int8(GetErrorLevel(ER_CHARSET_ON_COLUMN))
	} else {
		cnf.IncLevel.ER_CHARSET_ON_COLUMN = 0
	}

	if !cnf.Inc.EnableIdentiferKeyword {
		cnf.IncLevel.ER_IDENT_USE_KEYWORD = int8(GetErrorLevel(ER_IDENT_USE_KEYWORD))
	} else {
		cnf.IncLevel.ER_IDENT_USE_KEYWORD = 0
	}

	if cnf.Inc.CheckAutoIncrementName {
		cnf.IncLevel.ER_AUTO_INCR_ID_WARNING = int8(GetErrorLevel(ER_AUTO_INCR_ID_WARNING))
	} else {
		cnf.IncLevel.ER_AUTO_INCR_ID_WARNING = 0
	}

	if cnf.Inc.MergeAlterTable {
		cnf.IncLevel.ER_ALTER_TABLE_ONCE = int8(GetErrorLevel(ER_ALTER_TABLE_ONCE))
	} else {
		cnf.IncLevel.ER_ALTER_TABLE_ONCE = 0
	}

	if cnf.Inc.CheckColumnDefaultValue {
		cnf.IncLevel.ER_WITH_DEFAULT_ADD_COLUMN = int8(GetErrorLevel(ER_WITH_DEFAULT_ADD_COLUMN))
	} else {
		cnf.IncLevel.ER_WITH_DEFAULT_ADD_COLUMN = 0
	}

	if cnf.Inc.CheckColumnTypeChange {
		cnf.IncLevel.ER_CHANGE_COLUMN_TYPE = int8(GetErrorLevel(ER_CHANGE_COLUMN_TYPE))
	} else {
		cnf.IncLevel.ER_CHANGE_COLUMN_TYPE = 0
	}

	if cnf.Inc.CheckColumnPositionChange {
		cnf.IncLevel.ErCantChangeColumnPosition = int8(GetErrorLevel(ErCantChangeColumnPosition))
	} else {
		cnf.IncLevel.ErCantChangeColumnPosition = 0
	}

	if cnf.Inc.EnableChangeColumn {
		cnf.IncLevel.ErCantChangeColumn = 0
	} else {
		cnf.IncLevel.ErCantChangeColumn = int8(GetErrorLevel(ErCantChangeColumn))
	}

	if !cnf.Inc.EnableBlobNotNull {
		cnf.IncLevel.ER_TEXT_NOT_NULLABLE_ERROR = int8(GetErrorLevel(ER_TEXT_NOT_NULLABLE_ERROR))
	} else {
		cnf.IncLevel.ER_TEXT_NOT_NULLABLE_ERROR = 0
	}

	if cnf.Inc.CheckImplicitTypeConversion {
		cnf.IncLevel.ErrImplicitTypeConversion = int8(GetErrorLevel(ErrImplicitTypeConversion))
	} else {
		cnf.IncLevel.ErrImplicitTypeConversion = 0
	}
}