summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/csv.result19
-rw-r--r--mysql-test/t/csv.test23
-rw-r--r--storage/csv/ha_tina.cc34
3 files changed, 60 insertions, 16 deletions
diff --git a/mysql-test/r/csv.result b/mysql-test/r/csv.result
index e342af32a80..222d4de8059 100644
--- a/mysql-test/r/csv.result
+++ b/mysql-test/r/csv.result
@@ -5205,3 +5205,22 @@ select * from bug15205;
val
drop table bug15205;
drop table bug15205_2;
+create table bug22080_1 (id int,string varchar(64)) Engine=CSV;
+create table bug22080_2 (id int,string varchar(64)) Engine=CSV;
+create table bug22080_3 (id int,string varchar(64)) Engine=CSV;
+insert into bug22080_1 values(1,'string');
+insert into bug22080_1 values(2,'string');
+insert into bug22080_1 values(3,'string');
+"1","string"
+2","string"
+"3","string"
+check table bug22080_2;
+Table Op Msg_type Msg_text
+test.bug22080_2 check error Corrupt
+"1","string"
+"2",string"
+"3","string"
+check table bug22080_3;
+Table Op Msg_type Msg_text
+test.bug22080_3 check error Corrupt
+drop tables bug22080_1,bug22080_2,bug22080_3;
diff --git a/mysql-test/t/csv.test b/mysql-test/t/csv.test
index 9815da4fb55..f70b5b40766 100644
--- a/mysql-test/t/csv.test
+++ b/mysql-test/t/csv.test
@@ -1582,3 +1582,26 @@ select * from bug15205_2;
select * from bug15205;
drop table bug15205;
drop table bug15205_2;
+
+#
+# Bug#22080 "CHECK fails to identify some corruption"
+#
+
+create table bug22080_1 (id int,string varchar(64)) Engine=CSV;
+create table bug22080_2 (id int,string varchar(64)) Engine=CSV;
+create table bug22080_3 (id int,string varchar(64)) Engine=CSV;
+insert into bug22080_1 values(1,'string');
+insert into bug22080_1 values(2,'string');
+insert into bug22080_1 values(3,'string');
+
+# Currupt the file as described in the bug report
+--exec sed -e 's/"2"/2"/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
+--exec sed -e 's/2","/2",/' $MYSQLTEST_VARDIR/master-data/test/bug22080_1.CSV > $MYSQLTEST_VARDIR/master-data/test/bug22080_3.CSV
+
+--exec cat $MYSQLTEST_VARDIR/master-data/test/bug22080_2.CSV
+check table bug22080_2;
+
+--exec cat $MYSQLTEST_VARDIR/master-data/test/bug22080_3.CSV
+check table bug22080_3;
+
+drop tables bug22080_1,bug22080_2,bug22080_3;
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index 8f090470f49..c5c3ff11edc 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -548,7 +548,10 @@ int ha_tina::encode_quote(byte *buf)
in the code.
*/
if ((*field)->is_null())
- ptr= end_ptr= 0;
+ {
+ buffer.append(STRING_WITH_LEN("\"\","));
+ continue;
+ }
else
{
(*field)->val_str(&attribute,&attribute);
@@ -649,6 +652,7 @@ int ha_tina::find_current_row(byte *buf)
off_t end_offset, curr_offset= current_position;
int eoln_len;
my_bitmap_map *org_bitmap;
+ int error;
DBUG_ENTER("ha_tina::find_current_row");
/*
@@ -662,23 +666,23 @@ int ha_tina::find_current_row(byte *buf)
/* Avoid asserts in ::store() for columns that are not going to be updated */
org_bitmap= dbug_tmp_use_all_columns(table, table->write_set);
+ error= HA_ERR_CRASHED_ON_USAGE;
+
+ memset(buf, 0, table->s->null_bytes);
for (Field **field=table->field ; *field ; field++)
{
buffer.length(0);
- if (file_buff->get_value(curr_offset) == '"')
+ if (curr_offset < end_offset &&
+ file_buff->get_value(curr_offset) == '"')
curr_offset++; // Incrementpast the first quote
else
- {
- dbug_tmp_restore_column_map(table->write_set, org_bitmap);
- DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
- }
- for(;curr_offset != end_offset; curr_offset++)
+ goto err;
+ for(;curr_offset < end_offset; curr_offset++)
{
// Need to convert line feeds!
if (file_buff->get_value(curr_offset) == '"' &&
- (((file_buff->get_value(curr_offset + 1) == ',') &&
- (file_buff->get_value(curr_offset + 2) == '"')) ||
+ ((file_buff->get_value(curr_offset + 1) == ',') ||
(curr_offset == end_offset -1 )))
{
curr_offset+= 2; // Move past the , and the "
@@ -708,10 +712,7 @@ int ha_tina::find_current_row(byte *buf)
we are working with a damaged file.
*/
if (curr_offset == end_offset - 1)
- {
- dbug_tmp_restore_column_map(table->write_set, org_bitmap);
- DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
- }
+ goto err;
buffer.append(file_buff->get_value(curr_offset));
}
}
@@ -719,11 +720,12 @@ int ha_tina::find_current_row(byte *buf)
(*field)->store(buffer.ptr(), buffer.length(), system_charset_info);
}
next_position= end_offset + eoln_len;
- /* Maybe use \N for null? */
- memset(buf, 0, table->s->null_bytes); /* We do not implement nulls! */
+ error= 0;
+
+err:
dbug_tmp_restore_column_map(table->write_set, org_bitmap);
- DBUG_RETURN(0);
+ DBUG_RETURN(error);
}
/*