Loading mysql-test/r/csv.result +21 −5 Original line number Diff line number Diff line Loading @@ -5210,16 +5210,32 @@ 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" 1,"string" 2","string" "3","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" 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; create table float_test (id float,string varchar(64)) Engine=CSV; insert into float_test values(1.0,'string'); insert into float_test values(2.23,'serg.g'); insert into float_test values(0.03,'string'); insert into float_test values(0.19,'string'); insert into float_test values(.67,'string'); insert into float_test values(9.67,'string'); select * from float_test; id string 1 string 2.23 serg.g 0.03 string 0.19 string 0.67 string 9.67 string drop table float_test; mysql-test/t/csv.test +15 −1 Original line number Diff line number Diff line Loading @@ -1595,7 +1595,7 @@ 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_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 Loading @@ -1605,3 +1605,17 @@ check table bug22080_2; check table bug22080_3; drop tables bug22080_1,bug22080_2,bug22080_3; # # Testing float type # create table float_test (id float,string varchar(64)) Engine=CSV; insert into float_test values(1.0,'string'); insert into float_test values(2.23,'serg.g'); insert into float_test values(0.03,'string'); insert into float_test values(0.19,'string'); insert into float_test values(.67,'string'); insert into float_test values(9.67,'string'); select * from float_test; drop table float_test; storage/csv/ha_tina.cc +96 −62 Original line number Diff line number Diff line Loading @@ -462,6 +462,7 @@ int ha_tina::encode_quote(byte *buf) my_bitmap_map *org_bitmap= dbug_tmp_use_all_columns(table, table->read_set); buffer.length(0); for (Field **field=table->field ; *field ; field++) { const char *ptr; Loading @@ -478,12 +479,13 @@ int ha_tina::encode_quote(byte *buf) buffer.append(STRING_WITH_LEN("\"\",")); continue; } else { (*field)->val_str(&attribute,&attribute); if ((*field)->str_needs_quotes()) { ptr= attribute.ptr(); end_ptr= attribute.length() + ptr; } buffer.append('"'); Loading Loading @@ -517,11 +519,18 @@ int ha_tina::encode_quote(byte *buf) buffer.append(*ptr++); } buffer.append('"'); } else { buffer.append(attribute); } buffer.append(','); } // Remove the comma, add a line feed buffer.length(buffer.length() - 1); buffer.append('\n'); //buffer.replace(buffer.length(), 0, "\n", 1); dbug_tmp_restore_column_map(table->read_set, org_bitmap); Loading Loading @@ -601,9 +610,9 @@ int ha_tina::find_current_row(byte *buf) buffer.length(0); if (curr_offset < end_offset && file_buff->get_value(curr_offset) == '"') { curr_offset++; // Incrementpast the first quote else goto err; for(;curr_offset < end_offset; curr_offset++) { // Need to convert line feeds! Loading Loading @@ -642,6 +651,31 @@ int ha_tina::find_current_row(byte *buf) buffer.append(file_buff->get_value(curr_offset)); } } } else if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset))) { for(;curr_offset < end_offset; curr_offset++) { if (file_buff->get_value(curr_offset) == ',') { curr_offset+= 1; // Move past the , break; } if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset))) buffer.append(file_buff->get_value(curr_offset)); else if (file_buff->get_value(curr_offset) == '.') buffer.append(file_buff->get_value(curr_offset)); else goto err; } } else { goto err; } if (bitmap_is_set(table->read_set, (*field)->field_index)) (*field)->store(buffer.ptr(), buffer.length(), system_charset_info); } Loading Loading
mysql-test/r/csv.result +21 −5 Original line number Diff line number Diff line Loading @@ -5210,16 +5210,32 @@ 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" 1,"string" 2","string" "3","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" 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; create table float_test (id float,string varchar(64)) Engine=CSV; insert into float_test values(1.0,'string'); insert into float_test values(2.23,'serg.g'); insert into float_test values(0.03,'string'); insert into float_test values(0.19,'string'); insert into float_test values(.67,'string'); insert into float_test values(9.67,'string'); select * from float_test; id string 1 string 2.23 serg.g 0.03 string 0.19 string 0.67 string 9.67 string drop table float_test;
mysql-test/t/csv.test +15 −1 Original line number Diff line number Diff line Loading @@ -1595,7 +1595,7 @@ 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_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 Loading @@ -1605,3 +1605,17 @@ check table bug22080_2; check table bug22080_3; drop tables bug22080_1,bug22080_2,bug22080_3; # # Testing float type # create table float_test (id float,string varchar(64)) Engine=CSV; insert into float_test values(1.0,'string'); insert into float_test values(2.23,'serg.g'); insert into float_test values(0.03,'string'); insert into float_test values(0.19,'string'); insert into float_test values(.67,'string'); insert into float_test values(9.67,'string'); select * from float_test; drop table float_test;
storage/csv/ha_tina.cc +96 −62 Original line number Diff line number Diff line Loading @@ -462,6 +462,7 @@ int ha_tina::encode_quote(byte *buf) my_bitmap_map *org_bitmap= dbug_tmp_use_all_columns(table, table->read_set); buffer.length(0); for (Field **field=table->field ; *field ; field++) { const char *ptr; Loading @@ -478,12 +479,13 @@ int ha_tina::encode_quote(byte *buf) buffer.append(STRING_WITH_LEN("\"\",")); continue; } else { (*field)->val_str(&attribute,&attribute); if ((*field)->str_needs_quotes()) { ptr= attribute.ptr(); end_ptr= attribute.length() + ptr; } buffer.append('"'); Loading Loading @@ -517,11 +519,18 @@ int ha_tina::encode_quote(byte *buf) buffer.append(*ptr++); } buffer.append('"'); } else { buffer.append(attribute); } buffer.append(','); } // Remove the comma, add a line feed buffer.length(buffer.length() - 1); buffer.append('\n'); //buffer.replace(buffer.length(), 0, "\n", 1); dbug_tmp_restore_column_map(table->read_set, org_bitmap); Loading Loading @@ -601,9 +610,9 @@ int ha_tina::find_current_row(byte *buf) buffer.length(0); if (curr_offset < end_offset && file_buff->get_value(curr_offset) == '"') { curr_offset++; // Incrementpast the first quote else goto err; for(;curr_offset < end_offset; curr_offset++) { // Need to convert line feeds! Loading Loading @@ -642,6 +651,31 @@ int ha_tina::find_current_row(byte *buf) buffer.append(file_buff->get_value(curr_offset)); } } } else if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset))) { for(;curr_offset < end_offset; curr_offset++) { if (file_buff->get_value(curr_offset) == ',') { curr_offset+= 1; // Move past the , break; } if (my_isdigit(system_charset_info, file_buff->get_value(curr_offset))) buffer.append(file_buff->get_value(curr_offset)); else if (file_buff->get_value(curr_offset) == '.') buffer.append(file_buff->get_value(curr_offset)); else goto err; } } else { goto err; } if (bitmap_is_set(table->read_set, (*field)->field_index)) (*field)->store(buffer.ptr(), buffer.length(), system_charset_info); } Loading