List:Commits« Previous MessageNext Message »
From:holyfoot Date:December 2 2006 4:22pm
Subject:bk commit into 4.1 tree (holyfoot:1.2557) BUG#22372
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of hf. When hf 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-12-02 19:22:15+04:00, holyfoot@stripped +5 -0
  bug #22372 (LOAD DATA crashes the table with the geometry field)
   The problem is that the GEOMETRY NOT NULL can't automatically
  set any value as a default one. Now we always complete LOAD DATA command,
  even if we don't have all the data in file. That doesn't work for the
  GEOMETRY field. Setting the 'default' value for the field  ordinarily is 
  done by Field::reset method. Now it returns an error if Field can't
  be reset.

  mysql-test/r/gis.result@stripped, 2006-12-02 19:22:13+04:00, holyfoot@stripped +6 -0
    test result

  mysql-test/t/gis.test@stripped, 2006-12-02 19:22:13+04:00, holyfoot@stripped +7 -0
    test case

  sql/field.cc@stripped, 2006-12-02 19:22:13+04:00, holyfoot@stripped +2 -1
    ::reset method returns an error sing now

  sql/field.h@stripped, 2006-12-02 19:22:13+04:00, holyfoot@stripped +53 -50
    Field_*::reset method returns an error sing now

  sql/sql_load.cc@stripped, 2006-12-02 19:22:13+04:00, holyfoot@stripped +13 -2
    now we check if a field is able to reset it's value

# 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:	holyfoot
# Host:	deer.(none)
# Root:	/home/hf/work/22372/my41-22372

--- 1.233/sql/field.cc	2006-12-02 19:22:20 +04:00
+++ 1.234/sql/field.cc	2006-12-02 19:22:20 +04:00
@@ -1137,10 +1137,11 @@ void Field_null::sql_type(String &res) c
   This is an number stored as a pre-space (or pre-zero) string
 ****************************************************************************/
 
-void
+int
 Field_decimal::reset(void)
 {
   Field_decimal::store("0",1,&my_charset_bin);
+  return 0;
 }
 
 void Field_decimal::overflow(bool negative)

--- 1.133/sql/field.h	2006-12-02 19:22:20 +04:00
+++ 1.134/sql/field.h	2006-12-02 19:22:20 +04:00
@@ -126,7 +126,7 @@ public:
   bool eq(Field *field) { return ptr == field->ptr && null_ptr ==
field->null_ptr; }
   virtual bool eq_def(Field *field);
   virtual uint32 pack_length() const { return (uint32) field_length; }
-  virtual void reset(void) { bzero(ptr,pack_length()); }
+  virtual int reset(void) { bzero(ptr,pack_length()); return 0; }
   virtual void reset_fields() {}
   virtual void set_default()
   {
@@ -387,10 +387,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_DECIMAL;}
   enum ha_base_keytype key_type() const
   { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; }
-  void reset(void);
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
+  int reset(void);
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -418,10 +418,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_TINY;}
   enum ha_base_keytype key_type() const
     { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -454,10 +454,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_SHORT;}
   enum ha_base_keytype key_type() const
     { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=ptr[1]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -485,10 +485,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_INT24;}
   enum ha_base_keytype key_type() const
     { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
   int store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
+  int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -521,10 +521,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_LONG;}
   enum ha_base_keytype key_type() const
     { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   bool send_binary(Protocol *protocol);
@@ -559,10 +559,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_LONGLONG;}
   enum ha_base_keytype key_type() const
     { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; return 0;
}
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -597,7 +597,7 @@ public:
   int  store(const char *to,uint length,CHARSET_INFO *charset);
   int  store(double nr);
   int  store(longlong nr);
-  void reset(void) { bzero(ptr,sizeof(float)); }
+  int reset(void) { bzero(ptr,sizeof(float)); return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -628,10 +628,10 @@ public:
     {}
   enum_field_types type() const { return FIELD_TYPE_DOUBLE;}
   enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { bzero(ptr,sizeof(double)); }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { bzero(ptr,sizeof(double)); return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -656,11 +656,11 @@ public:
 	       unireg_check_arg, field_name_arg, table_arg, cs)
     {}
   enum_field_types type() const { return FIELD_TYPE_NULL;}
-  int  store(const char *to, uint length, CHARSET_INFO *cs)
+  int store(const char *to, uint length, CHARSET_INFO *cs)
   { null[0]=1; return 0; }
-  int  store(double nr)   { null[0]=1; return 0; }
-  int  store(longlong nr) { null[0]=1; return 0; }
-  void reset(void)	  {}
+  int store(double nr)   { null[0]=1; return 0; }
+  int store(longlong nr) { null[0]=1; return 0; }
+  int reset(void)        { return 0; }
   double val_real(void)		{ return 0.0;}
   longlong val_int(void)	{ return 0;}
   String *val_str(String *value,String *value2)
@@ -684,10 +684,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
   enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
   enum Item_result cmp_type () const { return INT_RESULT; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -763,10 +763,10 @@ public:
   enum_field_types type() const { return FIELD_TYPE_DATE;}
   enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
   enum Item_result cmp_type () const { return INT_RESULT; }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(double nr);
-  int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(double nr);
+  int store(longlong nr);
+  int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -795,7 +795,7 @@ public:
   int  store(double nr);
   int  store(longlong nr);
   void store_time(TIME *ltime,timestamp_type type);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
+  int  reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -829,7 +829,7 @@ public:
   int  store(const char *to,uint length,CHARSET_INFO *charset);
   int  store(double nr);
   int  store(longlong nr);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
+  int  reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -867,7 +867,9 @@ public:
   int  store(double nr);
   int  store(longlong nr);
   void store_time(TIME *ltime,timestamp_type type);
-  void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
+  int  reset(void)
+  { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
+    return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);
@@ -905,9 +907,9 @@ public:
   enum ha_base_keytype key_type() const
     { return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
   bool zero_pack() const { return 0; }
-  void reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); }
-  int  store(const char *to,uint length,CHARSET_INFO *charset);
-  int  store(longlong nr);
+  int reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); return
0; }
+  int store(const char *to,uint length,CHARSET_INFO *charset);
+  int store(longlong nr);
   int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */
   double val_real(void);
   longlong val_int(void);
