Commit b60713c0 authored by serg@serg.mylan's avatar serg@serg.mylan

bug in my_strnncoll_utf8 (and friends) fixed

cleanups
better, charset-dependent, ft_max_len_for_sort value
parent 08f3ba0e
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#define misc_word_char(X) ((X)=='\'') #define misc_word_char(X) ((X)=='\'')
#define word_char(s,X) (true_word_char(s,X) || misc_word_char(X)) #define word_char(s,X) (true_word_char(s,X) || misc_word_char(X))
#define FT_MAX_WORD_LEN_FOR_SORT 20 #define FT_MAX_WORD_LEN_FOR_SORT 31
#define COMPILE_STOPWORDS_IN #define COMPILE_STOPWORDS_IN
......
...@@ -2020,12 +2020,14 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, ...@@ -2020,12 +2020,14 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
if (sort_param.keyinfo->flag & HA_FULLTEXT) if (sort_param.keyinfo->flag & HA_FULLTEXT)
{ {
uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
sort_param.keyinfo->seg->charset->mbmaxlen;
sort_info.max_records= sort_info.max_records=
(ha_rows) (sort_info.filelength/FT_MAX_WORD_LEN_FOR_SORT+1); (ha_rows) (sort_info.filelength/ft_max_word_len_for_sort+1);
sort_param.key_read=sort_ft_key_read; sort_param.key_read=sort_ft_key_read;
sort_param.key_write=sort_ft_key_write; sort_param.key_write=sort_ft_key_write;
sort_param.key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN; sort_param.key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
} }
else else
{ {
...@@ -2425,7 +2427,11 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info, ...@@ -2425,7 +2427,11 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
total_key_length+=sort_param[i].key_length; total_key_length+=sort_param[i].key_length;
if (sort_param[i].keyinfo->flag & HA_FULLTEXT) if (sort_param[i].keyinfo->flag & HA_FULLTEXT)
sort_param[i].key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN; {
uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
sort_param[i].keyinfo->seg->charset->mbmaxlen;
sort_param[i].key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
}
} }
sort_info.total_keys=i; sort_info.total_keys=i;
sort_param[0].master= 1; sort_param[0].master= 1;
...@@ -2634,7 +2640,6 @@ static int sort_key_read(MI_SORT_PARAM *sort_param, void *key) ...@@ -2634,7 +2640,6 @@ static int sort_key_read(MI_SORT_PARAM *sort_param, void *key)
DBUG_RETURN(sort_write_record(sort_param)); DBUG_RETURN(sort_write_record(sort_param));
} /* sort_key_read */ } /* sort_key_read */
static int sort_ft_key_read(MI_SORT_PARAM *sort_param, void *key) static int sort_ft_key_read(MI_SORT_PARAM *sort_param, void *key)
{ {
int error; int error;
...@@ -3950,25 +3955,28 @@ static ha_checksum mi_byte_checksum(const byte *buf, uint length) ...@@ -3950,25 +3955,28 @@ static ha_checksum mi_byte_checksum(const byte *buf, uint length)
return crc; return crc;
} }
/*
Deactive all not unique index that can be recreated fast
These include packed keys on which sorting will use more temporary
space than the max allowed file length or for which the unpacked keys
will take much more space than packed keys.
Note that 'rows' may be zero for the case when we don't know how many
rows we will put into the file.
*/
static my_bool mi_too_big_key_for_sort(MI_KEYDEF *key, ha_rows rows) static my_bool mi_too_big_key_for_sort(MI_KEYDEF *key, ha_rows rows)
{ {
uint key_maxlength=key->maxlength; uint key_maxlength=key->maxlength;
if (key->flag & HA_FULLTEXT) if (key->flag & HA_FULLTEXT)
key_maxlength+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN; {
uint ft_max_word_len_for_sort=FT_MAX_WORD_LEN_FOR_SORT*
key->seg->charset->mbmaxlen;
key_maxlength+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN;
}
return (key->flag & (HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY | HA_FULLTEXT) && return (key->flag & (HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY | HA_FULLTEXT) &&
((ulonglong) rows * key_maxlength > ((ulonglong) rows * key_maxlength >
(ulonglong) myisam_max_temp_length)); (ulonglong) myisam_max_temp_length));
} }
/*
Deactivate all not unique index that can be recreated fast
These include packed keys on which sorting will use more temporary
space than the max allowed file length or for which the unpacked keys
will take much more space than packed keys.
Note that 'rows' may be zero for the case when we don't know how many
rows we will put into the file.
*/
void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows) void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows)
{ {
......
...@@ -154,7 +154,7 @@ enum options_mc { ...@@ -154,7 +154,7 @@ enum options_mc {
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,
OPT_SORT_KEY_BLOCKS, OPT_DECODE_BITS, OPT_FT_MIN_WORD_LEN, OPT_SORT_KEY_BLOCKS, OPT_DECODE_BITS, OPT_FT_MIN_WORD_LEN,
OPT_FT_MAX_WORD_LEN, OPT_FT_MAX_WORD_LEN_FOR_SORT, OPT_FT_STOPWORD_FILE, OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE,
OPT_MAX_RECORD_LENGTH OPT_MAX_RECORD_LENGTH
}; };
......
...@@ -204,7 +204,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, ...@@ -204,7 +204,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
reinit_io_cache(&tempfile,READ_CACHE,0L,0,0)) reinit_io_cache(&tempfile,READ_CACHE,0L,0,0))
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
if (!no_messages) if (!no_messages)
puts(" - Last merge and dumping keys\n"); /* purecov: tested */ printf(" - Last merge and dumping keys\n"); /* purecov: tested */
if (merge_index(info,keys,sort_keys,dynamic_element(&buffpek,0,BUFFPEK *), if (merge_index(info,keys,sort_keys,dynamic_element(&buffpek,0,BUFFPEK *),
maxbuffer,&tempfile)) maxbuffer,&tempfile))
goto err; /* purecov: inspected */ goto err; /* purecov: inspected */
...@@ -219,6 +219,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, ...@@ -219,6 +219,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
uint keyno=info->key; uint keyno=info->key;
uint key_length, ref_length=index->s->rec_reflength; uint key_length, ref_length=index->s->rec_reflength;
if (!no_messages)
printf(" - Adding exceptions\n"); /* purecov: tested */
if (flush_io_cache(&tempfile_for_exceptions) || if (flush_io_cache(&tempfile_for_exceptions) ||
reinit_io_cache(&tempfile_for_exceptions,READ_CACHE,0L,0,0)) reinit_io_cache(&tempfile_for_exceptions,READ_CACHE,0L,0,0))
goto err; goto err;
......
...@@ -783,10 +783,10 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length); ...@@ -783,10 +783,10 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length);
bool init_errmessage(void); bool init_errmessage(void);
void sql_perror(const char *message); void sql_perror(const char *message);
void vprint_msg_to_log( enum loglevel level, const char *format, va_list args ); void vprint_msg_to_log(enum loglevel level, const char *format, va_list args);
void sql_print_error( const char *format, ... ); void sql_print_error(const char *format, ...);
void sql_print_warning( const char *format, ...); void sql_print_warning(const char *format, ...);
void sql_print_information( const char *format, ...); void sql_print_information(const char *format, ...);
......
This diff is collapsed.
...@@ -251,9 +251,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ...@@ -251,9 +251,9 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
global_system_variables.old_passwords= 1; global_system_variables.old_passwords= 1;
pthread_mutex_unlock(&LOCK_global_system_variables); pthread_mutex_unlock(&LOCK_global_system_variables);
sql_print_error("mysql.user table is not updated to new password format; " sql_print_warning("mysql.user table is not updated to new password format; "
"Disabling new password usage until " "Disabling new password usage until "
"mysql_fix_privilege_tables is run"); "mysql_fix_privilege_tables is run");
} }
thd->variables.old_passwords= 1; thd->variables.old_passwords= 1;
} }
......
...@@ -1560,8 +1560,8 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap) ...@@ -1560,8 +1560,8 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
if (open_tables(thd, tables_buff, &counter) || if (open_tables(thd, tables_buff, &counter) ||
lock_tables(thd, tables_buff, counter)) lock_tables(thd, tables_buff, counter))
{ {
sql_print_error("Warning: Can't open and lock time zone table: %s " sql_print_warning("Can't open and lock time zone table: %s "
"trying to live without them", thd->net.last_error); "trying to live without them", thd->net.last_error);
/* We will try emulate that everything is ok */ /* We will try emulate that everything is ok */
return_val= time_zone_tables_exist= 0; return_val= time_zone_tables_exist= 0;
goto end_with_setting_default_tz; goto end_with_setting_default_tz;
...@@ -1740,8 +1740,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1740,8 +1740,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (!(alloc_buff= alloc_root(&tz_storage, sizeof(TIME_ZONE_INFO) + if (!(alloc_buff= alloc_root(&tz_storage, sizeof(TIME_ZONE_INFO) +
tz_name->length() + 1))) tz_name->length() + 1)))
{ {
sql_print_error("Error: Out of memory while loading time zone " sql_print_error("Out of memory while loading time zone description");
"description");
return 0; return 0;
} }
tz_info= (TIME_ZONE_INFO *)alloc_buff; tz_info= (TIME_ZONE_INFO *)alloc_buff;
...@@ -1757,7 +1756,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1757,7 +1756,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
Let us find out time zone id by its name (there is only one index Let us find out time zone id by its name (there is only one index
and it is specifically for this purpose). and it is specifically for this purpose).
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store(tz_name->ptr(), tz_name->length(), &my_charset_latin1); table->field[0]->store(tz_name->ptr(), tz_name->length(), &my_charset_latin1);
/* /*
...@@ -1770,7 +1769,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1770,7 +1769,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr, if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT)) 0, HA_READ_KEY_EXACT))
{ {
sql_print_error("Error: Can't find description of time zone."); sql_print_error("Can't find description of time zone.");
goto end; goto end;
} }
...@@ -1783,7 +1782,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1783,7 +1782,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
understand whenever this timezone uses leap seconds (again we are understand whenever this timezone uses leap seconds (again we are
using the only index in this table). using the only index in this table).
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid); table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0); (void)table->file->ha_index_init(0);
...@@ -1791,7 +1790,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1791,7 +1790,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr, if (table->file->index_read(table->record[0], (byte*)table->field[0]->ptr,
0, HA_READ_KEY_EXACT)) 0, HA_READ_KEY_EXACT))
{ {
sql_print_error("Error: Can't find description of time zone."); sql_print_error("Can't find description of time zone.");
goto end; goto end;
} }
...@@ -1810,7 +1809,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1810,7 +1809,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
only for our time zone guess what are we doing? only for our time zone guess what are we doing?
Right - using special index. Right - using special index.
*/ */
table= tz_tables->table; table= tz_tables->table;
tz_tables= tz_tables->next; tz_tables= tz_tables->next;
table->field[0]->store((longlong)tzid); table->field[0]->store((longlong)tzid);
(void)table->file->ha_index_init(0); (void)table->file->ha_index_init(0);
...@@ -1948,8 +1947,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1948,8 +1947,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
#endif #endif
sizeof(TRAN_TYPE_INFO) * tz_info->typecnt))) sizeof(TRAN_TYPE_INFO) * tz_info->typecnt)))
{ {
sql_print_error("Error: Out of memory while loading time zone " sql_print_error("Out of memory while loading time zone description");
"description");
goto end; goto end;
} }
...@@ -1974,12 +1972,12 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1974,12 +1972,12 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
*/ */
if (tz_info->typecnt < 1) if (tz_info->typecnt < 1)
{ {
sql_print_error("Error: loading time zone without transition types"); sql_print_error("loading time zone without transition types");
goto end; goto end;
} }
if (prepare_tz_info(tz_info, &tz_storage)) if (prepare_tz_info(tz_info, &tz_storage))
{ {
sql_print_error("Error: Unable to build mktime map for time zone"); sql_print_error("Unable to build mktime map for time zone");
goto end; goto end;
} }
...@@ -1991,7 +1989,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables) ...@@ -1991,7 +1989,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
&my_charset_latin1), &my_charset_latin1),
my_hash_insert(&tz_names, (const byte *)tmp_tzname))) my_hash_insert(&tz_names, (const byte *)tmp_tzname)))
{ {
sql_print_error("Error: Out of memory while loading time zone"); sql_print_error("Out of memory while loading time zone");
goto end; goto end;
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment