Commit c9245922 authored by Sergey Glukhov's avatar Sergey Glukhov

Bug#41441 repair csv table crashes debug server

The problem: data file can not be deleted on win because
there is another opened instance of this file.
Data file might be opened twice, on table opening stage and
during write_row execution. We need to close both instances
to satisfy Win.
parent 51b78382
...@@ -5394,4 +5394,17 @@ select * from t1; ...@@ -5394,4 +5394,17 @@ select * from t1;
ERROR HY000: File './test/t1.CSV' not found (Errcode: 2) ERROR HY000: File './test/t1.CSV' not found (Errcode: 2)
unlock tables; unlock tables;
drop table t1; drop table t1;
create table t1(a enum ('a') not null) engine=csv;
insert into t1 values (2);
Warnings:
Warning 1265 Data truncated for column 'a' at row 1
select * from t1 limit 1;
ERROR HY000: Table 't1' is marked as crashed and should be repaired
repair table t1;
Table Op Msg_type Msg_text
test.t1 repair Warning Data truncated for column 'a' at row 1
test.t1 repair status OK
select * from t1 limit 1;
a
drop table t1;
End of 5.1 tests End of 5.1 tests
...@@ -1804,4 +1804,17 @@ unlock tables; ...@@ -1804,4 +1804,17 @@ unlock tables;
drop table t1; drop table t1;
--disconnect con1 --disconnect con1
#
# Bug#41441 repair csv table crashes debug server
#
# Note: The test should be removed after Bug#33717 is fixed
create table t1(a enum ('a') not null) engine=csv;
insert into t1 values (2);
--error ER_CRASHED_ON_USAGE
select * from t1 limit 1;
repair table t1;
select * from t1 limit 1;
drop table t1;
--echo End of 5.1 tests --echo End of 5.1 tests
...@@ -1439,6 +1439,17 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -1439,6 +1439,17 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt)
a file, which descriptor is still open. EACCES will be returned a file, which descriptor is still open. EACCES will be returned
when trying to delete the "to"-file in my_rename(). when trying to delete the "to"-file in my_rename().
*/ */
if (share->tina_write_opened)
{
/*
Data file might be opened twice, on table opening stage and
during write_row execution. We need to close both instances
to satisfy Win.
*/
if (my_close(share->tina_write_filedes, MYF(0)))
DBUG_RETURN(my_errno ? my_errno : -1);
share->tina_write_opened= FALSE;
}
if (my_close(data_file,MYF(0)) || my_close(repair_file, MYF(0)) || if (my_close(data_file,MYF(0)) || my_close(repair_file, MYF(0)) ||
my_rename(repaired_fname, share->data_file_name, MYF(0))) my_rename(repaired_fname, share->data_file_name, MYF(0)))
DBUG_RETURN(-1); DBUG_RETURN(-1);
......
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