@@ -948,7 +950,7 @@ public:
   enum ha_base_keytype key_type() const
     { return binary() ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; }
   bool zero_pack() const { return 0; }
-  void reset(void) { bzero(ptr,field_length+2); }
+  int reset(void) { bzero(ptr,field_length+2); return 0; }
   uint32 pack_length() const { return (uint32) field_length+2; }
   uint32 key_length() const { return (uint32) field_length; }
   int  store(const char *to,uint length,CHARSET_INFO *charset);
@@ -1017,7 +1019,7 @@ public:
   {
     return (uint32) (((ulonglong) 1 << (packlength*8)) -1);
   }
-  void reset(void) { bzero(ptr, packlength+sizeof(char*)); }
+  int  reset(void) { bzero(ptr, packlength+sizeof(char*)); return 0; }
   void reset_fields() { bzero((char*) &value,sizeof(value)); }
   void store_length(uint32 number);
   inline uint32 get_length(uint row_offset=0)
@@ -1093,6 +1095,7 @@ public:
   int  store(const char *to, uint length, CHARSET_INFO *charset);
   int  store(double nr) { return 1; }
   int  store(longlong nr) { return 1; }
+  int  reset(void) { return !maybe_null(); }
 
   void get_key_image(char *buff,uint length, CHARSET_INFO *cs,imagetype type);
   void set_key_image(char *buff,uint length, CHARSET_INFO *cs);
@@ -1123,7 +1126,7 @@ public:
   int  store(const char *to,uint length,CHARSET_INFO *charset);
   int  store(double nr);
   int  store(longlong nr);
-  void reset() { bzero(ptr,packlength); }
+  int  reset() { bzero(ptr,packlength); return 0; }
   double val_real(void);
   longlong val_int(void);
   String *val_str(String*,String *);

--- 1.88/sql/sql_load.cc	2006-12-02 19:22:20 +04:00
+++ 1.89/sql/sql_load.cc	2006-12-02 19:22:20 +04:00
@@ -527,7 +527,13 @@ read_sep_field(THD *thd,COPY_INFO &info,
 	  (enclosed_length && length == 4 && !memcmp(pos,"NULL",4)) ||
 	  (length == 1 && read_info.found_null))
       {
-	field->reset();
+	if (field->reset())
+        {
+          my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0), field->field_name,
+              thd->row_count);
+          DBUG_RETURN(1);
+        }
+
 	field->set_null();
 	if (!field->maybe_null())
 	{
@@ -560,7 +566,12 @@ read_sep_field(THD *thd,COPY_INFO &info,
       for (; sql_field ; sql_field=(Item_field*) it++)
       {
 	sql_field->field->set_null();
-	sql_field->field->reset();
+	if (sql_field->field->reset())
+        {
+          my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0),sql_field->field->field_name,
+              thd->row_count);
+          DBUG_RETURN(1);
+        }
 	thd->cuted_fields++;
  	push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 
                 	    ER_WARN_TOO_FEW_RECORDS,

--- 1.22/mysql-test/r/gis.result	2006-12-02 19:22:20 +04:00
+++ 1.23/mysql-test/r/gis.result	2006-12-02 19:22:20 +04:00
@@ -661,6 +661,12 @@ POINT(10 10)
 select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))));
 (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))))
 POINT(10 10)
+create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
+alter table t1 disable keys;
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+ERROR 01000: Data truncated; NULL supplied to NOT NULL column 'b' at row 1
+alter table t1 enable keys;
+drop table t1;
 create table t1 (g GEOMETRY);
 select * from t1;
 Catalog	Database	Table	Table_alias	Column	Column_alias	Type	Length	Max
length	Is_null	Flags	Decimals	Charsetnr

--- 1.20/mysql-test/t/gis.test	2006-12-02 19:22:20 +04:00
+++ 1.21/mysql-test/t/gis.test	2006-12-02 19:22:20 +04:00
@@ -363,6 +363,13 @@ drop table t1;
 select (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000))));
 select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))));
 
+create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b));
+alter table t1 disable keys;
+--error 1263
+load data infile '../../std_data/bad_gis_data.dat' into table t1;
+alter table t1 enable keys;
+drop table t1;
+
 # End of 4.1 tests
 
 --enable_metadata
Thread
bk commit into 4.1 tree (holyfoot:1.2557) BUG#22372holyfoot2 Dec