Fix for bug #29411: deleting from a csv table leads to the table corruption
Problem: we don't adjust share->rows_recorded and local_saved_data_file_length deleting rows from a CSV table, so following table check may fail. Fix: properly adjust those values.
This commit is contained in:
parent
21b401bd26
commit
ba650762d1
@ -4945,8 +4945,6 @@ SELECT * FROM bug13894;
|
|||||||
val
|
val
|
||||||
6
|
6
|
||||||
6
|
6
|
||||||
5
|
|
||||||
11
|
|
||||||
DROP TABLE bug13894;
|
DROP TABLE bug13894;
|
||||||
DROP TABLE IF EXISTS bug14672;
|
DROP TABLE IF EXISTS bug14672;
|
||||||
CREATE TABLE bug14672 (c1 integer) engine = CSV;
|
CREATE TABLE bug14672 (c1 integer) engine = CSV;
|
||||||
@ -5291,4 +5289,20 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(a int) engine=csv;
|
||||||
|
insert into t1 values (0), (1), (2);
|
||||||
|
delete from t1 limit 2;
|
||||||
|
check table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
delete from t1;
|
||||||
|
check table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
@ -1698,4 +1698,17 @@ select * from t1;
|
|||||||
check table t1;
|
check table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #29411: deleting from a csv table leads to the table corruption
|
||||||
|
#
|
||||||
|
create table t1(a int) engine=csv;
|
||||||
|
insert into t1 values (0), (1), (2);
|
||||||
|
delete from t1 limit 2;
|
||||||
|
check table t1;
|
||||||
|
select * from t1;
|
||||||
|
delete from t1;
|
||||||
|
check table t1;
|
||||||
|
select * from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
@ -960,6 +960,11 @@ int ha_tina::delete_row(const uchar * buf)
|
|||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
stats.records--;
|
stats.records--;
|
||||||
|
/* Update shared info */
|
||||||
|
DBUG_ASSERT(share->rows_recorded);
|
||||||
|
pthread_mutex_lock(&share->mutex);
|
||||||
|
share->rows_recorded--;
|
||||||
|
pthread_mutex_unlock(&share->mutex);
|
||||||
|
|
||||||
/* DELETE should never happen on the log table */
|
/* DELETE should never happen on the log table */
|
||||||
DBUG_ASSERT(!share->is_log_table);
|
DBUG_ASSERT(!share->is_log_table);
|
||||||
@ -1146,6 +1151,7 @@ int ha_tina::rnd_end()
|
|||||||
|
|
||||||
if ((chain_ptr - chain) > 0)
|
if ((chain_ptr - chain) > 0)
|
||||||
{
|
{
|
||||||
|
off_t temp_file_length= 0;
|
||||||
tina_set *ptr= chain;
|
tina_set *ptr= chain;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1171,15 +1177,18 @@ int ha_tina::rnd_end()
|
|||||||
while ((file_buffer_start != -1)) // while not end of file
|
while ((file_buffer_start != -1)) // while not end of file
|
||||||
{
|
{
|
||||||
bool in_hole= get_write_pos(&write_end, ptr);
|
bool in_hole= get_write_pos(&write_end, ptr);
|
||||||
|
off_t write_length= write_end - write_begin;
|
||||||
|
|
||||||
/* if there is something to write, write it */
|
/* if there is something to write, write it */
|
||||||
if ((write_end - write_begin) &&
|
if (write_length)
|
||||||
(my_write(update_temp_file,
|
{
|
||||||
(uchar*)(file_buff->ptr() +
|
if (my_write(update_temp_file,
|
||||||
(write_begin - file_buff->start())),
|
(uchar*) (file_buff->ptr() +
|
||||||
write_end - write_begin, MYF_RW)))
|
(write_begin - file_buff->start())),
|
||||||
goto error;
|
write_length, MYF_RW))
|
||||||
|
goto error;
|
||||||
|
temp_file_length+= write_length;
|
||||||
|
}
|
||||||
if (in_hole)
|
if (in_hole)
|
||||||
{
|
{
|
||||||
/* skip hole */
|
/* skip hole */
|
||||||
@ -1232,6 +1241,8 @@ int ha_tina::rnd_end()
|
|||||||
Here we record this fact to the meta-file.
|
Here we record this fact to the meta-file.
|
||||||
*/
|
*/
|
||||||
(void)write_meta_file(share->meta_file, share->rows_recorded, FALSE);
|
(void)write_meta_file(share->meta_file, share->rows_recorded, FALSE);
|
||||||
|
|
||||||
|
local_saved_data_file_length= temp_file_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
@ -1390,6 +1401,11 @@ int ha_tina::delete_all_rows()
|
|||||||
rc= my_chsize(share->tina_write_filedes, 0, 0, MYF(MY_WME));
|
rc= my_chsize(share->tina_write_filedes, 0, 0, MYF(MY_WME));
|
||||||
|
|
||||||
stats.records=0;
|
stats.records=0;
|
||||||
|
/* Update shared info */
|
||||||
|
pthread_mutex_lock(&share->mutex);
|
||||||
|
share->rows_recorded= 0;
|
||||||
|
pthread_mutex_unlock(&share->mutex);
|
||||||
|
local_saved_data_file_length= 0;
|
||||||
DBUG_RETURN(rc);
|
DBUG_RETURN(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user