diff options
-rw-r--r-- | mysql-test/r/csv.result | 26 | ||||
-rw-r--r-- | mysql-test/t/csv.test | 16 | ||||
-rw-r--r-- | storage/csv/ha_tina.cc | 158 |
3 files changed, 132 insertions, 68 deletions
diff --git a/mysql-test/r/csv.result b/mysql-test/r/csv.result index 32ca47e20d2..6456eb1d1ba 100644 --- a/mysql-test/r/csv.result +++ b/mysql-test/r/csv.result @@ -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; diff --git a/mysql-test/t/csv.test b/mysql-test/t/csv.test index 60d38394fc0..135969fe644 100644 --- a/mysql-test/t/csv.test +++ b/mysql-test/t/csv.test @@ -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 @@ -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; diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index 712c2d9d29a..0818b915618 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -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; @@ -478,50 +479,58 @@ int ha_tina::encode_quote(byte *buf) buffer.append(STRING_WITH_LEN("\"\",")); continue; } - else + + (*field)->val_str(&attribute,&attribute); + + if ((*field)->str_needs_quotes()) { - (*field)->val_str(&attribute,&attribute); ptr= attribute.ptr(); end_ptr= attribute.length() + ptr; - } - buffer.append('"'); + buffer.append('"'); - while (ptr < end_ptr) - { - if (*ptr == '"') - { - buffer.append('\\'); - buffer.append('"'); - *ptr++; - } - else if (*ptr == '\r') - { - buffer.append('\\'); - buffer.append('r'); - *ptr++; - } - else if (*ptr == '\\') + while (ptr < end_ptr) { - buffer.append('\\'); - buffer.append('\\'); - *ptr++; - } - else if (*ptr == '\n') - { - buffer.append('\\'); - buffer.append('n'); - *ptr++; + if (*ptr == '"') + { + buffer.append('\\'); + buffer.append('"'); + *ptr++; + } + else if (*ptr == '\r') + { + buffer.append('\\'); + buffer.append('r'); + *ptr++; + } + else if (*ptr == '\\') + { + buffer.append('\\'); + buffer.append('\\'); + *ptr++; + } + else if (*ptr == '\n') + { + buffer.append('\\'); + buffer.append('n'); + *ptr++; + } + else + buffer.append(*ptr++); } - else - buffer.append(*ptr++); + buffer.append('"'); + } + else + { + buffer.append(attribute); } - buffer.append('"'); + 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); @@ -601,47 +610,72 @@ 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! - if (file_buff->get_value(curr_offset) == '"' && - ((file_buff->get_value(curr_offset + 1) == ',') || - (curr_offset == end_offset -1 ))) - { - curr_offset+= 2; // Move past the , and the " - break; - } - if (file_buff->get_value(curr_offset) == '\\' && - curr_offset != (end_offset - 1)) + curr_offset++; // Incrementpast the first quote + + for(;curr_offset < end_offset; curr_offset++) { - curr_offset++; - if (file_buff->get_value(curr_offset) == 'r') - buffer.append('\r'); - else if (file_buff->get_value(curr_offset) == 'n' ) - buffer.append('\n'); - else if ((file_buff->get_value(curr_offset) == '\\') || - (file_buff->get_value(curr_offset) == '"')) - buffer.append(file_buff->get_value(curr_offset)); - else /* This could only happed with an externally created file */ + // Need to convert line feeds! + if (file_buff->get_value(curr_offset) == '"' && + ((file_buff->get_value(curr_offset + 1) == ',') || + (curr_offset == end_offset -1 ))) { - buffer.append('\\'); + curr_offset+= 2; // Move past the , and the " + break; + } + if (file_buff->get_value(curr_offset) == '\\' && + curr_offset != (end_offset - 1)) + { + curr_offset++; + if (file_buff->get_value(curr_offset) == 'r') + buffer.append('\r'); + else if (file_buff->get_value(curr_offset) == 'n' ) + buffer.append('\n'); + else if ((file_buff->get_value(curr_offset) == '\\') || + (file_buff->get_value(curr_offset) == '"')) + buffer.append(file_buff->get_value(curr_offset)); + else /* This could only happed with an externally created file */ + { + buffer.append('\\'); + buffer.append(file_buff->get_value(curr_offset)); + } + } + else // ordinary symbol + { + /* + We are at final symbol and no last quote was found => + we are working with a damaged file. + */ + if (curr_offset == end_offset - 1) + goto err; buffer.append(file_buff->get_value(curr_offset)); } } - else // ordinary symbol + } + else if (my_isdigit(system_charset_info, + file_buff->get_value(curr_offset))) + { + for(;curr_offset < end_offset; curr_offset++) { - /* - We are at final symbol and no last quote was found => - we are working with a damaged file. - */ - if (curr_offset == end_offset - 1) + 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; - buffer.append(file_buff->get_value(curr_offset)); } } + else + { + goto err; + } + if (bitmap_is_set(table->read_set, (*field)->field_index)) (*field)->store(buffer.ptr(), buffer.length(), system_charset_info); } |