diff options
Diffstat (limited to 'handler/ha_innodb.cc')
-rw-r--r-- | handler/ha_innodb.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/handler/ha_innodb.cc b/handler/ha_innodb.cc index ed6719b8f8b..7a2d8e8fdbe 100644 --- a/handler/ha_innodb.cc +++ b/handler/ha_innodb.cc @@ -196,6 +196,7 @@ static my_bool innobase_stats_on_metadata = TRUE; static my_bool innobase_use_sys_stats_table = FALSE; static my_bool innobase_buffer_pool_shm_checksum = TRUE; static uint innobase_buffer_pool_shm_key = 0; +static my_bool innobase_large_prefix = FALSE; static char* internal_innobase_data_file_path = NULL; @@ -1056,7 +1057,7 @@ int convert_error_code_to_mysql( /*========================*/ int error, /*!< in: InnoDB error code */ - ulint flags, /*!< in: InnoDB table flags, or 0 */ + ulint flags, /*!< in: InnoDB table flags, or 0 */ THD* thd) /*!< in: user thread handle or NULL */ { switch (error) { @@ -1160,6 +1161,11 @@ convert_error_code_to_mysql( & DICT_TF_COMPACT) / 2); return(HA_ERR_TO_BIG_ROW); + case DB_TOO_BIG_INDEX_COL: + my_error(ER_INDEX_COLUMN_TOO_LONG, MYF(0), + DICT_MAX_FIELD_LEN_BY_FORMAT_FLAG(flags)); + return(HA_ERR_INDEX_COL_TOO_LONG); + case DB_NO_SAVEPOINT: return(HA_ERR_NO_SAVEPOINT); @@ -3040,8 +3046,10 @@ innobase_alter_table_flags( uint flags) { return(HA_INPLACE_ADD_INDEX_NO_READ_WRITE + | HA_INPLACE_ADD_INDEX_NO_WRITE | HA_INPLACE_DROP_INDEX_NO_READ_WRITE | HA_INPLACE_ADD_UNIQUE_INDEX_NO_READ_WRITE + | HA_INPLACE_ADD_UNIQUE_INDEX_NO_WRITE | HA_INPLACE_DROP_UNIQUE_INDEX_NO_READ_WRITE | HA_INPLACE_ADD_PK_INDEX_NO_READ_WRITE); } @@ -4403,7 +4411,11 @@ UNIV_INTERN uint ha_innobase::max_supported_key_part_length() const { - return(DICT_MAX_INDEX_COL_LEN - 1); + /* A table format specific index column length check will be performed + at ha_innobase::add_index() and row_create_index_for_mysql() */ + return(innobase_large_prefix + ? REC_VERSION_56_MAX_INDEX_COL_LEN + : REC_ANTELOPE_MAX_INDEX_COL_LEN - 1); } /******************************************************************//** @@ -7533,8 +7545,8 @@ ha_innobase::create( if (i != (uint) primary_key_no) { - if ((error = create_index(trx, form, flags, norm_name, - i))) { + if ((error = create_index(trx, form, flags, + norm_name, i))) { goto cleanup; } } @@ -11714,6 +11726,11 @@ static MYSQL_SYSVAR_STR(flush_method, innobase_file_flush_method, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "With which method to flush data.", NULL, NULL, NULL); +static MYSQL_SYSVAR_BOOL(large_prefix, innobase_large_prefix, + PLUGIN_VAR_NOCMDARG, + "Support large index prefix length of REC_VERSION_56_MAX_INDEX_COL_LEN (3072) bytes.", + NULL, NULL, FALSE); + static MYSQL_SYSVAR_BOOL(locks_unsafe_for_binlog, innobase_locks_unsafe_for_binlog, PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY, "Force InnoDB to not use next-key locking, to use only row-level locking.", @@ -12162,6 +12179,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(use_global_flush_log_at_trx_commit), MYSQL_SYSVAR(flush_method), MYSQL_SYSVAR(force_recovery), + MYSQL_SYSVAR(large_prefix), MYSQL_SYSVAR(locks_unsafe_for_binlog), MYSQL_SYSVAR(lock_wait_timeout), #ifdef UNIV_LOG_ARCHIVE |