Commit d437c35d authored by Alexander Barkov's avatar Alexander Barkov

Adding a few warning related protected methods in Field and reducing

some duplicate code.
parent 36f37a48
...@@ -1307,18 +1307,13 @@ int Field_num::check_int(CHARSET_INFO *cs, const char *str, int length, ...@@ -1307,18 +1307,13 @@ int Field_num::check_int(CHARSET_INFO *cs, const char *str, int length,
if (str == int_end || error == MY_ERRNO_EDOM) if (str == int_end || error == MY_ERRNO_EDOM)
{ {
ErrConvString err(str, length, cs); ErrConvString err(str, length, cs);
push_warning_printf(get_thd(), Sql_condition::WARN_LEVEL_WARN, set_warning_truncated_wrong_value("integer", err.ptr());
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
"integer", err.ptr(), field_name,
(ulong) table->in_use->get_stmt_da()->
current_row_for_warning());
return 1; return 1;
} }
/* Test if we have garbage at the end of the given string. */ /* Test if we have garbage at the end of the given string. */
if (test_if_important_data(cs, int_end, str + length)) if (test_if_important_data(cs, int_end, str + length))
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
return 2; return 2;
} }
return 0; return 0;
...@@ -1387,7 +1382,7 @@ bool Field_num::get_int(CHARSET_INFO *cs, const char *from, uint len, ...@@ -1387,7 +1382,7 @@ bool Field_num::get_int(CHARSET_INFO *cs, const char *from, uint len,
return 0; return 0;
out_of_range: out_of_range:
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
...@@ -1408,12 +1403,12 @@ int Field::warn_if_overflow(int op_result) ...@@ -1408,12 +1403,12 @@ int Field::warn_if_overflow(int op_result)
{ {
if (op_result == E_DEC_OVERFLOW) if (op_result == E_DEC_OVERFLOW)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
if (op_result == E_DEC_TRUNCATED) if (op_result == E_DEC_TRUNCATED)
{ {
set_warning(Sql_condition::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); set_note(WARN_DATA_TRUNCATED, 1);
/* We return 0 here as this is not a critical issue */ /* We return 0 here as this is not a critical issue */
} }
return 0; return 0;
...@@ -1739,7 +1734,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val, ...@@ -1739,7 +1734,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val,
{ {
if (val->sign()) if (val->sign())
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
i= 0; i= 0;
*err= 1; *err= 1;
} }
...@@ -2047,7 +2042,7 @@ void Field_decimal::overflow(bool negative) ...@@ -2047,7 +2042,7 @@ void Field_decimal::overflow(bool negative)
uint len=field_length; uint len=field_length;
uchar *to=ptr, filler= '9'; uchar *to=ptr, filler= '9';
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
if (negative) if (negative)
{ {
if (!unsigned_flag) if (!unsigned_flag)
...@@ -2155,7 +2150,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs) ...@@ -2155,7 +2150,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs)
from++; from++;
if (from == end) if (from == end)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
is_cuted_fields_incr=1; is_cuted_fields_incr=1;
} }
else if (*from == '+' || *from == '-') // Found some sign ? else if (*from == '+' || *from == '-') // Found some sign ?
...@@ -2231,7 +2226,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs) ...@@ -2231,7 +2226,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs)
for (;from != end && my_isspace(&my_charset_bin, *from); from++) ; for (;from != end && my_isspace(&my_charset_bin, *from); from++) ;
if (from != end) // If still something left, warn if (from != end) // If still something left, warn
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
is_cuted_fields_incr=1; is_cuted_fields_incr=1;
} }
} }
...@@ -2409,8 +2404,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs) ...@@ -2409,8 +2404,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs)
if (tmp_char != '0') // Losing a non zero digit ? if (tmp_char != '0') // Losing a non zero digit ?
{ {
if (!is_cuted_fields_incr) if (!is_cuted_fields_incr)
set_warning(Sql_condition::WARN_LEVEL_WARN, set_warning(WARN_DATA_TRUNCATED, 1);
WARN_DATA_TRUNCATED, 1);
return 0; return 0;
} }
continue; continue;
...@@ -2432,7 +2426,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs) ...@@ -2432,7 +2426,7 @@ int Field_decimal::store(const char *from_arg, uint len, CHARSET_INFO *cs)
This is a note, not a warning, as we don't want to abort This is a note, not a warning, as we don't want to abort
when we cut decimals in strict mode when we cut decimals in strict mode
*/ */
set_warning(Sql_condition::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); set_note(WARN_DATA_TRUNCATED, 1);
} }
return 0; return 0;
} }
...@@ -2782,7 +2776,7 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value) ...@@ -2782,7 +2776,7 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value)
if (unsigned_flag && decimal_value->sign()) if (unsigned_flag && decimal_value->sign())
{ {
DBUG_PRINT("info", ("unsigned overflow")); DBUG_PRINT("info", ("unsigned overflow"));
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
decimal_value= &decimal_zero; decimal_value= &decimal_zero;
} }
...@@ -2826,32 +2820,22 @@ int Field_new_decimal::store(const char *from, uint length, ...@@ -2826,32 +2820,22 @@ int Field_new_decimal::store(const char *from, uint length,
thd->abort_on_warning) thd->abort_on_warning)
{ {
ErrConvString errmsg(from, length, charset_arg); ErrConvString errmsg(from, length, charset_arg);
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, set_warning_truncated_wrong_value("decimal", errmsg.ptr());
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
"decimal", errmsg.ptr(), field_name,
static_cast<ulong>(thd->get_stmt_da()->
current_row_for_warning()));
DBUG_RETURN(err); DBUG_RETURN(err);
} }
switch (err) { switch (err) {
case E_DEC_TRUNCATED: case E_DEC_TRUNCATED:
set_warning(Sql_condition::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); set_note(WARN_DATA_TRUNCATED, 1);
break; break;
case E_DEC_OVERFLOW: case E_DEC_OVERFLOW:
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
set_value_on_overflow(&decimal_value, decimal_value.sign()); set_value_on_overflow(&decimal_value, decimal_value.sign());
break; break;
case E_DEC_BAD_NUM: case E_DEC_BAD_NUM:
{ {
ErrConvString errmsg(from, length, charset_arg); ErrConvString errmsg(from, length, charset_arg);
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, set_warning_truncated_wrong_value("decimal", errmsg.ptr());
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
"decimal", errmsg.ptr(), field_name,
static_cast<ulong>(thd->get_stmt_da()->
current_row_for_warning()));
my_decimal_set_zero(&decimal_value); my_decimal_set_zero(&decimal_value);
break; break;
} }
...@@ -3158,13 +3142,13 @@ int Field_tiny::store(double nr) ...@@ -3158,13 +3142,13 @@ int Field_tiny::store(double nr)
if (nr < 0.0) if (nr < 0.0)
{ {
*ptr=0; *ptr=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > 255.0) else if (nr > 255.0)
{ {
*ptr= (uchar) 255; *ptr= (uchar) 255;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3175,13 +3159,13 @@ int Field_tiny::store(double nr) ...@@ -3175,13 +3159,13 @@ int Field_tiny::store(double nr)
if (nr < -128.0) if (nr < -128.0)
{ {
*ptr= (uchar) -128; *ptr= (uchar) -128;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > 127.0) else if (nr > 127.0)
{ {
*ptr=127; *ptr=127;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3201,13 +3185,13 @@ int Field_tiny::store(longlong nr, bool unsigned_val) ...@@ -3201,13 +3185,13 @@ int Field_tiny::store(longlong nr, bool unsigned_val)
if (nr < 0 && !unsigned_val) if (nr < 0 && !unsigned_val)
{ {
*ptr= 0; *ptr= 0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if ((ulonglong) nr > (ulonglong) 255) else if ((ulonglong) nr > (ulonglong) 255)
{ {
*ptr= (char) 255; *ptr= (char) 255;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3220,13 +3204,13 @@ int Field_tiny::store(longlong nr, bool unsigned_val) ...@@ -3220,13 +3204,13 @@ int Field_tiny::store(longlong nr, bool unsigned_val)
if (nr < -128) if (nr < -128)
{ {
*ptr= (char) -128; *ptr= (char) -128;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > 127) else if (nr > 127)
{ {
*ptr=127; *ptr=127;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3337,13 +3321,13 @@ int Field_short::store(double nr) ...@@ -3337,13 +3321,13 @@ int Field_short::store(double nr)
if (nr < 0) if (nr < 0)
{ {
res=0; res=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > (double) UINT_MAX16) else if (nr > (double) UINT_MAX16)
{ {
res=(int16) UINT_MAX16; res=(int16) UINT_MAX16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3354,13 +3338,13 @@ int Field_short::store(double nr) ...@@ -3354,13 +3338,13 @@ int Field_short::store(double nr)
if (nr < (double) INT_MIN16) if (nr < (double) INT_MIN16)
{ {
res=INT_MIN16; res=INT_MIN16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > (double) INT_MAX16) else if (nr > (double) INT_MAX16)
{ {
res=INT_MAX16; res=INT_MAX16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3382,13 +3366,13 @@ int Field_short::store(longlong nr, bool unsigned_val) ...@@ -3382,13 +3366,13 @@ int Field_short::store(longlong nr, bool unsigned_val)
if (nr < 0L && !unsigned_val) if (nr < 0L && !unsigned_val)
{ {
res=0; res=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if ((ulonglong) nr > (ulonglong) UINT_MAX16) else if ((ulonglong) nr > (ulonglong) UINT_MAX16)
{ {
res=(int16) UINT_MAX16; res=(int16) UINT_MAX16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3402,13 +3386,13 @@ int Field_short::store(longlong nr, bool unsigned_val) ...@@ -3402,13 +3386,13 @@ int Field_short::store(longlong nr, bool unsigned_val)
if (nr < INT_MIN16) if (nr < INT_MIN16)
{ {
res=INT_MIN16; res=INT_MIN16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (nr > (longlong) INT_MAX16) else if (nr > (longlong) INT_MAX16)
{ {
res=INT_MAX16; res=INT_MAX16;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3525,14 +3509,14 @@ int Field_medium::store(double nr) ...@@ -3525,14 +3509,14 @@ int Field_medium::store(double nr)
if (nr < 0) if (nr < 0)
{ {
int3store(ptr,0); int3store(ptr,0);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; 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);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3544,14 +3528,14 @@ int Field_medium::store(double nr) ...@@ -3544,14 +3528,14 @@ int Field_medium::store(double nr)
{ {
long tmp=(long) INT_MIN24; long tmp=(long) INT_MIN24;
int3store(ptr,tmp); int3store(ptr,tmp);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; 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);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3571,14 +3555,14 @@ int Field_medium::store(longlong nr, bool unsigned_val) ...@@ -3571,14 +3555,14 @@ int Field_medium::store(longlong nr, bool unsigned_val)
if (nr < 0 && !unsigned_val) if (nr < 0 && !unsigned_val)
{ {
int3store(ptr,0); int3store(ptr,0);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if ((ulonglong) nr >= (ulonglong) (long) (1L << 24)) else if ((ulonglong) nr >= (ulonglong) (long) (1L << 24))
{ {
long tmp= (long) (1L << 24)-1L; long tmp= (long) (1L << 24)-1L;
int3store(ptr,tmp); int3store(ptr,tmp);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3593,14 +3577,14 @@ int Field_medium::store(longlong nr, bool unsigned_val) ...@@ -3593,14 +3577,14 @@ int Field_medium::store(longlong nr, bool unsigned_val)
{ {
long tmp= (long) INT_MIN24; long tmp= (long) INT_MIN24;
int3store(ptr,tmp); int3store(ptr,tmp);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; 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);
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3722,7 +3706,7 @@ int Field_long::store(double nr) ...@@ -3722,7 +3706,7 @@ int Field_long::store(double nr)
else if (nr > (double) UINT_MAX32) else if (nr > (double) UINT_MAX32)
{ {
res= UINT_MAX32; res= UINT_MAX32;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else else
...@@ -3744,7 +3728,7 @@ int Field_long::store(double nr) ...@@ -3744,7 +3728,7 @@ int Field_long::store(double nr)
res=(int32) (longlong) nr; res=(int32) (longlong) nr;
} }
if (error) if (error)
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
int4store(ptr,res); int4store(ptr,res);
return error; return error;
...@@ -3790,7 +3774,7 @@ int Field_long::store(longlong nr, bool unsigned_val) ...@@ -3790,7 +3774,7 @@ int Field_long::store(longlong nr, bool unsigned_val)
res=(int32) nr; res=(int32) nr;
} }
if (error) if (error)
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
int4store(ptr,res); int4store(ptr,res);
return error; return error;
...@@ -3889,7 +3873,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -3889,7 +3873,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
tmp= cs->cset->strntoull10rnd(cs,from,len,unsigned_flag,&end,&error); tmp= cs->cset->strntoull10rnd(cs,from,len,unsigned_flag,&end,&error);
if (error == MY_ERRNO_ERANGE) if (error == MY_ERRNO_ERANGE)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
else if (get_thd()->count_cuted_fields && else if (get_thd()->count_cuted_fields &&
...@@ -3911,7 +3895,7 @@ int Field_longlong::store(double nr) ...@@ -3911,7 +3895,7 @@ int Field_longlong::store(double nr)
res= double_to_longlong(nr, unsigned_flag, &error); res= double_to_longlong(nr, unsigned_flag, &error);
if (error) if (error)
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
int8store(ptr,res); int8store(ptr,res);
return error; return error;
...@@ -3932,7 +3916,7 @@ int Field_longlong::store(longlong nr, bool unsigned_val) ...@@ -3932,7 +3916,7 @@ int Field_longlong::store(longlong nr, bool unsigned_val)
if (unsigned_flag != unsigned_val) if (unsigned_flag != unsigned_val)
{ {
nr= unsigned_flag ? (ulonglong) 0 : (ulonglong) LONGLONG_MAX; nr= unsigned_flag ? (ulonglong) 0 : (ulonglong) LONGLONG_MAX;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1; error= 1;
} }
} }
...@@ -4046,8 +4030,7 @@ int Field_float::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -4046,8 +4030,7 @@ int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
if (error || (!len || ((uint) (end-from) != len && if (error || (!len || ((uint) (end-from) != len &&
get_thd()->count_cuted_fields))) get_thd()->count_cuted_fields)))
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, set_warning(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED, 1);
(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1);
error= error ? 1 : 2; error= error ? 1 : 2;
} }
Field_float::store(nr); Field_float::store(nr);
...@@ -4063,7 +4046,7 @@ int Field_float::store(double nr) ...@@ -4063,7 +4046,7 @@ int Field_float::store(double nr)
unsigned_flag, FLT_MAX); unsigned_flag, FLT_MAX);
if (error) if (error)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
if (error < 0) // Wrong double value if (error < 0) // Wrong double value
{ {
error= 1; error= 1;
...@@ -4234,8 +4217,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -4234,8 +4217,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
if (error || (!len || ((uint) (end-from) != len && if (error || (!len || ((uint) (end-from) != len &&
get_thd()->count_cuted_fields))) get_thd()->count_cuted_fields)))
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, set_warning(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED, 1);
(error ? ER_WARN_DATA_OUT_OF_RANGE : WARN_DATA_TRUNCATED), 1);
error= error ? 1 : 2; error= error ? 1 : 2;
} }
Field_double::store(nr); Field_double::store(nr);
...@@ -4251,7 +4233,7 @@ int Field_double::store(double nr) ...@@ -4251,7 +4233,7 @@ int Field_double::store(double nr)
unsigned_flag, DBL_MAX); unsigned_flag, DBL_MAX);
if (error) if (error)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
if (error < 0) // Wrong double value if (error < 0) // Wrong double value
{ {
error= 1; error= 1;
...@@ -4612,7 +4594,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time, ...@@ -4612,7 +4594,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time,
if (MYSQL_TIME_WARN_HAVE_WARNINGS(was_cut) || !have_smth_to_conv) if (MYSQL_TIME_WARN_HAVE_WARNINGS(was_cut) || !have_smth_to_conv)
{ {
error= 1; error= 1;
set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, set_datetime_warning(WARN_DATA_TRUNCATED,
str, MYSQL_TIMESTAMP_DATETIME, 1); str, MYSQL_TIMESTAMP_DATETIME, 1);
} }
else if (MYSQL_TIME_WARN_HAVE_NOTES(was_cut)) else if (MYSQL_TIME_WARN_HAVE_NOTES(was_cut))
...@@ -4630,7 +4612,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time, ...@@ -4630,7 +4612,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time,
conversion_error= ER_WARN_DATA_OUT_OF_RANGE; conversion_error= ER_WARN_DATA_OUT_OF_RANGE;
if (conversion_error) if (conversion_error)
{ {
set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, conversion_error, set_datetime_warning(conversion_error,
str, MYSQL_TIMESTAMP_DATETIME, !error); str, MYSQL_TIMESTAMP_DATETIME, !error);
error= 1; error= 1;
} }
...@@ -5128,7 +5110,7 @@ void Field_temporal::set_warnings(Sql_condition::enum_warning_level trunc_level, ...@@ -5128,7 +5110,7 @@ void Field_temporal::set_warnings(Sql_condition::enum_warning_level trunc_level,
set_datetime_warning(trunc_level, WARN_DATA_TRUNCATED, set_datetime_warning(trunc_level, WARN_DATA_TRUNCATED,
str, mysql_type_to_time_type(type()), 1); str, mysql_type_to_time_type(type()), 1);
if (was_cut & MYSQL_TIME_WARN_OUT_OF_RANGE) if (was_cut & MYSQL_TIME_WARN_OUT_OF_RANGE)
set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE,
str, mysql_type_to_time_type(type()), 1); str, mysql_type_to_time_type(type()), 1);
} }
...@@ -5656,7 +5638,7 @@ int Field_year::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -5656,7 +5638,7 @@ int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
error == MY_ERRNO_ERANGE) error == MY_ERRNO_ERANGE)
{ {
*ptr=0; *ptr=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
if (get_thd()->count_cuted_fields && if (get_thd()->count_cuted_fields &&
...@@ -5699,7 +5681,7 @@ int Field_year::store(longlong nr, bool unsigned_val) ...@@ -5699,7 +5681,7 @@ int Field_year::store(longlong nr, bool unsigned_val)
if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155) if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155)
{ {
*ptr= 0; *ptr= 0;
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000 if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000
...@@ -5720,8 +5702,7 @@ int Field_year::store_time_dec(MYSQL_TIME *ltime, uint dec) ...@@ -5720,8 +5702,7 @@ int Field_year::store_time_dec(MYSQL_TIME *ltime, uint dec)
if (Field_year::store(ltime->year, 0)) if (Field_year::store(ltime->year, 0))
return 1; return 1;
set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, set_datetime_warning(WARN_DATA_TRUNCATED, &str, ltime->time_type, 1);
&str, ltime->time_type, 1);
return 0; return 0;
} }
...@@ -6281,31 +6262,21 @@ bool Field_datetimef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) ...@@ -6281,31 +6262,21 @@ bool Field_datetimef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
TRUE - If an error happened TRUE - If an error happened
*/ */
static bool bool
check_string_copy_error(Field_str *field, Field_longstr::check_string_copy_error(const char *well_formed_error_pos,
const char *well_formed_error_pos, const char *cannot_convert_error_pos,
const char *cannot_convert_error_pos, const char *end,
const char *end, CHARSET_INFO *cs)
CHARSET_INFO *cs)
{ {
const char *pos; const char *pos;
char tmp[32]; char tmp[32];
THD *thd;
thd= field->get_thd();
if (!(pos= well_formed_error_pos) && if (!(pos= well_formed_error_pos) &&
!(pos= cannot_convert_error_pos)) !(pos= cannot_convert_error_pos))
return FALSE; return FALSE;
convert_to_printable(tmp, sizeof(tmp), pos, (end - pos), cs, 6); convert_to_printable(tmp, sizeof(tmp), pos, (end - pos), cs, 6);
set_warning_truncated_wrong_value("string", tmp);
push_warning_printf(thd,
Sql_condition::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
"string", tmp, field->field_name,
thd->get_stmt_da()->current_row_for_warning());
return TRUE; return TRUE;
} }
...@@ -6340,14 +6311,14 @@ Field_longstr::report_if_important_data(const char *pstr, const char *end, ...@@ -6340,14 +6311,14 @@ Field_longstr::report_if_important_data(const char *pstr, const char *end,
if (test_if_important_data(field_charset, pstr, end)) if (test_if_important_data(field_charset, pstr, end))
{ {
if (thd->abort_on_warning) if (thd->abort_on_warning)
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1); set_warning(ER_DATA_TOO_LONG, 1);
else else
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
return 2; return 2;
} }
else if (count_spaces) else if (count_spaces)
{ /* If we lost only spaces then produce a NOTE, not a WARNING */ { /* If we lost only spaces then produce a NOTE, not a WARNING */
set_warning(Sql_condition::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); set_note(WARN_DATA_TRUNCATED, 1);
return 2; return 2;
} }
} }
...@@ -6382,7 +6353,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -6382,7 +6353,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
field_length-copy_length, field_length-copy_length,
field_charset->pad_char); field_charset->pad_char);
if (check_string_copy_error(this, well_formed_error_pos, if (check_string_copy_error(well_formed_error_pos,
cannot_convert_error_pos, from + length, cs)) cannot_convert_error_pos, from + length, cs))
return 2; return 2;
...@@ -6413,9 +6384,9 @@ int Field_str::store(double nr) ...@@ -6413,9 +6384,9 @@ int Field_str::store(double nr)
if (error) if (error)
{ {
if (get_thd()->abort_on_warning) if (get_thd()->abort_on_warning)
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1); set_warning(ER_DATA_TOO_LONG, 1);
else else
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
} }
return store(buff, length, &my_charset_numeric); return store(buff, length, &my_charset_numeric);
} }
...@@ -6891,7 +6862,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -6891,7 +6862,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
else else
int2store(ptr, copy_length); int2store(ptr, copy_length);
if (check_string_copy_error(this, well_formed_error_pos, if (check_string_copy_error(well_formed_error_pos,
cannot_convert_error_pos, from + length, cs)) cannot_convert_error_pos, from + length, cs))
return 2; return 2;
...@@ -7417,7 +7388,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -7417,7 +7388,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
tmp= value.ptr(); tmp= value.ptr();
bmove(ptr+packlength,(uchar*) &tmp,sizeof(char*)); bmove(ptr+packlength,(uchar*) &tmp,sizeof(char*));
if (check_string_copy_error(this, well_formed_error_pos, if (check_string_copy_error(well_formed_error_pos,
cannot_convert_error_pos, from + length, cs)) cannot_convert_error_pos, from + length, cs))
return 2; return 2;
...@@ -7983,13 +7954,13 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -7983,13 +7954,13 @@ int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs)
if (err || end != from+length || tmp > typelib->count) if (err || end != from+length || tmp > typelib->count)
{ {
tmp=0; tmp=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
} }
if (!get_thd()->count_cuted_fields) if (!get_thd()->count_cuted_fields)
err= 0; err= 0;
} }
else else
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
} }
store_type((ulonglong) tmp); store_type((ulonglong) tmp);
return err; return err;
...@@ -8008,7 +7979,7 @@ int Field_enum::store(longlong nr, bool unsigned_val) ...@@ -8008,7 +7979,7 @@ int Field_enum::store(longlong nr, bool unsigned_val)
int error= 0; int error= 0;
if ((ulonglong) nr > typelib->count || nr == 0) if ((ulonglong) nr > typelib->count || nr == 0)
{ {
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
if (nr != 0 || get_thd()->count_cuted_fields) if (nr != 0 || get_thd()->count_cuted_fields)
{ {
nr= 0; nr= 0;
...@@ -8161,11 +8132,11 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs) ...@@ -8161,11 +8132,11 @@ int Field_set::store(const char *from,uint length,CHARSET_INFO *cs)
tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1))
{ {
tmp=0; tmp=0;
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
} }
} }
else if (got_warning) else if (got_warning)
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
store_type(tmp); store_type(tmp);
return err; return err;
} }
...@@ -8185,7 +8156,7 @@ int Field_set::store(longlong nr, bool unsigned_val) ...@@ -8185,7 +8156,7 @@ int Field_set::store(longlong nr, bool unsigned_val)
if ((ulonglong) nr > max_nr) if ((ulonglong) nr > max_nr)
{ {
nr&= max_nr; nr&= max_nr;
set_warning(Sql_condition::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED, 1); set_warning(WARN_DATA_TRUNCATED, 1);
error=1; error=1;
} }
store_type((ulonglong) nr); store_type((ulonglong) nr);
...@@ -8537,9 +8508,9 @@ int Field_bit::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -8537,9 +8508,9 @@ int Field_bit::store(const char *from, uint length, CHARSET_INFO *cs)
set_rec_bits((1 << bit_len) - 1, bit_ptr, bit_ofs, bit_len); set_rec_bits((1 << bit_len) - 1, bit_ptr, bit_ofs, bit_len);
memset(ptr, 0xff, bytes_in_rec); memset(ptr, 0xff, bytes_in_rec);
if (get_thd()->really_abort_on_warning()) if (get_thd()->really_abort_on_warning())
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1); set_warning(ER_DATA_TOO_LONG, 1);
else else
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
/* delta is >= -1 here */ /* delta is >= -1 here */
...@@ -8974,9 +8945,9 @@ int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs) ...@@ -8974,9 +8945,9 @@ int Field_bit_as_char::store(const char *from, uint length, CHARSET_INFO *cs)
if (bits) if (bits)
*ptr&= ((1 << bits) - 1); /* set first uchar */ *ptr&= ((1 << bits) - 1); /* set first uchar */
if (get_thd()->really_abort_on_warning()) if (get_thd()->really_abort_on_warning())
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_DATA_TOO_LONG, 1); set_warning(ER_DATA_TOO_LONG, 1);
else else
set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
bzero(ptr, delta); bzero(ptr, delta);
...@@ -10119,6 +10090,19 @@ void Field::set_datetime_warning(Sql_condition::enum_warning_level level, ...@@ -10119,6 +10090,19 @@ void Field::set_datetime_warning(Sql_condition::enum_warning_level level,
} }
void Field::set_warning_truncated_wrong_value(const char *type,
const char *value)
{
THD *thd= get_thd();
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
type, value, field_name,
static_cast<ulong>(thd->get_stmt_da()->
current_row_for_warning()));
}
/* /*
@brief @brief
Return possible keys for a field Return possible keys for a field
......
...@@ -885,14 +885,32 @@ public: ...@@ -885,14 +885,32 @@ public:
virtual int set_time() { return 1; } virtual int set_time() { return 1; }
bool set_warning(Sql_condition::enum_warning_level, unsigned int code, bool set_warning(Sql_condition::enum_warning_level, unsigned int code,
int cuted_increment) const; int cuted_increment) const;
protected:
bool set_warning(unsigned int code, int cuted_increment) const
{
return set_warning(Sql_condition::WARN_LEVEL_WARN, code, cuted_increment);
}
bool set_note(unsigned int code, int cuted_increment) const
{
return set_warning(Sql_condition::WARN_LEVEL_NOTE, code, cuted_increment);
}
void set_datetime_warning(Sql_condition::enum_warning_level, uint code, void set_datetime_warning(Sql_condition::enum_warning_level, uint code,
const ErrConv *str, timestamp_type ts_type, const ErrConv *str, timestamp_type ts_type,
int cuted_increment); int cuted_increment);
void set_datetime_warning(uint code,
const ErrConv *str, timestamp_type ts_type,
int cuted_increment)
{
set_datetime_warning(Sql_condition::WARN_LEVEL_WARN, code, str, ts_type,
cuted_increment);
}
void set_warning_truncated_wrong_value(const char *type, const char *value);
inline bool check_overflow(int op_result) inline bool check_overflow(int op_result)
{ {
return (op_result == E_DEC_OVERFLOW); return (op_result == E_DEC_OVERFLOW);
} }
int warn_if_overflow(int op_result); int warn_if_overflow(int op_result);
public:
void set_table_name(String *alias) void set_table_name(String *alias)
{ {
table_name= &alias->Ptr; table_name= &alias->Ptr;
...@@ -1139,6 +1157,10 @@ class Field_longstr :public Field_str ...@@ -1139,6 +1157,10 @@ class Field_longstr :public Field_str
protected: protected:
int report_if_important_data(const char *ptr, const char *end, int report_if_important_data(const char *ptr, const char *end,
bool count_spaces); bool count_spaces);
bool check_string_copy_error(const char *well_formed_error_pos,
const char *cannot_convert_error_pos,
const char *end,
CHARSET_INFO *cs);
public: public:
Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, Field_longstr(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg,
uchar null_bit_arg, utype unireg_check_arg, uchar null_bit_arg, utype unireg_check_arg,
......
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