Commit 7f13b1bd authored by unknown's avatar unknown

Adding a necessary functionality to ::store and ::save_in_field

that will take place properly after pull from 4.0, in order to 
handle conversions from quoted constants to bigint's.

parent 029dc2b3
...@@ -424,7 +424,7 @@ void Field_decimal::overflow(bool negative) ...@@ -424,7 +424,7 @@ void Field_decimal::overflow(bool negative)
} }
void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) int Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
reg3 int i; reg3 int i;
uint tmp_dec; uint tmp_dec;
...@@ -459,7 +459,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -459,7 +459,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs)
if (!error) if (!error)
current_thd->cuted_fields++; current_thd->cuted_fields++;
Field_decimal::overflow(1); Field_decimal::overflow(1);
return; return 1;
} }
} }
} }
...@@ -485,7 +485,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -485,7 +485,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs)
current_thd->cuted_fields++; current_thd->cuted_fields++;
// too big number, change to max or min number // too big number, change to max or min number
Field_decimal::overflow(decstr.sign && decstr.sign_char == '-'); Field_decimal::overflow(decstr.sign && decstr.sign_char == '-');
return; return 1;
} }
char *to=ptr; char *to=ptr;
for (i=(int) (field_length-tmp_dec-decstr.nr_length-decstr.extra - decstr.sign) ; for (i=(int) (field_length-tmp_dec-decstr.nr_length-decstr.extra - decstr.sign) ;
...@@ -520,16 +520,17 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -520,16 +520,17 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs)
} }
} }
} }
return (error) ? 1 : 0;
} }
void Field_decimal::store(double nr) int Field_decimal::store(double nr)
{ {
if (unsigned_flag && nr < 0) if (unsigned_flag && nr < 0)
{ {
overflow(1); overflow(1);
current_thd->cuted_fields++; current_thd->cuted_fields++;
return; return 1;
} }
reg4 uint i,length; reg4 uint i,length;
char fyllchar,*to; char fyllchar,*to;
...@@ -548,6 +549,7 @@ void Field_decimal::store(double nr) ...@@ -548,6 +549,7 @@ void Field_decimal::store(double nr)
{ {
overflow(nr < 0.0); overflow(nr < 0.0);
current_thd->cuted_fields++; current_thd->cuted_fields++;
return 1;
} }
else else
{ {
...@@ -555,17 +557,18 @@ void Field_decimal::store(double nr) ...@@ -555,17 +557,18 @@ void Field_decimal::store(double nr)
for (i=field_length-length ; i-- > 0 ;) for (i=field_length-length ; i-- > 0 ;)
*to++ = fyllchar; *to++ = fyllchar;
memcpy(to,buff,length); memcpy(to,buff,length);
return 0;
} }
} }
void Field_decimal::store(longlong nr) int Field_decimal::store(longlong nr)
{ {
if (unsigned_flag && nr < 0) if (unsigned_flag && nr < 0)
{ {
overflow(1); overflow(1);
current_thd->cuted_fields++; current_thd->cuted_fields++;
return; return 1;
} }
char buff[22]; char buff[22];
uint length=(uint) (longlong10_to_str(nr,buff,-10)-buff); uint length=(uint) (longlong10_to_str(nr,buff,-10)-buff);
...@@ -575,6 +578,7 @@ void Field_decimal::store(longlong nr) ...@@ -575,6 +578,7 @@ void Field_decimal::store(longlong nr)
{ {
overflow(test(nr < 0L)); /* purecov: inspected */ overflow(test(nr < 0L)); /* purecov: inspected */
current_thd->cuted_fields++; /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */
return 1;
} }
else else
{ {
...@@ -588,6 +592,7 @@ void Field_decimal::store(longlong nr) ...@@ -588,6 +592,7 @@ void Field_decimal::store(longlong nr)
to[length]='.'; to[length]='.';
bfill(to+length+1,dec,'0'); bfill(to+length+1,dec,'0');
} }
return 0;
} }
} }
...@@ -704,10 +709,11 @@ void Field_decimal::sql_type(String &res) const ...@@ -704,10 +709,11 @@ void Field_decimal::sql_type(String &res) const
** tiny int ** tiny int
****************************************************************************/ ****************************************************************************/
void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
long tmp= strtol(tmp_str.c_ptr(),NULL,10); long tmp= strtol(tmp_str.c_ptr(),NULL,10);
int error=0;
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -715,14 +721,19 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -715,14 +721,19 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp=0; /* purecov: inspected */ tmp=0; /* purecov: inspected */
current_thd->cuted_fields++; /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */
error = 1;
} }
else if (tmp > 255) else if (tmp > 255)
{ {
tmp= 255; tmp= 255;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
else else
{ {
...@@ -730,21 +741,28 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -730,21 +741,28 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp= -128; tmp= -128;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (tmp >= 128) else if (tmp >= 128)
{ {
tmp= 127; tmp= 127;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
ptr[0]= (char) tmp; ptr[0]= (char) tmp;
return error;
} }
void Field_tiny::store(double nr) int Field_tiny::store(double nr)
{ {
int error=0;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -752,11 +770,13 @@ void Field_tiny::store(double nr) ...@@ -752,11 +770,13 @@ void Field_tiny::store(double nr)
{ {
*ptr=0; *ptr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > 255.0) else if (nr > 255.0)
{ {
*ptr=(char) 255; *ptr=(char) 255;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
*ptr=(char) nr; *ptr=(char) nr;
...@@ -767,30 +787,36 @@ void Field_tiny::store(double nr) ...@@ -767,30 +787,36 @@ void Field_tiny::store(double nr)
{ {
*ptr= (char) -128; *ptr= (char) -128;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > 127.0) else if (nr > 127.0)
{ {
*ptr=127; *ptr=127;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
*ptr=(char) nr; *ptr=(char) nr;
} }
return error;
} }
void Field_tiny::store(longlong nr) int Field_tiny::store(longlong nr)
{ {
int error=0;
if (unsigned_flag) if (unsigned_flag)
{ {
if (nr < 0L) if (nr < 0L)
{ {
*ptr=0; *ptr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > 255L) else if (nr > 255L)
{ {
*ptr= (char) 255; *ptr= (char) 255;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
*ptr=(char) nr; *ptr=(char) nr;
...@@ -801,15 +827,18 @@ void Field_tiny::store(longlong nr) ...@@ -801,15 +827,18 @@ void Field_tiny::store(longlong nr)
{ {
*ptr= (char) -128; *ptr= (char) -128;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > 127L) else if (nr > 127L)
{ {
*ptr=127; *ptr=127;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
*ptr=(char) nr; *ptr=(char) nr;
} }
return error;
} }
...@@ -875,24 +904,30 @@ void Field_tiny::sql_type(String &res) const ...@@ -875,24 +904,30 @@ void Field_tiny::sql_type(String &res) const
// Note: Sometimes this should be fixed to use one strtol() to use // Note: Sometimes this should be fixed to use one strtol() to use
// len and check for garbage after number. // len and check for garbage after number.
void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
long tmp= strtol(tmp_str.c_ptr(),NULL,10); long tmp= strtol(tmp_str.c_ptr(),NULL,10);
int error=0;
if (unsigned_flag) if (unsigned_flag)
{ {
if (tmp < 0) if (tmp < 0)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (tmp > (uint16) ~0) else if (tmp > (uint16) ~0)
{ {
tmp=(uint16) ~0; tmp=(uint16) ~0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
else else
{ {
...@@ -900,14 +935,19 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -900,14 +935,19 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp= INT_MIN16; tmp= INT_MIN16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (tmp > INT_MAX16) else if (tmp > INT_MAX16)
{ {
tmp=INT_MAX16; tmp=INT_MAX16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
...@@ -917,11 +957,13 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -917,11 +957,13 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
shortstore(ptr,(short) tmp); shortstore(ptr,(short) tmp);
return error;
} }
void Field_short::store(double nr) int Field_short::store(double nr)
{ {
int error=0;
int16 res; int16 res;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
...@@ -930,11 +972,13 @@ void Field_short::store(double nr) ...@@ -930,11 +972,13 @@ void Field_short::store(double nr)
{ {
res=0; res=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (double) (uint16) ~0) else if (nr > (double) (uint16) ~0)
{ {
res=(int16) (uint16) ~0; res=(int16) (uint16) ~0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int16) (uint16) nr; res=(int16) (uint16) nr;
...@@ -945,11 +989,13 @@ void Field_short::store(double nr) ...@@ -945,11 +989,13 @@ void Field_short::store(double nr)
{ {
res=INT_MIN16; res=INT_MIN16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (double) INT_MAX16) else if (nr > (double) INT_MAX16)
{ {
res=INT_MAX16; res=INT_MAX16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int16) nr; res=(int16) nr;
...@@ -962,10 +1008,12 @@ void Field_short::store(double nr) ...@@ -962,10 +1008,12 @@ void Field_short::store(double nr)
else else
#endif #endif
shortstore(ptr,res); shortstore(ptr,res);
return error;
} }
void Field_short::store(longlong nr) int Field_short::store(longlong nr)
{ {
int error=0;
int16 res; int16 res;
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -973,11 +1021,13 @@ void Field_short::store(longlong nr) ...@@ -973,11 +1021,13 @@ void Field_short::store(longlong nr)
{ {
res=0; res=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (longlong) (uint16) ~0) else if (nr > (longlong) (uint16) ~0)
{ {
res=(int16) (uint16) ~0; res=(int16) (uint16) ~0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int16) (uint16) nr; res=(int16) (uint16) nr;
...@@ -988,11 +1038,13 @@ void Field_short::store(longlong nr) ...@@ -988,11 +1038,13 @@ void Field_short::store(longlong nr)
{ {
res=INT_MIN16; res=INT_MIN16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > INT_MAX16) else if (nr > INT_MAX16)
{ {
res=INT_MAX16; res=INT_MAX16;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int16) nr; res=(int16) nr;
...@@ -1005,6 +1057,7 @@ void Field_short::store(longlong nr) ...@@ -1005,6 +1057,7 @@ void Field_short::store(longlong nr)
else else
#endif #endif
shortstore(ptr,res); shortstore(ptr,res);
return error;
} }
...@@ -1115,10 +1168,11 @@ void Field_short::sql_type(String &res) const ...@@ -1115,10 +1168,11 @@ void Field_short::sql_type(String &res) const
// Note: Sometimes this should be fixed to use one strtol() to use // Note: Sometimes this should be fixed to use one strtol() to use
// len and check for garbage after number. // len and check for garbage after number.
void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
long tmp= strtol(tmp_str.c_ptr(),NULL,10); long tmp= strtol(tmp_str.c_ptr(),NULL,10);
int error=0;
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -1126,14 +1180,19 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1126,14 +1180,19 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (tmp >= (long) (1L << 24)) else if (tmp >= (long) (1L << 24))
{ {
tmp=(long) (1L << 24)-1L; tmp=(long) (1L << 24)-1L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
else else
{ {
...@@ -1141,22 +1200,29 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1141,22 +1200,29 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp= INT_MIN24; tmp= INT_MIN24;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (tmp > INT_MAX24) else if (tmp > INT_MAX24)
{ {
tmp=INT_MAX24; tmp=INT_MAX24;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
} }
int3store(ptr,tmp); int3store(ptr,tmp);
return error;
} }
void Field_medium::store(double nr) int Field_medium::store(double nr)
{ {
int error=0;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -1164,12 +1230,14 @@ void Field_medium::store(double nr) ...@@ -1164,12 +1230,14 @@ void Field_medium::store(double nr)
{ {
int3store(ptr,0); int3store(ptr,0);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr >= (double) (long) (1L << 24)) else if (nr >= (double) (long) (1L << 24))
{ {
uint32 tmp=(uint32) (1L << 24)-1L; uint32 tmp=(uint32) (1L << 24)-1L;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
int3store(ptr,(uint32) nr); int3store(ptr,(uint32) nr);
...@@ -1181,32 +1249,38 @@ void Field_medium::store(double nr) ...@@ -1181,32 +1249,38 @@ void Field_medium::store(double nr)
long tmp=(long) INT_MIN24; long tmp=(long) INT_MIN24;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (double) INT_MAX24) else if (nr > (double) INT_MAX24)
{ {
long tmp=(long) INT_MAX24; long tmp=(long) INT_MAX24;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
int3store(ptr,(long) nr); int3store(ptr,(long) nr);
} }
return error;
} }
void Field_medium::store(longlong nr) int Field_medium::store(longlong nr)
{ {
int error=0;
if (unsigned_flag) if (unsigned_flag)
{ {
if (nr < 0L) if (nr < 0L)
{ {
int3store(ptr,0); int3store(ptr,0);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr >= (longlong) (long) (1L << 24)) else if (nr >= (longlong) (long) (1L << 24))
{ {
long tmp=(long) (1L << 24)-1L;; long tmp=(long) (1L << 24)-1L;;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
int3store(ptr,(uint32) nr); int3store(ptr,(uint32) nr);
...@@ -1218,16 +1292,19 @@ void Field_medium::store(longlong nr) ...@@ -1218,16 +1292,19 @@ void Field_medium::store(longlong nr)
long tmp=(long) INT_MIN24; long tmp=(long) INT_MIN24;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (longlong) INT_MAX24) else if (nr > (longlong) INT_MAX24)
{ {
long tmp=(long) INT_MAX24; long tmp=(long) INT_MAX24;
int3store(ptr,tmp); int3store(ptr,tmp);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
int3store(ptr,(long) nr); int3store(ptr,(long) nr);
} }
return error;
} }
...@@ -1300,13 +1377,14 @@ void Field_medium::sql_type(String &res) const ...@@ -1300,13 +1377,14 @@ void Field_medium::sql_type(String &res) const
// Note: Sometimes this should be fixed to use one strtol() to use // Note: Sometimes this should be fixed to use one strtol() to use
// len and check for garbage after number. // len and check for garbage after number.
void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
while (len && my_isspace(system_charset_info,*from)) while (len && my_isspace(system_charset_info,*from))
{ {
len--; from++; len--; from++;
} }
long tmp; long tmp;
int error=0;
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
errno=0; errno=0;
if (unsigned_flag) if (unsigned_flag)
...@@ -1315,6 +1393,7 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1315,6 +1393,7 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp=0; // Set negative to 0 tmp=0; // Set negative to 0
errno=ERANGE; errno=ERANGE;
error = 1;
} }
else else
tmp=(long) strtoul(tmp_str.c_ptr(),NULL,10); tmp=(long) strtoul(tmp_str.c_ptr(),NULL,10);
...@@ -1322,7 +1401,10 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1322,7 +1401,10 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
else else
tmp=strtol(tmp_str.c_ptr(),NULL,10); tmp=strtol(tmp_str.c_ptr(),NULL,10);
if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) if (errno || current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
{ {
...@@ -1331,11 +1413,13 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1331,11 +1413,13 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
longstore(ptr,tmp); longstore(ptr,tmp);
return error;
} }
void Field_long::store(double nr) int Field_long::store(double nr)
{ {
int error=0;
int32 res; int32 res;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
...@@ -1344,11 +1428,13 @@ void Field_long::store(double nr) ...@@ -1344,11 +1428,13 @@ void Field_long::store(double nr)
{ {
res=0; res=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (double) (ulong) ~0L) else if (nr > (double) (ulong) ~0L)
{ {
res=(int32) (uint32) ~0L; res=(int32) (uint32) ~0L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int32) (ulong) nr; res=(int32) (ulong) nr;
...@@ -1359,11 +1445,13 @@ void Field_long::store(double nr) ...@@ -1359,11 +1445,13 @@ void Field_long::store(double nr)
{ {
res=(int32) INT_MIN32; res=(int32) INT_MIN32;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (double) INT_MAX32) else if (nr > (double) INT_MAX32)
{ {
res=(int32) INT_MAX32; res=(int32) INT_MAX32;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int32) nr; res=(int32) nr;
...@@ -1376,11 +1464,13 @@ void Field_long::store(double nr) ...@@ -1376,11 +1464,13 @@ void Field_long::store(double nr)
else else
#endif #endif
longstore(ptr,res); longstore(ptr,res);
return error;
} }
void Field_long::store(longlong nr) int Field_long::store(longlong nr)
{ {
int error=0;
int32 res; int32 res;
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -1388,11 +1478,13 @@ void Field_long::store(longlong nr) ...@@ -1388,11 +1478,13 @@ void Field_long::store(longlong nr)
{ {
res=0; res=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr >= (LL(1) << 32)) else if (nr >= (LL(1) << 32))
{ {
res=(int32) (uint32) ~0L; res=(int32) (uint32) ~0L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int32) (uint32) nr; res=(int32) (uint32) nr;
...@@ -1403,11 +1495,13 @@ void Field_long::store(longlong nr) ...@@ -1403,11 +1495,13 @@ void Field_long::store(longlong nr)
{ {
res=(int32) INT_MIN32; res=(int32) INT_MIN32;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > (longlong) INT_MAX32) else if (nr > (longlong) INT_MAX32)
{ {
res=(int32) INT_MAX32; res=(int32) INT_MAX32;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(int32) nr; res=(int32) nr;
...@@ -1420,6 +1514,7 @@ void Field_long::store(longlong nr) ...@@ -1420,6 +1514,7 @@ void Field_long::store(longlong nr)
else else
#endif #endif
longstore(ptr,res); longstore(ptr,res);
return error;
} }
...@@ -1528,7 +1623,7 @@ void Field_long::sql_type(String &res) const ...@@ -1528,7 +1623,7 @@ void Field_long::sql_type(String &res) const
** longlong int ** longlong int
****************************************************************************/ ****************************************************************************/
void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
while (len && my_isspace(system_charset_info,*from)) while (len && my_isspace(system_charset_info,*from))
{ // For easy error check { // For easy error check
...@@ -1536,6 +1631,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1536,6 +1631,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
} }
longlong tmp; longlong tmp;
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
int error=0;
errno=0; errno=0;
if (unsigned_flag) if (unsigned_flag)
{ {
...@@ -1543,6 +1639,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1543,6 +1639,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp=0; // Set negative to 0 tmp=0; // Set negative to 0
errno=ERANGE; errno=ERANGE;
error = 1;
} }
else else
tmp=(longlong) strtoull(tmp_str.c_ptr(),NULL,10); tmp=(longlong) strtoull(tmp_str.c_ptr(),NULL,10);
...@@ -1550,7 +1647,10 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1550,7 +1647,10 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
else else
tmp=strtoll(tmp_str.c_ptr(),NULL,10); tmp=strtoll(tmp_str.c_ptr(),NULL,10);
if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) if (errno || current_thd->count_cuted_fields && !test_if_int(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
{ {
...@@ -1559,11 +1659,13 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -1559,11 +1659,13 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
longlongstore(ptr,tmp); longlongstore(ptr,tmp);
return error;
} }
void Field_longlong::store(double nr) int Field_longlong::store(double nr)
{ {
int error=0;
longlong res; longlong res;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
...@@ -1572,11 +1674,13 @@ void Field_longlong::store(double nr) ...@@ -1572,11 +1674,13 @@ void Field_longlong::store(double nr)
{ {
res=0; res=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr >= (double) ~ (ulonglong) 0) else if (nr >= (double) ~ (ulonglong) 0)
{ {
res= ~(longlong) 0; res= ~(longlong) 0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(longlong) (ulonglong) nr; res=(longlong) (ulonglong) nr;
...@@ -1587,11 +1691,13 @@ void Field_longlong::store(double nr) ...@@ -1587,11 +1691,13 @@ void Field_longlong::store(double nr)
{ {
res=(longlong) LONGLONG_MIN; res=(longlong) LONGLONG_MIN;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr >= (double) LONGLONG_MAX) else if (nr >= (double) LONGLONG_MAX)
{ {
res=(longlong) LONGLONG_MAX; res=(longlong) LONGLONG_MAX;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
res=(longlong) nr; res=(longlong) nr;
...@@ -1604,10 +1710,11 @@ void Field_longlong::store(double nr) ...@@ -1604,10 +1710,11 @@ void Field_longlong::store(double nr)
else else
#endif #endif
longlongstore(ptr,res); longlongstore(ptr,res);
return error;
} }
void Field_longlong::store(longlong nr) int Field_longlong::store(longlong nr)
{ {
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
...@@ -1617,6 +1724,7 @@ void Field_longlong::store(longlong nr) ...@@ -1617,6 +1724,7 @@ void Field_longlong::store(longlong nr)
else else
#endif #endif
longlongstore(ptr,nr); longlongstore(ptr,nr);
return 0;
} }
...@@ -1735,35 +1843,43 @@ void Field_longlong::sql_type(String &res) const ...@@ -1735,35 +1843,43 @@ void Field_longlong::sql_type(String &res) const
** single precision float ** single precision float
****************************************************************************/ ****************************************************************************/
void Field_float::store(const char *from,uint len,CHARSET_INFO *cs) int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
errno=0; errno=0;
Field_float::store(atof(tmp_str.c_ptr())); Field_float::store(atof(tmp_str.c_ptr()));
if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) if (errno || current_thd->count_cuted_fields && !test_if_real(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
return 1;
}
return (errno) ? 1 : 0;
} }
void Field_float::store(double nr) int Field_float::store(double nr)
{ {
float j; float j;
int error=0;
if (dec < NOT_FIXED_DEC) if (dec < NOT_FIXED_DEC)
nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
if (unsigned_flag && nr < 0) if (unsigned_flag && nr < 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
nr=0; nr=0;
error = 1;
} }
if (nr < -FLT_MAX) if (nr < -FLT_MAX)
{ {
j= -FLT_MAX; j= -FLT_MAX;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr > FLT_MAX) else if (nr > FLT_MAX)
{ {
j=FLT_MAX; j=FLT_MAX;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
j= (float) nr; j= (float) nr;
...@@ -1775,16 +1891,19 @@ void Field_float::store(double nr) ...@@ -1775,16 +1891,19 @@ void Field_float::store(double nr)
else else
#endif #endif
memcpy_fixed(ptr,(byte*) &j,sizeof(j)); memcpy_fixed(ptr,(byte*) &j,sizeof(j));
return error;
} }
void Field_float::store(longlong nr) int Field_float::store(longlong nr)
{ {
int error=0;
float j= (float) nr; float j= (float) nr;
if (unsigned_flag && j < 0) if (unsigned_flag && j < 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
j=0; j=0;
error = 1;
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
...@@ -1794,6 +1913,7 @@ void Field_float::store(longlong nr) ...@@ -1794,6 +1913,7 @@ void Field_float::store(longlong nr)
else else
#endif #endif
memcpy_fixed(ptr,(byte*) &j,sizeof(j)); memcpy_fixed(ptr,(byte*) &j,sizeof(j));
return error;
} }
...@@ -1985,17 +2105,22 @@ void Field_float::sql_type(String &res) const ...@@ -1985,17 +2105,22 @@ void Field_float::sql_type(String &res) const
** double precision floating point numbers ** double precision floating point numbers
****************************************************************************/ ****************************************************************************/
void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
errno=0; errno=0;
int error=0;
double j= atof(tmp_str.c_ptr()); double j= atof(tmp_str.c_ptr());
if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) if (errno || current_thd->count_cuted_fields && !test_if_real(from,len))
{
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
}
if (unsigned_flag && j < 0) if (unsigned_flag && j < 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
j=0; j=0;
error = 1;
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
...@@ -2005,17 +2130,20 @@ void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -2005,17 +2130,20 @@ void Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
doublestore(ptr,j); doublestore(ptr,j);
return error;
} }
void Field_double::store(double nr) int Field_double::store(double nr)
{ {
int error=0;
if (dec < NOT_FIXED_DEC) if (dec < NOT_FIXED_DEC)
nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point
if (unsigned_flag && nr < 0) if (unsigned_flag && nr < 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
nr=0; nr=0;
error = 1;
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
...@@ -2025,15 +2153,18 @@ void Field_double::store(double nr) ...@@ -2025,15 +2153,18 @@ void Field_double::store(double nr)
else else
#endif #endif
doublestore(ptr,nr); doublestore(ptr,nr);
return error;
} }
void Field_double::store(longlong nr) int Field_double::store(longlong nr)
{ {
double j= (double) nr; double j= (double) nr;
int error=0;
if (unsigned_flag && j < 0) if (unsigned_flag && j < 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
j=0; j=0;
} }
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
...@@ -2044,6 +2175,7 @@ void Field_double::store(longlong nr) ...@@ -2044,6 +2175,7 @@ void Field_double::store(longlong nr)
else else
#endif #endif
doublestore(ptr,j); doublestore(ptr,j);
return error;
} }
...@@ -2241,7 +2373,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg, ...@@ -2241,7 +2373,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
} }
void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
long tmp=(long) str_to_timestamp(from,len); long tmp=(long) str_to_timestamp(from,len);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
...@@ -2252,9 +2384,10 @@ void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -2252,9 +2384,10 @@ void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
longstore(ptr,tmp); longstore(ptr,tmp);
return 0;
} }
void Field_timestamp::fill_and_store(char *from,uint len) void Field_timestamp::fill_and_store(char *from,uint len)
{ {
uint res_length; uint res_length;
if (len <= field_length) if (len <= field_length)
...@@ -2283,14 +2416,17 @@ void Field_timestamp::fill_and_store(char *from,uint len) ...@@ -2283,14 +2416,17 @@ void Field_timestamp::fill_and_store(char *from,uint len)
} }
void Field_timestamp::store(double nr) int Field_timestamp::store(double nr)
{ {
int error=0;
if (nr < 0 || nr > 99991231235959.0) if (nr < 0 || nr > 99991231235959.0)
{ {
nr=0; // Avoid overflow on buff nr=0; // Avoid overflow on buff
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
Field_timestamp::store((longlong) rint(nr)); error |= Field_timestamp::store((longlong) rint(nr));
return error;
} }
...@@ -2331,7 +2467,7 @@ static longlong fix_datetime(longlong nr) ...@@ -2331,7 +2467,7 @@ static longlong fix_datetime(longlong nr)
} }
void Field_timestamp::store(longlong nr) int Field_timestamp::store(longlong nr)
{ {
TIME l_time; TIME l_time;
time_t timestamp; time_t timestamp;
...@@ -2359,6 +2495,7 @@ void Field_timestamp::store(longlong nr) ...@@ -2359,6 +2495,7 @@ void Field_timestamp::store(longlong nr)
else else
#endif #endif
longstore(ptr,(uint32) timestamp); longstore(ptr,(uint32) timestamp);
return 0;
} }
...@@ -2580,12 +2717,16 @@ void Field_timestamp::set_time() ...@@ -2580,12 +2717,16 @@ void Field_timestamp::set_time()
** Stored as a 3 byte unsigned int ** Stored as a 3 byte unsigned int
****************************************************************************/ ****************************************************************************/
void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
TIME ltime; TIME ltime;
long tmp; long tmp;
int error=0;
if (str_to_time(from,len,&ltime)) if (str_to_time(from,len,&ltime))
{
tmp=0L; tmp=0L;
error = 1;
}
else else
{ {
if (ltime.month) if (ltime.month)
...@@ -2595,26 +2736,31 @@ void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -2595,26 +2736,31 @@ void Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
tmp=8385959; tmp=8385959;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
} }
if (ltime.neg) if (ltime.neg)
tmp= -tmp; tmp= -tmp;
Field_time::store((longlong) tmp); error |= Field_time::store((longlong) tmp);
return error;
} }
void Field_time::store(double nr) int Field_time::store(double nr)
{ {
long tmp; long tmp;
int error=0;
if (nr > 8385959.0) if (nr > 8385959.0)
{ {
tmp=8385959L; tmp=8385959L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr < -8385959.0) else if (nr < -8385959.0)
{ {
tmp= -8385959L; tmp= -8385959L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
{ {
...@@ -2625,24 +2771,29 @@ void Field_time::store(double nr) ...@@ -2625,24 +2771,29 @@ void Field_time::store(double nr)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
} }
int3store(ptr,tmp); int3store(ptr,tmp);
return error;
} }
void Field_time::store(longlong nr) int Field_time::store(longlong nr)
{ {
long tmp; long tmp;
int error=0;
if (nr > (longlong) 8385959L) if (nr > (longlong) 8385959L)
{ {
tmp=8385959L; tmp=8385959L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else if (nr < (longlong) -8385959L) else if (nr < (longlong) -8385959L)
{ {
tmp= -8385959L; tmp= -8385959L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
{ {
...@@ -2651,9 +2802,11 @@ void Field_time::store(longlong nr) ...@@ -2651,9 +2802,11 @@ void Field_time::store(longlong nr)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
} }
int3store(ptr,tmp); int3store(ptr,tmp);
return error;
} }
...@@ -2729,7 +2882,7 @@ void Field_time::sql_type(String &res) const ...@@ -2729,7 +2882,7 @@ void Field_time::sql_type(String &res) const
** Can handle 2 byte or 4 byte years! ** Can handle 2 byte or 4 byte years!
****************************************************************************/ ****************************************************************************/
void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
{ {
String tmp_str(from,len,default_charset_info); String tmp_str(from,len,default_charset_info);
long nr= strtol(tmp_str.c_ptr(),NULL,10); long nr= strtol(tmp_str.c_ptr(),NULL,10);
...@@ -2738,7 +2891,7 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -2738,7 +2891,7 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
{ {
*ptr=0; *ptr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
return; return 1;
} }
else if (current_thd->count_cuted_fields && !test_if_int(from,len)) else if (current_thd->count_cuted_fields && !test_if_int(from,len))
current_thd->cuted_fields++; current_thd->cuted_fields++;
...@@ -2750,23 +2903,27 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -2750,23 +2903,27 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
nr-= 1900; nr-= 1900;
} }
*ptr= (char) (unsigned char) nr; *ptr= (char) (unsigned char) nr;
return 0;
} }
void Field_year::store(double nr) int Field_year::store(double nr)
{ {
if (nr < 0.0 || nr >= 2155.0) if (nr < 0.0 || nr >= 2155.0)
Field_year::store((longlong) -1); {
(void) Field_year::store((longlong) -1);
return 1;
}
else else
Field_year::store((longlong) nr); return Field_year::store((longlong) nr);
} }
void Field_year::store(longlong nr) int Field_year::store(longlong nr)
{ {
if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155) if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155)
{ {
*ptr=0; *ptr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
return; return 1;
} }
if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000 if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000
{ {
...@@ -2776,6 +2933,7 @@ void Field_year::store(longlong nr) ...@@ -2776,6 +2933,7 @@ void Field_year::store(longlong nr)
nr-= 1900; nr-= 1900;
} }
*ptr= (char) (unsigned char) nr; *ptr= (char) (unsigned char) nr;
return 0;
} }
...@@ -2818,12 +2976,16 @@ void Field_year::sql_type(String &res) const ...@@ -2818,12 +2976,16 @@ void Field_year::sql_type(String &res) const
** Stored as a 4 byte unsigned int ** Stored as a 4 byte unsigned int
****************************************************************************/ ****************************************************************************/
void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
{ {
TIME l_time; TIME l_time;
uint32 tmp; uint32 tmp;
int error=0;
if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE)
{
tmp=0; tmp=0;
error = 1;
}
else else
tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day); tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
...@@ -2834,18 +2996,21 @@ void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -2834,18 +2996,21 @@ void Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
else else
#endif #endif
longstore(ptr,tmp); longstore(ptr,tmp);
return error;
} }
void Field_date::store(double nr) int Field_date::store(double nr)
{ {
long tmp; long tmp;
int error=0;
if (nr >= 19000000000000.0 && nr <= 99991231235959.0) if (nr >= 19000000000000.0 && nr <= 99991231235959.0)
nr=floor(nr/1000000.0); // Timestamp to date nr=floor(nr/1000000.0); // Timestamp to date
if (nr < 0.0 || nr > 99991231.0) if (nr < 0.0 || nr > 99991231.0)
{ {
tmp=0L; tmp=0L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
tmp=(long) rint(nr); tmp=(long) rint(nr);
...@@ -2857,18 +3022,21 @@ void Field_date::store(double nr) ...@@ -2857,18 +3022,21 @@ void Field_date::store(double nr)
else else
#endif #endif
longstore(ptr,tmp); longstore(ptr,tmp);
return error;
} }
void Field_date::store(longlong nr) int Field_date::store(longlong nr)
{ {
long tmp; long tmp;
int error=0;
if (nr >= LL(19000000000000) && nr < LL(99991231235959)) if (nr >= LL(19000000000000) && nr < LL(99991231235959))
nr=nr/LL(1000000); // Timestamp to date nr=nr/LL(1000000); // Timestamp to date
if (nr < 0 || nr > LL(99991231)) if (nr < 0 || nr > LL(99991231))
{ {
tmp=0L; tmp=0L;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
tmp=(long) nr; tmp=(long) nr;
...@@ -2880,6 +3048,7 @@ void Field_date::store(longlong nr) ...@@ -2880,6 +3048,7 @@ void Field_date::store(longlong nr)
else else
#endif #endif
longstore(ptr,tmp); longstore(ptr,tmp);
return error;
} }
...@@ -2975,35 +3144,45 @@ void Field_date::sql_type(String &res) const ...@@ -2975,35 +3144,45 @@ void Field_date::sql_type(String &res) const
** In number context: YYYYMMDD ** In number context: YYYYMMDD
****************************************************************************/ ****************************************************************************/
void Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
TIME l_time; TIME l_time;
long tmp; long tmp;
int error=0;
if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE)
{
tmp=0L; tmp=0L;
error = 1;
}
else else
tmp= l_time.day + l_time.month*32 + l_time.year*16*32; tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
int3store(ptr,tmp); int3store(ptr,tmp);
return error;
} }
void Field_newdate::store(double nr) int Field_newdate::store(double nr)
{ {
if (nr < 0.0 || nr > 99991231235959.0) if (nr < 0.0 || nr > 99991231235959.0)
Field_newdate::store((longlong) -1); {
(void) Field_newdate::store((longlong) -1);
return 1;
}
else else
Field_newdate::store((longlong) rint(nr)); return Field_newdate::store((longlong) rint(nr));
} }
void Field_newdate::store(longlong nr) int Field_newdate::store(longlong nr)
{ {
int32 tmp; int32 tmp;
int error=0;
if (nr >= LL(100000000) && nr <= LL(99991231235959)) if (nr >= LL(100000000) && nr <= LL(99991231235959))
nr=nr/LL(1000000); // Timestamp to date nr=nr/LL(1000000); // Timestamp to date
if (nr < 0L || nr > 99991231L) if (nr < 0L || nr > 99991231L)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
{ {
...@@ -3021,11 +3200,13 @@ void Field_newdate::store(longlong nr) ...@@ -3021,11 +3200,13 @@ void Field_newdate::store(longlong nr)
{ {
tmp=0L; // Don't allow date to change tmp=0L; // Don't allow date to change
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
tmp= day + month*32 + (tmp/10000)*16*32; tmp= day + month*32 + (tmp/10000)*16*32;
} }
int3store(ptr,(int32) tmp); int3store(ptr,(int32) tmp);
return error;
} }
void Field_newdate::store_time(TIME *ltime,timestamp_type type) void Field_newdate::store_time(TIME *ltime,timestamp_type type)
...@@ -3128,7 +3309,7 @@ void Field_newdate::sql_type(String &res) const ...@@ -3128,7 +3309,7 @@ void Field_newdate::sql_type(String &res) const
** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int. ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int.
****************************************************************************/ ****************************************************************************/
void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
longlong tmp=str_to_datetime(from,len,1); longlong tmp=str_to_datetime(from,len,1);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
...@@ -3139,26 +3320,32 @@ void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -3139,26 +3320,32 @@ void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
else else
#endif #endif
longlongstore(ptr,tmp); longlongstore(ptr,tmp);
return 0;
} }
void Field_datetime::store(double nr) int Field_datetime::store(double nr)
{ {
int error=0;
if (nr < 0.0 || nr > 99991231235959.0) if (nr < 0.0 || nr > 99991231235959.0)
{ {
nr=0.0; nr=0.0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
Field_datetime::store((longlong) rint(nr)); error |= Field_datetime::store((longlong) rint(nr));
return error;
} }
void Field_datetime::store(longlong nr) int Field_datetime::store(longlong nr)
{ {
int error=0;
if (nr < 0 || nr > LL(99991231235959)) if (nr < 0 || nr > LL(99991231235959))
{ {
nr=0; nr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
else else
nr=fix_datetime(nr); nr=fix_datetime(nr);
...@@ -3170,6 +3357,7 @@ void Field_datetime::store(longlong nr) ...@@ -3170,6 +3357,7 @@ void Field_datetime::store(longlong nr)
else else
#endif #endif
longlongstore(ptr,nr); longlongstore(ptr,nr);
return error;
} }
void Field_datetime::store_time(TIME *ltime,timestamp_type type) void Field_datetime::store_time(TIME *ltime,timestamp_type type)
...@@ -3344,9 +3532,10 @@ void Field_datetime::sql_type(String &res) const ...@@ -3344,9 +3532,10 @@ void Field_datetime::sql_type(String &res) const
/* Copy a string and fill with space */ /* Copy a string and fill with space */
void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
field_charset=cs; field_charset=cs;
int error=0;
#ifdef USE_TIS620 #ifdef USE_TIS620
if(!binary_flag) { if(!binary_flag) {
ThNormalize((uchar *)ptr, field_length, (uchar *)from, length); ThNormalize((uchar *)ptr, field_length, (uchar *)from, length);
...@@ -3372,30 +3561,32 @@ void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -3372,30 +3561,32 @@ void Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
if (!my_isspace(field_charset,*from)) if (!my_isspace(field_charset,*from))
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
error=1;
break; break;
} }
} }
} }
} }
#endif /* USE_TIS620 */ #endif /* USE_TIS620 */
return error;
} }
void Field_string::store(double nr) int Field_string::store(double nr)
{ {
char buff[MAX_FIELD_WIDTH],*end; char buff[MAX_FIELD_WIDTH],*end;
int width=min(field_length,DBL_DIG+5); int width=min(field_length,DBL_DIG+5);
sprintf(buff,"%-*.*g",width,max(width-5,0),nr); sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
end=strcend(buff,' '); end=strcend(buff,' ');
Field_string::store(buff,(uint) (end - buff), default_charset_info); return Field_string::store(buff,(uint) (end - buff), default_charset_info);
} }
void Field_string::store(longlong nr) int Field_string::store(longlong nr)
{ {
char buff[22]; char buff[22];
char *end=longlong10_to_str(nr,buff,-10); char *end=longlong10_to_str(nr,buff,-10);
Field_string::store(buff,(uint) (end-buff), default_charset_info); return Field_string::store(buff,(uint) (end-buff), default_charset_info);
} }
...@@ -3554,8 +3745,9 @@ uint Field_string::max_packed_col_length(uint max_length) ...@@ -3554,8 +3745,9 @@ uint Field_string::max_packed_col_length(uint max_length)
****************************************************************************/ ****************************************************************************/
void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
int error=0;
field_charset=cs; field_charset=cs;
#ifdef USE_TIS620 #ifdef USE_TIS620
if(!binary_flag) if(!binary_flag)
...@@ -3572,27 +3764,29 @@ void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -3572,27 +3764,29 @@ void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
length=field_length; length=field_length;
memcpy(ptr+2,from,field_length); memcpy(ptr+2,from,field_length);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error = 1;
} }
#endif /* USE_TIS620 */ #endif /* USE_TIS620 */
int2store(ptr,length); int2store(ptr,length);
return error;
} }
void Field_varstring::store(double nr) int Field_varstring::store(double nr)
{ {
char buff[MAX_FIELD_WIDTH],*end; char buff[MAX_FIELD_WIDTH],*end;
int width=min(field_length,DBL_DIG+5); int width=min(field_length,DBL_DIG+5);
sprintf(buff,"%-*.*g",width,max(width-5,0),nr); sprintf(buff,"%-*.*g",width,max(width-5,0),nr);
end=strcend(buff,' '); end=strcend(buff,' ');
Field_varstring::store(buff,(uint) (end - buff), default_charset_info); return Field_varstring::store(buff,(uint) (end - buff), default_charset_info);
} }
void Field_varstring::store(longlong nr) int Field_varstring::store(longlong nr)
{ {
char buff[22]; char buff[22];
char *end=longlong10_to_str(nr,buff,-10); char *end=longlong10_to_str(nr,buff,-10);
Field_varstring::store(buff,(uint) (end-buff), default_charset_info); return Field_varstring::store(buff,(uint) (end-buff), default_charset_info);
} }
...@@ -3877,7 +4071,7 @@ uint32 Field_blob::get_length(const char *pos) ...@@ -3877,7 +4071,7 @@ uint32 Field_blob::get_length(const char *pos)
} }
void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) int Field_blob::store(const char *from,uint len,CHARSET_INFO *cs)
{ {
field_charset=cs; field_charset=cs;
if (!len) if (!len)
...@@ -3911,20 +4105,21 @@ void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -3911,20 +4105,21 @@ void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs)
} }
bmove(ptr+packlength,(char*) &from,sizeof(char*)); bmove(ptr+packlength,(char*) &from,sizeof(char*));
} }
return 0;
} }
void Field_blob::store(double nr) int Field_blob::store(double nr)
{ {
value.set(nr); value.set(nr);
Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); return Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info);
} }
void Field_blob::store(longlong nr) int Field_blob::store(longlong nr)
{ {
value.set(nr); value.set(nr);
Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); return Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info);
} }
...@@ -4071,7 +4266,7 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type) ...@@ -4071,7 +4266,7 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type)
void Field_blob::set_key_image(char *buff,uint length) void Field_blob::set_key_image(char *buff,uint length)
{ {
length=uint2korr(buff); length=uint2korr(buff);
Field_blob::store(buff+2,length, default_charset_info); (void) Field_blob::store(buff+2,length, default_charset_info);
} }
void Field_geom::get_key_image(char *buff,uint length, imagetype type) void Field_geom::get_key_image(char *buff,uint length, imagetype type)
...@@ -4392,8 +4587,9 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) ...@@ -4392,8 +4587,9 @@ uint find_enum(TYPELIB *lib,const char *x, uint length)
** (if there isn't a empty value in the enum) ** (if there isn't a empty value in the enum)
*/ */
void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
int error=0;
uint tmp=find_enum(typelib,from,length); uint tmp=find_enum(typelib,from,length);
if (!tmp) if (!tmp)
{ {
...@@ -4413,29 +4609,34 @@ void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -4413,29 +4609,34 @@ void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
tmp=0; tmp=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
error=1;
} }
} }
else else
current_thd->cuted_fields++; current_thd->cuted_fields++;
} }
store_type((ulonglong) tmp); store_type((ulonglong) tmp);
return error;
} }
void Field_enum::store(double nr) int Field_enum::store(double nr)
{ {
Field_enum::store((longlong) nr); return Field_enum::store((longlong) nr);
} }
void Field_enum::store(longlong nr) int Field_enum::store(longlong nr)
{ {
int error=0;
if ((uint) nr > typelib->count || nr == 0) if ((uint) nr > typelib->count || nr == 0)
{ {
current_thd->cuted_fields++; current_thd->cuted_fields++;
nr=0; nr=0;
error=1;
} }
store_type((ulonglong) (uint) nr); store_type((ulonglong) (uint) nr);
return error;
} }
...@@ -4583,8 +4784,9 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length) ...@@ -4583,8 +4784,9 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length)
} }
void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
{ {
int error=0;
ulonglong tmp=find_set(typelib,from,length); ulonglong tmp=find_set(typelib,from,length);
if (!tmp && length && length < 22) if (!tmp && length && length < 22)
{ {
...@@ -4600,23 +4802,30 @@ void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -4600,23 +4802,30 @@ void Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
tmp=strtoull(conv,&end,10); tmp=strtoull(conv,&end,10);
if (my_errno || end != conv+length || if (my_errno || end != conv+length ||
tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1))
{
tmp=0; tmp=0;
error=1;
}
else else
current_thd->cuted_fields--; // Remove warning from find_set current_thd->cuted_fields--; // Remove warning from find_set
} }
store_type(tmp); store_type(tmp);
return error;
} }
void Field_set::store(longlong nr) int Field_set::store(longlong nr)
{ {
int error=0;
if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) - if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) -
(longlong) 1)) (longlong) 1))
{ {
nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1); nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1);
current_thd->cuted_fields++; current_thd->cuted_fields++;
error=1;
} }
store_type((ulonglong) nr); store_type((ulonglong) nr);
return error;
} }
......
...@@ -60,9 +60,9 @@ public: ...@@ -60,9 +60,9 @@ public:
utype unireg_check_arg, const char *field_name_arg, utype unireg_check_arg, const char *field_name_arg,
struct st_table *table_arg); struct st_table *table_arg);
virtual ~Field() {} virtual ~Field() {}
virtual void store(const char *to,uint length,CHARSET_INFO *cs)=0; virtual int store(const char *to,uint length,CHARSET_INFO *cs)=0;
virtual void store(double nr)=0; virtual int store(double nr)=0;
virtual void store(longlong nr)=0; virtual int store(longlong nr)=0;
virtual void store_time(TIME *ltime,timestamp_type t_type); virtual void store_time(TIME *ltime,timestamp_type t_type);
virtual double val_real(void)=0; virtual double val_real(void)=0;
virtual longlong val_int(void)=0; virtual longlong val_int(void)=0;
...@@ -281,9 +281,9 @@ public: ...@@ -281,9 +281,9 @@ public:
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); void reset(void);
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
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 *);
...@@ -310,9 +310,9 @@ public: ...@@ -310,9 +310,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_TINY;} enum_field_types type() const { return FIELD_TYPE_TINY;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; } { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=0; } void reset(void) { ptr[0]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -339,9 +339,9 @@ public: ...@@ -339,9 +339,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_SHORT;} enum_field_types type() const { return FIELD_TYPE_SHORT;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;} { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;}
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=0; } void reset(void) { ptr[0]=ptr[1]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -368,9 +368,9 @@ public: ...@@ -368,9 +368,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_INT24;} enum_field_types type() const { return FIELD_TYPE_INT24;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; } { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -402,9 +402,9 @@ public: ...@@ -402,9 +402,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_LONG;} enum_field_types type() const { return FIELD_TYPE_LONG;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; } { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -438,9 +438,9 @@ public: ...@@ -438,9 +438,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_LONGLONG;} enum_field_types type() const { return FIELD_TYPE_LONGLONG;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; } { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong 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; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -465,9 +465,9 @@ public: ...@@ -465,9 +465,9 @@ public:
{} {}
enum_field_types type() const { return FIELD_TYPE_FLOAT;} enum_field_types type() const { return FIELD_TYPE_FLOAT;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { bzero(ptr,sizeof(float)); } void reset(void) { bzero(ptr,sizeof(float)); }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -497,9 +497,9 @@ public: ...@@ -497,9 +497,9 @@ public:
{} {}
enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum_field_types type() const { return FIELD_TYPE_DOUBLE;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { bzero(ptr,sizeof(double)); } void reset(void) { bzero(ptr,sizeof(double)); }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -523,9 +523,9 @@ public: ...@@ -523,9 +523,9 @@ public:
unireg_check_arg, field_name_arg, table_arg, default_charset_info) unireg_check_arg, field_name_arg, table_arg, default_charset_info)
{} {}
enum_field_types type() const { return FIELD_TYPE_NULL;} enum_field_types type() const { return FIELD_TYPE_NULL;}
void store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; } int store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; return 0; }
void store(double nr) { null[0]=1; } int store(double nr) { null[0]=1; return 0; }
void store(longlong nr) { null[0]=1; } int store(longlong nr) { null[0]=1; return 0; }
void reset(void) {} void reset(void) {}
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;}
...@@ -547,9 +547,9 @@ public: ...@@ -547,9 +547,9 @@ public:
enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; } enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; }
enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;} enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -587,9 +587,9 @@ public: ...@@ -587,9 +587,9 @@ public:
unireg_check_arg, field_name_arg, table_arg, 1, 1) unireg_check_arg, field_name_arg, table_arg, 1, 1)
{} {}
enum_field_types type() const { return FIELD_TYPE_YEAR;} enum_field_types type() const { return FIELD_TYPE_YEAR;}
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
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 *);
...@@ -612,9 +612,9 @@ public: ...@@ -612,9 +612,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_DATE;} enum_field_types type() const { return FIELD_TYPE_DATE;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -639,9 +639,9 @@ public: ...@@ -639,9 +639,9 @@ public:
enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; } enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; }
enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; }
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void store_time(TIME *ltime,timestamp_type type); void store_time(TIME *ltime,timestamp_type type);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
double val_real(void); double val_real(void);
...@@ -673,9 +673,9 @@ public: ...@@ -673,9 +673,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_TIME;} enum_field_types type() const { return FIELD_TYPE_TIME;}
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -707,9 +707,9 @@ public: ...@@ -707,9 +707,9 @@ public:
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
#endif #endif
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void store_time(TIME *ltime,timestamp_type type); 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; } void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; }
double val_real(void); double val_real(void);
...@@ -761,9 +761,9 @@ public: ...@@ -761,9 +761,9 @@ public:
bool zero_pack() const { return 0; } bool zero_pack() const { return 0; }
bool binary() const { return binary_flag; } bool binary() const { return binary_flag; }
void reset(void) { bfill(ptr,field_length,' '); } void reset(void) { bfill(ptr,field_length,' '); }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
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 *);
...@@ -813,9 +813,9 @@ public: ...@@ -813,9 +813,9 @@ public:
void reset(void) { bzero(ptr,field_length+2); } void reset(void) { bzero(ptr,field_length+2); }
uint32 pack_length() const { return (uint32) field_length+2; } uint32 pack_length() const { return (uint32) field_length+2; }
uint32 key_length() const { return (uint32) field_length; } uint32 key_length() const { return (uint32) field_length; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
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 *);
...@@ -856,9 +856,9 @@ public: ...@@ -856,9 +856,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_BLOB;} enum_field_types type() const { return FIELD_TYPE_BLOB;}
enum ha_base_keytype key_type() const enum ha_base_keytype key_type() const
{ return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; } { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
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 *);
...@@ -962,9 +962,9 @@ public: ...@@ -962,9 +962,9 @@ public:
enum_field_types type() const { return FIELD_TYPE_STRING; } enum_field_types type() const { return FIELD_TYPE_STRING; }
enum Item_result cmp_type () const { return INT_RESULT; } enum Item_result cmp_type () const { return INT_RESULT; }
enum ha_base_keytype key_type() const; enum ha_base_keytype key_type() const;
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr); int store(double nr);
void store(longlong nr); int store(longlong nr);
void reset() { bzero(ptr,packlength); } void reset() { bzero(ptr,packlength); }
double val_real(void); double val_real(void);
longlong val_int(void); longlong val_int(void);
...@@ -997,9 +997,9 @@ public: ...@@ -997,9 +997,9 @@ public:
{ {
flags=(flags & ~ENUM_FLAG) | SET_FLAG; flags=(flags & ~ENUM_FLAG) | SET_FLAG;
} }
void store(const char *to,uint length,CHARSET_INFO *charset); int store(const char *to,uint length,CHARSET_INFO *charset);
void store(double nr) { Field_set::store((longlong) nr); } int store(double nr) { return Field_set::store((longlong) nr); }
void store(longlong nr); int store(longlong nr);
virtual bool zero_pack() const { return 1; } virtual bool zero_pack() const { return 1; }
String *val_str(String*,String *); String *val_str(String*,String *);
void sql_type(String &str) const; void sql_type(String &str) const;
......
...@@ -340,7 +340,7 @@ void Item_param::set_long_end() ...@@ -340,7 +340,7 @@ void Item_param::set_long_end()
item_result_type = STRING_RESULT; item_result_type = STRING_RESULT;
}; };
bool Item_param::save_in_field(Field *field) int Item_param::save_in_field(Field *field)
{ {
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
...@@ -349,20 +349,17 @@ bool Item_param::save_in_field(Field *field) ...@@ -349,20 +349,17 @@ bool Item_param::save_in_field(Field *field)
if (item_result_type == INT_RESULT) if (item_result_type == INT_RESULT)
{ {
longlong nr=val_int(); longlong nr=val_int();
field->store(nr); return (field->store(nr)) ? -1 : 0;
return 0;
} }
if (item_result_type == REAL_RESULT) if (item_result_type == REAL_RESULT)
{ {
double nr=val(); double nr=val();
field->store(nr); return (field->store(nr)) ? -1 : 0;
return 0;
} }
String *result; String *result;
CHARSET_INFO *cs=default_charset_info;//fix this CHARSET_INFO *cs=default_charset_info;//fix this
result=val_str(&str_value); result=val_str(&str_value);
field->store(result->ptr(),result->length(),cs); return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0;
return 0;
} }
void Item_param::make_field(Send_field *tmp_field) void Item_param::make_field(Send_field *tmp_field)
...@@ -615,7 +612,7 @@ void Item_field::save_org_in_field(Field *to) ...@@ -615,7 +612,7 @@ void Item_field::save_org_in_field(Field *to)
} }
} }
bool Item_field::save_in_field(Field *to) int Item_field::save_in_field(Field *to)
{ {
if (result_field->is_null()) if (result_field->is_null())
{ {
...@@ -632,14 +629,15 @@ bool Item_field::save_in_field(Field *to) ...@@ -632,14 +629,15 @@ bool Item_field::save_in_field(Field *to)
} }
bool Item_null::save_in_field(Field *field) int Item_null::save_in_field(Field *field)
{ {
return set_field_to_null(field); return set_field_to_null(field);
} }
bool Item::save_in_field(Field *field) int Item::save_in_field(Field *field)
{ {
int error;
if (result_type() == STRING_RESULT || if (result_type() == STRING_RESULT ||
result_type() == REAL_RESULT && result_type() == REAL_RESULT &&
field->result_type() == STRING_RESULT) field->result_type() == STRING_RESULT)
...@@ -652,7 +650,7 @@ bool Item::save_in_field(Field *field) ...@@ -652,7 +650,7 @@ bool Item::save_in_field(Field *field)
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(result->ptr(),result->length(),cs); error=field->store(result->ptr(),result->length(),cs);
str_value.set_quick(0, 0, cs); str_value.set_quick(0, 0, cs);
} }
else if (result_type() == REAL_RESULT) else if (result_type() == REAL_RESULT)
...@@ -661,7 +659,7 @@ bool Item::save_in_field(Field *field) ...@@ -661,7 +659,7 @@ bool Item::save_in_field(Field *field)
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(nr); error=field->store(nr);
} }
else else
{ {
...@@ -669,12 +667,12 @@ bool Item::save_in_field(Field *field) ...@@ -669,12 +667,12 @@ bool Item::save_in_field(Field *field)
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(nr); error=field->store(nr);
} }
return 0; return (error) ? -1 : 0;
} }
bool Item_string::save_in_field(Field *field) int Item_string::save_in_field(Field *field)
{ {
String *result; String *result;
CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset();
...@@ -682,28 +680,25 @@ bool Item_string::save_in_field(Field *field) ...@@ -682,28 +680,25 @@ bool Item_string::save_in_field(Field *field)
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(result->ptr(),result->length(),cs); return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0;
return 0;
} }
bool Item_int::save_in_field(Field *field) int Item_int::save_in_field(Field *field)
{ {
longlong nr=val_int(); longlong nr=val_int();
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(nr); return (field->store(nr)) ? -1 : 0;
return 0;
} }
bool Item_real::save_in_field(Field *field) int Item_real::save_in_field(Field *field)
{ {
double nr=val(); double nr=val();
if (null_value) if (null_value)
return set_field_to_null(field); return set_field_to_null(field);
field->set_notnull(); field->set_notnull();
field->store(nr); return (field->store(nr)) ? -1 : 0;
return 0;
} }
/**************************************************************************** /****************************************************************************
...@@ -751,20 +746,21 @@ longlong Item_varbinary::val_int() ...@@ -751,20 +746,21 @@ longlong Item_varbinary::val_int()
} }
bool Item_varbinary::save_in_field(Field *field) int Item_varbinary::save_in_field(Field *field)
{ {
int error;
CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset();
field->set_notnull(); field->set_notnull();
if (field->result_type() == STRING_RESULT) if (field->result_type() == STRING_RESULT)
{ {
field->store(str_value.ptr(),str_value.length(),cs); error=field->store(str_value.ptr(),str_value.length(),cs);
} }
else else
{ {
longlong nr=val_int(); longlong nr=val_int();
field->store(nr); error=field->store(nr);
} }
return 0; return (error) ? -1 : 0;
} }
......
...@@ -53,7 +53,7 @@ public: ...@@ -53,7 +53,7 @@ public:
void set_name(char* str,uint length=0); void set_name(char* str,uint length=0);
void init_make_field(Send_field *tmp_field,enum enum_field_types type); void init_make_field(Send_field *tmp_field,enum enum_field_types type);
virtual bool fix_fields(THD *, struct st_table_list *, Item **); virtual bool fix_fields(THD *, struct st_table_list *, Item **);
virtual bool save_in_field(Field *field); virtual int save_in_field(Field *field);
virtual void save_org_in_field(Field *field) virtual void save_org_in_field(Field *field)
{ (void) save_in_field(field); } { (void) save_in_field(field); }
virtual bool send(THD *thd, String *str); virtual bool send(THD *thd, String *str);
...@@ -124,7 +124,7 @@ public: ...@@ -124,7 +124,7 @@ public:
bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); } bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); }
void make_field(Send_field *field); void make_field(Send_field *field);
bool fix_fields(THD *, struct st_table_list *, Item **); bool fix_fields(THD *, struct st_table_list *, Item **);
bool save_in_field(Field *field); int save_in_field(Field *field);
void save_org_in_field(Field *field); void save_org_in_field(Field *field);
table_map used_tables() const; table_map used_tables() const;
enum Item_result result_type () const enum Item_result result_type () const
...@@ -149,7 +149,7 @@ public: ...@@ -149,7 +149,7 @@ public:
longlong val_int(); longlong val_int();
String *val_str(String *str); String *val_str(String *str);
void make_field(Send_field *field); void make_field(Send_field *field);
bool save_in_field(Field *field); int save_in_field(Field *field);
enum Item_result result_type () const enum Item_result result_type () const
{ return STRING_RESULT; } { return STRING_RESULT; }
bool send(THD *thd, String *str); bool send(THD *thd, String *str);
...@@ -178,7 +178,7 @@ public: ...@@ -178,7 +178,7 @@ public:
longlong val_int(); longlong val_int();
String *val_str(String*); String *val_str(String*);
void make_field(Send_field *field); void make_field(Send_field *field);
bool save_in_field(Field *field); int save_in_field(Field *field);
void set_null(); void set_null();
void set_int(longlong i); void set_int(longlong i);
void set_double(float i); void set_double(float i);
...@@ -215,7 +215,7 @@ public: ...@@ -215,7 +215,7 @@ public:
double val() { return (double) value; } double val() { return (double) value; }
String *val_str(String*); String *val_str(String*);
void make_field(Send_field *field); void make_field(Send_field *field);
bool save_in_field(Field *field); int save_in_field(Field *field);
bool basic_const_item() const { return 1; } bool basic_const_item() const { return 1; }
Item *new_item() { return new Item_int(name,value,max_length); } Item *new_item() { return new Item_int(name,value,max_length); }
void print(String *str); void print(String *str);
...@@ -254,7 +254,7 @@ public: ...@@ -254,7 +254,7 @@ public:
max_length=length; max_length=length;
} }
Item_real(double value_par) :value(value_par) {} Item_real(double value_par) :value(value_par) {}
bool save_in_field(Field *field); int save_in_field(Field *field);
enum Type type() const { return REAL_ITEM; } enum Type type() const { return REAL_ITEM; }
double val() { return value; } double val() { return value; }
longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));} longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));}
...@@ -297,7 +297,7 @@ public: ...@@ -297,7 +297,7 @@ public:
double val() { return atof(str_value.ptr()); } double val() { return atof(str_value.ptr()); }
longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); } longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); }
String *val_str(String*) { return (String*) &str_value; } String *val_str(String*) { return (String*) &str_value; }
bool save_in_field(Field *field); int save_in_field(Field *field);
void make_field(Send_field *field); void make_field(Send_field *field);
enum Item_result result_type () const { return STRING_RESULT; } enum Item_result result_type () const { return STRING_RESULT; }
bool basic_const_item() const { return 1; } bool basic_const_item() const { return 1; }
...@@ -334,7 +334,7 @@ public: ...@@ -334,7 +334,7 @@ public:
double val() { return (double) Item_varbinary::val_int(); } double val() { return (double) Item_varbinary::val_int(); }
longlong val_int(); longlong val_int();
String *val_str(String*) { return &str_value; } String *val_str(String*) { return &str_value; }
bool save_in_field(Field *field); int save_in_field(Field *field);
void make_field(Send_field *field); void make_field(Send_field *field);
enum Item_result result_type () const { return INT_RESULT; } enum Item_result result_type () const { return INT_RESULT; }
}; };
...@@ -394,7 +394,7 @@ public: ...@@ -394,7 +394,7 @@ public:
bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); }
void make_field(Send_field *field) { (*ref)->make_field(field); } void make_field(Send_field *field) { (*ref)->make_field(field); }
bool fix_fields(THD *, struct st_table_list *, Item **); bool fix_fields(THD *, struct st_table_list *, Item **);
bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } int save_in_field(Field *field) { return (*ref)->save_in_field(field); }
void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); }
enum Item_result result_type () const { return (*ref)->result_type(); } enum Item_result result_type () const { return (*ref)->result_type(); }
table_map used_tables() const { return (*ref)->used_tables(); } table_map used_tables() const { return (*ref)->used_tables(); }
...@@ -413,7 +413,7 @@ class Item_int_with_ref :public Item_int ...@@ -413,7 +413,7 @@ class Item_int_with_ref :public Item_int
public: public:
Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg) Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg)
{} {}
bool save_in_field(Field *field) int save_in_field(Field *field)
{ {
return ref->save_in_field(field); return ref->save_in_field(field);
} }
......
...@@ -43,7 +43,8 @@ static bool convert_constant_item(Field *field, Item **item) ...@@ -43,7 +43,8 @@ static bool convert_constant_item(Field *field, Item **item)
{ {
if ((*item)->const_item()) if ((*item)->const_item())
{ {
(*item)->save_in_field(field); if ((*item)->save_in_field(field))
return 0;
if (!((*item)->null_value)) if (!((*item)->null_value))
{ {
Item *tmp=new Item_int_with_ref(field->val_int(), *item); Item *tmp=new Item_int_with_ref(field->val_int(), *item);
......
...@@ -1915,7 +1915,7 @@ outp: ...@@ -1915,7 +1915,7 @@ outp:
} }
bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables, Item **ref)
{ {
char buff[STACK_BUFF_ALLOC]; // Max argument in function char buff[STACK_BUFF_ALLOC]; // Max argument in function
binary=0; binary=0;
...@@ -1948,7 +1948,7 @@ String *Item_func_set_collation::val_str(String *str) ...@@ -1948,7 +1948,7 @@ String *Item_func_set_collation::val_str(String *str)
return str; return str;
} }
bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables) bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, Item **ref)
{ {
char buff[STACK_BUFF_ALLOC]; // Max argument in function char buff[STACK_BUFF_ALLOC]; // Max argument in function
binary=0; binary=0;
......
...@@ -489,7 +489,7 @@ class Item_func_conv_charset :public Item_str_func ...@@ -489,7 +489,7 @@ class Item_func_conv_charset :public Item_str_func
public: public:
Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a)
{ conv_charset=cs; } { conv_charset=cs; }
bool fix_fields(THD *thd,struct st_table_list *tables); bool fix_fields(THD *thd,struct st_table_list *tables,Item **ref);
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec(); void fix_length_and_dec();
const char *func_name() const { return "conv_charset"; } const char *func_name() const { return "conv_charset"; }
...@@ -501,7 +501,7 @@ class Item_func_set_collation :public Item_str_func ...@@ -501,7 +501,7 @@ class Item_func_set_collation :public Item_str_func
public: public:
Item_func_set_collation(Item *a, CHARSET_INFO *cs) :Item_str_func(a) Item_func_set_collation(Item *a, CHARSET_INFO *cs) :Item_str_func(a)
{ set_collation=cs; } { set_collation=cs; }
bool fix_fields(THD *thd,struct st_table_list *tables); bool fix_fields(THD *thd,struct st_table_list *tables, Item **ref);
String *val_str(String *); String *val_str(String *);
void fix_length_and_dec() void fix_length_and_dec()
{ {
......
...@@ -410,7 +410,7 @@ String *Item_date::val_str(String *str) ...@@ -410,7 +410,7 @@ String *Item_date::val_str(String *str)
} }
bool Item_date::save_in_field(Field *field) int Item_date::save_in_field(Field *field)
{ {
TIME ltime; TIME ltime;
timestamp_type t_type=TIMESTAMP_FULL; timestamp_type t_type=TIMESTAMP_FULL;
...@@ -525,7 +525,7 @@ bool Item_func_now::get_date(TIME *res, ...@@ -525,7 +525,7 @@ bool Item_func_now::get_date(TIME *res,
} }
bool Item_func_now::save_in_field(Field *to) int Item_func_now::save_in_field(Field *to)
{ {
to->set_notnull(); to->set_notnull();
to->store_time(&ltime,TIMESTAMP_FULL); to->store_time(&ltime,TIMESTAMP_FULL);
......
...@@ -228,7 +228,7 @@ public: ...@@ -228,7 +228,7 @@ public:
double val() { return (double) val_int(); } double val() { return (double) val_int(); }
const char *func_name() const { return "date"; } const char *func_name() const { return "date"; }
void fix_length_and_dec() { decimals=0; max_length=10; } void fix_length_and_dec() { decimals=0; max_length=10; }
bool save_in_field(Field *to); int save_in_field(Field *to);
void make_field(Send_field *tmp_field) void make_field(Send_field *tmp_field)
{ {
init_make_field(tmp_field,FIELD_TYPE_DATE); init_make_field(tmp_field,FIELD_TYPE_DATE);
...@@ -311,7 +311,7 @@ public: ...@@ -311,7 +311,7 @@ public:
enum Item_result result_type () const { return STRING_RESULT; } enum Item_result result_type () const { return STRING_RESULT; }
double val() { return (double) value; } double val() { return (double) value; }
longlong val_int() { return value; } longlong val_int() { return value; }
bool save_in_field(Field *to); int save_in_field(Field *to);
String *val_str(String *str) String *val_str(String *str)
{ str_value.set(buff,buff_length,default_charset_info); return &str_value; } { str_value.set(buff,buff_length,default_charset_info); return &str_value; }
const char *func_name() const { return "now"; } const char *func_name() const { return "now"; }
......
...@@ -1028,7 +1028,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, ...@@ -1028,7 +1028,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part,
field->cmp_type() != value->result_type()) field->cmp_type() != value->result_type())
DBUG_RETURN(0); DBUG_RETURN(0);
if (value->save_in_field(field)) if (value->save_in_field(field) == 1)
{ {
if (type == Item_func::EQUAL_FUNC) if (type == Item_func::EQUAL_FUNC)
{ {
......
...@@ -2113,7 +2113,7 @@ fill_record(List<Item> &fields,List<Item> &values) ...@@ -2113,7 +2113,7 @@ fill_record(List<Item> &fields,List<Item> &values)
while ((field=(Item_field*) f++)) while ((field=(Item_field*) f++))
{ {
value=v++; value=v++;
if (value->save_in_field(field->field)) if (value->save_in_field(field->field) == 1)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
...@@ -2131,7 +2131,7 @@ fill_record(Field **ptr,List<Item> &values) ...@@ -2131,7 +2131,7 @@ fill_record(Field **ptr,List<Item> &values)
while ((field = *ptr++)) while ((field = *ptr++))
{ {
value=v++; value=v++;
if (value->save_in_field(field)) if (value->save_in_field(field) == 1)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -179,7 +179,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -179,7 +179,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
Item *item; Item *item;
for (key_len=0 ; (item=it_ke++) ; key_part++) for (key_len=0 ; (item=it_ke++) ; key_part++)
{ {
item->save_in_field(key_part->field); (void) item->save_in_field(key_part->field);
key_len+=key_part->store_length; key_len+=key_part->store_length;
} }
if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len)))) if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len))))
......
...@@ -2478,7 +2478,7 @@ store_val_in_field(Field *field,Item *item) ...@@ -2478,7 +2478,7 @@ store_val_in_field(Field *field,Item *item)
THD *thd=current_thd; THD *thd=current_thd;
ulong cuted_fields=thd->cuted_fields; ulong cuted_fields=thd->cuted_fields;
thd->count_cuted_fields=1; thd->count_cuted_fields=1;
item->save_in_field(field); (void) item->save_in_field(field);
thd->count_cuted_fields=0; thd->count_cuted_fields=0;
return cuted_fields != thd->cuted_fields; return cuted_fields != thd->cuted_fields;
} }
......
...@@ -338,7 +338,7 @@ public: ...@@ -338,7 +338,7 @@ public:
{} {}
bool copy() bool copy()
{ {
item->save_in_field(to_field); (void) item->save_in_field(to_field);
return err != 0; return err != 0;
} }
const char *name() const { return "func"; } const char *name() const { return "func"; }
...@@ -362,7 +362,7 @@ public: ...@@ -362,7 +362,7 @@ public:
if (!inited) if (!inited)
{ {
inited=1; inited=1;
item->save_in_field(to_field); (void)item->save_in_field(to_field);
} }
return err != 0; return err != 0;
} }
......
...@@ -590,7 +590,7 @@ static bool make_empty_rec(File file,enum db_type table_type, ...@@ -590,7 +590,7 @@ static bool make_empty_rec(File file,enum db_type table_type,
if (field->def && if (field->def &&
(regfield->real_type() != FIELD_TYPE_YEAR || (regfield->real_type() != FIELD_TYPE_YEAR ||
field->def->val_int() != 0)) field->def->val_int() != 0))
field->def->save_in_field(regfield); (void) field->def->save_in_field(regfield);
else if (regfield->real_type() == FIELD_TYPE_ENUM && else if (regfield->real_type() == FIELD_TYPE_ENUM &&
(field->flags & NOT_NULL_FLAG)) (field->flags & NOT_NULL_FLAG))
{ {
......
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