mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Bug#8349 myisamchk: --set-charset does not work
What we need to be able to set in myisamchk is actually a collation, not a character set. This fix just changes to display the proper error message. include/mysys_err.h: New mysys error message "unknown collation". mysys/charset.c: Display more proper error when a collation is not found. mysys/errors.c: New "unknown collation" error.
This commit is contained in:
@@ -21,7 +21,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GLOB 0 /* Error maps */
|
#define GLOB 0 /* Error maps */
|
||||||
#define GLOBERRS 28 /* Max number of error messages in map's */
|
#define GLOBERRS 29 /* Max number of error messages in map's */
|
||||||
#define EE(X) globerrs[ X ] /* Defines to add error to right map */
|
#define EE(X) globerrs[ X ] /* Defines to add error to right map */
|
||||||
|
|
||||||
extern const char * NEAR globerrs[]; /* my_error_messages is here */
|
extern const char * NEAR globerrs[]; /* my_error_messages is here */
|
||||||
@@ -54,6 +54,7 @@ extern const char * NEAR globerrs[]; /* my_error_messages is here */
|
|||||||
#define EE_CANT_SYMLINK 25
|
#define EE_CANT_SYMLINK 25
|
||||||
#define EE_REALPATH 26
|
#define EE_REALPATH 26
|
||||||
#define EE_SYNC 27
|
#define EE_SYNC 27
|
||||||
|
#define EE_UNKNOWN_COLLATION 28
|
||||||
|
|
||||||
/* exit codes for all MySQL programs */
|
/* exit codes for all MySQL programs */
|
||||||
|
|
||||||
|
@@ -41,8 +41,8 @@ SET_STACK_SIZE(9000) /* Minimum stack size for program */
|
|||||||
static uint decode_bits;
|
static uint decode_bits;
|
||||||
static char **default_argv;
|
static char **default_argv;
|
||||||
static const char *load_default_groups[]= { "myisamchk", 0 };
|
static const char *load_default_groups[]= { "myisamchk", 0 };
|
||||||
static const char *set_charset_name, *opt_tmpdir;
|
static const char *set_collation_name, *opt_tmpdir;
|
||||||
static CHARSET_INFO *set_charset;
|
static CHARSET_INFO *set_collation;
|
||||||
static long opt_myisam_block_size;
|
static long opt_myisam_block_size;
|
||||||
static long opt_key_cache_block_size;
|
static long opt_key_cache_block_size;
|
||||||
static const char *my_progname_short;
|
static const char *my_progname_short;
|
||||||
@@ -149,7 +149,7 @@ int main(int argc, char **argv)
|
|||||||
} /* main */
|
} /* main */
|
||||||
|
|
||||||
enum options_mc {
|
enum options_mc {
|
||||||
OPT_CHARSETS_DIR=256, OPT_SET_CHARSET,OPT_START_CHECK_POS,
|
OPT_CHARSETS_DIR=256, OPT_SET_COLLATION,OPT_START_CHECK_POS,
|
||||||
OPT_CORRECT_CHECKSUM, OPT_KEY_BUFFER_SIZE,
|
OPT_CORRECT_CHECKSUM, OPT_KEY_BUFFER_SIZE,
|
||||||
OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE,
|
OPT_KEY_CACHE_BLOCK_SIZE, OPT_MYISAM_BLOCK_SIZE,
|
||||||
OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, OPT_SORT_BUFFER_SIZE,
|
OPT_READ_BUFFER_SIZE, OPT_WRITE_BUFFER_SIZE, OPT_SORT_BUFFER_SIZE,
|
||||||
@@ -252,9 +252,9 @@ static struct my_option my_long_options[] =
|
|||||||
(gptr*) &check_param.auto_increment_value,
|
(gptr*) &check_param.auto_increment_value,
|
||||||
(gptr*) &check_param.auto_increment_value,
|
(gptr*) &check_param.auto_increment_value,
|
||||||
0, GET_ULL, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
0, GET_ULL, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"set-character-set", OPT_SET_CHARSET,
|
{"set-collation", OPT_SET_COLLATION,
|
||||||
"Change the character set used by the index",
|
"Change the collation used by the index",
|
||||||
(gptr*) &set_charset_name, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
(gptr*) &set_collation_name, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"set-variable", 'O',
|
{"set-variable", 'O',
|
||||||
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
|
"Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value.",
|
||||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
@@ -739,8 +739,9 @@ static void get_options(register int *argc,register char ***argv)
|
|||||||
check_param.tmpdir=&myisamchk_tmpdir;
|
check_param.tmpdir=&myisamchk_tmpdir;
|
||||||
check_param.key_cache_block_size= opt_key_cache_block_size;
|
check_param.key_cache_block_size= opt_key_cache_block_size;
|
||||||
|
|
||||||
if (set_charset_name)
|
if (set_collation_name)
|
||||||
if (!(set_charset=get_charset_by_name(set_charset_name, MYF(MY_WME))))
|
if (!(set_collation= get_charset_by_name(set_collation_name,
|
||||||
|
MYF(MY_WME))))
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
||||||
myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
|
myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
|
||||||
@@ -874,11 +875,12 @@ static int myisamchk(MI_CHECK *param, my_string filename)
|
|||||||
(((ulonglong) 1L << share->base.keys)-1)) ||
|
(((ulonglong) 1L << share->base.keys)-1)) ||
|
||||||
test_if_almost_full(info) ||
|
test_if_almost_full(info) ||
|
||||||
info->s->state.header.file_version[3] != myisam_file_magic[3] ||
|
info->s->state.header.file_version[3] != myisam_file_magic[3] ||
|
||||||
(set_charset && set_charset->number != share->state.header.language) ||
|
(set_collation &&
|
||||||
|
set_collation->number != share->state.header.language) ||
|
||||||
myisam_block_size != MI_KEY_BLOCK_LENGTH))
|
myisam_block_size != MI_KEY_BLOCK_LENGTH))
|
||||||
{
|
{
|
||||||
if (set_charset)
|
if (set_collation)
|
||||||
param->language=set_charset->number;
|
param->language= set_collation->number;
|
||||||
if (recreate_table(param, &info,filename))
|
if (recreate_table(param, &info,filename))
|
||||||
{
|
{
|
||||||
VOID(fprintf(stderr,
|
VOID(fprintf(stderr,
|
||||||
|
@@ -530,7 +530,7 @@ CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags)
|
|||||||
{
|
{
|
||||||
char index_file[FN_REFLEN];
|
char index_file[FN_REFLEN];
|
||||||
strmov(get_charsets_dir(index_file),MY_CHARSET_INDEX);
|
strmov(get_charsets_dir(index_file),MY_CHARSET_INDEX);
|
||||||
my_error(EE_UNKNOWN_CHARSET, MYF(ME_BELL), cs_name, index_file);
|
my_error(EE_UNKNOWN_COLLATION, MYF(ME_BELL), cs_name, index_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cs;
|
return cs;
|
||||||
|
@@ -49,6 +49,7 @@ const char * NEAR globerrs[GLOBERRS]=
|
|||||||
"Can't create symlink '%s' pointing at '%s' (Error %d)",
|
"Can't create symlink '%s' pointing at '%s' (Error %d)",
|
||||||
"Error on realpath() on '%s' (Error %d)",
|
"Error on realpath() on '%s' (Error %d)",
|
||||||
"Can't sync file '%s' to disk (Errcode: %d)",
|
"Can't sync file '%s' to disk (Errcode: %d)",
|
||||||
|
"Collation '%s' is not a compiled collation and is not specified in the '%s' file",
|
||||||
};
|
};
|
||||||
|
|
||||||
void init_glob_errs(void)
|
void init_glob_errs(void)
|
||||||
@@ -89,5 +90,6 @@ void init_glob_errs()
|
|||||||
EE(EE_CANT_SYMLINK)= "Can't create symlink '%s' pointing at '%s' (Error %d)";
|
EE(EE_CANT_SYMLINK)= "Can't create symlink '%s' pointing at '%s' (Error %d)";
|
||||||
EE(EE_REALPATH)= "Error on realpath() on '%s' (Error %d)";
|
EE(EE_REALPATH)= "Error on realpath() on '%s' (Error %d)";
|
||||||
EE(EE_SYNC)= "Can't sync file '%s' to disk (Errcode: %d)";
|
EE(EE_SYNC)= "Can't sync file '%s' to disk (Errcode: %d)";
|
||||||
|
EE(EE_UNKNOWN_COLLATION)= "Collation '%s' is not a compiled collation and is not specified in the %s file";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user