diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index c3b27dd9af2..67dce0d225b 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -692,6 +692,7 @@ then fi MYSQL_CLIENT_TEST="$MYSQL_CLIENT_TEST --no-defaults --testcase --user=root --socket=$MASTER_MYSOCK --port=$MYSQL_TCP_PORT --silent" +MYSQL_DUMP="$MYSQL_DUMP --no-defaults -uroot --socket=$MASTER_MYSOCK --password=$DBPASSWD $EXTRA_MYSQLDUMP_OPT" MYSQL_BINLOG="$MYSQL_BINLOG --no-defaults --local-load=$MYSQL_TMP_DIR --character-sets-dir=$CHARSETSDIR $EXTRA_MYSQLBINLOG_OPT" MYSQL_FIX_SYSTEM_TABLES="$MYSQL_FIX_SYSTEM_TABLES --no-defaults --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD --basedir=$BASEDIR --bindir=$CLIENT_BINDIR --verbose" MYSQL="$MYSQL --host=localhost --port=$MASTER_MYPORT --socket=$MASTER_MYSOCK --user=root --password=$DBPASSWD" diff --git a/mysql-test/r/ps_2myisam.result b/mysql-test/r/ps_2myisam.result index 78436b69ec7..14b7e8a7069 100644 --- a/mysql-test/r/ps_2myisam.result +++ b/mysql-test/r/ps_2myisam.result @@ -2666,7 +2666,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 127 @@ -2717,7 +2716,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 -128 diff --git a/mysql-test/r/ps_3innodb.result b/mysql-test/r/ps_3innodb.result index e5db53e1c18..940f5e8cbac 100644 --- a/mysql-test/r/ps_3innodb.result +++ b/mysql-test/r/ps_3innodb.result @@ -2649,7 +2649,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 127 @@ -2700,7 +2699,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 -128 diff --git a/mysql-test/r/ps_4heap.result b/mysql-test/r/ps_4heap.result index ad02de1110c..37dd8cb263e 100644 --- a/mysql-test/r/ps_4heap.result +++ b/mysql-test/r/ps_4heap.result @@ -2650,7 +2650,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 127 @@ -2701,7 +2700,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 -128 diff --git a/mysql-test/r/ps_5merge.result b/mysql-test/r/ps_5merge.result index 374f6142c44..867d410ebf1 100644 --- a/mysql-test/r/ps_5merge.result +++ b/mysql-test/r/ps_5merge.result @@ -2586,7 +2586,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 127 @@ -2637,7 +2636,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 -128 @@ -5597,7 +5595,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 127 @@ -5648,7 +5645,6 @@ Warning 1264 Out of range value adjusted for column 'c4' at row 1 Warning 1264 Out of range value adjusted for column 'c5' at row 1 Warning 1264 Out of range value adjusted for column 'c6' at row 1 Warning 1264 Out of range value adjusted for column 'c7' at row 1 -Note 1265 Data truncated for column 'c12' at row 1 Warning 1264 Out of range value adjusted for column 'c12' at row 1 execute my_select ; c1 -128 diff --git a/sql/field.cc b/sql/field.cc index ad66fec2fc2..bc95e1dab54 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -149,7 +149,7 @@ bool Field::check_int(const char *str, int length, const char *int_end, truncation. SYNOPSIS - Field::check_overflow() + Field::warn_if_overflow() op_result decimal library return code (E_DEC_* see include/decimal.h) RETURN @@ -157,19 +157,22 @@ bool Field::check_int(const char *str, int length, const char *int_end, 0 no error or some other errors except overflow */ -int Field::check_overflow(int op_result) +int Field::warn_if_overflow(int op_result) { if (op_result == E_DEC_OVERFLOW) { set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); return 1; } - else if (op_result == E_DEC_TRUNCATED) + if (op_result == E_DEC_TRUNCATED) + { set_warning(MYSQL_ERROR::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); - /* we return 1 only in case of EFL */ + /* We return 0 here as this is not a critical issue */ + } return 0; } + #ifdef NOT_USED static bool test_if_real(const char *str,int length, CHARSET_INFO *cs) { @@ -507,7 +510,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val, i= 0; *err= 1; } - else if (check_overflow(my_decimal2int(E_DEC_ERROR & + else if (warn_if_overflow(my_decimal2int(E_DEC_ERROR & ~E_DEC_OVERFLOW & ~E_DEC_TRUNCATED, val, TRUE, &i))) { @@ -515,7 +518,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val, *err= 1; } } - else if (check_overflow(my_decimal2int(E_DEC_ERROR & + else if (warn_if_overflow(my_decimal2int(E_DEC_ERROR & ~E_DEC_OVERFLOW & ~E_DEC_TRUNCATED, val, FALSE, &i))) { @@ -616,7 +619,7 @@ int Field_str::store_decimal(const my_decimal *d) { double val; /* TODO: use decimal2string? */ - int err= check_overflow(my_decimal2double(E_DEC_FATAL_ERROR & + int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, d, &val)); return err | store(val); } @@ -1552,12 +1555,17 @@ void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value, checks if decimal_value fits into field size. if it does, stores the decimal in the buffer using binary format. Otherwise sets maximal number that can be stored in the field. + + RETURN + 0 ok + 1 error */ bool Field_new_decimal::store_value(const my_decimal *decimal_value) { - DBUG_ENTER("Field_new_decimal::store_value"); my_decimal *dec= (my_decimal*)decimal_value; + int error= 0; + DBUG_ENTER("Field_new_decimal::store_value"); DBUG_EXECUTE("enter", print_decimal(dec);); /* check that we do not try to write negative value in unsigned field */ @@ -1565,16 +1573,18 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value) { DBUG_PRINT("info", ("unsigned overflow")); set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); + error= 1; dec= &decimal_zero; } DBUG_PRINT("info", ("saving with precision %d, scale: %d", (int)field_length, (int)decimals())); DBUG_EXECUTE("info", print_decimal(dec);); - if (check_overflow(my_decimal2binary(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, - dec, ptr, - field_length, - decimals()))) + if (warn_if_overflow(my_decimal2binary(E_DEC_FATAL_ERROR & + ~E_DEC_OVERFLOW, + dec, ptr, + field_length, + decimals()))) { my_decimal buff; DBUG_PRINT("info", ("overflow")); @@ -1584,20 +1594,20 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value) DBUG_RETURN(1); } DBUG_EXECUTE("info", print_decimal_buff(dec, ptr, bin_size);); - DBUG_RETURN(0); + DBUG_RETURN(error); } int Field_new_decimal::store(const char *from, uint length, CHARSET_INFO *charset) { - DBUG_ENTER("Field_new_decimal::store(char*)"); int err; my_decimal decimal_value; + DBUG_ENTER("Field_new_decimal::store(char*)"); + switch ((err= str2my_decimal(E_DEC_FATAL_ERROR & ~(E_DEC_OVERFLOW | E_DEC_BAD_NUM), - from, length, charset, &decimal_value))) - { + from, length, charset, &decimal_value))) { case E_DEC_TRUNCATED: set_warning(MYSQL_ERROR::WARN_LEVEL_NOTE, WARN_DATA_TRUNCATED, 1); break; @@ -1624,9 +1634,11 @@ int Field_new_decimal::store(const char *from, uint length, int Field_new_decimal::store(double nr) { my_decimal decimal_value; - int err= double2my_decimal(E_DEC_FATAL_ERROR & - ~E_DEC_OVERFLOW, nr, - &decimal_value); + int err; + DBUG_ENTER("Field_new_decimal::store(double)"); + + err= double2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, nr, + &decimal_value); /* TODO: fix following when double2my_decimal when double2decimal will return E_DEC_TRUNCATED always correctly @@ -1638,10 +1650,18 @@ int Field_new_decimal::store(double nr) if (nr2 != nr) err= E_DEC_TRUNCATED; } - if (check_overflow(err)) - set_value_on_overflow(&decimal_value, decimal_value.sign()); - store_value(&decimal_value); - return err; + if (err) + { + if (check_overflow(err)) + set_value_on_overflow(&decimal_value, decimal_value.sign()); + /* Only issue a warning if store_value doesn't issue an warning */ + table->in_use->got_warning= 0; + } + if (store_value(&decimal_value)) + err= 1; + else if (err && !table->in_use->got_warning) + err= warn_if_overflow(err); + DBUG_RETURN(err); } @@ -1649,10 +1669,19 @@ int Field_new_decimal::store(longlong nr) { my_decimal decimal_value; int err; - if ((err= check_overflow(int2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, - nr, unsigned_flag, &decimal_value)))) - set_value_on_overflow(&decimal_value, decimal_value.sign()); - store_value(&decimal_value); + + if ((err= int2my_decimal(E_DEC_FATAL_ERROR & ~E_DEC_OVERFLOW, + nr, unsigned_flag, &decimal_value))) + { + if (check_overflow(err)) + set_value_on_overflow(&decimal_value, decimal_value.sign()); + /* Only issue a warning if store_value doesn't issue an warning */ + table->in_use->got_warning= 0; + } + if (store_value(&decimal_value)) + err= 1; + else if (err && !table->in_use->got_warning) + err= warn_if_overflow(err); return err; } @@ -1694,7 +1723,7 @@ my_decimal* Field_new_decimal::val_decimal(my_decimal *decimal_value) String *Field_new_decimal::val_str(String *val_buffer, - String *val_ptr __attribute__((unused))) + String *val_ptr __attribute__((unused))) { my_decimal decimal_value; int fixed_precision= (zerofill ? @@ -1728,6 +1757,7 @@ void Field_new_decimal::sql_type(String &str) const add_zerofill_and_unsigned(str); } + /**************************************************************************** ** tiny int ****************************************************************************/ diff --git a/sql/field.h b/sql/field.h index d0b43e77e5a..327fb4c885b 100644 --- a/sql/field.h +++ b/sql/field.h @@ -290,7 +290,11 @@ public: int cuted_increment); void set_datetime_warning(const uint level, const uint code, double nr, timestamp_type ts_type); - int check_overflow(int op_result); + inline bool check_overflow(int op_result) + { + return (op_result == E_DEC_OVERFLOW); + } + int warn_if_overflow(int op_result); virtual field_cast_enum field_cast_type()= 0; bool field_cast_compatible(field_cast_enum type); /* maximum possible display length */ diff --git a/sql/sql_class.h b/sql/sql_class.h index b04ad449ba3..32a2390a402 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1027,6 +1027,7 @@ public: bool charset_is_system_charset, charset_is_collation_connection; bool slow_command; bool no_trans_update, abort_on_warning; + bool got_warning; /* Set on call to push_warning() */ longlong row_count_func; /* For the ROW_COUNT() function */ sp_rcontext *spcont; // SP runtime context sp_cache *sp_proc_cache; diff --git a/sql/sql_error.cc b/sql/sql_error.cc index adae481d608..d0f06c47edb 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -108,6 +108,7 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, if (thd->query_id != thd->warn_id) mysql_reset_errors(thd); + thd->got_warning= 1; if (thd->spcont && thd->spcont->find_handler(code, ((int) level >= diff --git a/sql/sql_list.h b/sql/sql_list.h index 6317d215399..85da553f64a 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -158,15 +158,6 @@ public: last= &first; return tmp->info; } - inline void concat(base_list *list) - { - if (!list->is_empty()) - { - *last= list->first; - last= list->last; - elements+= list->elements; - } - } inline void disjoin(base_list *list) { list_node **prev= &first;