List:Commits« Previous MessageNext Message »
From:antony Date:September 25 2006 4:04pm
Subject:bk commit into 5.1 tree (acurtis:1.2323) BUG#22080
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of antony. When antony does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-09-25 09:04:19-07:00, acurtis@stripped +3 -0
  Bug#22080
    "CHECK fails to identify some corruption"
    change to allow it to detect more errors in data format

  mysql-test/r/csv.result@stripped, 2006-09-25 09:04:15-07:00, acurtis@stripped +19 -0
    Test for bug

  mysql-test/t/csv.test@stripped, 2006-09-25 09:04:15-07:00, acurtis@stripped +23 -0
    Test for bug

  storage/csv/ha_tina.cc@stripped, 2006-09-25 09:04:15-07:00, acurtis@stripped +18 -16
    Bug#22080
      "CHECK fails to identify some corruption"
      change to allow it to detect more errors in data format

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	acurtis
# Host:	ltamd64.xiphis.org
# Root:	/home/antony/work2/p2-bug22080.2

--- 1.12/mysql-test/r/csv.result	2006-09-25 09:04:40 -07:00
+++ 1.13/mysql-test/r/csv.result	2006-09-25 09:04:40 -07:00
@@ -5205,3 +5205,22 @@
 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;

--- 1.15/mysql-test/t/csv.test	2006-09-25 09:04:40 -07:00
+++ 1.16/mysql-test/t/csv.test	2006-09-25 09:04:40 -07:00
@@ -1582,3 +1582,26 @@
 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;

--- 1.61/storage/csv/ha_tina.cc	2006-09-25 09:04:40 -07:00
+++ 1.62/storage/csv/ha_tina.cc	2006-09-25 09:04:40 -07:00
@@ -540,7 +540,10 @@
       in the code.
     */
     if ((*field)->is_null())
-      ptr= end_ptr= 0;
+    {
+      buffer.append(STRING_WITH_LEN("\"\","));
+      continue;
+    }
     else
     {
       (*field)->val_str(&attribute,&attribute);
@@ -641,6 +644,7 @@
   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");
 
   /*
@@ -654,23 +658,23 @@
 
   /* 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 "
@@ -700,10 +704,7 @@
           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));
       }
     }
@@ -711,11 +712,12 @@
       (*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);
 }
 
 /*
Thread
bk commit into 5.1 tree (acurtis:1.2323) BUG#22080antony25 Sep