Commit 9e52ef1f authored by holyfoot/hf@mysql.com/deer.(none)'s avatar holyfoot/hf@mysql.com/deer.(none)

Merge mysql.com:/home/hf/work/22372/my41-22372

into  mysql.com:/home/hf/work/22372/my50-22372
parents d253588c f404488d
...@@ -706,6 +706,12 @@ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is ...@@ -706,6 +706,12 @@ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is
def asbinary(g) 252 8192 0 Y 128 0 63 def asbinary(g) 252 8192 0 Y 128 0 63
asbinary(g) asbinary(g)
drop table t1; drop table t1;
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 select GeomFromText('point(1 1)'); create table t1 select GeomFromText('point(1 1)');
desc t1; desc t1;
Field Type Null Key Default Extra Field Type Null Key Default Extra
......
...@@ -375,6 +375,20 @@ drop table t1; ...@@ -375,6 +375,20 @@ drop table t1;
select (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000)))); select (asWKT(geomfromwkb((0x000000000140240000000000004024000000000000))));
select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440)))); select (asWKT(geomfromwkb((0x010100000000000000000024400000000000002440))));
--enable_metadata
create table t1 (g GEOMETRY);
select * from t1;
select asbinary(g) from t1;
--disable_metadata
drop table t1;
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 # End of 4.1 tests
# #
...@@ -410,15 +424,7 @@ alter table t1 add primary key pti(pt); ...@@ -410,15 +424,7 @@ alter table t1 add primary key pti(pt);
alter table t1 add primary key pti(pt(20)); alter table t1 add primary key pti(pt(20));
drop table t1; drop table t1;
--enable_metadata
create table t1 (g GEOMETRY);
select * from t1;
select asbinary(g) from t1;
--disable_metadata
drop table t1;
create table t1 select GeomFromText('point(1 1)'); create table t1 select GeomFromText('point(1 1)');
desc t1; desc t1;
drop table t1; drop table t1;
...@@ -1569,10 +1569,11 @@ void Field_null::sql_type(String &res) const ...@@ -1569,10 +1569,11 @@ void Field_null::sql_type(String &res) const
This is an number stored as a pre-space (or pre-zero) string This is an number stored as a pre-space (or pre-zero) string
****************************************************************************/ ****************************************************************************/
void int
Field_decimal::reset(void) Field_decimal::reset(void)
{ {
Field_decimal::store(STRING_WITH_LEN("0"),&my_charset_bin); Field_decimal::store(STRING_WITH_LEN("0"),&my_charset_bin);
return 0;
} }
void Field_decimal::overflow(bool negative) void Field_decimal::overflow(bool negative)
......
...@@ -150,7 +150,7 @@ public: ...@@ -150,7 +150,7 @@ public:
*/ */
virtual uint32 data_length(const char *from) { return pack_length(); } virtual uint32 data_length(const char *from) { return pack_length(); }
virtual uint32 sort_length() const { return pack_length(); } virtual uint32 sort_length() const { return pack_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 reset_fields() {}
virtual void set_default() virtual void set_default()
{ {
...@@ -450,7 +450,7 @@ public: ...@@ -450,7 +450,7 @@ public:
enum_field_types type() const { return FIELD_TYPE_DECIMAL;} enum_field_types type() const { return FIELD_TYPE_DECIMAL;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; } { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; }
void reset(void); int reset(void);
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
...@@ -490,7 +490,7 @@ public: ...@@ -490,7 +490,7 @@ public:
enum_field_types type() const { return FIELD_TYPE_NEWDECIMAL;} enum_field_types type() const { return FIELD_TYPE_NEWDECIMAL;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_BINARY; }
Item_result result_type () const { return DECIMAL_RESULT; } Item_result result_type () const { return DECIMAL_RESULT; }
void reset(void); int reset(void);
bool store_value(const my_decimal *decimal_value); bool store_value(const my_decimal *decimal_value);
void set_value_on_overflow(my_decimal *decimal_value, bool sign); void set_value_on_overflow(my_decimal *decimal_value, bool sign);
int store(const char *to, uint length, CHARSET_INFO *charset); int store(const char *to, uint length, CHARSET_INFO *charset);
...@@ -530,7 +530,7 @@ public: ...@@ -530,7 +530,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { ptr[0]=0; } int reset(void) { ptr[0]=0; return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -566,7 +566,7 @@ public: ...@@ -566,7 +566,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { ptr[0]=ptr[1]=0; } int reset(void) { ptr[0]=ptr[1]=0; return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -597,7 +597,7 @@ public: ...@@ -597,7 +597,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
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); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -633,7 +633,7 @@ public: ...@@ -633,7 +633,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
bool send_binary(Protocol *protocol); bool send_binary(Protocol *protocol);
...@@ -671,7 +671,11 @@ public: ...@@ -671,7 +671,11 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
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); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -707,7 +711,7 @@ public: ...@@ -707,7 +711,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { bzero(ptr,sizeof(float)); } int reset(void) { bzero(ptr,sizeof(float)); return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -741,7 +745,7 @@ public: ...@@ -741,7 +745,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { bzero(ptr,sizeof(double)); } int reset(void) { bzero(ptr,sizeof(double)); return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -771,7 +775,7 @@ public: ...@@ -771,7 +775,7 @@ public:
int store(double nr) { null[0]=1; return 0; } int store(double nr) { null[0]=1; return 0; }
int store(longlong nr, bool unsigned_val) { null[0]=1; return 0; } int store(longlong nr, bool unsigned_val) { null[0]=1; return 0; }
int store_decimal(const my_decimal *d) { null[0]=1; return 0; } int store_decimal(const my_decimal *d) { null[0]=1; return 0; }
void reset(void) {} int reset(void) { return 0; }
double val_real(void) { return 0.0;} double val_real(void) { return 0.0;}
longlong val_int(void) { return 0;} longlong val_int(void) { return 0;}
my_decimal *val_decimal(my_decimal *) { return 0; } my_decimal *val_decimal(my_decimal *) { return 0; }
...@@ -801,7 +805,7 @@ public: ...@@ -801,7 +805,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -880,7 +884,7 @@ public: ...@@ -880,7 +884,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } int reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -909,7 +913,7 @@ public: ...@@ -909,7 +913,7 @@ public:
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
int store_time(TIME *ltime, timestamp_type type); int 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); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -944,7 +948,7 @@ public: ...@@ -944,7 +948,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
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); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -982,7 +986,11 @@ public: ...@@ -982,7 +986,11 @@ public:
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
int store_time(TIME *ltime, timestamp_type type); int 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); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -1025,7 +1033,11 @@ public: ...@@ -1025,7 +1033,11 @@ public:
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; } { return binary() ? HA_KEYTYPE_BINARY : HA_KEYTYPE_TEXT; }
bool zero_pack() const { return 0; } bool zero_pack() const { return 0; }
void reset(void) { charset()->cset->fill(charset(),ptr,field_length,' '); } int reset(void)
{
charset()->cset->fill(charset(),ptr,field_length,' ');
return 0;
}
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */ int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */
...@@ -1082,7 +1094,7 @@ public: ...@@ -1082,7 +1094,7 @@ public:
enum_field_types type() const { return MYSQL_TYPE_VARCHAR; } enum_field_types type() const { return MYSQL_TYPE_VARCHAR; }
enum ha_base_keytype key_type() const; enum ha_base_keytype key_type() const;
bool zero_pack() const { return 0; } bool zero_pack() const { return 0; }
void reset(void) { bzero(ptr,field_length+length_bytes); } int reset(void) { bzero(ptr,field_length+length_bytes); return 0; }
uint32 pack_length() const { return (uint32) field_length+length_bytes; } uint32 pack_length() const { return (uint32) field_length+length_bytes; }
uint32 key_length() const { return (uint32) field_length; } uint32 key_length() const { return (uint32) field_length; }
uint32 sort_length() const uint32 sort_length() const
...@@ -1183,7 +1195,7 @@ public: ...@@ -1183,7 +1195,7 @@ public:
{ {
return (uint32) (((ulonglong) 1 << (packlength*8)) -1); 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 reset_fields() { bzero((char*) &value,sizeof(value)); }
void store_length(uint32 number); void store_length(uint32 number);
inline uint32 get_length(uint row_offset=0) inline uint32 get_length(uint row_offset=0)
...@@ -1264,6 +1276,7 @@ public: ...@@ -1264,6 +1276,7 @@ public:
int store_decimal(const my_decimal *); int store_decimal(const my_decimal *);
void get_key_image(char *buff,uint length,imagetype type); void get_key_image(char *buff,uint length,imagetype type);
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
int reset(void) { return !maybe_null(); }
}; };
#endif /*HAVE_SPATIAL*/ #endif /*HAVE_SPATIAL*/
...@@ -1292,7 +1305,7 @@ public: ...@@ -1292,7 +1305,7 @@ public:
int store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
void reset() { bzero(ptr,packlength); } int reset() { bzero(ptr,packlength); return 0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
String *val_str(String*,String *); String *val_str(String*,String *);
...@@ -1353,7 +1366,7 @@ public: ...@@ -1353,7 +1366,7 @@ public:
uint32 max_length() { return field_length; } uint32 max_length() { return field_length; }
uint size_of() const { return sizeof(*this); } uint size_of() const { return sizeof(*this); }
Item_result result_type () const { return INT_RESULT; } Item_result result_type () const { return INT_RESULT; }
void reset(void) { bzero(ptr, bytes_in_rec); } int reset(void) { bzero(ptr, bytes_in_rec); return 0; }
int store(const char *to, uint length, CHARSET_INFO *charset); int store(const char *to, uint length, CHARSET_INFO *charset);
int store(double nr); int store(double nr);
int store(longlong nr, bool unsigned_val); int store(longlong nr, bool unsigned_val);
......
...@@ -696,7 +696,12 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -696,7 +696,12 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
if (item->type() == Item::FIELD_ITEM) if (item->type() == Item::FIELD_ITEM)
{ {
Field *field= ((Item_field *)item)->field; Field *field= ((Item_field *)item)->field;
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(); field->set_null();
if (field == table->next_number_field) if (field == table->next_number_field)
table->auto_increment_field_not_null= TRUE; table->auto_increment_field_not_null= TRUE;
...@@ -745,6 +750,13 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ...@@ -745,6 +750,13 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
{ {
if (item->type() == Item::FIELD_ITEM) if (item->type() == Item::FIELD_ITEM)
{ {
Field *field= ((Item_field *)item)->field;
if (field->reset())
{
my_error(ER_WARN_NULL_TO_NOTNULL, MYF(0),sql_field->field->field_name,
thd->row_count);
DBUG_RETURN(1);
}
/* /*
QQ: We probably should not throw warning for each field. QQ: We probably should not throw warning for each field.
But how about intention to always have the same number But how about intention to always have the same number
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment