Commit 1bc3105d authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Fixed core dump bug in str LIKE "%other_str%" where strings contained characters >= 128.

Fixed problem with replication LOAD DATA INFILE when using  --old-rpl-compat.
When executing on master LOAD DATA and InnoDB failed with 'table full' error the binary log was corrupted.
parent 54ad6de1
......@@ -1538,12 +1538,12 @@ Item_func_regex::~Item_func_regex()
Precomputation dependent only on pattern_len.
**********************************************************************/
void Item_func_like::turboBM_compute_suffixes(int* suff)
void Item_func_like::turboBM_compute_suffixes(int *suff)
{
const int plm1 = pattern_len - 1;
int f = 0;
int g = plm1;
int* const splm1 = suff + plm1;
int *const splm1 = suff + plm1;
*splm1 = pattern_len;
......@@ -1579,7 +1579,8 @@ void Item_func_like::turboBM_compute_suffixes(int* suff)
if (i < g)
g = i; // g = min(i, g)
f = i;
while (g >= 0 && likeconv(pattern[g]) == likeconv(pattern[g + plm1 - f]))
while (g >= 0 &&
likeconv(pattern[g]) == likeconv(pattern[g + plm1 - f]))
g--;
suff[i] = f - g;
}
......@@ -1593,12 +1594,12 @@ void Item_func_like::turboBM_compute_suffixes(int* suff)
Precomputation dependent only on pattern_len.
**********************************************************************/
void Item_func_like::turboBM_compute_good_suffix_shifts(int* suff)
void Item_func_like::turboBM_compute_good_suffix_shifts(int *suff)
{
turboBM_compute_suffixes(suff);
int* end = bmGs + pattern_len;
int* k;
int *end = bmGs + pattern_len;
int *k;
for (k = bmGs; k < end; k++)
*k = pattern_len;
......@@ -1612,14 +1613,14 @@ void Item_func_like::turboBM_compute_good_suffix_shifts(int* suff)
{
for (tmp = plm1 - i; j < tmp; j++)
{
int* tmp2 = bmGs + j;
int *tmp2 = bmGs + j;
if (*tmp2 == pattern_len)
*tmp2 = tmp;
}
}
}
int* tmp2;
int *tmp2;
for (tmp = plm1 - i; j < tmp; j++)
{
tmp2 = bmGs + j;
......@@ -1640,19 +1641,23 @@ void Item_func_like::turboBM_compute_good_suffix_shifts(int* suff)
void Item_func_like::turboBM_compute_bad_character_shifts()
{
int* i;
int* end = bmBc + alphabet_size;
int *i;
int *end = bmBc + alphabet_size;
for (i = bmBc; i < end; i++)
*i = pattern_len;
int j;
const int plm1 = pattern_len - 1;
if (binary)
{
for (j = 0; j < plm1; j++)
bmBc[pattern[j]] = plm1 - j;
bmBc[(uint) (uchar) pattern[j]] = plm1 - j;
}
else
{
for (j = 0; j < plm1; j++)
bmBc[likeconv(pattern[j])] = plm1 - j;
bmBc[(uint) likeconv(pattern[j])] = plm1 - j;
}
}
......@@ -1669,27 +1674,27 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
int j = 0;
int u = 0;
const int plm1 = pattern_len - 1;
const int tlmpl = text_len - pattern_len;
const int plm1= pattern_len - 1;
const int tlmpl= text_len - pattern_len;
/* Searching */
if (binary)
{
while (j <= tlmpl)
{
register int i = plm1;
register int i= plm1;
while (i >= 0 && pattern[i] == text[i + j])
{
i--;
if (i == plm1 - shift)
i -= u;
i-= u;
}
if (i < 0)
return 1;
register const int v = plm1 - i;
turboShift = u - v;
bcShift = bmBc[text[i + j]] - plm1 + i;
bcShift = bmBc[(uint) (uchar) text[i + j]] - plm1 + i;
shift = max(turboShift, bcShift);
shift = max(shift, bmGs[i]);
if (shift == bmGs[i])
......@@ -1700,7 +1705,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
shift = max(shift, u + 1);
u = 0;
}
j += shift;
j+= shift;
}
return 0;
}
......@@ -1713,14 +1718,14 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
{
i--;
if (i == plm1 - shift)
i -= u;
i-= u;
}
if (i < 0)
return 1;
register const int v = plm1 - i;
turboShift = u - v;
bcShift = bmBc[likeconv(text[i + j])] - plm1 + i;
bcShift = bmBc[(uint) likeconv(text[i + j])] - plm1 + i;
shift = max(turboShift, bcShift);
shift = max(shift, bmGs[i]);
if (shift == bmGs[i])
......@@ -1731,7 +1736,7 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
shift = max(shift, u + 1);
u = 0;
}
j += shift;
j+= shift;
}
return 0;
}
......
......@@ -1202,8 +1202,8 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
{
uint data_len;
char* buf_end = (char*)buf + event_len;
const char* data_head = buf + ((old_format) ?
OLD_HEADER_LEN : LOG_EVENT_HEADER_LEN);
uint header_len= old_format ? OLD_HEADER_LEN : LOG_EVENT_HEADER_LEN;
const char* data_head = buf + header_len;
thread_id = uint4korr(data_head + L_THREAD_ID_OFFSET);
exec_time = uint4korr(data_head + L_EXEC_TIME_OFFSET);
skip_lines = uint4korr(data_head + L_SKIP_LINES_OFFSET);
......@@ -1212,7 +1212,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET);
int body_offset = ((buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ?
LOAD_HEADER_LEN + OLD_HEADER_LEN :
LOAD_HEADER_LEN + header_len :
get_data_body_offset());
if ((int) event_len < body_offset)
......
......@@ -283,6 +283,20 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
{
if (lf_info.wrote_create_file)
{
/*
Make sure last block (the one which caused the error) gets logged.
This is needed because otherwise after write of
(to the binlog, not to read_info (which is a cache))
Delete_file_log_event the bad block will remain in read_info.
At the end of mysql_load(), the destructor of read_info will call
end_io_cache() which will flush read_info, so we will finally have
this in the binlog:
Append_block # The last successfull block
Delete_file
Append_block # The failing block
which is nonsense.
*/
read_info.end_io_cache();
Delete_file_log_event d(thd, log_delayed);
mysql_bin_log.write(&d);
}
......
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